Hex Artifact Content
Not logged in

Artifact d7f7c17a2d5a8c53c728550fc6f7d69048e2cc56:


0000: 2f 2a 0a 0a 20 73 70 61 74 69 61 6c 69 74 65 2e  /*.. spatialite.
0010: 63 20 2d 2d 20 53 51 4c 69 74 65 33 20 73 70 61  c -- SQLite3 spa
0020: 74 69 61 6c 20 65 78 74 65 6e 73 69 6f 6e 0a 0a  tial extension..
0030: 20 76 65 72 73 69 6f 6e 20 34 2e 33 2c 20 32 30   version 4.3, 20
0040: 31 35 20 4a 75 6e 65 20 32 39 0a 0a 20 41 75 74  15 June 29.. Aut
0050: 68 6f 72 3a 20 53 61 6e 64 72 6f 20 46 75 72 69  hor: Sandro Furi
0060: 65 72 69 20 61 2e 66 75 72 69 65 72 69 40 6c 71  eri a.furieri@lq
0070: 74 2e 69 74 0a 0a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.it.. ---------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00c0: 2d 2d 2d 2d 2d 0a 20 0a 20 56 65 72 73 69 6f 6e  -----. . Version
00d0: 3a 20 4d 50 4c 20 31 2e 31 2f 47 50 4c 20 32 2e  : MPL 1.1/GPL 2.
00e0: 30 2f 4c 47 50 4c 20 32 2e 31 0a 20 0a 20 54 68  0/LGPL 2.1. . Th
00f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
0100: 69 73 20 66 69 6c 65 20 61 72 65 20 73 75 62 6a  is file are subj
0110: 65 63 74 20 74 6f 20 74 68 65 20 4d 6f 7a 69 6c  ect to the Mozil
0120: 6c 61 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  la Public Licens
0130: 65 20 56 65 72 73 69 6f 6e 0a 20 31 2e 31 20 28  e Version. 1.1 (
0140: 74 68 65 20 22 4c 69 63 65 6e 73 65 22 29 3b 20  the "License"); 
0150: 79 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73 65 20  you may not use 
0160: 74 68 69 73 20 66 69 6c 65 20 65 78 63 65 70 74  this file except
0170: 20 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65 20 77   in compliance w
0180: 69 74 68 0a 20 74 68 65 20 4c 69 63 65 6e 73 65  ith. the License
0190: 2e 20 59 6f 75 20 6d 61 79 20 6f 62 74 61 69 6e  . You may obtain
01a0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 4c   a copy of the L
01b0: 69 63 65 6e 73 65 20 61 74 0a 20 68 74 74 70 3a  icense at. http:
01c0: 2f 2f 77 77 77 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  //www.mozilla.or
01d0: 67 2f 4d 50 4c 2f 0a 20 0a 53 6f 66 74 77 61 72  g/MPL/. .Softwar
01e0: 65 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e  e distributed un
01f0: 64 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20  der the License 
0200: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f  is distributed o
0210: 6e 20 61 6e 20 22 41 53 20 49 53 22 20 62 61 73  n an "AS IS" bas
0220: 69 73 2c 0a 57 49 54 48 4f 55 54 20 57 41 52 52  is,.WITHOUT WARR
0230: 41 4e 54 59 20 4f 46 20 41 4e 59 20 4b 49 4e 44  ANTY OF ANY KIND
0240: 2c 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  , either express
0250: 20 6f 72 20 69 6d 70 6c 69 65 64 2e 20 53 65 65   or implied. See
0260: 20 74 68 65 20 4c 69 63 65 6e 73 65 0a 66 6f 72   the License.for
0270: 20 74 68 65 20 73 70 65 63 69 66 69 63 20 6c 61   the specific la
0280: 6e 67 75 61 67 65 20 67 6f 76 65 72 6e 69 6e 67  nguage governing
0290: 20 72 69 67 68 74 73 20 61 6e 64 20 6c 69 6d 69   rights and limi
02a0: 74 61 74 69 6f 6e 73 20 75 6e 64 65 72 20 74 68  tations under th
02b0: 65 0a 4c 69 63 65 6e 73 65 2e 0a 0a 54 68 65 20  e.License...The 
02c0: 4f 72 69 67 69 6e 61 6c 20 43 6f 64 65 20 69 73  Original Code is
02d0: 20 74 68 65 20 53 70 61 74 69 61 4c 69 74 65 20   the SpatiaLite 
02e0: 6c 69 62 72 61 72 79 0a 0a 54 68 65 20 49 6e 69  library..The Ini
02f0: 74 69 61 6c 20 44 65 76 65 6c 6f 70 65 72 20 6f  tial Developer o
0300: 66 20 74 68 65 20 4f 72 69 67 69 6e 61 6c 20 43  f the Original C
0310: 6f 64 65 20 69 73 20 41 6c 65 73 73 61 6e 64 72  ode is Alessandr
0320: 6f 20 46 75 72 69 65 72 69 0a 20 0a 50 6f 72 74  o Furieri. .Port
0330: 69 6f 6e 73 20 63 72 65 61 74 65 64 20 62 79 20  ions created by 
0340: 74 68 65 20 49 6e 69 74 69 61 6c 20 44 65 76 65  the Initial Deve
0350: 6c 6f 70 65 72 20 61 72 65 20 43 6f 70 79 72 69  loper are Copyri
0360: 67 68 74 20 28 43 29 20 32 30 30 38 2d 32 30 31  ght (C) 2008-201
0370: 35 0a 74 68 65 20 49 6e 69 74 69 61 6c 20 44 65  5.the Initial De
0380: 76 65 6c 6f 70 65 72 2e 20 41 6c 6c 20 52 69 67  veloper. All Rig
0390: 68 74 73 20 52 65 73 65 72 76 65 64 2e 0a 0a 43  hts Reserved...C
03a0: 6f 6e 74 72 69 62 75 74 6f 72 28 73 29 3a 0a 50  ontributor(s):.P
03b0: 65 70 69 6a 6e 20 56 61 6e 20 45 65 63 6b 68 6f  epijn Van Eeckho
03c0: 75 64 74 20 3c 70 65 70 69 6a 6e 76 61 6e 65 65  udt <pepijnvanee
03d0: 63 6b 68 6f 75 64 74 40 6c 75 63 69 61 64 2e 63  ckhoudt@luciad.c
03e0: 6f 6d 3e 0a 28 69 6d 70 6c 65 6d 65 6e 74 69 6e  om>.(implementin
03f0: 67 20 41 6e 64 72 6f 69 64 20 73 75 70 70 6f 72  g Android suppor
0400: 74 29 0a 0a 4d 61 72 6b 20 4a 6f 68 6e 73 6f 6e  t)..Mark Johnson
0410: 20 3c 6d 6a 31 30 37 37 37 40 67 6f 6f 67 6c 65   <mj10777@google
0420: 6d 61 69 6c 2e 63 6f 6d 3e 0a 0a 41 6c 74 65 72  mail.com>..Alter
0430: 6e 61 74 69 76 65 6c 79 2c 20 74 68 65 20 63 6f  natively, the co
0440: 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 66  ntents of this f
0450: 69 6c 65 20 6d 61 79 20 62 65 20 75 73 65 64 20  ile may be used 
0460: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0470: 6f 66 0a 65 69 74 68 65 72 20 74 68 65 20 47 4e  of.either the GN
0480: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0490: 20 4c 69 63 65 6e 73 65 20 56 65 72 73 69 6f 6e   License Version
04a0: 20 32 20 6f 72 20 6c 61 74 65 72 20 28 74 68 65   2 or later (the
04b0: 20 22 47 50 4c 22 29 2c 20 6f 72 0a 74 68 65 20   "GPL"), or.the 
04c0: 47 4e 55 20 4c 65 73 73 65 72 20 47 65 6e 65 72  GNU Lesser Gener
04d0: 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  al Public Licens
04e0: 65 20 56 65 72 73 69 6f 6e 20 32 2e 31 20 6f 72  e Version 2.1 or
04f0: 20 6c 61 74 65 72 20 28 74 68 65 20 22 4c 47 50   later (the "LGP
0500: 4c 22 29 2c 0a 69 6e 20 77 68 69 63 68 20 63 61  L"),.in which ca
0510: 73 65 20 74 68 65 20 70 72 6f 76 69 73 69 6f 6e  se the provision
0520: 73 20 6f 66 20 74 68 65 20 47 50 4c 20 6f 72 20  s of the GPL or 
0530: 74 68 65 20 4c 47 50 4c 20 61 72 65 20 61 70 70  the LGPL are app
0540: 6c 69 63 61 62 6c 65 20 69 6e 73 74 65 61 64 0a  licable instead.
0550: 6f 66 20 74 68 6f 73 65 20 61 62 6f 76 65 2e 20  of those above. 
0560: 49 66 20 79 6f 75 20 77 69 73 68 20 74 6f 20 61  If you wish to a
0570: 6c 6c 6f 77 20 75 73 65 20 6f 66 20 79 6f 75 72  llow use of your
0580: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
0590: 20 66 69 6c 65 20 6f 6e 6c 79 0a 75 6e 64 65 72   file only.under
05a0: 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 65 69   the terms of ei
05b0: 74 68 65 72 20 74 68 65 20 47 50 4c 20 6f 72 20  ther the GPL or 
05c0: 74 68 65 20 4c 47 50 4c 2c 20 61 6e 64 20 6e 6f  the LGPL, and no
05d0: 74 20 74 6f 20 61 6c 6c 6f 77 20 6f 74 68 65 72  t to allow other
05e0: 73 20 74 6f 0a 75 73 65 20 79 6f 75 72 20 76 65  s to.use your ve
05f0: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 69  rsion of this fi
0600: 6c 65 20 75 6e 64 65 72 20 74 68 65 20 74 65 72  le under the ter
0610: 6d 73 20 6f 66 20 74 68 65 20 4d 50 4c 2c 20 69  ms of the MPL, i
0620: 6e 64 69 63 61 74 65 20 79 6f 75 72 0a 64 65 63  ndicate your.dec
0630: 69 73 69 6f 6e 20 62 79 20 64 65 6c 65 74 69 6e  ision by deletin
0640: 67 20 74 68 65 20 70 72 6f 76 69 73 69 6f 6e 73  g the provisions
0650: 20 61 62 6f 76 65 20 61 6e 64 20 72 65 70 6c 61   above and repla
0660: 63 65 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ce them with the
0670: 20 6e 6f 74 69 63 65 0a 61 6e 64 20 6f 74 68 65   notice.and othe
0680: 72 20 70 72 6f 76 69 73 69 6f 6e 73 20 72 65 71  r provisions req
0690: 75 69 72 65 64 20 62 79 20 74 68 65 20 47 50 4c  uired by the GPL
06a0: 20 6f 72 20 74 68 65 20 4c 47 50 4c 2e 20 49 66   or the LGPL. If
06b0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 64 65 6c 65   you do not dele
06c0: 74 65 0a 74 68 65 20 70 72 6f 76 69 73 69 6f 6e  te.the provision
06d0: 73 20 61 62 6f 76 65 2c 20 61 20 72 65 63 69 70  s above, a recip
06e0: 69 65 6e 74 20 6d 61 79 20 75 73 65 20 79 6f 75  ient may use you
06f0: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  r version of thi
0700: 73 20 66 69 6c 65 20 75 6e 64 65 72 0a 74 68 65  s file under.the
0710: 20 74 65 72 6d 73 20 6f 66 20 61 6e 79 20 6f 6e   terms of any on
0720: 65 20 6f 66 20 74 68 65 20 4d 50 4c 2c 20 74 68  e of the MPL, th
0730: 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c 47 50  e GPL or the LGP
0740: 4c 2e 0a 20 0a 2a 2f 0a 0a 2f 2a 0a 20 0a 43 52  L.. .*/../*. .CR
0750: 45 44 49 54 53 3a 0a 0a 74 68 69 73 20 6d 6f 64  EDITS:..this mod
0760: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 61 72  ule has been par
0770: 74 6c 79 20 66 75 6e 64 65 64 20 62 79 3a 0a 52  tly funded by:.R
0780: 65 67 69 6f 6e 65 20 54 6f 73 63 61 6e 61 20 2d  egione Toscana -
0790: 20 53 65 74 74 6f 72 65 20 53 69 73 74 65 6d 61   Settore Sistema
07a0: 20 49 6e 66 6f 72 6d 61 74 69 76 6f 20 54 65 72   Informativo Ter
07b0: 72 69 74 6f 72 69 61 6c 65 20 65 64 20 41 6d 62  ritoriale ed Amb
07c0: 69 65 6e 74 61 6c 65 0a 28 65 78 70 6f 73 69 6e  ientale.(exposin
07d0: 67 20 6c 69 62 6c 77 67 65 6f 6d 20 41 50 49 73  g liblwgeom APIs
07e0: 20 61 73 20 53 70 61 74 69 61 4c 69 74 65 20 6f   as SpatiaLite o
07f0: 77 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  wn SQL functions
0800: 29 20 0a 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ) ..*/..#include
0810: 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23   <sys/types.h>.#
0820: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0830: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0840: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0850: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0860: 64 65 20 3c 6d 61 74 68 2e 68 3e 0a 23 69 6e 63  de <math.h>.#inc
0870: 6c 75 64 65 20 3c 66 6c 6f 61 74 2e 68 3e 0a 23  lude <float.h>.#
0880: 69 6e 63 6c 75 64 65 20 3c 6c 6f 63 61 6c 65 2e  include <locale.
0890: 68 3e 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h>..#if defined(
08a0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
08b0: 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29  ned(__MINGW32__)
08c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e  .#include <io.h>
08d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 64 69 72 65 63  .#include <direc
08e0: 74 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 6e 63 6c  t.h>.#else.#incl
08f0: 75 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23  ude <dirent.h>.#
0900: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
0910: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
0920: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0930: 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  __).#include "co
0940: 6e 66 69 67 2d 6d 73 76 63 2e 68 22 0a 23 65 6c  nfig-msvc.h".#el
0950: 73 65 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e  se.#include "con
0960: 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23  fig.h".#endif..#
0970: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0980: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
0990: 4e 33 32 29 0a 23 69 6e 63 6c 75 64 65 20 3c 69  N32).#include <i
09a0: 6f 2e 68 3e 0a 23 64 65 66 69 6e 65 20 69 73 61  o.h>.#define isa
09b0: 74 74 79 09 5f 69 73 61 74 74 79 0a 23 65 6c 73  tty._isatty.#els
09c0: 65 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  e.#include <unis
09d0: 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23  td.h>.#endif...#
09e0: 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c  include <spatial
09f0: 69 74 65 2f 73 71 6c 69 74 65 2e 68 3e 0a 23 69  ite/sqlite.h>.#i
0a00: 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69  nclude <spatiali
0a10: 74 65 2f 64 65 62 75 67 2e 68 3e 0a 0a 23 69 6e  te/debug.h>..#in
0a20: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74  clude <spatialit
0a30: 65 2f 67 61 69 61 61 75 78 2e 68 3e 0a 23 69 6e  e/gaiaaux.h>.#in
0a40: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74  clude <spatialit
0a50: 65 2f 67 61 69 61 67 65 6f 2e 68 3e 0a 23 69 6e  e/gaiageo.h>.#in
0a60: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74  clude <spatialit
0a70: 65 2f 67 61 69 61 65 78 69 66 2e 68 3e 0a 23 69  e/gaiaexif.h>.#i
0a80: 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69  nclude <spatiali
0a90: 74 65 2f 67 65 6f 70 61 63 6b 61 67 65 2e 68 3e  te/geopackage.h>
0aa0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69  .#include <spati
0ab0: 61 6c 69 74 65 2f 73 70 61 74 69 61 6c 69 74 65  alite/spatialite
0ac0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70  .h>.#include <sp
0ad0: 61 74 69 61 6c 69 74 65 2f 67 67 5f 61 64 76 61  atialite/gg_adva
0ae0: 6e 63 65 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  nced.h>.#include
0af0: 20 3c 73 70 61 74 69 61 6c 69 74 65 2f 67 67 5f   <spatialite/gg_
0b00: 64 78 66 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dxf.h>.#include 
0b10: 3c 73 70 61 74 69 61 6c 69 74 65 2f 67 61 69 61  <spatialite/gaia
0b20: 6d 61 74 72 69 78 2e 68 3e 0a 23 69 6e 63 6c 75  matrix.h>.#inclu
0b30: 64 65 20 3c 73 70 61 74 69 61 6c 69 74 65 2f 67  de <spatialite/g
0b40: 65 6f 70 61 63 6b 61 67 65 2e 68 3e 0a 23 69 6e  eopackage.h>.#in
0b50: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74  clude <spatialit
0b60: 65 2f 63 6f 6e 74 72 6f 6c 5f 70 6f 69 6e 74 73  e/control_points
0b70: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70  .h>.#include <sp
0b80: 61 74 69 61 6c 69 74 65 2f 73 74 6f 72 65 64 5f  atialite/stored_
0b90: 70 72 6f 63 65 64 75 72 65 73 2e 68 3e 0a 23 69  procedures.h>.#i
0ba0: 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69  nclude <spatiali
0bb0: 74 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  te.h>.#include <
0bc0: 73 70 61 74 69 61 6c 69 74 65 5f 70 72 69 76 61  spatialite_priva
0bd0: 74 65 2e 68 3e 0a 0a 23 69 66 64 65 66 20 45 4e  te.h>..#ifdef EN
0be0: 41 42 4c 45 5f 4c 49 42 58 4d 4c 32 09 09 2f 2a  ABLE_LIBXML2../*
0bf0: 20 4c 49 42 58 4d 4c 32 20 28 61 6e 64 20 74 68   LIBXML2 (and th
0c00: 75 73 20 57 46 53 29 20 65 6e 61 62 6c 65 64 20  us WFS) enabled 
0c10: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61  */.#include <spa
0c20: 74 69 61 6c 69 74 65 2f 67 67 5f 77 66 73 2e 68  tialite/gg_wfs.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  >.#endif..#ifnde
0c40: 66 20 4f 4d 49 54 5f 46 52 45 45 58 4c 09 09 2f  f OMIT_FREEXL../
0c50: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 46 72 65 65  * including Free
0c60: 58 4c 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  XL */.#include <
0c70: 66 72 65 65 78 6c 2e 68 3e 0a 23 65 6e 64 69 66  freexl.h>.#endif
0c80: 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 47  ..#ifndef OMIT_G
0c90: 45 4f 53 09 09 2f 2a 20 69 6e 63 6c 75 64 69 6e  EOS../* includin
0ca0: 67 20 47 45 4f 53 20 2a 2f 0a 23 69 66 64 65 66  g GEOS */.#ifdef
0cb0: 20 47 45 4f 53 5f 52 45 45 4e 54 52 41 4e 54 0a   GEOS_REENTRANT.
0cc0: 23 69 66 64 65 66 20 47 45 4f 53 5f 4f 4e 4c 59  #ifdef GEOS_ONLY
0cd0: 5f 52 45 45 4e 54 52 41 4e 54 0a 23 64 65 66 69  _REENTRANT.#defi
0ce0: 6e 65 20 47 45 4f 53 5f 55 53 45 5f 4f 4e 4c 59  ne GEOS_USE_ONLY
0cf0: 5f 52 5f 41 50 49 09 2f 2a 20 6f 6e 6c 79 20 66  _R_API./* only f
0d00: 75 6c 6c 79 20 74 68 72 65 61 64 2d 73 61 66 65  ully thread-safe
0d10: 20 47 45 4f 53 20 41 50 49 20 2a 2f 0a 23 65 6e   GEOS API */.#en
0d20: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  dif.#endif.#incl
0d30: 75 64 65 20 3c 67 65 6f 73 5f 63 2e 68 3e 0a 23  ude <geos_c.h>.#
0d40: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4f  endif..#ifndef O
0d50: 4d 49 54 5f 50 52 4f 4a 09 09 2f 2a 20 69 6e 63  MIT_PROJ../* inc
0d60: 6c 75 64 69 6e 67 20 50 52 4f 4a 2e 34 20 2a 2f  luding PROJ.4 */
0d70: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 6a 5f  .#include <proj_
0d80: 61 70 69 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  api.h>.#endif..#
0d90: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 23 64 65  ifdef _WIN32.#de
0da0: 66 69 6e 65 20 73 74 72 63 61 73 65 63 6d 70 09  fine strcasecmp.
0db0: 5f 73 74 72 69 63 6d 70 0a 23 65 6e 64 69 66 20  _stricmp.#endif 
0dc0: 2f 2a 20 6e 6f 74 20 57 49 4e 33 32 20 2a 2f 0a  /* not WIN32 */.
0dd0: 0a 2f 2a 20 36 34 20 62 69 74 20 69 6e 74 65 67  ./* 64 bit integ
0de0: 65 72 3a 20 70 6f 72 74 61 62 6c 65 20 66 6f 72  er: portable for
0df0: 6d 61 74 20 66 6f 72 20 70 72 69 6e 74 66 28 29  mat for printf()
0e00: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
0e10: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0e20: 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29  ned(__MINGW32__)
0e30: 0a 23 64 65 66 69 6e 65 20 46 52 4d 54 36 34 20  .#define FRMT64 
0e40: 22 25 49 36 34 64 22 0a 23 64 65 66 69 6e 65 20  "%I64d".#define 
0e50: 46 52 4d 54 36 34 5f 57 4f 5f 50 43 54 20 22 49  FRMT64_WO_PCT "I
0e60: 36 34 64 22 0a 23 65 6c 73 65 0a 23 64 65 66 69  64d".#else.#defi
0e70: 6e 65 20 46 52 4d 54 36 34 20 22 25 6c 6c 64 22  ne FRMT64 "%lld"
0e80: 0a 23 64 65 66 69 6e 65 20 46 52 4d 54 36 34 5f  .#define FRMT64_
0e90: 57 4f 5f 50 43 54 20 22 6c 6c 64 22 0a 23 65 6e  WO_PCT "lld".#en
0ea0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 47 41 49  dif..#define GAI
0eb0: 41 5f 55 4e 55 53 45 44 28 29 20 69 66 20 28 61  A_UNUSED() if (a
0ec0: 72 67 63 20 7c 7c 20 61 72 67 76 29 20 61 72 67  rgc || argv) arg
0ed0: 63 20 3d 20 61 72 67 63 3b 0a 0a 73 74 72 75 63  c = argc;..struc
0ee0: 74 20 67 61 69 61 5f 67 65 6f 6d 5f 63 68 61 69  t gaia_geom_chai
0ef0: 6e 5f 69 74 65 6d 0a 7b 0a 2f 2a 20 61 20 73 74  n_item.{./* a st
0f00: 72 75 63 74 20 75 73 65 64 20 74 6f 20 73 74 6f  ruct used to sto
0f10: 72 65 20 61 20 63 68 61 69 6e 20 69 74 65 6d 20  re a chain item 
0f20: 2a 2f 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  */.    gaiaGeomC
0f30: 6f 6c 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20  ollPtr geom;.   
0f40: 20 73 74 72 75 63 74 20 67 61 69 61 5f 67 65 6f   struct gaia_geo
0f50: 6d 5f 63 68 61 69 6e 5f 69 74 65 6d 20 2a 6e 65  m_chain_item *ne
0f60: 78 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 67  xt;.};..struct g
0f70: 61 69 61 5f 67 65 6f 6d 5f 63 68 61 69 6e 0a 7b  aia_geom_chain.{
0f80: 0a 2f 2a 20 61 20 73 74 72 75 63 74 20 75 73 65  ./* a struct use
0f90: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 64 79 6e  d to store a dyn
0fa0: 61 6d 69 63 20 63 68 61 69 6e 20 6f 66 20 47 65  amic chain of Ge
0fb0: 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74 69 6f 6e  ometryCollection
0fc0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 6c 6c  s */.    int all
0fd0: 5f 70 6f 6c 79 67 73 3b 0a 20 20 20 20 73 74 72  _polygs;.    str
0fe0: 75 63 74 20 67 61 69 61 5f 67 65 6f 6d 5f 63 68  uct gaia_geom_ch
0ff0: 61 69 6e 5f 69 74 65 6d 20 2a 66 69 72 73 74 3b  ain_item *first;
1000: 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61  .    struct gaia
1010: 5f 67 65 6f 6d 5f 63 68 61 69 6e 5f 69 74 65 6d  _geom_chain_item
1020: 20 2a 6c 61 73 74 3b 0a 7d 3b 0a 0a 23 69 66 6e   *last;.};..#ifn
1030: 64 65 66 20 4f 4d 49 54 5f 47 45 4f 43 41 4c 4c  def OMIT_GEOCALL
1040: 42 41 43 4b 53 09 2f 2a 20 73 75 70 70 6f 72 74  BACKS./* support
1050: 69 6e 67 20 52 54 72 65 65 20 67 65 6f 6d 65 74  ing RTree geomet
1060: 72 79 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  ry callbacks */.
1070: 73 74 72 75 63 74 20 67 61 69 61 5f 72 74 72 65  struct gaia_rtre
1080: 65 5f 6d 62 72 0a 7b 0a 2f 2a 20 61 20 73 74 72  e_mbr.{./* a str
1090: 75 63 74 20 75 73 65 64 20 62 79 20 52 2a 54 72  uct used by R*Tr
10a0: 65 65 20 47 65 6f 6d 65 74 72 79 43 61 6c 6c 62  ee GeometryCallb
10b0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 20 5b 4d  ack functions [M
10c0: 42 52 5d 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  BR] */.    doubl
10d0: 65 20 6d 69 6e 78 3b 0a 20 20 20 20 64 6f 75 62  e minx;.    doub
10e0: 6c 65 20 6d 69 6e 79 3b 0a 20 20 20 20 64 6f 75  le miny;.    dou
10f0: 62 6c 65 20 6d 61 78 78 3b 0a 20 20 20 20 64 6f  ble maxx;.    do
1100: 75 62 6c 65 20 6d 61 78 79 3b 0a 7d 3b 0a 23 65  uble maxy;.};.#e
1110: 6e 64 69 66 20 2f 2a 20 65 6e 64 20 52 54 72 65  ndif /* end RTre
1120: 65 20 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c 62  e geometry callb
1130: 61 63 6b 73 20 2a 2f 0a 0a 73 74 72 75 63 74 20  acks */..struct 
1140: 73 74 64 64 65 76 5f 73 74 72 0a 7b 0a 2f 2a 20  stddev_str.{./* 
1150: 61 20 73 74 72 75 63 74 20 74 6f 20 69 6d 70 6c  a struct to impl
1160: 65 6d 65 6e 74 20 53 74 61 6e 64 61 72 64 56 61  ement StandardVa
1170: 72 69 61 74 69 6f 6e 20 61 6e 64 20 56 61 72 69  riation and Vari
1180: 61 6e 63 65 20 61 67 67 72 65 67 61 74 65 20 66  ance aggregate f
1190: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  unctions */.    
11a0: 69 6e 74 20 63 6c 65 61 6e 65 64 3b 0a 20 20 20  int cleaned;.   
11b0: 20 64 6f 75 62 6c 65 20 6d 65 61 6e 3b 0a 20 20   double mean;.  
11c0: 20 20 64 6f 75 62 6c 65 20 71 75 6f 74 3b 0a 20    double quot;. 
11d0: 20 20 20 64 6f 75 62 6c 65 20 63 6f 75 6e 74 3b     double count;
11e0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 73 74 72 69  .};..struct stri
11f0: 6e 67 5f 6c 69 73 74 5f 73 74 72 0a 7b 0a 2f 2a  ng_list_str.{./*
1200: 20 61 20 73 74 72 75 63 74 20 73 75 70 70 6f 72   a struct suppor
1210: 74 69 6e 67 20 4d 61 6b 65 53 74 72 69 6e 67 4c  ting MakeStringL
1220: 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
1230: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68  nction */.    ch
1240: 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20  ar *string;.    
1250: 63 68 61 72 20 73 65 70 61 72 61 74 6f 72 3b 0a  char separator;.
1260: 7d 3b 0a 0a 73 74 72 75 63 74 20 66 64 6f 5f 74  };..struct fdo_t
1270: 61 62 6c 65 0a 7b 0a 2f 2a 20 61 20 73 74 72 75  able.{./* a stru
1280: 63 74 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ct to implement 
1290: 61 20 6c 69 6e 6b 65 64 2d 6c 69 73 74 20 66 6f  a linked-list fo
12a0: 72 20 46 44 4f 2d 4f 52 47 20 74 61 62 6c 65 20  r FDO-ORG table 
12b0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61  names */.    cha
12c0: 72 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 73 74  r *table;.    st
12d0: 72 75 63 74 20 66 64 6f 5f 74 61 62 6c 65 20 2a  ruct fdo_table *
12e0: 6e 65 78 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  next;.};..struct
12f0: 20 67 70 6b 67 5f 74 61 62 6c 65 0a 7b 0a 2f 2a   gpkg_table.{./*
1300: 20 61 20 73 74 72 75 63 74 20 74 6f 20 69 6d 70   a struct to imp
1310: 6c 65 6d 65 6e 74 20 61 20 6c 69 6e 6b 65 64 2d  lement a linked-
1320: 6c 69 73 74 20 66 6f 72 20 4f 47 43 20 47 65 6f  list for OGC Geo
1330: 50 61 63 6b 61 67 65 20 74 61 62 6c 65 20 6e 61  Package table na
1340: 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mes */.    char 
1350: 2a 74 61 62 6c 65 3b 0a 20 20 20 20 73 74 72 75  *table;.    stru
1360: 63 74 20 67 70 6b 67 5f 74 61 62 6c 65 20 2a 6e  ct gpkg_table *n
1370: 65 78 74 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 2a  ext;.};.../*.***
1380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 74 68 65 20  *****.**.** the 
13d0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 68  following code h
13e0: 61 73 20 62 65 65 6e 20 69 6e 74 65 67 72 61 6c  as been integral
13f0: 6c 79 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 53  ly copied from S
1400: 51 4c 69 74 65 27 73 20 6f 77 6e 20 73 6f 75 72  QLite's own sour
1410: 63 65 73 3a 0a 2a 2a 20 2d 2f 65 78 74 2f 6d 69  ces:.** -/ext/mi
1420: 73 63 2f 65 76 61 6c 2e 63 0a 2a 2f 0a 0a 2f 2a  sc/eval.c.*/../*
1430: 0a 2a 2a 20 32 30 31 34 2d 31 31 2d 31 30 0a 2a  .** 2014-11-10.*
1440: 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20  *.** The author 
1450: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
1460: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
1470: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
1480: 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 61 6c  ce of.** a legal
1490: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
14a0: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a 0a   a blessing:.**.
14b0: 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  **    May you do
14c0: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
14d0: 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  il..**    May yo
14e0: 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65  u find forgivene
14f0: 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20  ss for yourself 
1500: 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65  and forgive othe
1510: 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  rs..**    May yo
1520: 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20  u share freely, 
1530: 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72  never taking mor
1540: 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e  e than you give.
1550: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a0: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 53 51  **.**.** This SQ
15b0: 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 20 69  Lite extension i
15c0: 6d 70 6c 65 6d 65 6e 74 73 20 53 51 4c 20 66 75  mplements SQL fu
15d0: 6e 63 74 69 6f 6e 20 65 76 61 6c 28 29 20 77 68  nction eval() wh
15e0: 69 63 68 20 72 75 6e 73 0a 2a 2a 20 53 51 4c 20  ich runs.** SQL 
15f0: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 63 75 72  statements recur
1600: 73 69 76 65 6c 79 2e 0a 2a 2f 0a 0a 73 74 72 75  sively..*/..stru
1610: 63 74 20 45 76 61 6c 52 65 73 75 6c 74 0a 7b 0a  ct EvalResult.{.
1620: 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
1630: 75 73 65 64 20 74 6f 20 61 63 63 75 6d 75 6c 61  used to accumula
1640: 74 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2f  te the output.*/
1650: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 09 09 09  .    char *z;...
1660: 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 6f  /* Accumulated o
1670: 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  utput */.    con
1680: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 09 09  st char *zSep;..
1690: 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a  /* Separator */.
16a0: 20 20 20 20 69 6e 74 20 73 7a 53 65 70 3b 09 09      int szSep;..
16b0: 09 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20  ./* Size of the 
16c0: 73 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e 67  separator string
16d0: 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
16e0: 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 09 2f 2a 20   int nAlloc;./* 
16f0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1700: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b  allocated for z[
1710: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 73  ] */.    int nUs
1720: 65 64 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20  ed;.../* Number 
1730: 6f 66 20 62 79 74 65 73 20 6f 66 20 7a 5b 5d 20  of bytes of z[] 
1740: 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f  actually used */
1750: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  .};..static int.
1760: 65 76 61 6c 5f 63 61 6c 6c 62 61 63 6b 20 28 76  eval_callback (v
1770: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 61  oid *pCtx, int a
1780: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
1790: 2c 20 63 68 61 72 20 2a 2a 63 6f 6c 6e 61 6d 65  , char **colname
17a0: 73 29 0a 7b 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62  s).{./*.** Callb
17b0: 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ack from sqlite_
17c0: 65 78 65 63 28 29 20 66 6f 72 20 74 68 65 20 65  exec() for the e
17d0: 76 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  val() function..
17e0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 76  */.    struct Ev
17f0: 61 6c 52 65 73 75 6c 74 20 2a 70 20 3d 20 28 73  alResult *p = (s
1800: 74 72 75 63 74 20 45 76 61 6c 52 65 73 75 6c 74  truct EvalResult
1810: 20 2a 29 20 70 43 74 78 3b 0a 20 20 20 20 69 6e   *) pCtx;.    in
1820: 74 20 69 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f  t i;..    if (co
1830: 6c 6e 61 6d 65 73 20 3d 3d 20 4e 55 4c 4c 29 0a  lnames == NULL).
1840: 09 63 6f 6c 6e 61 6d 65 73 20 3d 20 4e 55 4c 4c  .colnames = NULL
1850: 3b 09 2f 2a 20 73 69 6c 65 6e 63 69 6e 67 20 73  ;./* silencing s
1860: 74 75 70 69 64 20 63 6f 6d 70 69 6c 65 72 20 77  tupid compiler w
1870: 61 72 6e 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  arnings */..    
1880: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
1890: 61 72 67 63 3b 20 69 2b 2b 29 0a 20 20 20 20 20  argc; i++).     
18a0: 20 7b 0a 09 20 20 63 6f 6e 73 74 20 63 68 61 72   {..  const char
18b0: 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 20 3f 20   *z = argv[i] ? 
18c0: 61 72 67 76 5b 69 5d 20 3a 20 22 22 3b 0a 09 20  argv[i] : "";.. 
18d0: 20 73 69 7a 65 5f 74 20 73 7a 20 3d 20 73 74 72   size_t sz = str
18e0: 6c 65 6e 20 28 7a 29 3b 0a 09 20 20 69 66 20 28  len (z);..  if (
18f0: 73 7a 20 2b 20 70 2d 3e 6e 55 73 65 64 20 2b 20  sz + p->nUsed + 
1900: 70 2d 3e 73 7a 53 65 70 20 2b 20 31 20 3e 20 70  p->szSep + 1 > p
1910: 2d 3e 6e 41 6c 6c 6f 63 29 0a 09 20 20 20 20 7b  ->nAlloc)..    {
1920: 0a 09 09 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 09  ...char *zNew;..
1930: 09 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  .p->nAlloc = p->
1940: 6e 41 6c 6c 6f 63 20 2a 20 32 20 2b 20 73 7a 20  nAlloc * 2 + sz 
1950: 2b 20 70 2d 3e 73 7a 53 65 70 20 2b 20 31 3b 0a  + p->szSep + 1;.
1960: 09 09 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  ..zNew = sqlite3
1970: 5f 72 65 61 6c 6c 6f 63 20 28 70 2d 3e 7a 2c 20  _realloc (p->z, 
1980: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 09 09 69 66  p->nAlloc);...if
1990: 20 28 7a 4e 65 77 20 3d 3d 20 30 29 0a 09 09 20   (zNew == 0)... 
19a0: 20 7b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74   {...      sqlit
19b0: 65 33 5f 66 72 65 65 20 28 70 2d 3e 7a 29 3b 0a  e3_free (p->z);.
19c0: 09 09 20 20 20 20 20 20 6d 65 6d 73 65 74 20 28  ..      memset (
19d0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 20 28 2a 70  p, 0, sizeof (*p
19e0: 29 29 3b 0a 09 09 20 20 20 20 20 20 72 65 74 75  ));...      retu
19f0: 72 6e 20 31 3b 0a 09 09 20 20 7d 0a 09 09 70 2d  rn 1;...  }...p-
1a00: 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 09 20 20 20 20  >z = zNew;..    
1a10: 7d 0a 09 20 20 69 66 20 28 70 2d 3e 6e 55 73 65  }..  if (p->nUse
1a20: 64 20 3e 20 30 29 0a 09 20 20 20 20 7b 0a 09 09  d > 0)..    {...
1a30: 6d 65 6d 63 70 79 20 28 26 70 2d 3e 7a 5b 70 2d  memcpy (&p->z[p-
1a40: 3e 6e 55 73 65 64 5d 2c 20 70 2d 3e 7a 53 65 70  >nUsed], p->zSep
1a50: 2c 20 70 2d 3e 73 7a 53 65 70 29 3b 0a 09 09 70  , p->szSep);...p
1a60: 2d 3e 6e 55 73 65 64 20 2b 3d 20 70 2d 3e 73 7a  ->nUsed += p->sz
1a70: 53 65 70 3b 0a 09 20 20 20 20 7d 0a 09 20 20 6d  Sep;..    }..  m
1a80: 65 6d 63 70 79 20 28 26 70 2d 3e 7a 5b 70 2d 3e  emcpy (&p->z[p->
1a90: 6e 55 73 65 64 5d 2c 20 7a 2c 20 73 7a 29 3b 0a  nUsed], z, sz);.
1aa0: 09 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 73  .  p->nUsed += s
1ab0: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  z;.      }.    r
1ac0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
1ad0: 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 45 76 61  ic void.fnct_Eva
1ae0: 6c 46 75 6e 63 20 28 73 71 6c 69 74 65 33 5f 63  lFunc (sqlite3_c
1af0: 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
1b00: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
1b10: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
1b20: 76 29 0a 7b 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  v).{./*.** Imple
1b30: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1b40: 20 65 76 61 6c 28 58 29 20 61 6e 64 20 65 76 61   eval(X) and eva
1b50: 6c 28 58 2c 59 29 20 53 51 4c 20 66 75 6e 63 74  l(X,Y) SQL funct
1b60: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 61 6c  ions..**.** Eval
1b70: 75 61 74 65 20 74 68 65 20 53 51 4c 20 74 65 78  uate the SQL tex
1b80: 74 20 69 6e 20 58 2e 20 20 52 65 74 75 72 6e 20  t in X.  Return 
1b90: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 75 73 69  the results, usi
1ba0: 6e 67 20 73 74 72 69 6e 67 0a 2a 2a 20 59 20 61  ng string.** Y a
1bb0: 73 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e  s the separator.
1bc0: 20 20 49 66 20 59 20 69 73 20 6f 6d 69 74 74 65    If Y is omitte
1bd0: 64 2c 20 75 73 65 20 61 20 73 69 6e 67 6c 65 20  d, use a single 
1be0: 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 2e  space character.
1bf0: 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  .*/.    const ch
1c00: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71  ar *zSql;.    sq
1c10: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 63  lite3 *db;.    c
1c20: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
1c30: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
1c40: 74 72 75 63 74 20 45 76 61 6c 52 65 73 75 6c 74  truct EvalResult
1c50: 20 78 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 20   x;..    memset 
1c60: 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 20 28  (&x, 0, sizeof (
1c70: 78 29 29 3b 0a 20 20 20 20 78 2e 7a 53 65 70 20  x));.    x.zSep 
1c80: 3d 20 22 20 22 3b 0a 20 20 20 20 7a 53 71 6c 20  = " ";.    zSql 
1c90: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
1ca0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1cb0: 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
1cc0: 20 20 20 69 66 20 28 7a 53 71 6c 20 3d 3d 20 30     if (zSql == 0
1cd0: 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 69  )..return;.    i
1ce0: 66 20 28 61 72 67 63 20 3e 20 31 29 0a 20 20 20  f (argc > 1).   
1cf0: 20 20 20 7b 0a 09 20 20 78 2e 7a 53 65 70 20 3d     {..  x.zSep =
1d00: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
1d10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1d20: 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  xt (argv[1]);.. 
1d30: 20 69 66 20 28 78 2e 7a 53 65 70 20 3d 3d 20 30   if (x.zSep == 0
1d40: 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b  )..      return;
1d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 78 2e 73  .      }.    x.s
1d60: 7a 53 65 70 20 3d 20 28 69 6e 74 29 20 73 74 72  zSep = (int) str
1d70: 6c 65 6e 20 28 78 2e 7a 53 65 70 29 3b 0a 20 20  len (x.zSep);.  
1d80: 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63    db = sqlite3_c
1d90: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
1da0: 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
1db0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1dc0: 63 20 28 64 62 2c 20 7a 53 71 6c 2c 20 65 76 61  c (db, zSql, eva
1dd0: 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20  l_callback, &x, 
1de0: 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 20 28  &zErr);.    if (
1df0: 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  rc != SQLITE_OK)
1e00: 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
1e10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1e20: 20 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c   (context, zErr,
1e30: 20 2d 31 29 3b 0a 09 20 20 73 71 6c 69 74 65 33   -1);..  sqlite3
1e40: 5f 66 72 65 65 20 28 7a 45 72 72 29 3b 0a 20 20  _free (zErr);.  
1e50: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
1e60: 66 20 28 78 2e 7a 53 65 70 20 3d 3d 20 30 29 0a  f (x.zSep == 0).
1e70: 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
1e80: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
1e90: 6e 6f 6d 65 6d 20 28 63 6f 6e 74 65 78 74 29 3b  nomem (context);
1ea0: 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
1eb0: 20 28 78 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a   (x.z);.      }.
1ec0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
1ed0: 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
1ee0: 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74  lt_text (context
1ef0: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
1f00: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
1f10: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
1f20: 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70 61 74 69   void.fnct_spati
1f30: 61 6c 69 74 65 5f 76 65 72 73 69 6f 6e 20 28 73  alite_version (s
1f40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1f50: 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
1f60: 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65 33 5f  gc,.... sqlite3_
1f70: 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
1f80: 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
1f90: 3a 0a 2f 20 73 70 61 74 69 61 6c 69 74 65 5f 76  :./ spatialite_v
1fa0: 65 72 73 69 6f 6e 28 29 0a 2f 0a 2f 20 72 65 74  ersion()././ ret
1fb0: 75 72 6e 20 61 20 74 65 78 74 20 73 74 72 69 6e  urn a text strin
1fc0: 67 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  g representing t
1fd0: 68 65 20 63 75 72 72 65 6e 74 20 53 70 61 74 69  he current Spati
1fe0: 61 4c 69 74 65 20 76 65 72 73 69 6f 6e 0a 2a 2f  aLite version.*/
1ff0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
2000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 5f    const char *p_
2010: 72 65 73 75 6c 74 20 3d 20 73 70 61 74 69 61 6c  result = spatial
2020: 69 74 65 5f 76 65 72 73 69 6f 6e 20 28 29 3b 0a  ite_version ();.
2030: 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
2040: 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
2050: 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 6c 65  L_LINE */.    le
2060: 6e 20 3d 20 73 74 72 6c 65 6e 20 28 70 5f 72 65  n = strlen (p_re
2070: 73 75 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  sult);.    sqlit
2080: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28  e3_result_text (
2090: 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
20a0: 74 2c 20 6c 65 6e 2c 20 53 51 4c 49 54 45 5f 54  t, len, SQLITE_T
20b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 73 74  RANSIENT);.}..st
20c0: 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73  atic void.fnct_s
20d0: 70 61 74 69 61 6c 69 74 65 5f 74 61 72 67 65 74  patialite_target
20e0: 5f 63 70 75 20 28 73 71 6c 69 74 65 33 5f 63 6f  _cpu (sqlite3_co
20f0: 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
2100: 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20   int argc,....  
2110: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2120: 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
2130: 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 73 70  L function:./ sp
2140: 61 74 69 61 6c 69 74 65 5f 74 61 72 67 65 74 5f  atialite_target_
2150: 63 70 75 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  cpu()././ return
2160: 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 72   a text string r
2170: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
2180: 63 75 72 72 65 6e 74 20 53 70 61 74 69 61 4c 69  current SpatiaLi
2190: 74 65 20 54 61 72 67 65 74 20 43 50 55 0a 2a 2f  te Target CPU.*/
21a0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
21b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 5f    const char *p_
21c0: 72 65 73 75 6c 74 20 3d 20 73 70 61 74 69 61 6c  result = spatial
21d0: 69 74 65 5f 74 61 72 67 65 74 5f 63 70 75 20 28  ite_target_cpu (
21e0: 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
21f0: 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
2200: 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
2210: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 70   len = strlen (p
2220: 5f 72 65 73 75 6c 74 29 3b 0a 20 20 20 20 73 71  _result);.    sq
2230: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
2240: 74 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  t (context, p_re
2250: 73 75 6c 74 2c 20 6c 65 6e 2c 20 53 51 4c 49 54  sult, len, SQLIT
2260: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
2270: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
2280: 74 5f 66 72 65 65 78 6c 5f 76 65 72 73 69 6f 6e  t_freexl_version
2290: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
22a0: 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
22b0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
22c0: 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
22d0: 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
22e0: 0a 2f 20 66 72 65 65 78 6c 5f 76 65 72 73 69 6f  ./ freexl_versio
22f0: 6e 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 61  n()././ return a
2300: 20 74 65 78 74 20 73 74 72 69 6e 67 20 72 65 70   text string rep
2310: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 63 75  resenting the cu
2320: 72 72 65 6e 74 20 46 72 65 65 58 4c 20 76 65 72  rrent FreeXL ver
2330: 73 69 6f 6e 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  sion./ or NULL i
2340: 66 20 46 72 65 65 58 4c 20 69 73 20 63 75 72 72  f FreeXL is curr
2350: 65 6e 74 6c 79 20 75 6e 73 75 70 70 6f 72 74 65  ently unsupporte
2360: 64 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 4d  d.*/..#ifndef OM
2370: 49 54 5f 46 52 45 45 58 4c 09 09 2f 2a 20 46 72  IT_FREEXL../* Fr
2380: 65 65 58 4c 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  eeXL version */.
2390: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
23a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 5f 72   const char *p_r
23b0: 65 73 75 6c 74 20 3d 20 66 72 65 65 78 6c 5f 76  esult = freexl_v
23c0: 65 72 73 69 6f 6e 20 28 29 3b 0a 20 20 20 20 47  ersion ();.    G
23d0: 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
23e0: 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
23f0: 45 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 73  E */.    len = s
2400: 74 72 6c 65 6e 20 28 70 5f 72 65 73 75 6c 74 29  trlen (p_result)
2410: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
2420: 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
2430: 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
2440: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
2450: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
2460: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
2470: 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 23  ull (context);.#
2480: 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20  endif.}..static 
2490: 76 6f 69 64 0a 66 6e 63 74 5f 67 65 6f 73 5f 76  void.fnct_geos_v
24a0: 65 72 73 69 6f 6e 20 28 73 71 6c 69 74 65 33 5f  ersion (sqlite3_
24b0: 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
24c0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
24d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
24e0: 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
24f0: 63 74 69 6f 6e 3a 0a 2f 20 67 65 6f 73 5f 76 65  ction:./ geos_ve
2500: 72 73 69 6f 6e 28 29 0a 2f 0a 2f 20 72 65 74 75  rsion()././ retu
2510: 72 6e 20 61 20 74 65 78 74 20 73 74 72 69 6e 67  rn a text string
2520: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
2530: 65 20 63 75 72 72 65 6e 74 20 47 45 4f 53 20 76  e current GEOS v
2540: 65 72 73 69 6f 6e 0a 2f 20 6f 72 20 4e 55 4c 4c  ersion./ or NULL
2550: 20 69 66 20 47 45 4f 53 20 69 73 20 63 75 72 72   if GEOS is curr
2560: 65 6e 74 6c 79 20 75 6e 73 75 70 70 6f 72 74 65  ently unsupporte
2570: 64 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 4d  d.*/..#ifndef OM
2580: 49 54 5f 47 45 4f 53 09 09 2f 2a 20 47 45 4f 53  IT_GEOS../* GEOS
2590: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20   version */.    
25a0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e  int len;.    con
25b0: 73 74 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  st char *p_resul
25c0: 74 20 3d 20 47 45 4f 53 76 65 72 73 69 6f 6e 20  t = GEOSversion 
25d0: 28 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  ();.    GAIA_UNU
25e0: 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
25f0: 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
2600: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28    len = strlen (
2610: 70 5f 72 65 73 75 6c 74 29 3b 0a 20 20 20 20 73  p_result);.    s
2620: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
2630: 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  xt (context, p_r
2640: 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 53 51 4c 49  esult, len, SQLI
2650: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
2660: 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
2670: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
2680: 6e 74 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  ntext);.#endif.}
2690: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
26a0: 63 74 5f 70 72 6f 6a 34 5f 76 65 72 73 69 6f 6e  ct_proj4_version
26b0: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
26c0: 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
26d0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
26e0: 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
26f0: 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
2700: 0a 2f 20 70 72 6f 6a 34 5f 76 65 72 73 69 6f 6e  ./ proj4_version
2710: 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 61 20  ()././ return a 
2720: 74 65 78 74 20 73 74 72 69 6e 67 20 72 65 70 72  text string repr
2730: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 63 75 72  esenting the cur
2740: 72 65 6e 74 20 50 52 4f 4a 2e 34 20 76 65 72 73  rent PROJ.4 vers
2750: 69 6f 6e 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ion./ or NULL if
2760: 20 50 52 4f 4a 2e 34 20 69 73 20 63 75 72 72 65   PROJ.4 is curre
2770: 6e 74 6c 79 20 75 6e 73 75 70 70 6f 72 74 65 64  ntly unsupported
2780: 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49  .*/..#ifndef OMI
2790: 54 5f 50 52 4f 4a 09 09 2f 2a 20 50 52 4f 4a 2e  T_PROJ../* PROJ.
27a0: 34 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20  4 version */.   
27b0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
27c0: 6e 73 74 20 63 68 61 72 20 2a 70 5f 72 65 73 75  nst char *p_resu
27d0: 6c 74 20 3d 20 70 6a 5f 67 65 74 5f 72 65 6c 65  lt = pj_get_rele
27e0: 61 73 65 20 28 29 3b 0a 20 20 20 20 47 41 49 41  ase ();.    GAIA
27f0: 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
2800: 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
2810: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  /.    len = strl
2820: 65 6e 20 28 70 5f 72 65 73 75 6c 74 29 3b 0a 20  en (p_result);. 
2830: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2840: 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c  t_text (context,
2850: 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
2860: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
2870: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
2880: 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
2890: 20 28 63 6f 6e 74 65 78 74 29 3b 0a 23 65 6e 64   (context);.#end
28a0: 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  if.}..static voi
28b0: 64 0a 66 6e 63 74 5f 68 61 73 5f 70 72 6f 6a 20  d.fnct_has_proj 
28c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
28d0: 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
28e0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
28f0: 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
2900: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
2910: 2f 20 48 61 73 50 72 6f 6a 28 29 0a 2f 0a 2f 20  / HasProj()././ 
2920: 72 65 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c  return 1 if buil
2930: 74 20 69 6e 63 6c 75 64 69 6e 67 20 50 72 6f 6a  t including Proj
2940: 2e 34 3b 20 6f 74 68 65 72 77 69 73 65 20 30 0a  .4; otherwise 0.
2950: 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  */.    GAIA_UNUS
2960: 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
2970: 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66  EXCL_LINE */.#if
2980: 6e 64 65 66 20 4f 4d 49 54 5f 50 52 4f 4a 0a 23  ndef OMIT_PROJ.#
2990: 69 66 20 64 65 66 69 6e 65 64 28 50 4a 5f 56 45  if defined(PJ_VE
29a0: 52 53 49 4f 4e 29 20 26 26 20 50 4a 5f 56 45 52  RSION) && PJ_VER
29b0: 53 49 4f 4e 20 3e 3d 20 34 39 30 0a 20 20 20 20  SION >= 490.    
29c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
29d0: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  nt (context, 1);
29e0: 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
29f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
2a00: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65 6e 64  ontext, 0);.#end
2a10: 69 66 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  if.#else.    sql
2a20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
2a30: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65  (context, 0);.#e
2a40: 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ndif.}..static v
2a50: 6f 69 64 0a 66 6e 63 74 5f 68 61 73 5f 70 72 6f  oid.fnct_has_pro
2a60: 6a 5f 67 65 6f 64 65 73 69 63 20 28 73 71 6c 69  j_geodesic (sqli
2a70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
2a80: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2a90: 0a 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75  ....sqlite3_valu
2aa0: 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
2ab0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
2ac0: 48 61 73 50 72 6f 6a 47 65 6f 64 65 73 69 63 28  HasProjGeodesic(
2ad0: 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 31 20 69  )././ return 1 i
2ae0: 66 20 62 75 69 6c 74 20 73 75 70 70 6f 72 74 69  f built supporti
2af0: 6e 67 20 50 72 6f 6a 2e 34 20 47 65 6f 64 65 73  ng Proj.4 Geodes
2b00: 69 63 3b 20 6f 74 68 65 72 77 69 73 65 20 30 0a  ic; otherwise 0.
2b10: 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  */.    GAIA_UNUS
2b20: 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
2b30: 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66  EXCL_LINE */.#if
2b40: 6e 64 65 66 20 4f 4d 49 54 5f 50 52 4f 4a 09 09  ndef OMIT_PROJ..
2b50: 2f 2a 20 50 52 4f 4a 2e 34 20 69 73 20 73 75 70  /* PROJ.4 is sup
2b60: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ported */.    sq
2b70: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2b80: 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23   (context, 1);.#
2b90: 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
2ba0: 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
2bb0: 74 65 78 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66  text, 0);.#endif
2bc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
2bd0: 66 6e 63 74 5f 68 61 73 5f 67 65 6f 73 20 28 73  fnct_has_geos (s
2be0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2bf0: 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
2c00: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
2c10: 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
2c20: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
2c30: 48 61 73 47 65 6f 73 28 29 0a 2f 0a 2f 20 72 65  HasGeos()././ re
2c40: 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c 74 20  turn 1 if built 
2c50: 69 6e 63 6c 75 64 69 6e 67 20 47 45 4f 53 3b 20  including GEOS; 
2c60: 6f 74 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a 20  otherwise 0.*/. 
2c70: 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
2c80: 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
2c90: 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 6e 64 65 66  _LINE */.#ifndef
2ca0: 20 4f 4d 49 54 5f 47 45 4f 53 09 09 2f 2a 20 47   OMIT_GEOS../* G
2cb0: 45 4f 53 20 69 73 20 73 75 70 70 6f 72 74 65 64  EOS is supported
2cc0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2cd0: 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
2ce0: 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73 65 0a 20  ext, 1);.#else. 
2cf0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2d00: 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
2d10: 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 74  0);.#endif.}..st
2d20: 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 68  atic void.fnct_h
2d30: 61 73 5f 67 65 6f 73 5f 61 64 76 61 6e 63 65 64  as_geos_advanced
2d40: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
2d50: 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
2d60: 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65   argc,....sqlite
2d70: 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
2d80: 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
2d90: 6f 6e 3a 0a 2f 20 48 61 73 47 65 6f 73 41 64 76  on:./ HasGeosAdv
2da0: 61 6e 63 65 64 28 29 0a 2f 0a 2f 20 72 65 74 75  anced()././ retu
2db0: 72 6e 20 31 20 69 66 20 62 75 69 6c 74 20 69 6e  rn 1 if built in
2dc0: 63 6c 75 64 69 6e 67 20 47 45 4f 53 2d 41 44 56  cluding GEOS-ADV
2dd0: 41 4e 43 45 44 3b 20 6f 74 68 65 72 77 69 73 65  ANCED; otherwise
2de0: 20 30 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55   0.*/.    GAIA_U
2df0: 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
2e00: 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
2e10: 23 69 66 64 65 66 20 47 45 4f 53 5f 41 44 56 41  #ifdef GEOS_ADVA
2e20: 4e 43 45 44 09 09 2f 2a 20 47 45 4f 53 2d 41 44  NCED../* GEOS-AD
2e30: 56 41 4e 43 45 44 20 69 73 20 73 75 70 70 6f 72  VANCED is suppor
2e40: 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
2e50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
2e60: 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73  ontext, 1);.#els
2e70: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  e.    sqlite3_re
2e80: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
2e90: 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  t, 0);.#endif.}.
2ea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
2eb0: 74 5f 68 61 73 5f 67 65 6f 73 5f 74 72 75 6e 6b  t_has_geos_trunk
2ec0: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
2ed0: 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
2ee0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2ef0: 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
2f00: 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
2f10: 0a 2f 20 48 61 73 47 65 6f 73 54 72 75 6e 6b 28  ./ HasGeosTrunk(
2f20: 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 31 20 69  )././ return 1 i
2f30: 66 20 62 75 69 6c 74 20 69 6e 63 6c 75 64 69 6e  f built includin
2f40: 67 20 47 45 4f 53 2d 54 52 55 4e 4b 3b 20 6f 74  g GEOS-TRUNK; ot
2f50: 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a 20 20 20  herwise 0.*/.   
2f60: 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
2f70: 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
2f80: 49 4e 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  INE */.    sqlit
2f90: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
2fa0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 73  ontext, 0);.}..s
2fb0: 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
2fc0: 68 61 73 5f 67 65 6f 73 5f 72 65 65 6e 74 72 61  has_geos_reentra
2fd0: 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nt (sqlite3_cont
2fe0: 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
2ff0: 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 73 71 6c  nt argc,.... sql
3000: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
3010: 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
3020: 63 74 69 6f 6e 3a 0a 2f 20 48 61 73 47 65 6f 73  ction:./ HasGeos
3030: 52 65 65 6e 74 72 61 6e 74 28 29 0a 2f 0a 2f 20  Reentrant()././ 
3040: 72 65 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c  return 1 if buil
3050: 74 20 69 6e 63 6c 75 64 69 6e 67 20 47 45 4f 53  t including GEOS
3060: 2d 52 45 45 4e 54 52 41 4e 54 3b 20 6f 74 68 65  -REENTRANT; othe
3070: 72 77 69 73 65 20 30 0a 2a 2f 0a 20 20 20 20 47  rwise 0.*/.    G
3080: 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
3090: 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
30a0: 45 20 2a 2f 0a 23 69 66 64 65 66 20 47 45 4f 53  E */.#ifdef GEOS
30b0: 5f 52 45 45 4e 54 52 41 4e 54 09 09 2f 2a 20 47  _REENTRANT../* G
30c0: 45 4f 53 2d 52 45 45 4e 54 52 41 4e 54 20 69 73  EOS-REENTRANT is
30d0: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
30e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
30f0: 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31  _int (context, 1
3100: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
3110: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
3120: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65  (context, 0);.#e
3130: 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ndif.}..static v
3140: 6f 69 64 0a 66 6e 63 74 5f 68 61 73 5f 67 65 6f  oid.fnct_has_geo
3150: 73 5f 6f 6e 6c 79 5f 72 65 65 6e 74 72 61 6e 74  s_only_reentrant
3160: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
3170: 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
3180: 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20 20   argc,....      
3190: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
31a0: 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
31b0: 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48 61 73 47  function:./ HasG
31c0: 65 6f 73 4f 6e 6c 79 52 65 65 6e 74 72 61 6e 74  eosOnlyReentrant
31d0: 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 31 20  ()././ return 1 
31e0: 69 66 20 62 75 69 6c 74 20 69 6e 63 6c 75 64 69  if built includi
31f0: 6e 67 20 47 45 4f 53 2d 4f 4e 4c 59 5f 52 45 45  ng GEOS-ONLY_REE
3200: 4e 54 52 41 4e 54 3b 20 6f 74 68 65 72 77 69 73  NTRANT; otherwis
3210: 65 20 30 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f  e 0.*/.    GAIA_
3220: 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
3230: 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
3240: 0a 23 69 66 64 65 66 20 47 45 4f 53 5f 52 45 45  .#ifdef GEOS_REE
3250: 4e 54 52 41 4e 54 09 09 2f 2a 20 47 45 4f 53 2d  NTRANT../* GEOS-
3260: 52 45 45 4e 54 52 41 4e 54 20 69 73 20 73 75 70  REENTRANT is sup
3270: 70 6f 72 74 65 64 20 2a 2f 0a 23 69 66 64 65 66  ported */.#ifdef
3280: 20 47 45 4f 53 5f 4f 4e 4c 59 5f 52 45 45 4e 54   GEOS_ONLY_REENT
3290: 52 41 4e 54 09 2f 2a 20 47 45 4f 53 2d 4f 4e 4c  RANT./* GEOS-ONL
32a0: 59 2d 52 45 45 4e 54 52 41 4e 54 20 69 73 20 73  Y-REENTRANT is s
32b0: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
32c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
32d0: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  nt (context, 1);
32e0: 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
32f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
3300: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65 6e 64  ontext, 0);.#end
3310: 69 66 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  if.#else.    sql
3320: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
3330: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65  (context, 0);.#e
3340: 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ndif.}..static v
3350: 6f 69 64 0a 66 6e 63 74 5f 72 74 74 6f 70 6f 5f  oid.fnct_rttopo_
3360: 76 65 72 73 69 6f 6e 20 28 73 71 6c 69 74 65 33  version (sqlite3
3370: 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
3380: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
3390: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
33a0: 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
33b0: 6e 63 74 69 6f 6e 3a 0a 2f 20 72 74 74 6f 70 6f  nction:./ rttopo
33c0: 5f 76 65 72 73 69 6f 6e 28 29 0a 2f 0a 2f 20 72  _version()././ r
33d0: 65 74 75 72 6e 20 61 20 74 65 78 74 20 73 74 72  eturn a text str
33e0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ing representing
33f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 52 54 54   the current RTT
3400: 4f 50 4f 20 76 65 72 73 69 6f 6e 0a 2f 20 6f 72  OPO version./ or
3410: 20 4e 55 4c 4c 20 69 66 20 52 54 54 4f 50 4f 20   NULL if RTTOPO 
3420: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 73  is currently uns
3430: 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 0a 23 69 66  upported.*/..#if
3440: 64 65 66 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50  def ENABLE_RTTOP
3450: 4f 09 09 2f 2a 20 52 54 54 4f 50 4f 20 76 65 72  O../* RTTOPO ver
3460: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
3470: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
3480: 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
3490: 73 70 6c 69 74 65 5f 72 74 74 6f 70 6f 5f 76 65  splite_rttopo_ve
34a0: 72 73 69 6f 6e 20 28 29 3b 0a 20 20 20 20 47 41  rsion ();.    GA
34b0: 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
34c0: 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
34d0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74   */.    len = st
34e0: 72 6c 65 6e 20 28 70 5f 72 65 73 75 6c 74 29 3b  rlen (p_result);
34f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
3500: 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
3510: 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
3520: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
3530: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 47  NT);.#else.    G
3540: 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
3550: 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
3560: 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  E */.    sqlite3
3570: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
3580: 6e 74 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  ntext);.#endif.}
3590: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
35a0: 63 74 5f 6c 69 62 78 6d 6c 32 5f 76 65 72 73 69  ct_libxml2_versi
35b0: 6f 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  on (sqlite3_cont
35c0: 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
35d0: 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20  nt argc,...     
35e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
35f0: 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
3600: 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 6c 69 62   function:./ lib
3610: 78 6d 6c 32 5f 76 65 72 73 69 6f 6e 28 29 0a 2f  xml2_version()./
3620: 0a 2f 20 72 65 74 75 72 6e 20 61 20 74 65 78 74  ./ return a text
3630: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
3640: 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
3650: 20 4c 49 42 58 4d 4c 32 20 76 65 72 73 69 6f 6e   LIBXML2 version
3660: 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 4c 49  ./ or NULL if LI
3670: 42 58 4d 4c 32 20 69 73 20 63 75 72 72 65 6e 74  BXML2 is current
3680: 6c 79 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a  ly unsupported.*
3690: 2f 0a 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45  /..#ifdef ENABLE
36a0: 5f 4c 49 42 58 4d 4c 32 09 09 2f 2a 20 4c 49 42  _LIBXML2../* LIB
36b0: 58 4d 4c 32 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  XML2 version */.
36c0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
36d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 5f 72   const char *p_r
36e0: 65 73 75 6c 74 20 3d 20 67 61 69 61 5f 6c 69 62  esult = gaia_lib
36f0: 78 6d 6c 32 5f 76 65 72 73 69 6f 6e 20 28 29 3b  xml2_version ();
3700: 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
3710: 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
3720: 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 6c  CL_LINE */.    l
3730: 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 70 5f 72  en = strlen (p_r
3740: 65 73 75 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  esult);.    sqli
3750: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20  te3_result_text 
3760: 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
3770: 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
3780: 23 65 6c 73 65 0a 20 20 20 20 47 41 49 41 5f 55  #else.    GAIA_U
3790: 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
37a0: 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
37b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
37c0: 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
37d0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 74 61  );.#endif.}..sta
37e0: 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 68 61  tic void.fnct_ha
37f0: 73 5f 72 74 74 6f 70 6f 20 28 73 71 6c 69 74 65  s_rttopo (sqlite
3800: 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
3810: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
3820: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
3830: 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
3840: 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48 61 73 52 74  unction:./ HasRt
3850: 54 6f 70 6f 28 29 0a 2f 0a 2f 20 72 65 74 75 72  Topo()././ retur
3860: 6e 20 31 20 69 66 20 62 75 69 6c 74 20 69 6e 63  n 1 if built inc
3870: 6c 75 64 69 6e 67 20 52 54 54 4f 50 4f 3b 20 6f  luding RTTOPO; o
3880: 74 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a 20 20  therwise 0.*/.  
3890: 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
38a0: 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
38b0: 4c 49 4e 45 20 2a 2f 0a 23 69 66 64 65 66 20 45  LINE */.#ifdef E
38c0: 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09 09 2f 2a  NABLE_RTTOPO../*
38d0: 20 52 54 54 4f 50 4f 20 69 73 20 73 75 70 70 6f   RTTOPO is suppo
38e0: 72 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  rted */.    sqli
38f0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
3900: 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c  context, 1);.#el
3910: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  se.    sqlite3_r
3920: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
3930: 78 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d  xt, 0);.#endif.}
3940: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
3950: 63 74 5f 68 61 73 5f 69 63 6f 6e 76 20 28 73 71  ct_has_iconv (sq
3960: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
3970: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
3980: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
3990: 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
39a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48  QL function:./ H
39b0: 61 73 49 63 6f 6e 76 28 29 0a 2f 0a 2f 20 72 65  asIconv()././ re
39c0: 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c 74 20  turn 1 if built 
39d0: 69 6e 63 6c 75 64 69 6e 67 20 49 43 4f 4e 56 3b  including ICONV;
39e0: 20 6f 74 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a   otherwise 0.*/.
39f0: 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
3a00: 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
3a10: 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 6e 64 65  L_LINE */.#ifnde
3a20: 66 20 4f 4d 49 54 5f 49 43 4f 4e 56 09 09 2f 2a  f OMIT_ICONV../*
3a30: 20 49 43 4f 4e 56 20 69 73 20 73 75 70 70 6f 72   ICONV is suppor
3a40: 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
3a50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
3a60: 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73  ontext, 1);.#els
3a70: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  e.    sqlite3_re
3a80: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
3a90: 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  t, 0);.#endif.}.
3aa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
3ab0: 74 5f 68 61 73 5f 6d 61 74 68 5f 73 71 6c 20 28  t_has_math_sql (
3ac0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3ad0: 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
3ae0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
3af0: 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
3b00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
3b10: 20 48 61 73 4d 61 74 68 53 71 6c 28 29 0a 2f 0a   HasMathSql()./.
3b20: 2f 20 72 65 74 75 72 6e 20 31 20 69 66 20 62 75  / return 1 if bu
3b30: 69 6c 74 20 69 6e 63 6c 75 64 69 6e 67 20 4d 41  ilt including MA
3b40: 54 48 53 51 4c 3b 20 6f 74 68 65 72 77 69 73 65  THSQL; otherwise
3b50: 20 30 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55   0.*/.    GAIA_U
3b60: 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
3b70: 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
3b80: 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 4d 41 54  #ifndef OMIT_MAT
3b90: 48 53 51 4c 09 09 2f 2a 20 4d 41 54 48 53 51 4c  HSQL../* MATHSQL
3ba0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   is supported */
3bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
3bc0: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
3bd0: 2c 20 31 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 1);.#else.    
3be0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3bf0: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
3c00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69  .#endif.}..stati
3c10: 63 20 76 6f 69 64 0a 66 6e 63 74 5f 68 61 73 5f  c void.fnct_has_
3c20: 67 65 6f 5f 63 61 6c 6c 62 61 63 6b 73 20 28 73  geo_callbacks (s
3c30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3c40: 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
3c50: 67 63 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 76  gc,....sqlite3_v
3c60: 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
3c70: 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
3c80: 0a 2f 20 48 61 73 47 65 6f 43 61 6c 6c 62 61 63  ./ HasGeoCallbac
3c90: 6b 73 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20  ks()././ return 
3ca0: 31 20 69 66 20 62 75 69 6c 74 20 65 6e 61 62 6c  1 if built enabl
3cb0: 69 6e 67 20 47 45 4f 43 41 4c 4c 42 41 43 4b 53  ing GEOCALLBACKS
3cc0: 3b 20 6f 74 68 65 72 77 69 73 65 20 30 0a 2a 2f  ; otherwise 0.*/
3cd0: 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
3ce0: 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
3cf0: 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 6e 64  CL_LINE */.#ifnd
3d00: 65 66 20 4f 4d 49 54 5f 47 45 4f 43 41 4c 4c 42  ef OMIT_GEOCALLB
3d10: 41 43 4b 53 09 2f 2a 20 47 45 4f 2d 43 41 4c 4c  ACKS./* GEO-CALL
3d20: 42 41 43 4b 53 20 61 72 65 20 73 75 70 70 6f 72  BACKS are suppor
3d30: 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
3d40: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
3d50: 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73  ontext, 1);.#els
3d60: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  e.    sqlite3_re
3d70: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
3d80: 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  t, 0);.#endif.}.
3d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
3da0: 74 5f 68 61 73 5f 66 72 65 65 58 4c 20 28 73 71  t_has_freeXL (sq
3db0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
3dc0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
3dd0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
3de0: 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
3df0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48  QL function:./ H
3e00: 61 73 46 72 65 65 58 4c 28 29 0a 2f 0a 2f 20 72  asFreeXL()././ r
3e10: 65 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c 74  eturn 1 if built
3e20: 20 69 6e 63 6c 75 64 69 6e 67 20 46 72 65 65 58   including FreeX
3e30: 4c 3b 20 6f 74 68 65 72 77 69 73 65 20 30 0a 2a  L; otherwise 0.*
3e40: 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  /.    GAIA_UNUSE
3e50: 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
3e60: 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 6e  XCL_LINE */.#ifn
3e70: 64 65 66 20 4f 4d 49 54 5f 46 52 45 45 58 4c 09  def OMIT_FREEXL.
3e80: 09 2f 2a 20 46 72 65 65 58 4c 20 69 73 20 73 75  ./* FreeXL is su
3e90: 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 73  pported */.    s
3ea0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3eb0: 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
3ec0: 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
3ed0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
3ee0: 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65 6e 64 69  ntext, 0);.#endi
3ef0: 66 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  f.}..static void
3f00: 0a 66 6e 63 74 5f 68 61 73 5f 65 70 73 67 20 28  .fnct_has_epsg (
3f10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3f20: 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
3f30: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
3f40: 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
3f50: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
3f60: 20 48 61 73 45 70 73 67 28 29 0a 2f 0a 2f 20 72   HasEpsg()././ r
3f70: 65 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c 74  eturn 1 if built
3f80: 20 69 6e 63 6c 75 64 69 6e 67 20 45 50 53 47 3b   including EPSG;
3f90: 20 6f 74 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a   otherwise 0.*/.
3fa0: 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
3fb0: 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
3fc0: 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 6e 64 65  L_LINE */.#ifnde
3fd0: 66 20 4f 4d 49 54 5f 45 50 53 47 09 09 2f 2a 20  f OMIT_EPSG../* 
3fe0: 45 50 53 47 20 69 73 20 73 75 70 70 6f 72 74 65  EPSG is supporte
3ff0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
4000: 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
4010: 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73 65 0a  text, 1);.#else.
4020: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4030: 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
4040: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73   0);.#endif.}..s
4050: 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
4060: 68 61 73 5f 6c 69 62 78 6d 6c 32 20 28 73 71 6c  has_libxml2 (sql
4070: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
4080: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
4090: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
40a0: 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
40b0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48 61  L function:./ Ha
40c0: 73 4c 69 62 58 4d 4c 32 28 29 0a 2f 0a 2f 20 72  sLibXML2()././ r
40d0: 65 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c 74  eturn 1 if built
40e0: 20 69 6e 63 6c 75 64 69 6e 67 20 4c 49 42 58 4d   including LIBXM
40f0: 4c 32 3b 20 6f 74 68 65 72 77 69 73 65 20 30 0a  L2; otherwise 0.
4100: 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  */.    GAIA_UNUS
4110: 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
4120: 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66  EXCL_LINE */.#if
4130: 64 65 66 20 45 4e 41 42 4c 45 5f 4c 49 42 58 4d  def ENABLE_LIBXM
4140: 4c 32 09 09 2f 2a 20 4c 49 42 58 4d 4c 32 20 69  L2../* LIBXML2 i
4150: 73 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  s supported */. 
4160: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4170: 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
4180: 31 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  1);.#else.    sq
4190: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
41a0: 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23   (context, 0);.#
41b0: 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20  endif.}..static 
41c0: 76 6f 69 64 0a 66 6e 63 74 5f 68 61 73 5f 67 65  void.fnct_has_ge
41d0: 6f 70 61 63 6b 61 67 65 20 28 73 71 6c 69 74 65  opackage (sqlite
41e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
41f0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
4200: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
4210: 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
4220: 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48 61 73 47 65  unction:./ HasGe
4230: 6f 50 61 63 6b 61 67 65 28 29 0a 2f 0a 2f 20 72  oPackage()././ r
4240: 65 74 75 72 6e 20 31 20 69 66 20 62 75 69 6c 74  eturn 1 if built
4250: 20 69 6e 63 6c 75 64 69 6e 67 20 47 65 6f 50 61   including GeoPa
4260: 63 6b 61 67 65 20 73 75 70 70 6f 72 74 20 28 47  ckage support (G
4270: 50 4b 47 29 3b 20 6f 74 68 65 72 77 69 73 65 20  PKG); otherwise 
4280: 30 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e  0.*/.    GAIA_UN
4290: 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
42a0: 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23  V_EXCL_LINE */.#
42b0: 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 45 4f  ifdef ENABLE_GEO
42c0: 50 41 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50 41  PACKAGE./* GEOPA
42d0: 43 4b 41 47 45 20 69 73 20 73 75 70 70 6f 72 74  CKAGE is support
42e0: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
42f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
4300: 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73 65  ntext, 1);.#else
4310: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4320: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
4330: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  , 0);.#endif.}..
4340: 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
4350: 5f 68 61 73 5f 67 63 70 20 28 73 71 6c 69 74 65  _has_gcp (sqlite
4360: 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
4370: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
4380: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
4390: 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
43a0: 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48 61 73 47 43  unction:./ HasGC
43b0: 50 28 29 0a 2f 20 48 61 73 47 72 6f 75 6e 64 43  P()./ HasGroundC
43c0: 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 28 29 0a 2f  ontrolPoints()./
43d0: 0a 2f 20 72 65 74 75 72 6e 20 31 20 69 66 20 62  ./ return 1 if b
43e0: 75 69 6c 74 20 69 6e 63 6c 75 64 69 6e 67 20 47  uilt including G
43f0: 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e  roundControlPoin
4400: 74 73 20 73 75 70 70 6f 72 74 20 28 47 47 50 29  ts support (GGP)
4410: 3b 20 6f 74 68 65 72 77 69 73 65 20 30 0a 2a 2f  ; otherwise 0.*/
4420: 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
4430: 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
4440: 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 64 65  CL_LINE */.#ifde
4450: 66 20 45 4e 41 42 4c 45 5f 47 43 50 09 09 2f 2a  f ENABLE_GCP../*
4460: 20 47 43 50 20 61 72 65 20 73 75 70 70 6f 72 74   GCP are support
4470: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
4480: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
4490: 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c 73 65  ntext, 1);.#else
44a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
44b0: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
44c0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  , 0);.#endif.}..
44d0: 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
44e0: 5f 68 61 73 5f 74 6f 70 6f 6c 6f 67 79 20 28 73  _has_topology (s
44f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4500: 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
4510: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
4520: 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
4530: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
4540: 48 61 73 54 6f 70 6f 6c 6f 67 79 28 29 0a 2f 0a  HasTopology()./.
4550: 2f 20 72 65 74 75 72 6e 20 31 20 69 66 20 62 75  / return 1 if bu
4560: 69 6c 74 20 69 6e 63 6c 75 64 69 6e 67 20 47 72  ilt including Gr
4570: 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74  oundControlPoint
4580: 73 20 73 75 70 70 6f 72 74 20 28 47 47 50 29 3b  s support (GGP);
4590: 20 6f 74 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a   otherwise 0.*/.
45a0: 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
45b0: 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
45c0: 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69 66 64 65 66  L_LINE */.#ifdef
45d0: 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09 09   ENABLE_RTTOPO..
45e0: 2f 2a 20 52 54 54 4f 50 4f 20 69 73 20 73 75 70  /* RTTOPO is sup
45f0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ported */.    sq
4600: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4610: 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23   (context, 1);.#
4620: 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
4630: 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
4640: 74 65 78 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66  text, 0);.#endif
4650: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
4660: 66 6e 63 74 5f 68 61 73 5f 6b 6e 6e 20 28 73 71  fnct_has_knn (sq
4670: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
4680: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
4690: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
46a0: 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
46b0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48  QL function:./ H
46c0: 61 73 4b 4e 4e 28 29 0a 2f 0a 2f 20 72 65 74 75  asKNN()././ retu
46d0: 72 6e 20 31 20 69 66 20 62 75 69 6c 74 20 69 6e  rn 1 if built in
46e0: 63 6c 75 64 69 6e 67 20 4b 4e 4e 20 73 75 70 70  cluding KNN supp
46f0: 6f 72 74 3b 20 6f 74 68 65 72 77 69 73 65 20 30  ort; otherwise 0
4700: 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  .*/.    GAIA_UNU
4710: 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
4720: 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 23 69  _EXCL_LINE */.#i
4730: 66 6e 64 65 66 20 4f 4d 49 54 5f 47 45 4f 53 09  fndef OMIT_GEOS.
4740: 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 47 45 4f 53  ./* only if GEOS
4750: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23   is enabled */.#
4760: 69 66 6e 64 65 66 20 4f 4d 49 54 5f 4b 4e 4e 09  ifndef OMIT_KNN.
4770: 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 4b 4e 4e 20  ./* only if KNN 
4780: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
4790: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
47a0: 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31  _int (context, 1
47b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
47c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
47d0: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 23 65  (context, 0);.#e
47e0: 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 20 20 73  ndif.#else.    s
47f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
4800: 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
4810: 23 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63  #endif.}..static
4820: 20 76 6f 69 64 0a 66 6e 63 74 5f 68 61 73 5f 72   void.fnct_has_r
4830: 6f 75 74 69 6e 67 20 28 73 71 6c 69 74 65 33 5f  outing (sqlite3_
4840: 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
4850: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
4860: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
4870: 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
4880: 63 74 69 6f 6e 3a 0a 2f 20 48 61 73 52 6f 75 74  ction:./ HasRout
4890: 69 6e 67 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  ing()././ return
48a0: 20 31 20 69 66 20 62 75 69 6c 74 20 69 6e 63 6c   1 if built incl
48b0: 75 64 69 6e 67 20 56 69 72 74 75 61 6c 52 6f 75  uding VirtualRou
48c0: 74 69 6e 67 20 73 75 70 70 6f 72 74 3b 20 6f 74  ting support; ot
48d0: 68 65 72 77 69 73 65 20 30 0a 2a 2f 0a 20 20 20  herwise 0.*/.   
48e0: 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
48f0: 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
4900: 49 4e 45 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  INE */.#ifndef O
4910: 4d 49 54 5f 47 45 4f 53 09 09 2f 2a 20 6f 6e 6c  MIT_GEOS../* onl
4920: 79 20 69 66 20 47 45 4f 53 20 69 73 20 65 6e 61  y if GEOS is ena
4930: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  bled */.    sqli
4940: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
4950: 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 23 65 6c  context, 1);.#el
4960: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  se.    sqlite3_r
4970: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
4980: 78 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d  xt, 0);.#endif.}
4990: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  ...static void.f
49a0: 6e 63 74 5f 47 65 6f 6d 65 74 72 79 43 6f 6e 73  nct_GeometryCons
49b0: 74 72 61 69 6e 74 73 20 28 73 71 6c 69 74 65 33  traints (sqlite3
49c0: 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
49d0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
49e0: 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
49f0: 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
4a00: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47  QL function:./ G
4a10: 65 6f 6d 65 74 72 79 43 6f 6e 73 74 72 61 69 6e  eometryConstrain
4a20: 74 73 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  ts(BLOBencoded g
4a30: 65 6f 6d 65 74 72 79 2c 20 67 65 6f 6d 65 74 72  eometry, geometr
4a40: 79 2d 74 79 70 65 2c 20 73 72 69 64 29 0a 2f 20  y-type, srid)./ 
4a50: 47 65 6f 6d 65 74 72 79 43 6f 6e 73 74 72 61 69  GeometryConstrai
4a60: 6e 74 73 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  nts(BLOBencoded 
4a70: 67 65 6f 6d 65 74 72 79 2c 20 67 65 6f 6d 65 74  geometry, geomet
4a80: 72 79 2d 74 79 70 65 2c 20 73 72 69 64 2c 20 64  ry-type, srid, d
4a90: 69 6d 65 6e 73 69 6f 6e 73 29 0a 2f 0a 2f 20 63  imensions)././ c
4aa0: 68 65 63 6b 73 20 67 65 6f 6d 65 74 72 79 20 63  hecks geometry c
4ab0: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 72 65 74 75  onstraints, retu
4ac0: 72 6e 69 6e 67 3a 0a 2f 0a 2f 20 2d 31 20 2d 20  rning:././ -1 - 
4ad0: 69 66 20 73 6f 6d 65 20 65 72 72 6f 72 20 6f 63  if some error oc
4ae0: 63 75 72 72 65 64 0a 2f 20 31 20 2d 20 69 66 20  curred./ 1 - if 
4af0: 67 65 6f 6d 65 74 72 79 20 63 6f 6e 73 74 72 61  geometry constra
4b00: 69 6e 74 73 20 76 61 6c 69 64 61 74 69 6f 6e 20  ints validation 
4b10: 70 61 73 73 65 73 0a 2f 20 30 20 2d 20 69 66 20  passes./ 0 - if 
4b20: 67 65 6f 6d 65 74 72 79 20 63 6f 6e 73 74 72 61  geometry constra
4b30: 69 6e 74 73 20 76 61 6c 69 64 61 74 69 6f 6e 20  ints validation 
4b40: 66 61 69 6c 73 0a 2f 0a 2a 2f 0a 20 20 20 20 69  fails./.*/.    i
4b50: 6e 74 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e  nt little_endian
4b60: 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64 69 61 6e  ;.    int endian
4b70: 5f 61 72 63 68 20 3d 20 67 61 69 61 45 6e 64 69  _arch = gaiaEndi
4b80: 61 6e 41 72 63 68 20 28 29 3b 0a 20 20 20 20 75  anArch ();.    u
4b90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
4ba0: 62 6c 6f 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  blob = NULL;.   
4bb0: 20 69 6e 74 20 6e 5f 62 79 74 65 73 20 3d 20 30   int n_bytes = 0
4bc0: 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a  ;.    int srid;.
4bd0: 20 20 20 20 69 6e 74 20 67 65 6f 6d 5f 73 72 69      int geom_sri
4be0: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6f 6e 73  d = -1;.    cons
4bf0: 74 20 63 68 61 72 20 2a 74 79 70 65 3b 0a 20 20  t char *type;.  
4c00: 20 20 69 6e 74 20 78 74 79 70 65 3b 0a 20 20 20    int xtype;.   
4c10: 20 69 6e 74 20 67 65 6f 6d 5f 74 79 70 65 20 3d   int geom_type =
4c20: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f   -1;.    int geo
4c30: 6d 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 74 79 70  m_normalized_typ
4c40: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
4c50: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 6d 65  igned char *dime
4c60: 6e 73 69 6f 6e 73 3b 0a 20 20 20 20 69 6e 74 20  nsions;.    int 
4c70: 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a  dims = GAIA_XY;.
4c80: 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
4c90: 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
4ca0: 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
4cb0: 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
4cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4cd0: 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
4ce0: 51 4c 49 54 45 5f 42 4c 4f 42 0a 09 7c 7c 20 73  QLITE_BLOB..|| s
4cf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4d00: 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
4d10: 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20  QLITE_NULL)..;. 
4d20: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
4d30: 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4d40: 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
4d50: 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  -1);..  return;.
4d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
4d70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
4d80: 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
4d90: 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 74 79  SQLITE_TEXT)..ty
4da0: 70 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  pe = (const char
4db0: 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
4dc0: 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29  e_text (argv[1])
4dd0: 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
4de0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4df0: 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
4e00: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
4e10: 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 63 75 72       {..  /* cur
4e20: 72 65 6e 74 20 6d 65 74 61 64 61 74 61 20 73 74  rent metadata st
4e30: 79 6c 65 20 3e 3d 20 76 2e 34 2e 30 2e 30 20 2a  yle >= v.4.0.0 *
4e40: 2f 0a 09 20 20 74 79 70 65 20 3d 20 22 55 4e 4b  /..  type = "UNK
4e50: 4e 4f 57 4e 22 3b 0a 09 20 20 73 77 69 74 63 68  NOWN";..  switch
4e60: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
4e70: 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 29 0a 09  int (argv[1]))..
4e80: 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20      {..    case 
4e90: 30 3a 0a 09 09 74 79 70 65 20 3d 20 22 47 45 4f  0:...type = "GEO
4ea0: 4d 45 54 52 59 22 3b 0a 09 09 64 69 6d 73 20 3d  METRY";...dims =
4eb0: 20 47 41 49 41 5f 58 59 3b 0a 09 09 62 72 65 61   GAIA_XY;...brea
4ec0: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31 3a 0a  k;..    case 1:.
4ed0: 09 09 74 79 70 65 20 3d 20 22 50 4f 49 4e 54 22  ..type = "POINT"
4ee0: 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f  ;...dims = GAIA_
4ef0: 58 59 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  XY;...break;..  
4f00: 20 20 63 61 73 65 20 32 3a 0a 09 09 74 79 70 65    case 2:...type
4f10: 20 3d 20 22 4c 49 4e 45 53 54 52 49 4e 47 22 3b   = "LINESTRING";
4f20: 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58  ...dims = GAIA_X
4f30: 59 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  Y;...break;..   
4f40: 20 63 61 73 65 20 33 3a 0a 09 09 74 79 70 65 20   case 3:...type 
4f50: 3d 20 22 50 4f 4c 59 47 4f 4e 22 3b 0a 09 09 64  = "POLYGON";...d
4f60: 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09  ims = GAIA_XY;..
4f70: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
4f80: 65 20 34 3a 0a 09 09 74 79 70 65 20 3d 20 22 4d  e 4:...type = "M
4f90: 55 4c 54 49 50 4f 49 4e 54 22 3b 0a 09 09 64 69  ULTIPOINT";...di
4fa0: 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 09  ms = GAIA_XY;...
4fb0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
4fc0: 20 35 3a 0a 09 09 74 79 70 65 20 3d 20 22 4d 55   5:...type = "MU
4fd0: 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a  LTILINESTRING";.
4fe0: 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  ..dims = GAIA_XY
4ff0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
5000: 63 61 73 65 20 36 3a 0a 09 09 74 79 70 65 20 3d  case 6:...type =
5010: 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 22 3b   "MULTIPOLYGON";
5020: 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58  ...dims = GAIA_X
5030: 59 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  Y;...break;..   
5040: 20 63 61 73 65 20 37 3a 0a 09 09 74 79 70 65 20   case 7:...type 
5050: 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  = "GEOMETRYCOLLE
5060: 43 54 49 4f 4e 22 3b 0a 09 09 64 69 6d 73 20 3d  CTION";...dims =
5070: 20 47 41 49 41 5f 58 59 3b 0a 09 09 62 72 65 61   GAIA_XY;...brea
5080: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31 30 30  k;..    case 100
5090: 30 3a 0a 09 09 74 79 70 65 20 3d 20 22 47 45 4f  0:...type = "GEO
50a0: 4d 45 54 52 59 22 3b 0a 09 09 64 69 6d 73 20 3d  METRY";...dims =
50b0: 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 09 62 72   GAIA_XY_Z;...br
50c0: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31  eak;..    case 1
50d0: 30 30 31 3a 0a 09 09 74 79 70 65 20 3d 20 22 50  001:...type = "P
50e0: 4f 49 4e 54 22 3b 0a 09 09 64 69 6d 73 20 3d 20  OINT";...dims = 
50f0: 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 09 62 72 65  GAIA_XY_Z;...bre
5100: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31 30  ak;..    case 10
5110: 30 32 3a 0a 09 09 74 79 70 65 20 3d 20 22 4c 49  02:...type = "LI
5120: 4e 45 53 54 52 49 4e 47 22 3b 0a 09 09 64 69 6d  NESTRING";...dim
5130: 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09  s = GAIA_XY_Z;..
5140: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
5150: 65 20 31 30 30 33 3a 0a 09 09 74 79 70 65 20 3d  e 1003:...type =
5160: 20 22 50 4f 4c 59 47 4f 4e 22 3b 0a 09 09 64 69   "POLYGON";...di
5170: 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a  ms = GAIA_XY_Z;.
5180: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
5190: 73 65 20 31 30 30 34 3a 0a 09 09 74 79 70 65 20  se 1004:...type 
51a0: 3d 20 22 4d 55 4c 54 49 50 4f 49 4e 54 22 3b 0a  = "MULTIPOINT";.
51b0: 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  ..dims = GAIA_XY
51c0: 5f 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  _Z;...break;..  
51d0: 20 20 63 61 73 65 20 31 30 30 35 3a 0a 09 09 74    case 1005:...t
51e0: 79 70 65 20 3d 20 22 4d 55 4c 54 49 4c 49 4e 45  ype = "MULTILINE
51f0: 53 54 52 49 4e 47 22 3b 0a 09 09 64 69 6d 73 20  STRING";...dims 
5200: 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 09 62  = GAIA_XY_Z;...b
5210: 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
5220: 31 30 30 36 3a 0a 09 09 74 79 70 65 20 3d 20 22  1006:...type = "
5230: 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 22 3b 0a 09  MULTIPOLYGON";..
5240: 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f  .dims = GAIA_XY_
5250: 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  Z;...break;..   
5260: 20 63 61 73 65 20 31 30 30 37 3a 0a 09 09 74 79   case 1007:...ty
5270: 70 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f  pe = "GEOMETRYCO
5280: 4c 4c 45 43 54 49 4f 4e 22 3b 0a 09 09 64 69 6d  LLECTION";...dim
5290: 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09  s = GAIA_XY_Z;..
52a0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
52b0: 65 20 32 30 30 30 3a 0a 09 09 74 79 70 65 20 3d  e 2000:...type =
52c0: 20 22 47 45 4f 4d 45 54 52 59 22 3b 0a 09 09 64   "GEOMETRY";...d
52d0: 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b  ims = GAIA_XY_M;
52e0: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
52f0: 61 73 65 20 32 30 30 31 3a 0a 09 09 74 79 70 65  ase 2001:...type
5300: 20 3d 20 22 50 4f 49 4e 54 22 3b 0a 09 09 64 69   = "POINT";...di
5310: 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a  ms = GAIA_XY_M;.
5320: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
5330: 73 65 20 32 30 30 32 3a 0a 09 09 74 79 70 65 20  se 2002:...type 
5340: 3d 20 22 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a  = "LINESTRING";.
5350: 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  ..dims = GAIA_XY
5360: 5f 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  _M;...break;..  
5370: 20 20 63 61 73 65 20 32 30 30 33 3a 0a 09 09 74    case 2003:...t
5380: 79 70 65 20 3d 20 22 50 4f 4c 59 47 4f 4e 22 3b  ype = "POLYGON";
5390: 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58  ...dims = GAIA_X
53a0: 59 5f 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  Y_M;...break;.. 
53b0: 20 20 20 63 61 73 65 20 32 30 30 34 3a 0a 09 09     case 2004:...
53c0: 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49  type = "MULTIPOI
53d0: 4e 54 22 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41  NT";...dims = GA
53e0: 49 41 5f 58 59 5f 4d 3b 0a 09 09 62 72 65 61 6b  IA_XY_M;...break
53f0: 3b 0a 09 20 20 20 20 63 61 73 65 20 32 30 30 35  ;..    case 2005
5400: 3a 0a 09 09 74 79 70 65 20 3d 20 22 4d 55 4c 54  :...type = "MULT
5410: 49 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a 09 09  ILINESTRING";...
5420: 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d  dims = GAIA_XY_M
5430: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
5440: 63 61 73 65 20 32 30 30 36 3a 0a 09 09 74 79 70  case 2006:...typ
5450: 65 20 3d 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f  e = "MULTIPOLYGO
5460: 4e 22 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41 49  N";...dims = GAI
5470: 41 5f 58 59 5f 4d 3b 0a 09 09 62 72 65 61 6b 3b  A_XY_M;...break;
5480: 0a 09 20 20 20 20 63 61 73 65 20 32 30 30 37 3a  ..    case 2007:
5490: 0a 09 09 74 79 70 65 20 3d 20 22 47 45 4f 4d 45  ...type = "GEOME
54a0: 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 22 3b 0a  TRYCOLLECTION";.
54b0: 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  ..dims = GAIA_XY
54c0: 5f 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  _M;...break;..  
54d0: 20 20 63 61 73 65 20 33 30 30 30 3a 0a 09 09 74    case 3000:...t
54e0: 79 70 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 22  ype = "GEOMETRY"
54f0: 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f  ;...dims = GAIA_
5500: 58 59 5f 5a 5f 4d 3b 0a 09 09 62 72 65 61 6b 3b  XY_Z_M;...break;
5510: 0a 09 20 20 20 20 63 61 73 65 20 33 30 30 31 3a  ..    case 3001:
5520: 0a 09 09 74 79 70 65 20 3d 20 22 50 4f 49 4e 54  ...type = "POINT
5530: 22 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41  ";...dims = GAIA
5540: 5f 58 59 5f 5a 5f 4d 3b 0a 09 09 62 72 65 61 6b  _XY_Z_M;...break
5550: 3b 0a 09 20 20 20 20 63 61 73 65 20 33 30 30 32  ;..    case 3002
5560: 3a 0a 09 09 74 79 70 65 20 3d 20 22 4c 49 4e 45  :...type = "LINE
5570: 53 54 52 49 4e 47 22 3b 0a 09 09 64 69 6d 73 20  STRING";...dims 
5580: 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09  = GAIA_XY_Z_M;..
5590: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
55a0: 65 20 33 30 30 33 3a 0a 09 09 74 79 70 65 20 3d  e 3003:...type =
55b0: 20 22 50 4f 4c 59 47 4f 4e 22 3b 0a 09 09 64 69   "POLYGON";...di
55c0: 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  ms = GAIA_XY_Z_M
55d0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
55e0: 63 61 73 65 20 33 30 30 34 3a 0a 09 09 74 79 70  case 3004:...typ
55f0: 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e 54 22  e = "MULTIPOINT"
5600: 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41 5f  ;...dims = GAIA_
5610: 58 59 5f 5a 5f 4d 3b 0a 09 09 62 72 65 61 6b 3b  XY_Z_M;...break;
5620: 0a 09 20 20 20 20 63 61 73 65 20 33 30 30 35 3a  ..    case 3005:
5630: 0a 09 09 74 79 70 65 20 3d 20 22 4d 55 4c 54 49  ...type = "MULTI
5640: 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a 09 09 64  LINESTRING";...d
5650: 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  ims = GAIA_XY_Z_
5660: 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  M;...break;..   
5670: 20 63 61 73 65 20 33 30 30 36 3a 0a 09 09 74 79   case 3006:...ty
5680: 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 4c 59 47  pe = "MULTIPOLYG
5690: 4f 4e 22 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41  ON";...dims = GA
56a0: 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 09 62 72 65  IA_XY_Z_M;...bre
56b0: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 33 30  ak;..    case 30
56c0: 30 37 3a 0a 09 09 74 79 70 65 20 3d 20 22 47 45  07:...type = "GE
56d0: 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
56e0: 22 3b 0a 09 09 64 69 6d 73 20 3d 20 47 41 49 41  ";...dims = GAIA
56f0: 5f 58 59 5f 5a 5f 4d 3b 0a 09 09 62 72 65 61 6b  _XY_Z_M;...break
5700: 3b 0a 09 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  ;..    };.      
5710: 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
5720: 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
5730: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
5740: 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
5750: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
5760: 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
5770: 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
5780: 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
5790: 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69 74  R)..srid = sqlit
57a0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
57b0: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[2]);.    else
57c0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
57d0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
57e0: 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
57f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
5800: 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
5810: 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f   4).      {..  /
5820: 2a 20 65 78 70 6c 69 63 69 74 20 64 69 6d 65 6e  * explicit dimen
5830: 73 69 6f 6e 73 20 2d 20 73 75 70 70 6f 72 74 69  sions - supporti
5840: 6e 67 20 58 59 5a 4d 20 2a 2f 0a 09 20 20 64 69  ng XYZM */..  di
5850: 6d 65 6e 73 69 6f 6e 73 20 3d 20 73 71 6c 69 74  mensions = sqlit
5860: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
5870: 72 67 76 5b 33 5d 29 3b 0a 09 20 20 69 66 20 28  rgv[3]);..  if (
5880: 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61  strcasecmp ((cha
5890: 72 20 2a 29 20 64 69 6d 65 6e 73 69 6f 6e 73 2c  r *) dimensions,
58a0: 20 22 58 59 5a 22 29 20 3d 3d 20 30 29 0a 09 20   "XYZ") == 0).. 
58b0: 20 20 20 20 20 64 69 6d 73 20 3d 20 47 41 49 41       dims = GAIA
58c0: 5f 58 59 5f 5a 3b 0a 09 20 20 65 6c 73 65 20 69  _XY_Z;..  else i
58d0: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28  f (strcasecmp ((
58e0: 63 68 61 72 20 2a 29 20 64 69 6d 65 6e 73 69 6f  char *) dimensio
58f0: 6e 73 2c 20 22 58 59 4d 22 29 20 3d 3d 20 30 29  ns, "XYM") == 0)
5900: 0a 09 20 20 20 20 20 20 64 69 6d 73 20 3d 20 47  ..      dims = G
5910: 41 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 65 6c 73  AIA_XY_M;..  els
5920: 65 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70  e if (strcasecmp
5930: 20 28 28 63 68 61 72 20 2a 29 20 64 69 6d 65 6e   ((char *) dimen
5940: 73 69 6f 6e 73 2c 20 22 58 59 5a 4d 22 29 20 3d  sions, "XYZM") =
5950: 3d 20 30 29 0a 09 20 20 20 20 20 20 64 69 6d 73  = 0)..      dims
5960: 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a   = GAIA_XY_Z_M;.
5970: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 64  .  else..      d
5980: 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 20  ims = GAIA_XY;. 
5990: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
59a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
59b0: 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
59c0: 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
59d0: 20 20 7b 0a 09 20 20 70 5f 62 6c 6f 62 20 3d 20    {..  p_blob = 
59e0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
59f0: 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
5a00: 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
5a10: 09 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c  .  n_bytes = sql
5a20: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5a30: 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
5a40: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 5f 62 6c    }.    if (p_bl
5a50: 6f 62 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ob).      {..  i
5a60: 66 20 28 6e 5f 62 79 74 65 73 20 3d 3d 20 32 34  f (n_bytes == 24
5a70: 20 7c 7c 20 6e 5f 62 79 74 65 73 20 3d 3d 20 33   || n_bytes == 3
5a80: 32 20 7c 7c 20 6e 5f 62 79 74 65 73 20 3d 3d 20  2 || n_bytes == 
5a90: 34 30 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20  40)..    {.../* 
5aa0: 74 65 73 74 69 6e 67 20 66 6f 72 20 61 20 70 6f  testing for a po
5ab0: 73 73 69 62 6c 65 20 54 69 6e 79 50 6f 69 6e 74  ssible TinyPoint
5ac0: 20 42 4c 4f 42 20 2a 2f 0a 09 09 69 66 20 28 2a   BLOB */...if (*
5ad0: 28 70 5f 62 6c 6f 62 20 2b 20 30 29 20 3d 3d 20  (p_blob + 0) == 
5ae0: 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54 20  GAIA_MARK_START 
5af0: 26 26 0a 09 09 20 20 20 20 28 2a 28 70 5f 62 6c  &&...    (*(p_bl
5b00: 6f 62 20 2b 20 31 29 20 3d 3d 20 47 41 49 41 5f  ob + 1) == GAIA_
5b10: 54 49 4e 59 50 4f 49 4e 54 5f 4c 49 54 54 4c 45  TINYPOINT_LITTLE
5b20: 5f 45 4e 44 49 41 4e 0a 09 09 20 20 20 20 20 7c  _ENDIAN...     |
5b30: 7c 20 2a 28 70 5f 62 6c 6f 62 20 2b 20 31 29 20  | *(p_blob + 1) 
5b40: 3d 3d 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e  == GAIA_TINYPOIN
5b50: 54 5f 42 49 47 5f 45 4e 44 49 41 4e 29 0a 09 09  T_BIG_ENDIAN)...
5b60: 20 20 20 20 26 26 20 2a 28 70 5f 62 6c 6f 62 20      && *(p_blob 
5b70: 2b 20 28 6e 5f 62 79 74 65 73 20 2d 20 31 29 29  + (n_bytes - 1))
5b80: 20 3d 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e   == GAIA_MARK_EN
5b90: 44 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  D)...  {...     
5ba0: 20 2f 2a 20 71 75 69 63 6b 20 54 69 6e 79 50 6f   /* quick TinyPo
5bb0: 69 6e 74 20 76 61 6c 69 64 61 74 69 6f 6e 20 2a  int validation *
5bc0: 2f 0a 09 09 20 20 20 20 20 20 69 6e 74 20 70 6f  /...      int po
5bd0: 69 6e 74 54 79 70 65 3b 0a 09 09 20 20 20 20 20  intType;...     
5be0: 20 69 66 20 28 2a 28 70 5f 62 6c 6f 62 20 2b 20   if (*(p_blob + 
5bf0: 31 29 20 3d 3d 20 47 41 49 41 5f 54 49 4e 59 50  1) == GAIA_TINYP
5c00: 4f 49 4e 54 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  OINT_LITTLE_ENDI
5c10: 41 4e 29 0a 09 09 09 20 20 6c 69 74 74 6c 65 5f  AN)....  little_
5c20: 65 6e 64 69 61 6e 20 3d 20 31 3b 0a 09 09 20 20  endian = 1;...  
5c30: 20 20 20 20 65 6c 73 65 20 69 66 20 28 2a 28 70      else if (*(p
5c40: 5f 62 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47 41  _blob + 1) == GA
5c50: 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 42 49 47  IA_TINYPOINT_BIG
5c60: 5f 45 4e 44 49 41 4e 29 0a 09 09 09 20 20 6c 69  _ENDIAN)....  li
5c70: 74 74 6c 65 5f 65 6e 64 69 61 6e 20 3d 20 30 3b  ttle_endian = 0;
5c80: 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09  ...      else...
5c90: 09 20 20 67 6f 74 6f 20 69 6c 6c 65 67 61 6c 5f  .  goto illegal_
5ca0: 67 65 6f 6d 65 74 72 79 3b 09 2f 2a 20 75 6e 6b  geometry;./* unk
5cb0: 6e 6f 77 6e 20 65 6e 63 6f 64 69 6e 67 3b 20 6e  nown encoding; n
5cc0: 65 69 74 68 65 72 20 6c 69 74 74 6c 65 2d 65 6e  either little-en
5cd0: 64 69 61 6e 20 6e 6f 72 20 62 69 67 2d 65 6e 64  dian nor big-end
5ce0: 69 61 6e 20 2a 2f 0a 09 09 20 20 20 20 20 20 67  ian */...      g
5cf0: 65 6f 6d 5f 73 72 69 64 20 3d 0a 09 09 09 20 20  eom_srid =....  
5d00: 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 70 5f  gaiaImport32 (p_
5d10: 62 6c 6f 62 20 2b 20 32 2c 20 6c 69 74 74 6c 65  blob + 2, little
5d20: 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f  _endian, endian_
5d30: 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 70  arch);...      p
5d40: 6f 69 6e 74 54 79 70 65 20 3d 20 2a 28 70 5f 62  ointType = *(p_b
5d50: 6c 6f 62 20 2b 20 36 29 3b 0a 09 09 20 20 20 20  lob + 6);...    
5d60: 20 20 73 77 69 74 63 68 20 28 70 6f 69 6e 74 54    switch (pointT
5d70: 79 70 65 29 0a 09 09 09 7b 0a 09 09 09 63 61 73  ype)....{....cas
5d80: 65 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54  e GAIA_TINYPOINT
5d90: 5f 58 59 3a 0a 09 09 09 20 20 20 20 67 65 6f 6d  _XY:....    geom
5da0: 5f 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49  _type = GAIA_POI
5db0: 4e 54 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b  NT;....    break
5dc0: 3b 0a 09 09 09 63 61 73 65 20 47 41 49 41 5f 54  ;....case GAIA_T
5dd0: 49 4e 59 50 4f 49 4e 54 5f 58 59 5a 3a 0a 09 09  INYPOINT_XYZ:...
5de0: 09 20 20 20 20 67 65 6f 6d 5f 74 79 70 65 20 3d  .    geom_type =
5df0: 20 47 41 49 41 5f 50 4f 49 4e 54 5a 3b 0a 09 09   GAIA_POINTZ;...
5e00: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 63  .    break;....c
5e10: 61 73 65 20 47 41 49 41 5f 54 49 4e 59 50 4f 49  ase GAIA_TINYPOI
5e20: 4e 54 5f 58 59 4d 3a 0a 09 09 09 20 20 20 20 67  NT_XYM:....    g
5e30: 65 6f 6d 5f 74 79 70 65 20 3d 20 47 41 49 41 5f  eom_type = GAIA_
5e40: 50 4f 49 4e 54 4d 3b 0a 09 09 09 20 20 20 20 62  POINTM;....    b
5e50: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 41  reak;....case GA
5e60: 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 58 59 5a  IA_TINYPOINT_XYZ
5e70: 4d 3a 0a 09 09 09 20 20 20 20 67 65 6f 6d 5f 74  M:....    geom_t
5e80: 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54  ype = GAIA_POINT
5e90: 5a 4d 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b  ZM;....    break
5ea0: 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  ;....default:...
5eb0: 09 20 20 20 20 67 6f 74 6f 20 69 6c 6c 65 67 61  .    goto illega
5ec0: 6c 5f 67 65 6f 6d 65 74 72 79 3b 0a 09 09 09 7d  l_geometry;....}
5ed0: 3b 0a 09 09 20 20 20 20 20 20 67 6f 74 6f 20 76  ;...      goto v
5ee0: 61 6c 69 64 5f 67 65 6f 6d 65 74 72 79 3b 0a 09  alid_geometry;..
5ef0: 09 20 20 7d 0a 09 20 20 20 20 7d 0a 0a 09 20 20  .  }..    }...  
5f00: 2f 2a 20 71 75 69 63 6b 20 47 65 6f 6d 65 74 72  /* quick Geometr
5f10: 79 20 76 61 6c 69 64 61 74 69 6f 6e 20 2a 2f 0a  y validation */.
5f20: 09 20 20 69 66 20 28 6e 5f 62 79 74 65 73 20 3c  .  if (n_bytes <
5f30: 20 34 35 29 0a 09 20 20 20 20 20 20 67 6f 74 6f   45)..      goto
5f40: 20 69 6c 6c 65 67 61 6c 5f 67 65 6f 6d 65 74 72   illegal_geometr
5f50: 79 3b 09 2f 2a 20 63 61 6e 6e 6f 74 20 62 65 20  y;./* cannot be 
5f60: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 42 4c 4f 42  an internal BLOB
5f70: 20 57 4b 42 20 67 65 6f 6d 65 74 72 79 20 2a 2f   WKB geometry */
5f80: 0a 09 20 20 69 66 20 28 2a 28 70 5f 62 6c 6f 62  ..  if (*(p_blob
5f90: 20 2b 20 30 29 20 21 3d 20 47 41 49 41 5f 4d 41   + 0) != GAIA_MA
5fa0: 52 4b 5f 53 54 41 52 54 29 0a 09 20 20 20 20 20  RK_START)..     
5fb0: 20 67 6f 74 6f 20 69 6c 6c 65 67 61 6c 5f 67 65   goto illegal_ge
5fc0: 6f 6d 65 74 72 79 3b 09 2f 2a 20 66 61 69 6c 65  ometry;./* faile
5fd0: 64 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65 20 53  d to recognize S
5fe0: 54 41 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a  TART signature *
5ff0: 2f 0a 09 20 20 69 66 20 28 2a 28 70 5f 62 6c 6f  /..  if (*(p_blo
6000: 62 20 2b 20 28 6e 5f 62 79 74 65 73 20 2d 20 31  b + (n_bytes - 1
6010: 29 29 20 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f  )) != GAIA_MARK_
6020: 45 4e 44 29 0a 09 20 20 20 20 20 20 67 6f 74 6f  END)..      goto
6030: 20 69 6c 6c 65 67 61 6c 5f 67 65 6f 6d 65 74 72   illegal_geometr
6040: 79 3b 09 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20  y;./* failed to 
6050: 72 65 63 6f 67 6e 69 7a 65 20 45 4e 44 20 73 69  recognize END si
6060: 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 69 66  gnature */..  if
6070: 20 28 2a 28 70 5f 62 6c 6f 62 20 2b 20 33 38 29   (*(p_blob + 38)
6080: 20 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42   != GAIA_MARK_MB
6090: 52 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 69  R)..      goto i
60a0: 6c 6c 65 67 61 6c 5f 67 65 6f 6d 65 74 72 79 3b  llegal_geometry;
60b0: 09 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  ./* failed to re
60c0: 63 6f 67 6e 69 7a 65 20 4d 42 52 20 73 69 67 6e  cognize MBR sign
60d0: 61 74 75 72 65 20 2a 2f 0a 09 20 20 69 66 20 28  ature */..  if (
60e0: 2a 28 70 5f 62 6c 6f 62 20 2b 20 31 29 20 3d 3d  *(p_blob + 1) ==
60f0: 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
6100: 49 41 4e 29 0a 09 20 20 20 20 20 20 6c 69 74 74  IAN)..      litt
6110: 6c 65 5f 65 6e 64 69 61 6e 20 3d 20 31 3b 0a 09  le_endian = 1;..
6120: 20 20 65 6c 73 65 20 69 66 20 28 2a 28 70 5f 62    else if (*(p_b
6130: 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47 41 49 41  lob + 1) == GAIA
6140: 5f 42 49 47 5f 45 4e 44 49 41 4e 29 0a 09 20 20  _BIG_ENDIAN)..  
6150: 20 20 20 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61      little_endia
6160: 6e 20 3d 20 30 3b 0a 09 20 20 65 6c 73 65 0a 09  n = 0;..  else..
6170: 20 20 20 20 20 20 67 6f 74 6f 20 69 6c 6c 65 67        goto illeg
6180: 61 6c 5f 67 65 6f 6d 65 74 72 79 3b 09 2f 2a 20  al_geometry;./* 
6190: 75 6e 6b 6e 6f 77 6e 20 65 6e 63 6f 64 69 6e 67  unknown encoding
61a0: 3b 20 6e 65 69 74 68 65 72 20 6c 69 74 74 6c 65  ; neither little
61b0: 2d 65 6e 64 69 61 6e 20 6e 6f 72 20 62 69 67 2d  -endian nor big-
61c0: 65 6e 64 69 61 6e 20 2a 2f 0a 09 20 20 67 65 6f  endian */..  geo
61d0: 6d 5f 74 79 70 65 20 3d 20 67 61 69 61 49 6d 70  m_type = gaiaImp
61e0: 6f 72 74 33 32 20 28 70 5f 62 6c 6f 62 20 2b 20  ort32 (p_blob + 
61f0: 33 39 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61  39, little_endia
6200: 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  n, endian_arch);
6210: 0a 09 20 20 67 65 6f 6d 5f 73 72 69 64 20 3d 20  ..  geom_srid = 
6220: 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 70 5f  gaiaImport32 (p_
6230: 62 6c 6f 62 20 2b 20 32 2c 20 6c 69 74 74 6c 65  blob + 2, little
6240: 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f  _endian, endian_
6250: 61 72 63 68 29 3b 0a 09 20 20 67 6f 74 6f 20 76  arch);..  goto v
6260: 61 6c 69 64 5f 67 65 6f 6d 65 74 72 79 3b 0a 09  alid_geometry;..
6270: 69 6c 6c 65 67 61 6c 5f 67 65 6f 6d 65 74 72 79  illegal_geometry
6280: 3a 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  :..  sqlite3_res
6290: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
62a0: 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
62b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 76 61 6c 69  ;.      }.  vali
62c0: 64 5f 67 65 6f 6d 65 74 72 79 3a 0a 20 20 20 20  d_geometry:.    
62d0: 78 74 79 70 65 20 3d 20 47 41 49 41 5f 55 4e 4b  xtype = GAIA_UNK
62e0: 4e 4f 57 4e 3b 0a 20 20 20 20 69 66 20 28 73 74  NOWN;.    if (st
62f0: 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
6300: 2a 29 20 74 79 70 65 2c 20 22 50 4f 49 4e 54 22  *) type, "POINT"
6310: 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  ) == 0).      {.
6320: 09 20 20 73 77 69 74 63 68 20 28 64 69 6d 73 29  .  switch (dims)
6330: 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73  ..    {..    cas
6340: 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09 78  e GAIA_XY_Z:...x
6350: 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e  type = GAIA_POIN
6360: 54 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  TZ;...break;..  
6370: 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d    case GAIA_XY_M
6380: 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41  :...xtype = GAIA
6390: 5f 50 4f 49 4e 54 4d 3b 0a 09 09 62 72 65 61 6b  _POINTM;...break
63a0: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
63b0: 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65  _XY_Z_M:...xtype
63c0: 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3b   = GAIA_POINTZM;
63d0: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64  ...break;..    d
63e0: 65 66 61 75 6c 74 3a 0a 09 09 78 74 79 70 65 20  efault:...xtype 
63f0: 3d 20 47 41 49 41 5f 50 4f 49 4e 54 3b 0a 09 09  = GAIA_POINT;...
6400: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 20  break;..    };. 
6410: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
6420: 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72  trcasecmp ((char
6430: 20 2a 29 20 74 79 70 65 2c 20 22 4c 49 4e 45 53   *) type, "LINES
6440: 54 52 49 4e 47 22 29 20 3d 3d 20 30 29 0a 20 20  TRING") == 0).  
6450: 20 20 20 20 7b 0a 09 20 20 73 77 69 74 63 68 20      {..  switch 
6460: 28 64 69 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20  (dims)..    {.. 
6470: 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f     case GAIA_XY_
6480: 5a 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  Z:...xtype = GAI
6490: 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3b 0a 09  A_LINESTRINGZ;..
64a0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
64b0: 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 78  e GAIA_XY_M:...x
64c0: 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45  type = GAIA_LINE
64d0: 53 54 52 49 4e 47 4d 3b 0a 09 09 62 72 65 61 6b  STRINGM;...break
64e0: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
64f0: 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65  _XY_Z_M:...xtype
6500: 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49   = GAIA_LINESTRI
6510: 4e 47 5a 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  NGZM;...break;..
6520: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 78      default:...x
6530: 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45  type = GAIA_LINE
6540: 53 54 52 49 4e 47 3b 0a 09 09 62 72 65 61 6b 3b  STRING;...break;
6550: 0a 09 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d  ..    };.      }
6560: 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
6570: 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
6580: 70 65 2c 20 22 50 4f 4c 59 47 4f 4e 22 29 20 3d  pe, "POLYGON") =
6590: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 0).      {..  
65a0: 73 77 69 74 63 68 20 28 64 69 6d 73 29 0a 09 20  switch (dims).. 
65b0: 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20 47     {..    case G
65c0: 41 49 41 5f 58 59 5f 5a 3a 0a 09 09 78 74 79 70  AIA_XY_Z:...xtyp
65d0: 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  e = GAIA_POLYGON
65e0: 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  Z;...break;..   
65f0: 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a   case GAIA_XY_M:
6600: 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f  ...xtype = GAIA_
6610: 50 4f 4c 59 47 4f 4e 4d 3b 0a 09 09 62 72 65 61  POLYGONM;...brea
6620: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
6630: 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70  A_XY_Z_M:...xtyp
6640: 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  e = GAIA_POLYGON
6650: 5a 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  ZM;...break;..  
6660: 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 78 74 79    default:...xty
6670: 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f  pe = GAIA_POLYGO
6680: 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  N;...break;..   
6690: 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   };.      }.    
66a0: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
66b0: 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22  (char *) type, "
66c0: 4d 55 4c 54 49 50 4f 49 4e 54 22 29 20 3d 3d 20  MULTIPOINT") == 
66d0: 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 77  0).      {..  sw
66e0: 69 74 63 68 20 28 64 69 6d 73 29 0a 09 20 20 20  itch (dims)..   
66f0: 20 7b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49   {..    case GAI
6700: 41 5f 58 59 5f 5a 3a 0a 09 09 78 74 79 70 65 20  A_XY_Z:...xtype 
6710: 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  = GAIA_MULTIPOIN
6720: 54 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  TZ;...break;..  
6730: 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d    case GAIA_XY_M
6740: 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41  :...xtype = GAIA
6750: 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 3b 0a 09 09  _MULTIPOINTM;...
6760: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
6770: 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09   GAIA_XY_Z_M:...
6780: 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c  xtype = GAIA_MUL
6790: 54 49 50 4f 49 4e 54 5a 4d 3b 0a 09 09 62 72 65  TIPOINTZM;...bre
67a0: 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
67b0: 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41  :...xtype = GAIA
67c0: 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 09 09 62  _MULTIPOINT;...b
67d0: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 20 20  reak;..    };.  
67e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
67f0: 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
6800: 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 4c  *) type, "MULTIL
6810: 49 4e 45 53 54 52 49 4e 47 22 29 20 3d 3d 20 30  INESTRING") == 0
6820: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 77 69  ).      {..  swi
6830: 74 63 68 20 28 64 69 6d 73 29 0a 09 20 20 20 20  tch (dims)..    
6840: 7b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  {..    case GAIA
6850: 5f 58 59 5f 5a 3a 0a 09 09 78 74 79 70 65 20 3d  _XY_Z:...xtype =
6860: 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
6870: 54 52 49 4e 47 5a 3b 0a 09 09 62 72 65 61 6b 3b  TRINGZ;...break;
6880: 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
6890: 58 59 5f 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20  XY_M:...xtype = 
68a0: 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
68b0: 52 49 4e 47 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a  RINGM;...break;.
68c0: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58  .    case GAIA_X
68d0: 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65 20 3d  Y_Z_M:...xtype =
68e0: 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
68f0: 54 52 49 4e 47 5a 4d 3b 0a 09 09 62 72 65 61 6b  TRINGZM;...break
6900: 3b 0a 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
6910: 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d  ..xtype = GAIA_M
6920: 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a  ULTILINESTRING;.
6930: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b  ..break;..    };
6940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
6950: 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68  (strcasecmp ((ch
6960: 61 72 20 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c  ar *) type, "MUL
6970: 54 49 50 4f 4c 59 47 4f 4e 22 29 20 3d 3d 20 30  TIPOLYGON") == 0
6980: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 77 69  ).      {..  swi
6990: 74 63 68 20 28 64 69 6d 73 29 0a 09 20 20 20 20  tch (dims)..    
69a0: 7b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  {..    case GAIA
69b0: 5f 58 59 5f 5a 3a 0a 09 09 78 74 79 70 65 20 3d  _XY_Z:...xtype =
69c0: 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
69d0: 4f 4e 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  ONZ;...break;.. 
69e0: 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f     case GAIA_XY_
69f0: 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  M:...xtype = GAI
6a00: 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 3b  A_MULTIPOLYGONM;
6a10: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
6a20: 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a  ase GAIA_XY_Z_M:
6a30: 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f  ...xtype = GAIA_
6a40: 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a  MULTIPOLYGONZM;.
6a50: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64 65  ..break;..    de
6a60: 66 61 75 6c 74 3a 0a 09 09 78 74 79 70 65 20 3d  fault:...xtype =
6a70: 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
6a80: 4f 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  ON;...break;..  
6a90: 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    };.      }.   
6aa0: 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
6ab0: 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
6ac0: 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  "GEOMETRYCOLLECT
6ad0: 49 4f 4e 22 29 20 3d 3d 20 30 29 0a 20 20 20 20  ION") == 0).    
6ae0: 20 20 7b 0a 09 20 20 73 77 69 74 63 68 20 28 64    {..  switch (d
6af0: 69 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20 20 20  ims)..    {..   
6b00: 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a   case GAIA_XY_Z:
6b10: 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f  ...xtype = GAIA_
6b20: 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
6b30: 4f 4e 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  ONZ;...break;.. 
6b40: 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f     case GAIA_XY_
6b50: 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  M:...xtype = GAI
6b60: 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
6b70: 54 49 4f 4e 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a  TIONM;...break;.
6b80: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58  .    case GAIA_X
6b90: 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65 20 3d  Y_Z_M:...xtype =
6ba0: 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
6bb0: 4c 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 62 72  LLECTIONZM;...br
6bc0: 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
6bd0: 74 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  t:...xtype = GAI
6be0: 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
6bf0: 54 49 4f 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  TION;...break;..
6c00: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 20      };.      }. 
6c10: 20 20 20 73 77 69 74 63 68 20 28 67 65 6f 6d 5f     switch (geom_
6c20: 74 79 70 65 29 0a 20 20 20 20 20 20 7b 0a 09 20  type).      {.. 
6c30: 20 2f 2a 20 61 64 6a 75 73 74 69 6e 67 20 43 4f   /* adjusting CO
6c40: 4d 50 52 45 53 53 45 44 20 47 65 6f 6d 65 74 72  MPRESSED Geometr
6c50: 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 61 73  ies */.      cas
6c60: 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  e GAIA_COMPRESSE
6c70: 44 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20  D_LINESTRING:.. 
6c80: 20 67 65 6f 6d 5f 6e 6f 72 6d 61 6c 69 7a 65 64   geom_normalized
6c90: 5f 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e  _type = GAIA_LIN
6ca0: 45 53 54 52 49 4e 47 3b 0a 09 20 20 62 72 65 61  ESTRING;..  brea
6cb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  k;.      case GA
6cc0: 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 4c 49  IA_COMPRESSED_LI
6cd0: 4e 45 53 54 52 49 4e 47 5a 3a 0a 09 20 20 67 65  NESTRINGZ:..  ge
6ce0: 6f 6d 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 74 79  om_normalized_ty
6cf0: 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54  pe = GAIA_LINEST
6d00: 52 49 4e 47 5a 3b 0a 09 20 20 62 72 65 61 6b 3b  RINGZ;..  break;
6d10: 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
6d20: 5f 43 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45  _COMPRESSED_LINE
6d30: 53 54 52 49 4e 47 4d 3a 0a 09 20 20 67 65 6f 6d  STRINGM:..  geom
6d40: 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 74 79 70 65  _normalized_type
6d50: 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49   = GAIA_LINESTRI
6d60: 4e 47 4d 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  NGM;..  break;. 
6d70: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 43       case GAIA_C
6d80: 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54  OMPRESSED_LINEST
6d90: 52 49 4e 47 5a 4d 3a 0a 09 20 20 67 65 6f 6d 5f  RINGZM:..  geom_
6da0: 6e 6f 72 6d 61 6c 69 7a 65 64 5f 74 79 70 65 20  normalized_type 
6db0: 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  = GAIA_LINESTRIN
6dc0: 47 5a 4d 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  GZM;..  break;. 
6dd0: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 43       case GAIA_C
6de0: 4f 4d 50 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f  OMPRESSED_POLYGO
6df0: 4e 3a 0a 09 20 20 67 65 6f 6d 5f 6e 6f 72 6d 61  N:..  geom_norma
6e00: 6c 69 7a 65 64 5f 74 79 70 65 20 3d 20 47 41 49  lized_type = GAI
6e10: 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 09 20 20 62 72  A_POLYGON;..  br
6e20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
6e30: 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f  GAIA_COMPRESSED_
6e40: 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 67 65 6f  POLYGONZ:..  geo
6e50: 6d 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 74 79 70  m_normalized_typ
6e60: 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  e = GAIA_POLYGON
6e70: 5a 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  Z;..  break;.   
6e80: 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d     case GAIA_COM
6e90: 50 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 4d  PRESSED_POLYGONM
6ea0: 3a 0a 09 20 20 67 65 6f 6d 5f 6e 6f 72 6d 61 6c  :..  geom_normal
6eb0: 69 7a 65 64 5f 74 79 70 65 20 3d 20 47 41 49 41  ized_type = GAIA
6ec0: 5f 50 4f 4c 59 47 4f 4e 4d 3b 0a 09 20 20 62 72  _POLYGONM;..  br
6ed0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
6ee0: 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f  GAIA_COMPRESSED_
6ef0: 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20 67 65  POLYGONZM:..  ge
6f00: 6f 6d 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 74 79  om_normalized_ty
6f10: 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f  pe = GAIA_POLYGO
6f20: 4e 5a 4d 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  NZM;..  break;. 
6f30: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20       default:.. 
6f40: 20 67 65 6f 6d 5f 6e 6f 72 6d 61 6c 69 7a 65 64   geom_normalized
6f50: 5f 74 79 70 65 20 3d 20 67 65 6f 6d 5f 74 79 70  _type = geom_typ
6f60: 65 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  e;..  break;.   
6f70: 20 20 20 7d 3b 0a 20 20 20 20 69 66 20 28 73 74     };.    if (st
6f80: 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
6f90: 2a 29 20 74 79 70 65 2c 20 22 47 45 4f 4d 45 54  *) type, "GEOMET
6fa0: 52 59 22 29 20 3d 3d 20 30 29 0a 09 78 74 79 70  RY") == 0)..xtyp
6fb0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 20 28  e = -1;.    if (
6fc0: 78 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 55 4e  xtype == GAIA_UN
6fd0: 4b 4e 4f 57 4e 29 0a 09 73 71 6c 69 74 65 33 5f  KNOWN)..sqlite3_
6fe0: 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
6ff0: 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c  ext, -1);.    el
7000: 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65  se.      {..  re
7010: 74 20 3d 20 31 3b 0a 09 20 20 69 66 20 28 70 5f  t = 1;..  if (p_
7020: 62 6c 6f 62 29 0a 09 20 20 20 20 7b 0a 09 09 2f  blob)..    {.../
7030: 2a 20 73 6b 69 70 70 69 6e 67 20 4e 55 4c 4c 20  * skipping NULL 
7040: 47 65 6f 6d 65 74 72 79 3b 20 74 68 69 73 20 69  Geometry; this i
7050: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
7060: 61 6c 77 61 79 73 20 67 6f 6f 64 20 2a 2f 0a 09  always good */..
7070: 09 69 66 20 28 67 65 6f 6d 5f 73 72 69 64 20 21  .if (geom_srid !
7080: 3d 20 73 72 69 64 29 0a 09 09 20 20 20 20 72 65  = srid)...    re
7090: 74 20 3d 20 30 3b 0a 09 09 69 66 20 28 78 74 79  t = 0;...if (xty
70a0: 70 65 20 3d 3d 20 2d 31 29 0a 09 09 20 20 20 20  pe == -1)...    
70b0: 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 78 74 79  ;...else if (xty
70c0: 70 65 20 21 3d 20 67 65 6f 6d 5f 6e 6f 72 6d 61  pe != geom_norma
70d0: 6c 69 7a 65 64 5f 74 79 70 65 29 0a 09 09 20 20  lized_type)...  
70e0: 20 20 72 65 74 20 3d 20 30 3b 0a 09 20 20 20 20    ret = 0;..    
70f0: 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  }..  sqlite3_res
7100: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
7110: 2c 20 72 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  , ret);.      }.
7120: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
7130: 6e 63 74 5f 52 54 72 65 65 41 6c 69 67 6e 20 28  nct_RTreeAlign (
7140: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7150: 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
7160: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
7170: 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
7180: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
7190: 20 52 54 72 65 65 41 6c 69 67 6e 28 52 54 72 65   RTreeAlign(RTre
71a0: 65 2d 74 61 62 6c 65 2d 6e 61 6d 65 2c 20 50 4b  e-table-name, PK
71b0: 49 44 2d 76 61 6c 75 65 2c 20 42 4c 4f 42 65 6e  ID-value, BLOBen
71c0: 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
71d0: 2f 0a 2f 20 61 74 74 65 6d 70 74 73 20 74 6f 20  /./ attempts to 
71e0: 75 70 64 61 74 65 20 74 68 65 20 61 73 73 6f 63  update the assoc
71f0: 69 61 74 65 64 20 52 2a 54 72 65 65 2c 20 72 65  iated R*Tree, re
7200: 74 75 72 6e 69 6e 67 3a 0a 2f 0a 2f 20 2d 31 20  turning:././ -1 
7210: 2d 20 69 66 20 73 6f 6d 65 20 69 6e 76 61 6c 69  - if some invali
7220: 64 20 61 72 67 20 77 61 73 20 70 61 73 73 65 64  d arg was passed
7230: 0a 2f 20 31 20 2d 20 73 75 63 63 65 73 73 66 75  ./ 1 - successfu
7240: 6c 20 75 70 64 61 74 65 0a 2f 20 30 20 2d 20 75  l update./ 0 - u
7250: 70 64 61 74 65 20 66 61 69 6c 75 72 65 0a 2f 0a  pdate failure./.
7260: 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
7270: 63 68 61 72 20 2a 70 5f 62 6c 6f 62 20 3d 20 4e  char *p_blob = N
7280: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  ULL;.    int n_b
7290: 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 73 71  ytes = 0;.    sq
72a0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 70 6b 69 64  lite3_int64 pkid
72b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
72c0: 20 2a 72 74 72 65 65 5f 74 61 62 6c 65 3b 0a 20   *rtree_table;. 
72d0: 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65 5f 6e     char *table_n
72e0: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ame;.    int len
72f0: 3b 0a 20 20 20 20 63 68 61 72 20 70 6b 76 5b 36  ;.    char pkv[6
7300: 34 5d 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  4];.    gaiaGeom
7310: 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 20 3d 20 4e  CollPtr geom = N
7320: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
7330: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 5f  ;.    char *sql_
7340: 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 73  statement;.    s
7350: 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
7360: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7370: 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
7380: 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
7390: 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
73a0: 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
73b0: 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
73c0: 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
73d0: 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [0]) == SQLITE_T
73e0: 45 58 54 29 0a 09 72 74 72 65 65 5f 74 61 62 6c  EXT)..rtree_tabl
73f0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
7400: 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
7410: 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
7420: 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
7430: 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
7440: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
7450: 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
7460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
7470: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
7480: 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
7490: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
74a0: 29 0a 09 70 6b 69 64 20 3d 20 73 71 6c 69 74 65  )..pkid = sqlite
74b0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 20 28 61  3_value_int64 (a
74c0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
74d0: 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
74e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
74f0: 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
7500: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
7510: 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
7520: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
7530: 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
7540: 5f 42 4c 4f 42 0a 09 7c 7c 20 73 71 6c 69 74 65  _BLOB..|| sqlite
7550: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
7560: 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
7570: 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c  _NULL)..;.    el
7580: 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
7590: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
75a0: 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
75b0: 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
75c0: 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
75d0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
75e0: 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
75f0: 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
7600: 09 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73  .  p_blob = (uns
7610: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
7620: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
7630: 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 6e   (argv[2]);..  n
7640: 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
7650: 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
7660: 67 76 5b 32 5d 29 3b 0a 09 20 20 67 65 6f 6d 20  gv[2]);..  geom 
7670: 3d 20 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  = gaiaFromSpatia
7680: 4c 69 74 65 42 6c 6f 62 57 6b 62 20 28 70 5f 62  LiteBlobWkb (p_b
7690: 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20  lob, n_bytes);. 
76a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28       }..    if (
76b0: 67 65 6f 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  geom == NULL).  
76c0: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 4e 55 4c 4c      {..  /* NULL
76d0: 20 67 65 6f 6d 65 74 72 79 3a 20 6e 6f 74 68 69   geometry: nothi
76e0: 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 09 20 20 73  ng to do */..  s
76f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
7700: 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
7710: 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
7720: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 49  .      {..  /* I
7730: 4e 53 45 52 54 69 6e 67 20 69 6e 74 6f 20 74 68  NSERTing into th
7740: 65 20 52 2a 54 72 65 65 20 2a 2f 0a 09 20 20 69  e R*Tree */..  i
7750: 66 20 28 2a 28 72 74 72 65 65 5f 74 61 62 6c 65  f (*(rtree_table
7760: 20 2b 20 30 29 20 3d 3d 20 27 22 27 0a 09 20 20   + 0) == '"'..  
7770: 20 20 20 20 26 26 20 2a 28 72 74 72 65 65 5f 74      && *(rtree_t
7780: 61 62 6c 65 20 2b 20 73 74 72 6c 65 6e 20 28 72  able + strlen (r
7790: 74 72 65 65 5f 74 61 62 6c 65 29 20 2d 20 31 29  tree_table) - 1)
77a0: 20 3d 3d 20 27 22 27 29 0a 09 20 20 20 20 7b 0a   == '"')..    {.
77b0: 09 09 2f 2a 20 65 61 72 6c 69 65 72 20 76 65 72  ../* earlier ver
77c0: 73 69 6f 6e 73 20 6d 61 79 20 70 61 73 73 20 61  sions may pass a
77d0: 6e 20 61 6c 72 65 61 64 79 20 71 75 6f 74 65 64  n already quoted
77e0: 20 6e 61 6d 65 20 2a 2f 0a 09 09 63 68 61 72 20   name */...char 
77f0: 2a 64 65 71 75 6f 74 65 64 5f 74 61 62 6c 65 5f  *dequoted_table_
7800: 6e 61 6d 65 3b 0a 09 09 6c 65 6e 20 3d 20 73 74  name;...len = st
7810: 72 6c 65 6e 20 28 72 74 72 65 65 5f 74 61 62 6c  rlen (rtree_tabl
7820: 65 29 3b 0a 09 09 74 61 62 6c 65 5f 6e 61 6d 65  e);...table_name
7830: 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b   = malloc (len +
7840: 20 31 29 3b 0a 09 09 73 74 72 63 70 79 20 28 74   1);...strcpy (t
7850: 61 62 6c 65 5f 6e 61 6d 65 2c 20 72 74 72 65 65  able_name, rtree
7860: 5f 74 61 62 6c 65 29 3b 0a 09 09 64 65 71 75 6f  _table);...dequo
7870: 74 65 64 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d  ted_table_name =
7880: 20 67 61 69 61 44 65 71 75 6f 74 65 64 53 71 6c   gaiaDequotedSql
7890: 20 28 74 61 62 6c 65 5f 6e 61 6d 65 29 3b 0a 09   (table_name);..
78a0: 09 66 72 65 65 20 28 74 61 62 6c 65 5f 6e 61 6d  .free (table_nam
78b0: 65 29 3b 0a 09 09 69 66 20 28 64 65 71 75 6f 74  e);...if (dequot
78c0: 65 64 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 3d  ed_table_name ==
78d0: 20 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20   NULL)...  {... 
78e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
78f0: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
7900: 2c 20 2d 31 29 3b 0a 09 09 20 20 20 20 20 20 72  , -1);...      r
7910: 65 74 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 09 74  eturn;...  }...t
7920: 61 62 6c 65 5f 6e 61 6d 65 20 3d 20 67 61 69 61  able_name = gaia
7930: 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20  DoubleQuotedSql 
7940: 28 64 65 71 75 6f 74 65 64 5f 74 61 62 6c 65 5f  (dequoted_table_
7950: 6e 61 6d 65 29 3b 0a 09 09 66 72 65 65 20 28 64  name);...free (d
7960: 65 71 75 6f 74 65 64 5f 74 61 62 6c 65 5f 6e 61  equoted_table_na
7970: 6d 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  me);..    }..  e
7980: 6c 73 65 0a 09 20 20 20 20 20 20 74 61 62 6c 65  lse..      table
7990: 5f 6e 61 6d 65 20 3d 20 67 61 69 61 44 6f 75 62  _name = gaiaDoub
79a0: 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 72 74 72  leQuotedSql (rtr
79b0: 65 65 5f 74 61 62 6c 65 29 3b 0a 09 20 20 73 70  ee_table);..  sp
79c0: 72 69 6e 74 66 20 28 70 6b 76 2c 20 46 52 4d 54  rintf (pkv, FRMT
79d0: 36 34 2c 20 70 6b 69 64 29 3b 0a 09 20 20 73 71  64, pkid);..  sq
79e0: 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09 20  l_statement =.. 
79f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
7a00: 69 6e 74 66 0a 09 20 20 20 20 20 20 28 22 49 4e  intf..      ("IN
7a10: 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 73 5c 22  SERT INTO \"%s\"
7a20: 20 28 70 6b 69 64 2c 20 78 6d 69 6e 2c 20 79 6d   (pkid, xmin, ym
7a30: 69 6e 2c 20 78 6d 61 78 2c 20 79 6d 61 78 29 20  in, xmax, ymax) 
7a40: 22 0a 09 20 20 20 20 20 20 20 22 56 41 4c 55 45  "..       "VALUE
7a50: 53 20 28 25 73 2c 20 25 31 2e 31 32 66 2c 20 25  S (%s, %1.12f, %
7a60: 31 2e 31 32 66 2c 20 25 31 2e 31 32 66 2c 20 25  1.12f, %1.12f, %
7a70: 31 2e 31 32 66 29 22 2c 20 74 61 62 6c 65 5f 6e  1.12f)", table_n
7a80: 61 6d 65 2c 0a 09 20 20 20 20 20 20 20 70 6b 76  ame,..       pkv
7a90: 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 67 65  , geom->MinX, ge
7aa0: 6f 6d 2d 3e 4d 69 6e 59 2c 20 67 65 6f 6d 2d 3e  om->MinY, geom->
7ab0: 4d 61 78 58 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59  MaxX, geom->MaxY
7ac0: 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65  );..  gaiaFreeGe
7ad0: 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09  omColl (geom);..
7ae0: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
7af0: 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71  exec (sqlite, sq
7b00: 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c  l_statement, NUL
7b10: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
7b20: 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20  .  sqlite3_free 
7b30: 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b  (sql_statement);
7b40: 0a 09 20 20 66 72 65 65 20 28 74 61 62 6c 65 5f  ..  free (table_
7b50: 6e 61 6d 65 29 3b 0a 09 20 20 69 66 20 28 72 65  name);..  if (re
7b60: 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
7b70: 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7b80: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
7b90: 78 74 2c 20 30 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 0);..  else.
7ba0: 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7bb0: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
7bc0: 78 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xt, 1);.      }.
7bd0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
7be0: 6e 63 74 5f 49 73 56 61 6c 69 64 46 6f 6e 74 20  nct_IsValidFont 
7bf0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7c00: 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
7c10: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
7c20: 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
7c30: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
7c40: 2f 20 49 73 56 61 6c 69 64 46 6f 6e 74 28 42 4c  / IsValidFont(BL
7c50: 4f 42 65 6e 63 6f 64 65 64 20 66 6f 6e 74 29 0a  OBencoded font).
7c60: 2f 0a 2f 20 62 61 73 69 63 20 76 65 72 73 69 6f  /./ basic versio
7c70: 6e 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  n intended to be
7c80: 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 52   overloaded by R
7c90: 61 73 74 65 72 4c 69 74 65 2d 32 0a 2f 20 61 6c  asterLite-2./ al
7ca0: 77 61 79 73 20 72 65 74 75 72 6e 20 30 20 28 46  ways return 0 (F
7cb0: 41 4c 53 45 29 0a 2f 20 6f 72 20 2d 31 20 28 49  ALSE)./ or -1 (I
7cc0: 4e 56 41 4c 49 44 20 41 52 47 53 29 0a 2f 0a 2a  NVALID ARGS)./.*
7cd0: 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  /.    GAIA_UNUSE
7ce0: 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
7cf0: 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
7d00: 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
7d10: 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
7d20: 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
7d30: 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
7d40: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
7d50: 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
7d60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
7d80: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
7d90: 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  , 0);.}..static 
7da0: 76 6f 69 64 0a 66 6e 63 74 5f 43 68 65 63 6b 46  void.fnct_CheckF
7db0: 6f 6e 74 46 61 63 65 6e 61 6d 65 20 28 73 71 6c  ontFacename (sql
7dc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
7dd0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
7de0: 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  ,....sqlite3_val
7df0: 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
7e00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
7e10: 20 43 68 65 63 6b 46 6f 6e 74 66 61 63 65 4e 61   CheckFontfaceNa
7e20: 6d 65 28 54 45 58 54 20 66 61 63 65 6e 61 6d 65  me(TEXT facename
7e30: 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 66 6f  , BLOBencoded fo
7e40: 6e 74 29 0a 2f 0a 2f 20 62 61 73 69 63 20 76 65  nt)././ basic ve
7e50: 72 73 69 6f 6e 20 69 6e 74 65 6e 64 65 64 20 74  rsion intended t
7e60: 6f 20 62 65 20 6f 76 65 72 6c 6f 61 64 65 64 20  o be overloaded 
7e70: 62 79 20 52 61 73 74 65 72 4c 69 74 65 2d 32 0a  by RasterLite-2.
7e80: 2f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  / always return 
7e90: 4e 55 4c 4c 0a 2f 0a 2a 2f 0a 20 20 20 20 47 41  NULL./.*/.    GA
7ea0: 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
7eb0: 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
7ec0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
7ed0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
7ee0: 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
7ef0: 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
7f00: 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
7f10: 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
7f20: 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
7f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
7f40: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
7f50: 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
7f60: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
7f70: 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
7f80: 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
7f90: 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
7fa0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
7fb0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7fc0: 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
7fd0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
7fe0: 64 0a 66 6e 63 74 5f 47 65 74 46 6f 6e 74 46 61  d.fnct_GetFontFa
7ff0: 6d 69 6c 79 20 28 73 71 6c 69 74 65 33 5f 63 6f  mily (sqlite3_co
8000: 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
8010: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
8020: 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
8030: 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
8040: 69 6f 6e 3a 0a 2f 20 47 65 74 46 6f 6e 74 46 61  ion:./ GetFontFa
8050: 6d 69 6c 79 28 42 4c 4f 42 65 6e 63 6f 64 65 64  mily(BLOBencoded
8060: 20 66 6f 6e 74 29 0a 2f 0a 2f 20 62 61 73 69 63   font)././ basic
8070: 20 76 65 72 73 69 6f 6e 20 69 6e 74 65 6e 64 65   version intende
8080: 64 20 74 6f 20 62 65 20 6f 76 65 72 6c 6f 61 64  d to be overload
8090: 65 64 20 62 79 20 52 61 73 74 65 72 4c 69 74 65  ed by RasterLite
80a0: 2d 32 0a 2f 20 61 6c 77 61 79 73 20 72 65 74 75  -2./ always retu
80b0: 72 6e 20 4e 55 4c 4c 0a 2f 0a 2a 2f 0a 20 20 20  rn NULL./.*/.   
80c0: 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
80d0: 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
80e0: 49 4e 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  INE */.    sqlit
80f0: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
8100: 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61  context);.}..sta
8110: 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73  tic void.fnct_Is
8120: 46 6f 6e 74 42 6f 6c 64 20 28 73 71 6c 69 74 65  FontBold (sqlite
8130: 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
8140: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
8150: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
8160: 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
8170: 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 73 46 6f 6e  unction:./ IsFon
8180: 74 42 6f 6c 64 28 42 4c 4f 42 65 6e 63 6f 64 65  tBold(BLOBencode
8190: 64 20 66 6f 6e 74 29 0a 2f 0a 2f 20 62 61 73 69  d font)././ basi
81a0: 63 20 76 65 72 73 69 6f 6e 20 69 6e 74 65 6e 64  c version intend
81b0: 65 64 20 74 6f 20 62 65 20 6f 76 65 72 6c 6f 61  ed to be overloa
81c0: 64 65 64 20 62 79 20 52 61 73 74 65 72 4c 69 74  ded by RasterLit
81d0: 65 2d 32 0a 2f 20 61 6c 77 61 79 73 20 72 65 74  e-2./ always ret
81e0: 75 72 6e 20 2d 31 0a 2f 0a 2a 2f 0a 20 20 20 20  urn -1./.*/.    
81f0: 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
8200: 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
8210: 4e 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  NE */.    sqlite
8220: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
8230: 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 7d 0a 0a 73  ntext, -1);.}..s
8240: 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
8250: 49 73 46 6f 6e 74 49 74 61 6c 69 63 20 28 73 71  IsFontItalic (sq
8260: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
8270: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
8280: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
8290: 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
82a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49  QL function:./ I
82b0: 73 46 6f 6e 74 49 74 61 6c 69 63 28 42 4c 4f 42  sFontItalic(BLOB
82c0: 65 6e 63 6f 64 65 64 20 66 6f 6e 74 29 0a 2f 0a  encoded font)./.
82d0: 2f 20 62 61 73 69 63 20 76 65 72 73 69 6f 6e 20  / basic version 
82e0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 6f  intended to be o
82f0: 76 65 72 6c 6f 61 64 65 64 20 62 79 20 52 61 73  verloaded by Ras
8300: 74 65 72 4c 69 74 65 2d 32 0a 2f 20 61 6c 77 61  terLite-2./ alwa
8310: 79 73 20 72 65 74 75 72 6e 20 2d 31 0a 2f 0a 2a  ys return -1./.*
8320: 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  /.    GAIA_UNUSE
8330: 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
8340: 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
8350: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
8360: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
8370: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
8380: 0a 66 6e 63 74 5f 49 73 56 61 6c 69 64 50 69 78  .fnct_IsValidPix
8390: 65 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  el (sqlite3_cont
83a0: 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
83b0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
83c0: 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
83d0: 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
83e0: 6e 3a 0a 2f 20 49 73 56 61 6c 69 64 50 69 78 65  n:./ IsValidPixe
83f0: 6c 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 70 69  l(BLOBencoded pi
8400: 78 65 6c 2c 20 74 65 78 74 20 73 61 6d 70 6c 65  xel, text sample
8410: 5f 74 79 70 65 2c 20 69 6e 74 20 6e 75 6d 5f 62  _type, int num_b
8420: 61 6e 64 73 29 0a 2f 0a 2f 20 62 61 73 69 63 20  ands)././ basic 
8430: 76 65 72 73 69 6f 6e 20 69 6e 74 65 6e 64 65 64  version intended
8440: 20 74 6f 20 62 65 20 6f 76 65 72 6c 6f 61 64 65   to be overloade
8450: 64 20 62 79 20 52 61 73 74 65 72 4c 69 74 65 2d  d by RasterLite-
8460: 32 0a 2f 20 61 6c 77 61 79 73 20 72 65 74 75 72  2./ always retur
8470: 6e 20 30 20 28 46 41 4c 53 45 29 0a 2f 20 6f 72  n 0 (FALSE)./ or
8480: 20 2d 31 20 28 49 4e 56 41 4c 49 44 20 41 52 47   -1 (INVALID ARG
8490: 53 29 0a 2f 0a 2a 2f 0a 20 20 20 20 47 41 49 41  S)./.*/.    GAIA
84a0: 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
84b0: 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
84c0: 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
84d0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
84e0: 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
84f0: 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
8500: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8510: 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
8520: 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
8530: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
8540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8550: 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
8560: 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20  QLITE_TEXT).    
8570: 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
8580: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
8590: 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
85a0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
85b0: 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
85c0: 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
85d0: 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
85e0: 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  ER).      {..  s
85f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
8600: 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
8610: 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
8620: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
8630: 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
8640: 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74  ext, 0);.}..stat
8650: 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 56  ic void.fnct_IsV
8660: 61 6c 69 64 52 61 73 74 65 72 50 61 6c 65 74 74  alidRasterPalett
8670: 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
8680: 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
8690: 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 73 71  t argc,....   sq
86a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
86b0: 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
86c0: 6e 63 74 69 6f 6e 3a 0a 2f 20 49 73 56 61 6c 69  nction:./ IsVali
86d0: 64 52 61 73 74 65 72 50 61 6c 65 74 74 65 28 42  dRasterPalette(B
86e0: 4c 4f 42 65 6e 63 6f 64 65 64 20 70 61 6c 65 74  LOBencoded palet
86f0: 74 65 2c 20 74 65 78 74 20 73 61 6d 70 6c 65 5f  te, text sample_
8700: 74 79 70 65 29 0a 2f 0a 2f 20 62 61 73 69 63 20  type)././ basic 
8710: 76 65 72 73 69 6f 6e 20 69 6e 74 65 6e 64 65 64  version intended
8720: 20 74 6f 20 62 65 20 6f 76 65 72 6c 6f 61 64 65   to be overloade
8730: 64 20 62 79 20 52 61 73 74 65 72 4c 69 74 65 2d  d by RasterLite-
8740: 32 0a 2f 20 61 6c 77 61 79 73 20 72 65 74 75 72  2./ always retur
8750: 6e 20 30 20 28 46 41 4c 53 45 29 0a 2f 20 6f 72  n 0 (FALSE)./ or
8760: 20 2d 31 20 28 49 4e 56 41 4c 49 44 20 41 52 47   -1 (INVALID ARG
8770: 53 29 0a 2f 0a 2a 2f 0a 20 20 20 20 47 41 49 41  S)./.*/.    GAIA
8780: 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
8790: 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
87a0: 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
87b0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
87c0: 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
87d0: 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
87e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
87f0: 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
8800: 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
8810: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
8820: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8830: 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
8840: 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20  QLITE_TEXT).    
8850: 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
8860: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
8870: 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
8880: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8890: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
88a0: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
88b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
88c0: 66 6e 63 74 5f 49 73 56 61 6c 69 64 52 61 73 74  fnct_IsValidRast
88d0: 65 72 53 74 61 74 69 73 74 69 63 73 20 28 73 71  erStatistics (sq
88e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
88f0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
8900: 63 2c 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69  c,....      sqli
8910: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
8920: 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
8930: 74 69 6f 6e 3a 0a 2f 20 49 73 56 61 6c 69 64 52  tion:./ IsValidR
8940: 61 73 74 65 72 53 74 61 74 69 73 74 69 63 73 28  asterStatistics(
8950: 74 65 78 74 20 64 62 5f 70 72 65 66 69 78 2c 20  text db_prefix, 
8960: 74 65 78 74 20 63 6f 76 65 72 61 67 65 2c 20 0a  text coverage, .
8970: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
8980: 20 20 20 20 20 20 20 20 20 20 42 4c 4f 42 65 6e            BLOBen
8990: 63 6f 64 65 64 20 73 74 61 74 69 73 74 69 63 73  coded statistics
89a0: 29 0a 2f 20 20 20 6f 72 0a 2f 20 49 73 56 61 6c  )./   or./ IsVal
89b0: 69 64 52 61 73 74 65 72 53 74 61 74 69 73 74 69  idRasterStatisti
89c0: 63 73 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 73  cs(BLOBencoded s
89d0: 74 61 74 69 73 74 69 63 73 2c 20 74 65 78 74 20  tatistics, text 
89e0: 73 61 6d 70 6c 65 5f 74 79 70 65 2c 20 0a 2f 20  sample_type, ./ 
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 75 6d 5f          int num_
8a10: 62 61 6e 64 73 29 0a 2f 0a 2f 20 62 61 73 69 63  bands)././ basic
8a20: 20 76 65 72 73 69 6f 6e 20 69 6e 74 65 6e 64 65   version intende
8a30: 64 20 74 6f 20 62 65 20 6f 76 65 72 6c 6f 61 64  d to be overload
8a40: 65 64 20 62 79 20 52 61 73 74 65 72 4c 69 74 65  ed by RasterLite
8a50: 2d 32 0a 2f 20 61 6c 77 61 79 73 20 72 65 74 75  -2./ always retu
8a60: 72 6e 20 30 20 28 46 41 4c 53 45 29 0a 2f 20 6f  rn 0 (FALSE)./ o
8a70: 72 20 2d 31 20 28 49 4e 56 41 4c 49 44 20 41 52  r -1 (INVALID AR
8a80: 47 53 29 0a 2f 0a 2a 2f 0a 20 20 20 20 47 41 49  GS)./.*/.    GAI
8a90: 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
8aa0: 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
8ab0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 71 6c 69  */.    if ((sqli
8ac0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
8ad0: 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49  argv[0]) == SQLI
8ae0: 54 45 5f 54 45 58 54 0a 09 20 7c 7c 20 73 71 6c  TE_TEXT.. || sql
8af0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
8b00: 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
8b10: 49 54 45 5f 4e 55 4c 4c 29 0a 09 26 26 20 73 71  ITE_NULL)..&& sq
8b20: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b30: 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
8b40: 4c 49 54 45 5f 54 45 58 54 0a 09 26 26 20 73 71  LITE_TEXT..&& sq
8b50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b60: 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
8b70: 4c 49 54 45 5f 42 4c 4f 42 29 0a 09 3b 0a 20 20  LITE_BLOB)..;.  
8b80: 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
8b90: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
8ba0: 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
8bb0: 45 5f 42 4c 4f 42 0a 09 20 20 20 20 20 26 26 20  E_BLOB..     && 
8bc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8bd0: 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
8be0: 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 20 20 20  SQLITE_TEXT..   
8bf0: 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c    && sqlite3_val
8c00: 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
8c10: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
8c20: 47 45 52 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65  GER)..;.    else
8c30: 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
8c40: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
8c50: 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
8c60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8c80: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
8c90: 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  , 0);.}..static 
8ca0: 76 6f 69 64 0a 66 6e 63 74 5f 49 73 56 61 6c 69  void.fnct_IsVali
8cb0: 64 52 61 73 74 65 72 54 69 6c 65 20 28 73 71 6c  dRasterTile (sql
8cc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
8cd0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
8ce0: 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  ,....sqlite3_val
8cf0: 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
8d00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
8d10: 20 49 73 56 61 6c 69 64 52 61 73 74 65 72 54 69   IsValidRasterTi
8d20: 6c 65 28 74 65 78 74 20 64 62 5f 70 72 65 66 69  le(text db_prefi
8d30: 78 2c 20 74 65 78 74 20 63 6f 76 65 72 61 67 65  x, text coverage
8d40: 2c 20 69 6e 74 65 67 65 72 20 6c 65 76 65 6c 2c  , integer level,
8d50: 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   ./             
8d60: 20 20 20 20 20 20 42 4c 4f 42 65 6e 63 6f 64 65        BLOBencode
8d70: 64 20 74 69 6c 65 5f 6f 64 64 2c 20 42 4c 4f 42  d tile_odd, BLOB
8d80: 65 6e 63 6f 64 65 64 20 74 69 6c 65 5f 65 76 65  encoded tile_eve
8d90: 6e 29 0a 2f 0a 2f 20 62 61 73 69 63 20 76 65 72  n)././ basic ver
8da0: 73 69 6f 6e 20 69 6e 74 65 6e 64 65 64 20 74 6f  sion intended to
8db0: 20 62 65 20 6f 76 65 72 6c 6f 61 64 65 64 20 62   be overloaded b
8dc0: 79 20 52 61 73 74 65 72 4c 69 74 65 2d 32 0a 2f  y RasterLite-2./
8dd0: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30   always return 0
8de0: 20 28 46 41 4c 53 45 29 0a 2f 20 6f 72 20 2d 31   (FALSE)./ or -1
8df0: 20 28 49 4e 56 41 4c 49 44 20 41 52 47 53 29 0a   (INVALID ARGS).
8e00: 2f 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e  /.*/.    GAIA_UN
8e10: 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
8e20: 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
8e30: 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
8e40: 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
8e50: 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45  0]) == SQLITE_TE
8e60: 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76  XT..|| sqlite3_v
8e70: 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
8e80: 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55  0]) == SQLITE_NU
8e90: 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a  LL)..;.    else.
8ea0: 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
8eb0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
8ec0: 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
8ed0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
8ee0: 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
8ef0: 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
8f00: 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [1]) != SQLITE_T
8f10: 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
8f20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
8f30: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
8f40: 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
8f50: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
8f60: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
8f70: 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c  (argv[2]) != SQL
8f80: 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
8f90: 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
8fa0: 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
8fb0: 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
8fc0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
8fd0: 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
8fe0: 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
8ff0: 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
9000: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
9010: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
9020: 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
9030: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
9040: 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
9050: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
9060: 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[4]) != SQLITE
9070: 5f 42 4c 4f 42 0a 09 26 26 20 73 71 6c 69 74 65  _BLOB..&& sqlite
9080: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
9090: 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[4]) != SQLITE
90a0: 5f 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09  _NULL).      {..
90b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
90c0: 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
90d0: 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
90e0: 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
90f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
9100: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 73  ontext, 0);.}..s
9110: 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
9120: 49 73 50 6f 70 75 6c 61 74 65 64 43 6f 76 65 72  IsPopulatedCover
9130: 61 67 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  age (sqlite3_con
9140: 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
9150: 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73  int argc,....  s
9160: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
9170: 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
9180: 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 73 50 6f 70  unction:./ IsPop
9190: 75 6c 61 74 65 64 43 6f 76 65 72 61 67 65 28 74  ulatedCoverage(t
91a0: 65 78 74 20 64 62 5f 70 72 65 66 69 78 2c 20 74  ext db_prefix, t
91b0: 65 78 74 20 63 6f 76 65 72 61 67 65 29 0a 2f 0a  ext coverage)./.
91c0: 2f 20 63 68 65 63 6b 20 69 66 20 61 20 52 61 73  / check if a Ras
91d0: 74 65 72 43 6f 76 65 72 61 67 65 20 69 73 20 61  terCoverage is a
91e0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
91f0: 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 69 66   ./ returns 1 if
9200: 20 54 52 55 45 2c 20 30 20 69 66 20 46 41 4c 53   TRUE, 0 if FALS
9210: 45 0a 2f 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69  E./ -1 on invali
9220: 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
9230: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64     const char *d
9240: 62 5f 70 72 65 66 69 78 20 3d 20 4e 55 4c 4c 3b  b_prefix = NULL;
9250: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9260: 2a 63 6f 76 65 72 61 67 65 3b 0a 20 20 20 20 69  *coverage;.    i
9270: 6e 74 20 72 65 74 3b 0a 20 20 20 20 73 71 6c 69  nt ret;.    sqli
9280: 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71  te3 *sqlite = sq
9290: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
92a0: 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
92b0: 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
92c0: 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
92d0: 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
92e0: 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
92f0: 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
9300: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
9310: 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ..|| sqlite3_val
9320: 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
9330: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
9340: 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  )..;.    else.  
9350: 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
9360: 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
9370: 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
9380: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
9390: 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
93a0: 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
93b0: 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
93c0: 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
93d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
93e0: 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
93f0: 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
9400: 20 7d 0a 20 20 20 20 63 6f 76 65 72 61 67 65 20   }.    coverage 
9410: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
9420: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
9430: 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
9440: 20 20 20 72 65 74 20 3d 20 63 68 65 63 6b 50 6f     ret = checkPo
9450: 70 75 6c 61 74 65 64 43 6f 76 65 72 61 67 65 20  pulatedCoverage 
9460: 28 73 71 6c 69 74 65 2c 20 64 62 5f 70 72 65 66  (sqlite, db_pref
9470: 69 78 2c 20 63 6f 76 65 72 61 67 65 29 3b 0a 20  ix, coverage);. 
9480: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9490: 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
94a0: 72 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ret);.    return
94b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  ;.}..static int.
94c0: 69 73 5f 77 69 74 68 6f 75 74 5f 72 6f 77 69 64  is_without_rowid
94d0: 5f 74 61 62 6c 65 20 28 73 71 6c 69 74 65 33 20  _table (sqlite3 
94e0: 2a 20 73 71 6c 69 74 65 2c 20 63 6f 6e 73 74 20  * sqlite, const 
94f0: 63 68 61 72 20 2a 74 61 62 6c 65 29 0a 7b 0a 2f  char *table).{./
9500: 2a 20 69 6e 74 65 72 6e 61 6c 20 75 74 69 6c 69  * internal utili
9510: 74 79 20 66 75 6e 63 74 69 6f 6e 73 3b 20 63 68  ty functions; ch
9520: 65 63 6b 73 20 66 6f 72 20 57 49 54 48 4f 55 54  ecks for WITHOUT
9530: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
9540: 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a  .    char *sql;.
9550: 20 20 20 20 63 68 61 72 20 2a 78 74 61 62 6c 65      char *xtable
9560: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
9570: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
9580: 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a 20 20  ar **results;.  
9590: 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 20 20    int rows;.    
95a0: 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20 20 20  int columns;.   
95b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 63 68 61 72   int j;.    char
95c0: 20 2a 2a 72 65 73 75 6c 74 73 32 3b 0a 20 20 20   **results2;.   
95d0: 20 69 6e 74 20 72 6f 77 73 32 3b 0a 20 20 20 20   int rows2;.    
95e0: 69 6e 74 20 63 6f 6c 75 6d 6e 73 32 3b 0a 20 20  int columns2;.  
95f0: 20 20 63 68 61 72 20 2a 65 72 72 4d 73 67 20 3d    char *errMsg =
9600: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 77   NULL;.    int w
9610: 69 74 68 6f 75 74 5f 72 6f 77 69 64 20 3d 20 30  ithout_rowid = 0
9620: 3b 0a 0a 20 20 20 20 78 74 61 62 6c 65 20 3d 20  ;..    xtable = 
9630: 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64  gaiaDoubleQuoted
9640: 53 71 6c 20 28 74 61 62 6c 65 29 3b 0a 20 20 20  Sql (table);.   
9650: 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d   sql = sqlite3_m
9660: 70 72 69 6e 74 66 20 28 22 50 52 41 47 4d 41 20  printf ("PRAGMA 
9670: 69 6e 64 65 78 5f 6c 69 73 74 28 5c 22 25 73 5c  index_list(\"%s\
9680: 22 29 22 2c 20 78 74 61 62 6c 65 29 3b 0a 20 20  ")", xtable);.  
9690: 20 20 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b    free (xtable);
96a0: 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74  .    ret = sqlit
96b0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 20 28 73 71  e3_get_table (sq
96c0: 6c 69 74 65 2c 20 73 71 6c 2c 20 26 72 65 73 75  lite, sql, &resu
96d0: 6c 74 73 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c  lts, &rows, &col
96e0: 75 6d 6e 73 2c 20 26 65 72 72 4d 73 67 29 3b 0a  umns, &errMsg);.
96f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9700: 20 28 73 71 6c 29 3b 0a 20 20 20 20 69 66 20 28   (sql);.    if (
9710: 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
9720: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
9730: 69 74 65 33 5f 66 72 65 65 20 28 65 72 72 4d 73  ite3_free (errMs
9740: 67 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 31 3b  g);..  return 1;
9750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  .      }.    for
9760: 20 28 69 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f   (i = 1; i <= ro
9770: 77 73 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b  ws; i++).      {
9780: 0a 09 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
9790: 69 6e 64 65 78 20 3d 20 72 65 73 75 6c 74 73 5b  index = results[
97a0: 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20  (i * columns) + 
97b0: 31 5d 3b 0a 09 20 20 73 71 6c 20 3d 20 73 71 6c  1];..  sql = sql
97c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 53  ite3_mprintf ("S
97d0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
97e0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
97f0: 72 20 57 48 45 52 45 20 22 0a 09 09 09 09 20 22  r WHERE "..... "
9800: 74 79 70 65 20 3d 20 27 69 6e 64 65 78 27 20 41  type = 'index' A
9810: 4e 44 20 4c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d  ND Lower(tbl_nam
9820: 65 29 20 3d 20 4c 6f 77 65 72 28 25 51 29 20 22  e) = Lower(%Q) "
9830: 0a 09 09 09 09 20 22 41 4e 44 20 4c 6f 77 65 72  ..... "AND Lower
9840: 28 6e 61 6d 65 29 20 3d 20 4c 6f 77 65 72 28 25  (name) = Lower(%
9850: 51 29 22 2c 20 74 61 62 6c 65 2c 20 69 6e 64 65  Q)", table, inde
9860: 78 29 3b 0a 09 20 20 72 65 74 20 3d 0a 09 20 20  x);..  ret =..  
9870: 20 20 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f      sqlite3_get_
9880: 74 61 62 6c 65 20 28 73 71 6c 69 74 65 2c 20 73  table (sqlite, s
9890: 71 6c 2c 20 26 72 65 73 75 6c 74 73 32 2c 20 26  ql, &results2, &
98a0: 72 6f 77 73 32 2c 20 26 63 6f 6c 75 6d 6e 73 32  rows2, &columns2
98b0: 2c 0a 09 09 09 09 20 26 65 72 72 4d 73 67 29 3b  ,..... &errMsg);
98c0: 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
98d0: 20 28 73 71 6c 29 3b 0a 09 20 20 69 66 20 28 72   (sql);..  if (r
98e0: 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  et != SQLITE_OK)
98f0: 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
9900: 33 5f 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b  3_free (errMsg);
9910: 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 20 20  ...return 1;..  
9920: 20 20 7d 0a 09 20 20 66 6f 72 20 28 6a 20 3d 20    }..  for (j = 
9930: 31 3b 20 6a 20 3c 3d 20 72 6f 77 73 32 3b 20 6a  1; j <= rows2; j
9940: 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  ++)..    {...if 
9950: 28 61 74 6f 69 20 28 72 65 73 75 6c 74 73 32 5b  (atoi (results2[
9960: 28 6a 20 2a 20 63 6f 6c 75 6d 6e 73 32 29 20 2b  (j * columns2) +
9970: 20 30 5d 29 20 3d 3d 20 30 29 0a 09 09 20 20 20   0]) == 0)...   
9980: 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 20 3d   without_rowid =
9990: 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 71   1;..    }..  sq
99a0: 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65  lite3_free_table
99b0: 20 28 72 65 73 75 6c 74 73 32 29 3b 0a 20 20 20   (results2);.   
99c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
99d0: 5f 66 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73  _free_table (res
99e0: 75 6c 74 73 29 3b 0a 20 20 20 20 72 65 74 75 72  ults);.    retur
99f0: 6e 20 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 3b  n without_rowid;
9a00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 63  .}..static int.c
9a10: 68 65 63 6b 44 61 74 61 62 61 73 65 20 28 63 6f  heckDatabase (co
9a20: 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 20 68 61  nst sqlite3 * ha
9a30: 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
9a40: 20 2a 64 62 5f 70 72 65 66 69 78 29 0a 7b 0a 2f   *db_prefix).{./
9a50: 2a 20 74 65 73 74 69 6e 67 20 69 66 20 73 6f 6d  * testing if som
9a60: 65 20 41 54 54 41 43 48 45 44 2d 44 42 20 64 6f  e ATTACHED-DB do
9a70: 20 72 65 61 6c 6c 79 20 65 78 69 73 74 20 2a 2f   really exist */
9a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
9a90: 6c 69 74 65 20 3d 20 28 73 71 6c 69 74 65 33 20  lite = (sqlite3 
9aa0: 2a 29 20 68 61 6e 64 6c 65 3b 0a 20 20 20 20 63  *) handle;.    c
9ab0: 68 61 72 20 2a 78 64 62 5f 70 72 65 66 69 78 3b  har *xdb_prefix;
9ac0: 0a 20 20 20 20 63 68 61 72 20 73 71 6c 5b 31 30  .    char sql[10
9ad0: 32 34 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  24];.    int ret
9ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
9af0: 20 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b   char **results;
9b00: 0a 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20  .    int rows;. 
9b10: 20 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a     int columns;.
9b20: 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d      int exists =
9b30: 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 64 62 5f   0;..    if (db_
9b40: 70 72 65 66 69 78 20 3d 3d 20 4e 55 4c 4c 29 0a  prefix == NULL).
9b50: 09 64 62 5f 70 72 65 66 69 78 20 3d 20 22 6d 61  .db_prefix = "ma
9b60: 69 6e 22 3b 0a 20 20 20 20 78 64 62 5f 70 72 65  in";.    xdb_pre
9b70: 66 69 78 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  fix = gaiaDouble
9b80: 51 75 6f 74 65 64 53 71 6c 20 28 64 62 5f 70 72  QuotedSql (db_pr
9b90: 65 66 69 78 29 3b 0a 20 20 20 20 73 70 72 69 6e  efix);.    sprin
9ba0: 74 66 20 28 73 71 6c 2c 20 22 50 52 41 47 4d 41  tf (sql, "PRAGMA
9bb0: 20 5c 22 25 73 5c 22 2e 64 61 74 61 62 61 73 65   \"%s\".database
9bc0: 5f 6c 69 73 74 22 2c 20 78 64 62 5f 70 72 65 66  _list", xdb_pref
9bd0: 69 78 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78  ix);.    free (x
9be0: 64 62 5f 70 72 65 66 69 78 29 3b 0a 20 20 20 20  db_prefix);.    
9bf0: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65  ret = sqlite3_ge
9c00: 74 5f 74 61 62 6c 65 20 28 73 71 6c 69 74 65 2c  t_table (sqlite,
9c10: 20 73 71 6c 2c 20 26 72 65 73 75 6c 74 73 2c 20   sql, &results, 
9c20: 26 72 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c  &rows, &columns,
9c30: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
9c40: 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
9c50: 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  )..return 0;.   
9c60: 20 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09   if (rows < 1)..
9c70: 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
9c80: 20 7b 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 31   {..  for (i = 1
9c90: 3b 20 69 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b  ; i <= rows; i++
9ca0: 29 0a 09 20 20 20 20 7b 0a 09 09 63 6f 6e 73 74  )..    {...const
9cb0: 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 72 65   char *name = re
9cc0: 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d  sults[(i * colum
9cd0: 6e 73 29 20 2b 20 31 5d 3b 0a 09 09 69 66 20 28  ns) + 1];...if (
9ce0: 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65  strcasecmp (name
9cf0: 2c 20 64 62 5f 70 72 65 66 69 78 29 20 3d 3d 20  , db_prefix) == 
9d00: 30 29 0a 09 09 20 20 20 20 65 78 69 73 74 73 20  0)...    exists 
9d10: 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  = 1;..    }.    
9d20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
9d30: 66 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73 75  free_table (resu
9d40: 6c 74 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lts);.    return
9d50: 20 65 78 69 73 74 73 3b 0a 7d 0a 0a 73 74 61 74   exists;.}..stat
9d60: 69 63 20 69 6e 74 0a 63 68 65 63 6b 47 65 6f 50  ic int.checkGeoP
9d70: 61 63 6b 61 67 65 20 28 73 71 6c 69 74 65 33 20  ackage (sqlite3 
9d80: 2a 20 68 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  * handle, const 
9d90: 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69 78 29  char *db_prefix)
9da0: 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f  .{./* testing fo
9db0: 72 20 47 65 6f 50 61 63 6b 61 67 65 20 6d 65 74  r GeoPackage met
9dc0: 61 2d 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  a-tables */.    
9dd0: 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
9de0: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 20 68 61  = (sqlite3 *) ha
9df0: 6e 64 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  ndle;.    char *
9e00: 78 64 62 5f 70 72 65 66 69 78 3b 0a 20 20 20 20  xdb_prefix;.    
9e10: 63 68 61 72 20 73 71 6c 5b 31 30 32 34 5d 3b 0a  char sql[1024];.
9e20: 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
9e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
9e40: 65 3b 0a 20 20 20 20 69 6e 74 20 74 61 62 6c 65  e;.    int table
9e50: 5f 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69  _name = 0;.    i
9e60: 6e 74 20 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 3d  nt column_name =
9e70: 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f 6d   0;.    int geom
9e80: 65 74 72 79 5f 74 79 70 65 5f 6e 61 6d 65 20 3d  etry_type_name =
9e90: 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 72 73 5f   0;.    int srs_
9ea0: 69 64 5f 67 63 20 3d 20 30 3b 0a 20 20 20 20 69  id_gc = 0;.    i
9eb0: 6e 74 20 68 61 73 5f 7a 20 3d 20 30 3b 0a 20 20  nt has_z = 0;.  
9ec0: 20 20 69 6e 74 20 68 61 73 5f 6d 20 3d 20 30 3b    int has_m = 0;
9ed0: 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 67 63  .    int gpkg_gc
9ee0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 72   = 0;.    int sr
9ef0: 73 5f 69 64 5f 73 72 73 20 3d 20 30 3b 0a 20 20  s_id_srs = 0;.  
9f00: 20 20 69 6e 74 20 73 72 73 5f 6e 61 6d 65 20 3d    int srs_name =
9f10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
9f20: 5f 73 72 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  _srs = 0;.    in
9f30: 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  t i;.    char **
9f40: 72 65 73 75 6c 74 73 3b 0a 20 20 20 20 69 6e 74  results;.    int
9f50: 20 72 6f 77 73 3b 0a 20 20 20 20 69 6e 74 20 63   rows;.    int c
9f60: 6f 6c 75 6d 6e 73 3b 0a 0a 20 20 20 20 69 66 20  olumns;..    if 
9f70: 28 21 63 68 65 63 6b 44 61 74 61 62 61 73 65 20  (!checkDatabase 
9f80: 28 68 61 6e 64 6c 65 2c 20 64 62 5f 70 72 65 66  (handle, db_pref
9f90: 69 78 29 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b  ix))..return -1;
9fa0: 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 74 68 65  ./* checking the
9fb0: 20 47 50 4b 47 5f 47 45 4f 4d 45 54 52 59 5f 43   GPKG_GEOMETRY_C
9fc0: 4f 4c 55 4d 4e 53 20 74 61 62 6c 65 20 2a 2f 0a  OLUMNS table */.
9fd0: 20 20 20 20 69 66 20 28 64 62 5f 70 72 65 66 69      if (db_prefi
9fe0: 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 64 62 5f 70  x == NULL)..db_p
9ff0: 72 65 66 69 78 20 3d 20 22 6d 61 69 6e 22 3b 0a  refix = "main";.
a000: 20 20 20 20 78 64 62 5f 70 72 65 66 69 78 20 3d      xdb_prefix =
a010: 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65   gaiaDoubleQuote
a020: 64 53 71 6c 20 28 64 62 5f 70 72 65 66 69 78 29  dSql (db_prefix)
a030: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 20 28 73  ;.    sprintf (s
a040: 71 6c 2c 20 22 50 52 41 47 4d 41 20 5c 22 25 73  ql, "PRAGMA \"%s
a050: 5c 22 2e 74 61 62 6c 65 5f 69 6e 66 6f 28 67 70  \".table_info(gp
a060: 6b 67 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75  kg_geometry_colu
a070: 6d 6e 73 29 22 2c 0a 09 20 20 20 20 20 78 64 62  mns)",..     xdb
a080: 5f 70 72 65 66 69 78 29 3b 0a 20 20 20 20 66 72  _prefix);.    fr
a090: 65 65 20 28 78 64 62 5f 70 72 65 66 69 78 29 3b  ee (xdb_prefix);
a0a0: 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74  .    ret = sqlit
a0b0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 20 28 73 71  e3_get_table (sq
a0c0: 6c 69 74 65 2c 20 73 71 6c 2c 20 26 72 65 73 75  lite, sql, &resu
a0d0: 6c 74 73 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c  lts, &rows, &col
a0e0: 75 6d 6e 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  umns, NULL);.   
a0f0: 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49   if (ret != SQLI
a100: 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 75 6e 6b  TE_OK)..goto unk
a110: 6e 6f 77 6e 3b 0a 20 20 20 20 69 66 20 28 72 6f  nown;.    if (ro
a120: 77 73 20 3c 20 31 29 0a 09 3b 0a 20 20 20 20 65  ws < 1)..;.    e
a130: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 66  lse.      {..  f
a140: 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 3d 20  or (i = 1; i <= 
a150: 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 20 20 20 20  rows; i++)..    
a160: 7b 0a 09 09 6e 61 6d 65 20 3d 20 72 65 73 75 6c  {...name = resul
a170: 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29  ts[(i * columns)
a180: 20 2b 20 31 5d 3b 0a 09 09 69 66 20 28 73 74 72   + 1];...if (str
a190: 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22  casecmp (name, "
a1a0: 74 61 62 6c 65 5f 6e 61 6d 65 22 29 20 3d 3d 20  table_name") == 
a1b0: 30 29 0a 09 09 20 20 20 20 74 61 62 6c 65 5f 6e  0)...    table_n
a1c0: 61 6d 65 20 3d 20 31 3b 0a 09 09 69 66 20 28 73  ame = 1;...if (s
a1d0: 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c  trcasecmp (name,
a1e0: 20 22 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 29 20   "column_name") 
a1f0: 3d 3d 20 30 29 0a 09 09 20 20 20 20 63 6f 6c 75  == 0)...    colu
a200: 6d 6e 5f 6e 61 6d 65 20 3d 20 31 3b 0a 09 09 69  mn_name = 1;...i
a210: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e  f (strcasecmp (n
a220: 61 6d 65 2c 20 22 67 65 6f 6d 65 74 72 79 5f 74  ame, "geometry_t
a230: 79 70 65 5f 6e 61 6d 65 22 29 20 3d 3d 20 30 29  ype_name") == 0)
a240: 0a 09 09 20 20 20 20 67 65 6f 6d 65 74 72 79 5f  ...    geometry_
a250: 74 79 70 65 5f 6e 61 6d 65 20 3d 20 31 3b 0a 09  type_name = 1;..
a260: 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20  .if (strcasecmp 
a270: 28 6e 61 6d 65 2c 20 22 73 72 73 5f 69 64 22 29  (name, "srs_id")
a280: 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 73 72 73   == 0)...    srs
a290: 5f 69 64 5f 67 63 20 3d 20 31 3b 0a 09 09 69 66  _id_gc = 1;...if
a2a0: 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61   (strcasecmp (na
a2b0: 6d 65 2c 20 22 7a 22 29 20 3d 3d 20 30 29 0a 09  me, "z") == 0)..
a2c0: 09 20 20 20 20 68 61 73 5f 7a 20 3d 20 31 3b 0a  .    has_z = 1;.
a2d0: 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70  ..if (strcasecmp
a2e0: 20 28 6e 61 6d 65 2c 20 22 6d 22 29 20 3d 3d 20   (name, "m") == 
a2f0: 30 29 0a 09 09 20 20 20 20 68 61 73 5f 6d 20 3d  0)...    has_m =
a300: 20 31 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20   1;..    }.     
a310: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
a320: 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73 75 6c  ree_table (resul
a330: 74 73 29 3b 0a 20 20 20 20 69 66 20 28 74 61 62  ts);.    if (tab
a340: 6c 65 5f 6e 61 6d 65 20 26 26 20 63 6f 6c 75 6d  le_name && colum
a350: 6e 5f 6e 61 6d 65 20 26 26 20 67 65 6f 6d 65 74  n_name && geomet
a360: 72 79 5f 74 79 70 65 5f 6e 61 6d 65 20 26 26 20  ry_type_name && 
a370: 73 72 73 5f 69 64 5f 67 63 20 26 26 20 68 61 73  srs_id_gc && has
a380: 5f 7a 0a 09 26 26 20 68 61 73 5f 6d 29 0a 09 67  _z..&& has_m)..g
a390: 70 6b 67 5f 67 63 20 3d 20 31 3b 0a 2f 2a 20 63  pkg_gc = 1;./* c
a3a0: 68 65 63 6b 69 6e 67 20 74 68 65 20 47 50 4b 47  hecking the GPKG
a3b0: 5f 53 50 41 54 49 41 4c 5f 52 45 46 5f 53 59 53  _SPATIAL_REF_SYS
a3c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 74   table */.    st
a3d0: 72 63 70 79 20 28 73 71 6c 2c 20 22 50 52 41 47  rcpy (sql, "PRAG
a3e0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 67 70  MA table_info(gp
a3f0: 6b 67 5f 73 70 61 74 69 61 6c 5f 72 65 66 5f 73  kg_spatial_ref_s
a400: 79 73 29 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  ys)");.    ret =
a410: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
a420: 6c 65 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c  le (sqlite, sql,
a430: 20 26 72 65 73 75 6c 74 73 2c 20 26 72 6f 77 73   &results, &rows
a440: 2c 20 26 63 6f 6c 75 6d 6e 73 2c 20 4e 55 4c 4c  , &columns, NULL
a450: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
a460: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f  = SQLITE_OK)..go
a470: 74 6f 20 75 6e 6b 6e 6f 77 6e 3b 0a 20 20 20 20  to unknown;.    
a480: 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09 3b  if (rows < 1)..;
a490: 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
a4a0: 7b 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 31 3b  {..  for (i = 1;
a4b0: 20 69 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b 29   i <= rows; i++)
a4c0: 0a 09 20 20 20 20 7b 0a 09 09 6e 61 6d 65 20 3d  ..    {...name =
a4d0: 20 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f   results[(i * co
a4e0: 6c 75 6d 6e 73 29 20 2b 20 31 5d 3b 0a 09 09 69  lumns) + 1];...i
a4f0: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e  f (strcasecmp (n
a500: 61 6d 65 2c 20 22 73 72 73 5f 69 64 22 29 20 3d  ame, "srs_id") =
a510: 3d 20 30 29 0a 09 09 20 20 20 20 73 72 73 5f 69  = 0)...    srs_i
a520: 64 5f 73 72 73 20 3d 20 31 3b 0a 09 09 69 66 20  d_srs = 1;...if 
a530: 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d  (strcasecmp (nam
a540: 65 2c 20 22 73 72 73 5f 6e 61 6d 65 22 29 20 3d  e, "srs_name") =
a550: 3d 20 30 29 0a 09 09 20 20 20 20 73 72 73 5f 6e  = 0)...    srs_n
a560: 61 6d 65 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a  ame = 1;..    }.
a570: 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69        }.    sqli
a580: 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20 28  te3_free_table (
a590: 72 65 73 75 6c 74 73 29 3b 0a 20 20 20 20 69 66  results);.    if
a5a0: 20 28 73 72 73 5f 69 64 5f 73 72 73 20 26 26 20   (srs_id_srs && 
a5b0: 73 72 73 5f 6e 61 6d 65 29 0a 09 67 70 6b 67 5f  srs_name)..gpkg_
a5c0: 73 72 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 20  srs = 1;.    if 
a5d0: 28 67 70 6b 67 5f 67 63 20 26 26 20 67 70 6b 67  (gpkg_gc && gpkg
a5e0: 5f 73 72 73 29 0a 09 72 65 74 75 72 6e 20 31 3b  _srs)..return 1;
a5f0: 0a 20 20 75 6e 6b 6e 6f 77 6e 3a 0a 20 20 20 20  .  unknown:.    
a600: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 53 50 41  return 0;.}..SPA
a610: 54 49 41 4c 49 54 45 5f 50 52 49 56 41 54 45 20  TIALITE_PRIVATE 
a620: 69 6e 74 0a 63 68 65 63 6b 53 70 61 74 69 61 6c  int.checkSpatial
a630: 4d 65 74 61 44 61 74 61 20 28 63 6f 6e 73 74 20  MetaData (const 
a640: 76 6f 69 64 20 2a 68 61 6e 64 6c 65 29 0a 7b 0a  void *handle).{.
a650: 2f 2a 20 6a 75 73 74 20 63 61 6c 6c 73 20 63 68  /* just calls ch
a660: 65 63 6b 53 70 61 74 69 61 6c 4d 65 74 61 44 61  eckSpatialMetaDa
a670: 74 61 5f 65 78 20 2a 2f 0a 20 20 20 20 72 65 74  ta_ex */.    ret
a680: 75 72 6e 20 63 68 65 63 6b 53 70 61 74 69 61 6c  urn checkSpatial
a690: 4d 65 74 61 44 61 74 61 5f 65 78 20 28 68 61 6e  MetaData_ex (han
a6a0: 64 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 53  dle, NULL);.}..S
a6b0: 50 41 54 49 41 4c 49 54 45 5f 50 52 49 56 41 54  PATIALITE_PRIVAT
a6c0: 45 20 69 6e 74 0a 63 68 65 63 6b 53 70 61 74 69  E int.checkSpati
a6d0: 61 6c 4d 65 74 61 44 61 74 61 5f 65 78 20 28 63  alMetaData_ex (c
a6e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 68 61 6e 64 6c  onst void *handl
a6f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  e, const char *d
a700: 62 5f 70 72 65 66 69 78 29 0a 7b 0a 2f 2a 20 69  b_prefix).{./* i
a710: 6e 74 65 72 6e 61 6c 20 75 74 69 6c 69 74 79 20  nternal utility 
a720: 66 75 6e 63 74 69 6f 6e 3a 0a 2f 0a 2f 20 66 6f  function:././ fo
a730: 72 20 46 44 4f 2d 4f 47 52 20 69 6e 74 65 72 6f  r FDO-OGR intero
a740: 70 65 72 61 62 69 6c 69 74 79 20 61 6e 64 20 63  perability and c
a750: 72 6f 73 73 2d 76 65 72 73 69 6f 6e 20 73 65 61  ross-version sea
a760: 6d 6c 65 73 73 20 63 6f 6d 70 61 74 69 62 69 6c  mless compatibil
a770: 69 74 79 3a 0a 2f 20 74 65 73 74 73 20 74 68 65  ity:./ tests the
a780: 20 53 70 61 74 69 61 6c 4d 65 74 61 64 61 74 61   SpatialMetadata
a790: 20 74 79 70 65 2c 20 72 65 74 75 72 6e 69 6e 67   type, returning
a7a0: 3a 0a 2f 0a 2f 20 2d 31 20 2d 20 20 69 66 20 6e  :././ -1 -  if n
a7b0: 6f 20 41 54 54 41 43 48 45 44 2d 44 42 20 69 64  o ATTACHED-DB id
a7c0: 65 6e 74 69 66 69 65 64 20 62 79 20 64 62 5f 70  entified by db_p
a7d0: 72 65 66 69 78 20 65 78 69 73 74 73 0a 2f 20 30  refix exists./ 0
a7e0: 20 2d 20 69 66 20 6e 6f 20 76 61 6c 69 64 20 53   - if no valid S
a7f0: 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 20 77  patialMetaData w
a800: 65 72 65 20 66 6f 75 6e 64 0a 2f 20 31 20 2d 20  ere found./ 1 - 
a810: 69 66 20 53 70 61 74 69 61 4c 69 74 65 2d 6c 69  if SpatiaLite-li
a820: 6b 65 20 28 6c 65 67 61 63 79 29 20 53 70 61 74  ke (legacy) Spat
a830: 69 61 6c 4d 65 74 61 64 61 74 61 20 77 65 72 65  ialMetadata were
a840: 20 66 6f 75 6e 64 0a 2f 20 32 20 2d 20 69 66 20   found./ 2 - if 
a850: 46 44 4f 2d 4f 47 52 2d 6c 69 6b 65 20 53 70 61  FDO-OGR-like Spa
a860: 74 69 61 6c 4d 65 74 61 64 61 74 61 20 77 65 72  tialMetadata wer
a870: 65 20 66 6f 75 6e 64 0a 2f 20 33 20 2d 20 69 66  e found./ 3 - if
a880: 20 53 70 61 74 69 61 4c 69 74 65 2d 6c 69 6b 65   SpatiaLite-like
a890: 20 28 63 75 72 72 65 6e 74 29 20 53 70 61 74 69   (current) Spati
a8a0: 61 6c 4d 65 74 61 64 61 74 61 20 77 65 72 65 20  alMetadata were 
a8b0: 0a 2f 20 34 20 2d 20 69 66 20 47 65 6f 50 61 63  ./ 4 - if GeoPac
a8c0: 6b 61 67 65 20 53 70 61 74 69 61 6c 4d 65 74 61  kage SpatialMeta
a8d0: 64 61 74 61 20 77 65 72 65 20 66 6f 75 6e 64 0a  data were found.
a8e0: 2f 0a 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  /.*/.    sqlite3
a8f0: 20 2a 73 71 6c 69 74 65 20 3d 20 28 73 71 6c 69   *sqlite = (sqli
a900: 74 65 33 20 2a 29 20 68 61 6e 64 6c 65 3b 0a 20  te3 *) handle;. 
a910: 20 20 20 63 68 61 72 20 2a 78 64 62 5f 70 72 65     char *xdb_pre
a920: 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 73 70 61  fix;.    int spa
a930: 74 69 61 6c 69 74 65 5f 6c 65 67 61 63 79 5f 72  tialite_legacy_r
a940: 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  s = 0;.    int s
a950: 70 61 74 69 61 6c 69 74 65 5f 72 73 20 3d 20 30  patialite_rs = 0
a960: 3b 0a 20 20 20 20 69 6e 74 20 66 64 6f 5f 72 73  ;.    int fdo_rs
a970: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 70   = 0;.    int sp
a980: 61 74 69 61 6c 69 74 65 5f 6c 65 67 61 63 79 5f  atialite_legacy_
a990: 67 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  gc = 0;.    int 
a9a0: 73 70 61 74 69 61 6c 69 74 65 5f 67 63 20 3d 20  spatialite_gc = 
a9b0: 30 3b 0a 20 20 20 20 69 6e 74 20 66 64 6f 5f 67  0;.    int fdo_g
a9c0: 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  c = 0;.    int r
a9d0: 73 5f 73 72 69 64 20 3d 20 30 3b 0a 20 20 20 20  s_srid = 0;.    
a9e0: 69 6e 74 20 61 75 74 68 5f 6e 61 6d 65 20 3d 20  int auth_name = 
a9f0: 30 3b 0a 20 20 20 20 69 6e 74 20 61 75 74 68 5f  0;.    int auth_
aa00: 73 72 69 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  srid = 0;.    in
aa10: 74 20 73 72 74 65 78 74 20 3d 20 30 3b 0a 20 20  t srtext = 0;.  
aa20: 20 20 69 6e 74 20 72 65 66 5f 73 79 73 5f 6e 61    int ref_sys_na
aa30: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  me = 0;.    int 
aa40: 70 72 6f 6a 34 74 65 78 74 20 3d 20 30 3b 0a 20  proj4text = 0;. 
aa50: 20 20 20 69 6e 74 20 66 5f 74 61 62 6c 65 5f 6e     int f_table_n
aa60: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ame = 0;.    int
aa70: 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75   f_geometry_colu
aa80: 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  mn = 0;.    int 
aa90: 67 65 6f 6d 65 74 72 79 5f 74 79 70 65 20 3d 20  geometry_type = 
aaa0: 30 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6f 72 64  0;.    int coord
aab0: 5f 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 30 3b 0a  _dimension = 0;.
aac0: 20 20 20 20 69 6e 74 20 67 63 5f 73 72 69 64 20      int gc_srid 
aad0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f  = 0;.    int geo
aae0: 6d 65 74 72 79 5f 66 6f 72 6d 61 74 20 3d 20 30  metry_format = 0
aaf0: 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 20 3d  ;.    int type =
ab00: 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 70 61 74   0;.    int spat
ab10: 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65  ial_index_enable
ab20: 64 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  d = 0;.    char 
ab30: 73 71 6c 5b 31 30 32 34 5d 3b 0a 20 20 20 20 69  sql[1024];.    i
ab40: 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73  nt ret;.    cons
ab50: 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20  t char *name;.  
ab60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61    int i;.    cha
ab70: 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a 20 20 20  r **results;.   
ab80: 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 20 20 69   int rows;.    i
ab90: 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 0a 20 20 20  nt columns;..   
aba0: 20 69 66 20 28 21 63 68 65 63 6b 44 61 74 61 62   if (!checkDatab
abb0: 61 73 65 20 28 68 61 6e 64 6c 65 2c 20 64 62 5f  ase (handle, db_
abc0: 70 72 65 66 69 78 29 29 0a 09 72 65 74 75 72 6e  prefix))..return
abd0: 20 2d 31 3b 0a 2f 2a 20 63 68 65 63 6b 69 6e 67   -1;./* checking
abe0: 20 74 68 65 20 47 45 4f 4d 45 54 52 59 5f 43 4f   the GEOMETRY_CO
abf0: 4c 55 4d 4e 53 20 74 61 62 6c 65 20 2a 2f 0a 20  LUMNS table */. 
ac00: 20 20 20 69 66 20 28 64 62 5f 70 72 65 66 69 78     if (db_prefix
ac10: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 64 62 5f 70 72   == NULL)..db_pr
ac20: 65 66 69 78 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  efix = "main";. 
ac30: 20 20 20 78 64 62 5f 70 72 65 66 69 78 20 3d 20     xdb_prefix = 
ac40: 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64  gaiaDoubleQuoted
ac50: 53 71 6c 20 28 64 62 5f 70 72 65 66 69 78 29 3b  Sql (db_prefix);
ac60: 0a 20 20 20 20 73 70 72 69 6e 74 66 20 28 73 71  .    sprintf (sq
ac70: 6c 2c 20 22 50 52 41 47 4d 41 20 5c 22 25 73 5c  l, "PRAGMA \"%s\
ac80: 22 2e 74 61 62 6c 65 5f 69 6e 66 6f 28 67 65 6f  ".table_info(geo
ac90: 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 29 22 2c  metry_columns)",
aca0: 20 78 64 62 5f 70 72 65 66 69 78 29 3b 0a 20 20   xdb_prefix);.  
acb0: 20 20 66 72 65 65 20 28 78 64 62 5f 70 72 65 66    free (xdb_pref
acc0: 69 78 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  ix);.    ret = s
acd0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
ace0: 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 26   (sqlite, sql, &
acf0: 72 65 73 75 6c 74 73 2c 20 26 72 6f 77 73 2c 20  results, &rows, 
ad00: 26 63 6f 6c 75 6d 6e 73 2c 20 4e 55 4c 4c 29 3b  &columns, NULL);
ad10: 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20  .    if (ret != 
ad20: 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f  SQLITE_OK)..goto
ad30: 20 75 6e 6b 6e 6f 77 6e 3b 0a 20 20 20 20 69 66   unknown;.    if
ad40: 20 28 72 6f 77 73 20 3c 20 31 29 0a 09 3b 0a 20   (rows < 1)..;. 
ad50: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
ad60: 09 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69  .  for (i = 1; i
ad70: 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 09   <= rows; i++)..
ad80: 20 20 20 20 7b 0a 09 09 6e 61 6d 65 20 3d 20 72      {...name = r
ad90: 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75  esults[(i * colu
ada0: 6d 6e 73 29 20 2b 20 31 5d 3b 0a 09 09 69 66 20  mns) + 1];...if 
adb0: 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d  (strcasecmp (nam
adc0: 65 2c 20 22 66 5f 74 61 62 6c 65 5f 6e 61 6d 65  e, "f_table_name
add0: 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 66  ") == 0)...    f
ade0: 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 20 31 3b  _table_name = 1;
adf0: 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  ...if (strcasecm
ae00: 70 20 28 6e 61 6d 65 2c 20 22 66 5f 67 65 6f 6d  p (name, "f_geom
ae10: 65 74 72 79 5f 63 6f 6c 75 6d 6e 22 29 20 3d 3d  etry_column") ==
ae20: 20 30 29 0a 09 09 20 20 20 20 66 5f 67 65 6f 6d   0)...    f_geom
ae30: 65 74 72 79 5f 63 6f 6c 75 6d 6e 20 3d 20 31 3b  etry_column = 1;
ae40: 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  ...if (strcasecm
ae50: 70 20 28 6e 61 6d 65 2c 20 22 67 65 6f 6d 65 74  p (name, "geomet
ae60: 72 79 5f 74 79 70 65 22 29 20 3d 3d 20 30 29 0a  ry_type") == 0).
ae70: 09 09 20 20 20 20 67 65 6f 6d 65 74 72 79 5f 74  ..    geometry_t
ae80: 79 70 65 20 3d 20 31 3b 0a 09 09 69 66 20 28 73  ype = 1;...if (s
ae90: 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c  trcasecmp (name,
aea0: 20 22 63 6f 6f 72 64 5f 64 69 6d 65 6e 73 69 6f   "coord_dimensio
aeb0: 6e 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20  n") == 0)...    
aec0: 63 6f 6f 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 20  coord_dimension 
aed0: 3d 20 31 3b 0a 09 09 69 66 20 28 73 74 72 63 61  = 1;...if (strca
aee0: 73 65 63 6d 70 20 28 6e 61 6d 65 2c 20 22 73 72  secmp (name, "sr
aef0: 69 64 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20  id") == 0)...   
af00: 20 67 63 5f 73 72 69 64 20 3d 20 31 3b 0a 09 09   gc_srid = 1;...
af10: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
af20: 6e 61 6d 65 2c 20 22 67 65 6f 6d 65 74 72 79 5f  name, "geometry_
af30: 66 6f 72 6d 61 74 22 29 20 3d 3d 20 30 29 0a 09  format") == 0)..
af40: 09 20 20 20 20 67 65 6f 6d 65 74 72 79 5f 66 6f  .    geometry_fo
af50: 72 6d 61 74 20 3d 20 31 3b 0a 09 09 69 66 20 28  rmat = 1;...if (
af60: 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65  strcasecmp (name
af70: 2c 20 22 74 79 70 65 22 29 20 3d 3d 20 30 29 0a  , "type") == 0).
af80: 09 09 20 20 20 20 74 79 70 65 20 3d 20 31 3b 0a  ..    type = 1;.
af90: 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70  ..if (strcasecmp
afa0: 20 28 6e 61 6d 65 2c 20 22 73 70 61 74 69 61 6c   (name, "spatial
afb0: 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65 64 22 29  _index_enabled")
afc0: 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 73 70 61   == 0)...    spa
afd0: 74 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c  tial_index_enabl
afe0: 65 64 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 20  ed = 1;..    }. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
b000: 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20 28 72  e3_free_table (r
b010: 65 73 75 6c 74 73 29 3b 0a 20 20 20 20 69 66 20  esults);.    if 
b020: 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 26 26  (f_table_name &&
b030: 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75   f_geometry_colu
b040: 6d 6e 20 26 26 20 74 79 70 65 20 26 26 20 63 6f  mn && type && co
b050: 6f 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 0a 09 26  ord_dimension..&
b060: 26 20 67 63 5f 73 72 69 64 20 26 26 20 73 70 61  & gc_srid && spa
b070: 74 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c  tial_index_enabl
b080: 65 64 29 0a 09 73 70 61 74 69 61 6c 69 74 65 5f  ed)..spatialite_
b090: 6c 65 67 61 63 79 5f 67 63 20 3d 20 31 3b 0a 20  legacy_gc = 1;. 
b0a0: 20 20 20 69 66 20 28 66 5f 74 61 62 6c 65 5f 6e     if (f_table_n
b0b0: 61 6d 65 20 26 26 20 66 5f 67 65 6f 6d 65 74 72  ame && f_geometr
b0c0: 79 5f 63 6f 6c 75 6d 6e 20 26 26 20 67 65 6f 6d  y_column && geom
b0d0: 65 74 72 79 5f 74 79 70 65 20 26 26 20 63 6f 6f  etry_type && coo
b0e0: 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 0a 09 26 26  rd_dimension..&&
b0f0: 20 67 63 5f 73 72 69 64 20 26 26 20 73 70 61 74   gc_srid && spat
b100: 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65  ial_index_enable
b110: 64 29 0a 09 73 70 61 74 69 61 6c 69 74 65 5f 67  d)..spatialite_g
b120: 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 28 66  c = 1;.    if (f
b130: 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 26 26 20 66  _table_name && f
b140: 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e  _geometry_column
b150: 20 26 26 20 67 65 6f 6d 65 74 72 79 5f 74 79 70   && geometry_typ
b160: 65 20 26 26 20 63 6f 6f 72 64 5f 64 69 6d 65 6e  e && coord_dimen
b170: 73 69 6f 6e 0a 09 26 26 20 67 63 5f 73 72 69 64  sion..&& gc_srid
b180: 20 26 26 20 67 65 6f 6d 65 74 72 79 5f 66 6f 72   && geometry_for
b190: 6d 61 74 29 0a 09 66 64 6f 5f 67 63 20 3d 20 31  mat)..fdo_gc = 1
b1a0: 3b 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 74 68  ;./* checking th
b1b0: 65 20 53 50 41 54 49 41 4c 5f 52 45 46 5f 53 59  e SPATIAL_REF_SY
b1c0: 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  S table */.    s
b1d0: 74 72 63 70 79 20 28 73 71 6c 2c 20 22 50 52 41  trcpy (sql, "PRA
b1e0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 73  GMA table_info(s
b1f0: 70 61 74 69 61 6c 5f 72 65 66 5f 73 79 73 29 22  patial_ref_sys)"
b200: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c  );.    ret = sql
b210: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 20 28  ite3_get_table (
b220: 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 26 72 65  sqlite, sql, &re
b230: 73 75 6c 74 73 2c 20 26 72 6f 77 73 2c 20 26 63  sults, &rows, &c
b240: 6f 6c 75 6d 6e 73 2c 20 4e 55 4c 4c 29 3b 0a 20  olumns, NULL);. 
b250: 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51     if (ret != SQ
b260: 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 75  LITE_OK)..goto u
b270: 6e 6b 6e 6f 77 6e 3b 0a 20 20 20 20 69 66 20 28  nknown;.    if (
b280: 72 6f 77 73 20 3c 20 31 29 0a 09 3b 0a 20 20 20  rows < 1)..;.   
b290: 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
b2a0: 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c   for (i = 1; i <
b2b0: 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 20 20  = rows; i++)..  
b2c0: 20 20 7b 0a 09 09 6e 61 6d 65 20 3d 20 72 65 73    {...name = res
b2d0: 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e  ults[(i * column
b2e0: 73 29 20 2b 20 31 5d 3b 0a 09 09 69 66 20 28 73  s) + 1];...if (s
b2f0: 74 72 63 61 73 65 63 6d 70 20 28 6e 61 6d 65 2c  trcasecmp (name,
b300: 20 22 73 72 69 64 22 29 20 3d 3d 20 30 29 0a 09   "srid") == 0)..
b310: 09 20 20 20 20 72 73 5f 73 72 69 64 20 3d 20 31  .    rs_srid = 1
b320: 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  ;...if (strcasec
b330: 6d 70 20 28 6e 61 6d 65 2c 20 22 61 75 74 68 5f  mp (name, "auth_
b340: 6e 61 6d 65 22 29 20 3d 3d 20 30 29 0a 09 09 20  name") == 0)... 
b350: 20 20 20 61 75 74 68 5f 6e 61 6d 65 20 3d 20 31     auth_name = 1
b360: 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  ;...if (strcasec
b370: 6d 70 20 28 6e 61 6d 65 2c 20 22 61 75 74 68 5f  mp (name, "auth_
b380: 73 72 69 64 22 29 20 3d 3d 20 30 29 0a 09 09 20  srid") == 0)... 
b390: 20 20 20 61 75 74 68 5f 73 72 69 64 20 3d 20 31     auth_srid = 1
b3a0: 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  ;...if (strcasec
b3b0: 6d 70 20 28 6e 61 6d 65 2c 20 22 73 72 74 65 78  mp (name, "srtex
b3c0: 74 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20  t") == 0)...    
b3d0: 73 72 74 65 78 74 20 3d 20 31 3b 0a 09 09 69 66  srtext = 1;...if
b3e0: 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 6e 61   (strcasecmp (na
b3f0: 6d 65 2c 20 22 72 65 66 5f 73 79 73 5f 6e 61 6d  me, "ref_sys_nam
b400: 65 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20  e") == 0)...    
b410: 72 65 66 5f 73 79 73 5f 6e 61 6d 65 20 3d 20 31  ref_sys_name = 1
b420: 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  ;...if (strcasec
b430: 6d 70 20 28 6e 61 6d 65 2c 20 22 70 72 6f 6a 34  mp (name, "proj4
b440: 74 65 78 74 22 29 20 3d 3d 20 30 29 0a 09 09 20  text") == 0)... 
b450: 20 20 20 70 72 6f 6a 34 74 65 78 74 20 3d 20 31     proj4text = 1
b460: 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  ;...if (strcasec
b470: 6d 70 20 28 6e 61 6d 65 2c 20 22 73 72 74 65 78  mp (name, "srtex
b480: 74 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20  t") == 0)...    
b490: 73 72 74 65 78 74 20 3d 20 31 3b 0a 09 20 20 20  srtext = 1;..   
b4a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73   }.      }.    s
b4b0: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
b4c0: 65 20 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 20  e (results);.   
b4d0: 20 69 66 20 28 72 73 5f 73 72 69 64 20 26 26 20   if (rs_srid && 
b4e0: 61 75 74 68 5f 6e 61 6d 65 20 26 26 20 61 75 74  auth_name && aut
b4f0: 68 5f 73 72 69 64 20 26 26 20 72 65 66 5f 73 79  h_srid && ref_sy
b500: 73 5f 6e 61 6d 65 20 26 26 20 70 72 6f 6a 34 74  s_name && proj4t
b510: 65 78 74 0a 09 26 26 20 73 72 74 65 78 74 29 0a  ext..&& srtext).
b520: 09 73 70 61 74 69 61 6c 69 74 65 5f 72 73 20 3d  .spatialite_rs =
b530: 20 31 3b 0a 20 20 20 20 69 66 20 28 72 73 5f 73   1;.    if (rs_s
b540: 72 69 64 20 26 26 20 61 75 74 68 5f 6e 61 6d 65  rid && auth_name
b550: 20 26 26 20 61 75 74 68 5f 73 72 69 64 20 26 26   && auth_srid &&
b560: 20 72 65 66 5f 73 79 73 5f 6e 61 6d 65 20 26 26   ref_sys_name &&
b570: 20 70 72 6f 6a 34 74 65 78 74 29 0a 09 73 70 61   proj4text)..spa
b580: 74 69 61 6c 69 74 65 5f 6c 65 67 61 63 79 5f 72  tialite_legacy_r
b590: 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 28 72  s = 1;.    if (r
b5a0: 73 5f 73 72 69 64 20 26 26 20 61 75 74 68 5f 6e  s_srid && auth_n
b5b0: 61 6d 65 20 26 26 20 61 75 74 68 5f 73 72 69 64  ame && auth_srid
b5c0: 20 26 26 20 73 72 74 65 78 74 29 0a 09 66 64 6f   && srtext)..fdo
b5d0: 5f 72 73 20 3d 20 31 3b 0a 2f 2a 20 76 65 72 69  _rs = 1;./* veri
b5e0: 66 79 69 6e 67 20 74 68 65 20 4d 65 74 61 44 61  fying the MetaDa
b5f0: 74 61 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20  ta format */.   
b600: 20 69 66 20 28 73 70 61 74 69 61 6c 69 74 65 5f   if (spatialite_
b610: 6c 65 67 61 63 79 5f 67 63 20 26 26 20 73 70 61  legacy_gc && spa
b620: 74 69 61 6c 69 74 65 5f 6c 65 67 61 63 79 5f 72  tialite_legacy_r
b630: 73 29 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20  s)..return 1;.  
b640: 20 20 69 66 20 28 66 64 6f 5f 67 63 20 26 26 20    if (fdo_gc && 
b650: 66 64 6f 5f 72 73 29 0a 09 72 65 74 75 72 6e 20  fdo_rs)..return 
b660: 32 3b 0a 20 20 20 20 69 66 20 28 73 70 61 74 69  2;.    if (spati
b670: 61 6c 69 74 65 5f 67 63 20 26 26 20 73 70 61 74  alite_gc && spat
b680: 69 61 6c 69 74 65 5f 72 73 29 0a 09 72 65 74 75  ialite_rs)..retu
b690: 72 6e 20 33 3b 0a 20 20 75 6e 6b 6e 6f 77 6e 3a  rn 3;.  unknown:
b6a0: 0a 20 20 20 20 69 66 20 28 63 68 65 63 6b 47 65  .    if (checkGe
b6b0: 6f 50 61 63 6b 61 67 65 20 28 73 71 6c 69 74 65  oPackage (sqlite
b6c0: 2c 20 64 62 5f 70 72 65 66 69 78 29 29 0a 09 72  , db_prefix))..r
b6d0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 72 65 74  eturn 4;.    ret
b6e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
b6f0: 20 76 6f 69 64 0a 61 64 64 5f 66 64 6f 5f 74 61   void.add_fdo_ta
b700: 62 6c 65 20 28 73 74 72 75 63 74 20 66 64 6f 5f  ble (struct fdo_
b710: 74 61 62 6c 65 20 2a 2a 66 69 72 73 74 2c 20 73  table **first, s
b720: 74 72 75 63 74 20 66 64 6f 5f 74 61 62 6c 65 20  truct fdo_table 
b730: 2a 2a 6c 61 73 74 2c 0a 09 20 20 20 20 20 20 20  **last,..       
b740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c  const char *tabl
b750: 65 2c 20 69 6e 74 20 6c 65 6e 29 0a 7b 0a 2f 2a  e, int len).{./*
b760: 20 61 64 64 73 20 61 6e 20 46 44 4f 2d 4f 47 52   adds an FDO-OGR
b770: 20 73 74 79 6c 65 64 20 47 65 6f 6d 65 74 72 79   styled Geometry
b780: 20 54 61 62 6c 65 20 74 6f 20 63 6f 72 72 65 73   Table to corres
b790: 70 6f 6e 64 69 6e 67 20 6c 69 6e 6b 65 64 20 6c  ponding linked l
b7a0: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ist */.    struc
b7b0: 74 20 66 64 6f 5f 74 61 62 6c 65 20 2a 70 20 3d  t fdo_table *p =
b7c0: 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20   malloc (sizeof 
b7d0: 28 73 74 72 75 63 74 20 66 64 6f 5f 74 61 62 6c  (struct fdo_tabl
b7e0: 65 29 29 3b 0a 20 20 20 20 70 2d 3e 74 61 62 6c  e));.    p->tabl
b7f0: 65 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20  e = malloc (len 
b800: 2b 20 31 29 3b 0a 20 20 20 20 73 74 72 63 70 79  + 1);.    strcpy
b810: 20 28 70 2d 3e 74 61 62 6c 65 2c 20 74 61 62 6c   (p->table, tabl
b820: 65 29 3b 0a 20 20 20 20 70 2d 3e 6e 65 78 74 20  e);.    p->next 
b830: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
b840: 21 28 2a 66 69 72 73 74 29 29 0a 09 28 2a 66 69  !(*first))..(*fi
b850: 72 73 74 29 20 3d 20 70 3b 0a 20 20 20 20 69 66  rst) = p;.    if
b860: 20 28 28 2a 6c 61 73 74 29 29 0a 09 28 2a 6c 61   ((*last))..(*la
b870: 73 74 29 2d 3e 6e 65 78 74 20 3d 20 70 3b 0a 20  st)->next = p;. 
b880: 20 20 20 28 2a 6c 61 73 74 29 20 3d 20 70 3b 0a     (*last) = p;.
b890: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
b8a0: 72 65 65 5f 66 64 6f 5f 74 61 62 6c 65 73 20 28  ree_fdo_tables (
b8b0: 73 74 72 75 63 74 20 66 64 6f 5f 74 61 62 6c 65  struct fdo_table
b8c0: 20 2a 66 69 72 73 74 29 0a 7b 0a 2f 2a 20 6d 65   *first).{./* me
b8d0: 6d 6f 72 79 20 63 6c 65 61 6e 75 70 3b 20 64 65  mory cleanup; de
b8e0: 73 74 72 6f 79 69 6e 67 20 74 68 65 20 46 44 4f  stroying the FDO
b8f0: 2d 4f 47 52 20 74 61 62 6c 65 73 20 6c 69 6e 6b  -OGR tables link
b900: 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73  ed list */.    s
b910: 74 72 75 63 74 20 66 64 6f 5f 74 61 62 6c 65 20  truct fdo_table 
b920: 2a 70 3b 0a 20 20 20 20 73 74 72 75 63 74 20 66  *p;.    struct f
b930: 64 6f 5f 74 61 62 6c 65 20 2a 70 6e 3b 0a 20 20  do_table *pn;.  
b940: 20 20 70 20 3d 20 66 69 72 73 74 3b 0a 20 20 20    p = first;.   
b950: 20 77 68 69 6c 65 20 28 70 29 0a 20 20 20 20 20   while (p).     
b960: 20 7b 0a 09 20 20 70 6e 20 3d 20 70 2d 3e 6e 65   {..  pn = p->ne
b970: 78 74 3b 0a 09 20 20 69 66 20 28 70 2d 3e 74 61  xt;..  if (p->ta
b980: 62 6c 65 29 0a 09 20 20 20 20 20 20 66 72 65 65  ble)..      free
b990: 20 28 70 2d 3e 74 61 62 6c 65 29 3b 0a 09 20 20   (p->table);..  
b9a0: 66 72 65 65 20 28 70 29 3b 0a 09 20 20 70 20 3d  free (p);..  p =
b9b0: 20 70 6e 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a   pn;.      }.}..
b9c0: 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
b9d0: 5f 41 75 74 6f 46 44 4f 53 74 61 72 74 20 28 73  _AutoFDOStart (s
b9e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b9f0: 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
ba00: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ba10: 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
ba20: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
ba30: 41 75 74 6f 46 44 4f 53 74 61 72 74 28 76 6f 69  AutoFDOStart(voi
ba40: 64 29 0a 2f 20 20 20 20 20 6f 72 0a 2f 20 41 75  d)./     or./ Au
ba50: 74 6f 46 44 4f 53 74 61 72 74 28 64 62 5f 70 72  toFDOStart(db_pr
ba60: 65 66 69 78 20 54 45 58 54 29 0a 2f 0a 2f 20 66  efix TEXT)././ f
ba70: 6f 72 20 46 44 4f 2d 4f 47 52 20 69 6e 74 65 72  or FDO-OGR inter
ba80: 6f 70 65 72 61 62 69 6c 69 74 79 3a 0a 2f 20 74  operability:./ t
ba90: 65 73 74 73 20 74 68 65 20 53 70 61 74 69 61 6c  ests the Spatial
baa0: 4d 65 74 61 64 61 74 61 20 74 79 70 65 2c 20 74  Metadata type, t
bab0: 68 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  hen automaticall
bac0: 79 0a 2f 20 63 72 65 61 74 69 6e 67 20 61 20 56  y./ creating a V
bad0: 69 72 74 75 61 6c 46 44 4f 20 74 61 62 6c 65 20  irtualFDO table 
bae0: 66 6f 72 20 65 61 63 68 20 46 44 4f 2d 4f 47 52  for each FDO-OGR
baf0: 20 6d 61 69 6e 20 74 61 62 6c 65 20 0a 2f 20 64   main table ./ d
bb00: 65 63 6c 61 72 65 64 20 77 69 74 68 69 6e 20 46  eclared within F
bb10: 44 4f 2d 73 74 79 6c 65 64 20 53 70 61 74 69 61  DO-styled Spatia
bb20: 6c 4d 65 74 61 64 61 74 61 0a 2f 0a 2a 2f 0a 20  lMetadata./.*/. 
bb30: 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
bb40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 70  const char *db_p
bb50: 72 65 66 69 78 20 3d 20 22 6d 61 69 6e 22 3b 0a  refix = "main";.
bb60: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bb70: 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b  name;.    int i;
bb80: 0a 20 20 20 20 63 68 61 72 20 2a 2a 72 65 73 75  .    char **resu
bb90: 6c 74 73 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77  lts;.    int row
bba0: 73 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6c 75 6d  s;.    int colum
bbb0: 6e 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71  ns;.    char *sq
bbc0: 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20  l_statement;.   
bbd0: 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a   int count = 0;.
bbe0: 20 20 20 20 73 74 72 75 63 74 20 66 64 6f 5f 74      struct fdo_t
bbf0: 61 62 6c 65 20 2a 66 69 72 73 74 20 3d 20 4e 55  able *first = NU
bc00: 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 66  LL;.    struct f
bc10: 64 6f 5f 74 61 62 6c 65 20 2a 6c 61 73 74 20 3d  do_table *last =
bc20: 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63   NULL;.    struc
bc30: 74 20 66 64 6f 5f 74 61 62 6c 65 20 2a 70 3b 0a  t fdo_table *p;.
bc40: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
bc50: 20 63 68 61 72 20 2a 78 6e 61 6d 65 3b 0a 20 20   char *xname;.  
bc60: 20 20 63 68 61 72 20 2a 78 78 6e 61 6d 65 3b 0a    char *xxname;.
bc70: 20 20 20 20 63 68 61 72 20 2a 78 74 61 62 6c 65      char *xtable
bc80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
bc90: 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
bca0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
bcb0: 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
bcc0: 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
bcd0: 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
bce0: 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 61  INE */.    if (a
bcf0: 72 67 63 20 3d 3d 20 31 29 0a 20 20 20 20 20 20  rgc == 1).      
bd00: 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
bd10: 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
bd20: 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
bd30: 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 67 6f 74  NULL)..      got
bd40: 6f 20 6e 75 6c 6c 5f 70 72 65 66 69 78 3b 0a 09  o null_prefix;..
bd50: 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
bd60: 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
bd70: 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
bd80: 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  T)..    {...sqli
bd90: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
bda0: 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09  context, -1);...
bdb0: 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
bdc0: 20 20 64 62 5f 70 72 65 66 69 78 20 3d 20 28 63    db_prefix = (c
bdd0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
bde0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
bdf0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
be00: 20 7d 0a 20 20 6e 75 6c 6c 5f 70 72 65 66 69 78   }.  null_prefix
be10: 3a 0a 20 20 20 20 69 66 20 28 63 68 65 63 6b 53  :.    if (checkS
be20: 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 5f 65  patialMetaData_e
be30: 78 20 28 73 71 6c 69 74 65 2c 20 64 62 5f 70 72  x (sqlite, db_pr
be40: 65 66 69 78 29 20 3d 3d 20 32 29 0a 20 20 20 20  efix) == 2).    
be50: 20 20 7b 0a 09 20 20 2f 2a 20 6f 6b 2c 20 63 72    {..  /* ok, cr
be60: 65 61 74 69 6e 67 20 56 69 72 74 75 61 6c 46 44  eating VirtualFD
be70: 4f 20 74 61 62 6c 65 73 20 2a 2f 0a 09 20 20 63  O tables */..  c
be80: 68 61 72 20 2a 78 64 62 5f 70 72 65 66 69 78 20  har *xdb_prefix 
be90: 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74  = gaiaDoubleQuot
bea0: 65 64 53 71 6c 20 28 64 62 5f 70 72 65 66 69 78  edSql (db_prefix
beb0: 29 3b 0a 09 20 20 73 71 6c 5f 73 74 61 74 65 6d  );..  sql_statem
bec0: 65 6e 74 20 3d 0a 09 20 20 20 20 20 20 73 71 6c  ent =..      sql
bed0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 20 20  ite3_mprintf..  
bee0: 20 20 20 20 28 22 53 45 4c 45 43 54 20 44 49 53      ("SELECT DIS
bef0: 54 49 4e 43 54 20 66 5f 74 61 62 6c 65 5f 6e 61  TINCT f_table_na
bf00: 6d 65 20 46 52 4f 4d 20 5c 22 25 73 5c 22 2e 67  me FROM \"%s\".g
bf10: 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 22  eometry_columns"
bf20: 2c 0a 09 20 20 20 20 20 20 20 78 64 62 5f 70 72  ,..       xdb_pr
bf30: 65 66 69 78 29 3b 0a 09 20 20 66 72 65 65 20 28  efix);..  free (
bf40: 78 64 62 5f 70 72 65 66 69 78 29 3b 0a 09 20 20  xdb_prefix);..  
bf50: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65  ret = sqlite3_ge
bf60: 74 5f 74 61 62 6c 65 20 28 73 71 6c 69 74 65 2c  t_table (sqlite,
bf70: 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20   sql_statement, 
bf80: 26 72 65 73 75 6c 74 73 2c 20 26 72 6f 77 73 2c  &results, &rows,
bf90: 0a 09 09 09 09 20 20 20 26 63 6f 6c 75 6d 6e 73  .....   &columns
bfa0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 73 71 6c 69  , NULL);..  sqli
bfb0: 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74  te3_free (sql_st
bfc0: 61 74 65 6d 65 6e 74 29 3b 0a 09 20 20 69 66 20  atement);..  if 
bfd0: 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f  (ret != SQLITE_O
bfe0: 4b 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 65  K)..      goto e
bff0: 72 72 6f 72 3b 0a 09 20 20 69 66 20 28 72 6f 77  rror;..  if (row
c000: 73 20 3c 20 31 29 0a 09 20 20 20 20 20 20 3b 0a  s < 1)..      ;.
c010: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
c020: 09 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c  .for (i = 1; i <
c030: 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 09 20  = rows; i++)... 
c040: 20 7b 0a 09 09 20 20 20 20 20 20 6e 61 6d 65 20   {...      name 
c050: 3d 20 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63  = results[(i * c
c060: 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 3b 0a 09 09  olumns) + 0];...
c070: 20 20 20 20 20 20 69 66 20 28 6e 61 6d 65 29 0a        if (name).
c080: 09 09 09 7b 0a 09 09 09 20 20 20 20 6c 65 6e 20  ...{....    len 
c090: 3d 20 73 74 72 6c 65 6e 20 28 6e 61 6d 65 29 3b  = strlen (name);
c0a0: 0a 09 09 09 20 20 20 20 61 64 64 5f 66 64 6f 5f  ....    add_fdo_
c0b0: 74 61 62 6c 65 20 28 26 66 69 72 73 74 2c 20 26  table (&first, &
c0c0: 6c 61 73 74 2c 20 6e 61 6d 65 2c 20 6c 65 6e 29  last, name, len)
c0d0: 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 20 20  ;....}...  }..  
c0e0: 20 20 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
c0f0: 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73 75 6c  ree_table (resul
c100: 74 73 29 3b 0a 09 20 20 70 20 3d 20 66 69 72 73  ts);..  p = firs
c110: 74 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 29 0a  t;..  while (p).
c120: 09 20 20 20 20 7b 0a 09 09 2f 2a 20 64 65 73 74  .    {.../* dest
c130: 72 6f 79 69 6e 67 20 74 68 65 20 56 69 72 74 75  roying the Virtu
c140: 61 6c 46 44 4f 20 74 61 62 6c 65 20 5b 69 66 20  alFDO table [if 
c150: 65 78 69 73 74 69 6e 67 5d 20 2a 2f 0a 09 09 78  existing] */...x
c160: 64 62 5f 70 72 65 66 69 78 20 3d 20 67 61 69 61  db_prefix = gaia
c170: 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20  DoubleQuotedSql 
c180: 28 64 62 5f 70 72 65 66 69 78 29 3b 0a 09 09 78  (db_prefix);...x
c190: 78 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  xname = sqlite3_
c1a0: 6d 70 72 69 6e 74 66 20 28 22 66 64 6f 5f 25 73  mprintf ("fdo_%s
c1b0: 22 2c 20 70 2d 3e 74 61 62 6c 65 29 3b 0a 09 09  ", p->table);...
c1c0: 78 6e 61 6d 65 20 3d 20 67 61 69 61 44 6f 75 62  xname = gaiaDoub
c1d0: 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 78 78 6e  leQuotedSql (xxn
c1e0: 61 6d 65 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  ame);...sqlite3_
c1f0: 66 72 65 65 20 28 78 78 6e 61 6d 65 29 3b 0a 09  free (xxname);..
c200: 09 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d  .sql_statement =
c210: 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ...    sqlite3_m
c220: 70 72 69 6e 74 66 20 28 22 44 52 4f 50 20 54 41  printf ("DROP TA
c230: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 5c 22  BLE IF EXISTS \"
c240: 25 73 5c 22 2e 5c 22 25 73 5c 22 22 2c 0a 09 09  %s\".\"%s\"",...
c250: 09 09 20 20 20 20 20 78 64 62 5f 70 72 65 66 69  ..     xdb_prefi
c260: 78 2c 20 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65  x, xname);...fre
c270: 65 20 28 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65  e (xname);...fre
c280: 65 20 28 78 64 62 5f 70 72 65 66 69 78 29 3b 0a  e (xdb_prefix);.
c290: 09 09 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f  ..ret = sqlite3_
c2a0: 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71  exec (sqlite, sq
c2b0: 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c  l_statement, NUL
c2c0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
c2d0: 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28  ..sqlite3_free (
c2e0: 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a  sql_statement);.
c2f0: 09 09 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c  ..if (ret != SQL
c300: 49 54 45 5f 4f 4b 29 0a 09 09 20 20 20 20 67 6f  ITE_OK)...    go
c310: 74 6f 20 65 72 72 6f 72 3b 0a 09 09 2f 2a 20 63  to error;.../* c
c320: 72 65 61 74 69 6e 67 20 74 68 65 20 56 69 72 74  reating the Virt
c330: 75 61 6c 46 44 4f 20 74 61 62 6c 65 20 2a 2f 0a  ualFDO table */.
c340: 09 09 78 64 62 5f 70 72 65 66 69 78 20 3d 20 67  ..xdb_prefix = g
c350: 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53  aiaDoubleQuotedS
c360: 71 6c 20 28 64 62 5f 70 72 65 66 69 78 29 3b 0a  ql (db_prefix);.
c370: 09 09 78 78 6e 61 6d 65 20 3d 20 73 71 6c 69 74  ..xxname = sqlit
c380: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 66 64 6f  e3_mprintf ("fdo
c390: 5f 25 73 22 2c 20 70 2d 3e 74 61 62 6c 65 29 3b  _%s", p->table);
c3a0: 0a 09 09 78 6e 61 6d 65 20 3d 20 67 61 69 61 44  ...xname = gaiaD
c3b0: 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
c3c0: 78 78 6e 61 6d 65 29 3b 0a 09 09 73 71 6c 69 74  xxname);...sqlit
c3d0: 65 33 5f 66 72 65 65 20 28 78 78 6e 61 6d 65 29  e3_free (xxname)
c3e0: 3b 0a 09 09 78 74 61 62 6c 65 20 3d 20 67 61 69  ;...xtable = gai
c3f0: 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c  aDoubleQuotedSql
c400: 20 28 70 2d 3e 74 61 62 6c 65 29 3b 0a 09 09 73   (p->table);...s
c410: 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09  ql_statement =..
c420: 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
c430: 69 6e 74 66 0a 09 09 20 20 20 20 28 22 43 52 45  intf...    ("CRE
c440: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
c450: 45 20 5c 22 25 73 5c 22 2e 5c 22 25 73 5c 22 20  E \"%s\".\"%s\" 
c460: 55 53 49 4e 47 20 56 69 72 74 75 61 6c 46 44 4f  USING VirtualFDO
c470: 28 5c 22 25 73 5c 22 2c 20 5c 22 25 73 5c 22 29  (\"%s\", \"%s\")
c480: 22 2c 0a 09 09 20 20 20 20 20 78 64 62 5f 70 72  ",...     xdb_pr
c490: 65 66 69 78 2c 20 78 6e 61 6d 65 2c 20 78 64 62  efix, xname, xdb
c4a0: 5f 70 72 65 66 69 78 2c 20 78 74 61 62 6c 65 29  _prefix, xtable)
c4b0: 3b 0a 09 09 66 72 65 65 20 28 78 6e 61 6d 65 29  ;...free (xname)
c4c0: 3b 0a 09 09 66 72 65 65 20 28 78 74 61 62 6c 65  ;...free (xtable
c4d0: 29 3b 0a 09 09 66 72 65 65 20 28 78 64 62 5f 70  );...free (xdb_p
c4e0: 72 65 66 69 78 29 3b 0a 09 09 72 65 74 20 3d 20  refix);...ret = 
c4f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
c500: 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d  lite, sql_statem
c510: 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ent, NULL, NULL,
c520: 20 4e 55 4c 4c 29 3b 0a 09 09 73 71 6c 69 74 65   NULL);...sqlite
c530: 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74  3_free (sql_stat
c540: 65 6d 65 6e 74 29 3b 0a 09 09 69 66 20 28 72 65  ement);...if (re
c550: 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
c560: 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ..    goto error
c570: 3b 0a 09 09 63 6f 75 6e 74 2b 2b 3b 0a 09 09 70  ;...count++;...p
c580: 20 3d 20 70 2d 3e 6e 65 78 74 3b 0a 09 20 20 20   = p->next;..   
c590: 20 7d 0a 09 65 72 72 6f 72 3a 0a 09 20 20 66 72   }..error:..  fr
c5a0: 65 65 5f 66 64 6f 5f 74 61 62 6c 65 73 20 28 66  ee_fdo_tables (f
c5b0: 69 72 73 74 29 3b 0a 09 20 20 73 71 6c 69 74 65  irst);..  sqlite
c5c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
c5d0: 6e 74 65 78 74 2c 20 63 6f 75 6e 74 29 3b 0a 09  ntext, count);..
c5e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c5f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
c600: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
c610: 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  t, 0);.    retur
c620: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
c630: 64 0a 66 6e 63 74 5f 41 75 74 6f 46 44 4f 53 74  d.fnct_AutoFDOSt
c640: 6f 70 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  op (sqlite3_cont
c650: 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
c660: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
c670: 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
c680: 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
c690: 6e 3a 0a 2f 20 41 75 74 6f 46 44 4f 53 74 6f 70  n:./ AutoFDOStop
c6a0: 28 76 6f 69 64 29 0a 2f 20 20 20 20 20 6f 72 0a  (void)./     or.
c6b0: 2f 20 41 75 74 6f 46 44 4f 53 74 6f 70 28 64 62  / AutoFDOStop(db
c6c0: 5f 70 72 65 66 69 78 20 54 45 58 54 29 0a 2f 0a  _prefix TEXT)./.
c6d0: 2f 20 66 6f 72 20 46 44 4f 2d 4f 47 52 20 69 6e  / for FDO-OGR in
c6e0: 74 65 72 6f 70 65 72 61 62 69 6c 69 74 79 3a 0a  teroperability:.
c6f0: 2f 20 74 65 73 74 73 20 74 68 65 20 53 70 61 74  / tests the Spat
c700: 69 61 6c 4d 65 74 61 64 61 74 61 20 74 79 70 65  ialMetadata type
c710: 2c 20 74 68 65 6e 20 61 75 74 6f 6d 61 74 69 63  , then automatic
c720: 61 6c 6c 79 0a 2f 20 72 65 6d 6f 76 65 73 20 61  ally./ removes a
c730: 6e 79 20 56 69 72 74 75 61 6c 46 44 4f 20 74 61  ny VirtualFDO ta
c740: 62 6c 65 20 0a 2f 0a 2a 2f 0a 20 20 20 20 69 6e  ble ./.*/.    in
c750: 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  t ret;.    const
c760: 20 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69 78   char *db_prefix
c770: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   = "main";.    c
c780: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b  onst char *name;
c790: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
c7a0: 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a  char **results;.
c7b0: 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20      int rows;.  
c7c0: 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20    int columns;. 
c7d0: 20 20 20 63 68 61 72 20 2a 73 71 6c 5f 73 74 61     char *sql_sta
c7e0: 74 65 6d 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20  tement;.    int 
c7f0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  count = 0;.    s
c800: 74 72 75 63 74 20 66 64 6f 5f 74 61 62 6c 65 20  truct fdo_table 
c810: 2a 66 69 72 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20  *first = NULL;. 
c820: 20 20 20 73 74 72 75 63 74 20 66 64 6f 5f 74 61     struct fdo_ta
c830: 62 6c 65 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c  ble *last = NULL
c840: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 66 64 6f  ;.    struct fdo
c850: 5f 74 61 62 6c 65 20 2a 70 3b 0a 20 20 20 20 69  _table *p;.    i
c860: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 68 61 72  nt len;.    char
c870: 20 2a 78 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *xname;.    cha
c880: 72 20 2a 78 78 6e 61 6d 65 3b 0a 20 20 20 20 73  r *xxname;.    s
c890: 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
c8a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
c8b0: 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
c8c0: 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
c8d0: 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
c8e0: 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
c8f0: 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
c900: 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  1).      {..  if
c910: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c920: 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
c930: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09  = SQLITE_NULL)..
c940: 20 20 20 20 20 20 67 6f 74 6f 20 6e 75 6c 6c 5f        goto null_
c950: 70 72 65 66 69 78 3b 0a 09 20 20 69 66 20 28 73  prefix;..  if (s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
c970: 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
c980: 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
c990: 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
c9a0: 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
c9b0: 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b  , -1);...return;
c9c0: 0a 09 20 20 20 20 7d 0a 09 20 20 64 62 5f 70 72  ..    }..  db_pr
c9d0: 65 66 69 78 20 3d 20 28 63 6f 6e 73 74 20 63 68  efix = (const ch
c9e0: 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
c9f0: 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
ca00: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 6e 75  ]);.      }.  nu
ca10: 6c 6c 5f 70 72 65 66 69 78 3a 0a 20 20 20 20 69  ll_prefix:.    i
ca20: 66 20 28 63 68 65 63 6b 53 70 61 74 69 61 6c 4d  f (checkSpatialM
ca30: 65 74 61 44 61 74 61 5f 65 78 20 28 73 71 6c 69  etaData_ex (sqli
ca40: 74 65 2c 20 64 62 5f 70 72 65 66 69 78 29 20 3d  te, db_prefix) =
ca50: 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 2).      {..  
ca60: 2f 2a 20 6f 6b 2c 20 72 65 6d 6f 76 69 6e 67 20  /* ok, removing 
ca70: 56 69 72 74 75 61 6c 46 44 4f 20 74 61 62 6c 65  VirtualFDO table
ca80: 73 20 2a 2f 0a 09 20 20 63 68 61 72 20 2a 78 64  s */..  char *xd
ca90: 62 5f 70 72 65 66 69 78 20 3d 20 67 61 69 61 44  b_prefix = gaiaD
caa0: 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
cab0: 64 62 5f 70 72 65 66 69 78 29 3b 0a 09 20 20 73  db_prefix);..  s
cac0: 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09  ql_statement =..
cad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
cae0: 72 69 6e 74 66 0a 09 20 20 20 20 20 20 28 22 53  rintf..      ("S
caf0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 66  ELECT DISTINCT f
cb00: 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 46 52 4f 4d  _table_name FROM
cb10: 20 5c 22 25 73 5c 22 2e 67 65 6f 6d 65 74 72 79   \"%s\".geometry
cb20: 5f 63 6f 6c 75 6d 6e 73 22 2c 0a 09 20 20 20 20  _columns",..    
cb30: 20 20 20 78 64 62 5f 70 72 65 66 69 78 29 3b 0a     xdb_prefix);.
cb40: 09 20 20 66 72 65 65 20 28 78 64 62 5f 70 72 65  .  free (xdb_pre
cb50: 66 69 78 29 3b 0a 09 20 20 72 65 74 20 3d 20 73  fix);..  ret = s
cb60: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
cb70: 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74   (sqlite, sql_st
cb80: 61 74 65 6d 65 6e 74 2c 20 26 72 65 73 75 6c 74  atement, &result
cb90: 73 2c 20 26 72 6f 77 73 2c 0a 09 09 09 09 20 20  s, &rows,.....  
cba0: 20 26 63 6f 6c 75 6d 6e 73 2c 20 4e 55 4c 4c 29   &columns, NULL)
cbb0: 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20  ;..  if (ret != 
cbc0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20  SQLITE_OK)..    
cbd0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20    goto error;.. 
cbe0: 20 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09   if (rows < 1)..
cbf0: 20 20 20 20 20 20 3b 0a 09 20 20 65 6c 73 65 0a        ;..  else.
cc00: 09 20 20 20 20 7b 0a 09 09 66 6f 72 20 28 69 20  .    {...for (i 
cc10: 3d 20 31 3b 20 69 20 3c 3d 20 72 6f 77 73 3b 20  = 1; i <= rows; 
cc20: 69 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  i++)...  {...   
cc30: 20 20 20 6e 61 6d 65 20 3d 20 72 65 73 75 6c 74     name = result
cc40: 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20  s[(i * columns) 
cc50: 2b 20 30 5d 3b 0a 09 09 20 20 20 20 20 20 69 66  + 0];...      if
cc60: 20 28 6e 61 6d 65 29 0a 09 09 09 7b 0a 09 09 09   (name)....{....
cc70: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
cc80: 20 28 6e 61 6d 65 29 3b 0a 09 09 09 20 20 20 20   (name);....    
cc90: 61 64 64 5f 66 64 6f 5f 74 61 62 6c 65 20 28 26  add_fdo_table (&
cca0: 66 69 72 73 74 2c 20 26 6c 61 73 74 2c 20 6e 61  first, &last, na
ccb0: 6d 65 2c 20 6c 65 6e 29 3b 0a 09 09 09 7d 0a 09  me, len);....}..
ccc0: 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 73  .  }..    }..  s
ccd0: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
cce0: 65 20 28 72 65 73 75 6c 74 73 29 3b 0a 09 20 20  e (results);..  
ccf0: 70 20 3d 20 66 69 72 73 74 3b 0a 09 20 20 77 68  p = first;..  wh
cd00: 69 6c 65 20 28 70 29 0a 09 20 20 20 20 7b 0a 09  ile (p)..    {..
cd10: 09 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ./* destroying t
cd20: 68 65 20 56 69 72 74 75 61 6c 46 44 4f 20 74 61  he VirtualFDO ta
cd30: 62 6c 65 20 5b 69 66 20 65 78 69 73 74 69 6e 67  ble [if existing
cd40: 5d 20 2a 2f 0a 09 09 78 64 62 5f 70 72 65 66 69  ] */...xdb_prefi
cd50: 78 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75  x = gaiaDoubleQu
cd60: 6f 74 65 64 53 71 6c 20 28 64 62 5f 70 72 65 66  otedSql (db_pref
cd70: 69 78 29 3b 0a 09 09 78 78 6e 61 6d 65 20 3d 20  ix);...xxname = 
cd80: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
cd90: 28 22 66 64 6f 5f 25 73 22 2c 20 70 2d 3e 74 61  ("fdo_%s", p->ta
cda0: 62 6c 65 29 3b 0a 09 09 78 6e 61 6d 65 20 3d 20  ble);...xname = 
cdb0: 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64  gaiaDoubleQuoted
cdc0: 53 71 6c 20 28 78 78 6e 61 6d 65 29 3b 0a 09 09  Sql (xxname);...
cdd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 78 78  sqlite3_free (xx
cde0: 6e 61 6d 65 29 3b 0a 09 09 73 71 6c 5f 73 74 61  name);...sql_sta
cdf0: 74 65 6d 65 6e 74 20 3d 0a 09 09 20 20 20 20 73  tement =...    s
ce00: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
ce10: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
ce20: 58 49 53 54 53 20 5c 22 25 73 5c 22 2e 5c 22 25  XISTS \"%s\".\"%
ce30: 73 5c 22 22 2c 0a 09 09 09 09 20 20 20 20 20 78  s\"",.....     x
ce40: 64 62 5f 70 72 65 66 69 78 2c 20 78 6e 61 6d 65  db_prefix, xname
ce50: 29 3b 0a 09 09 66 72 65 65 20 28 78 6e 61 6d 65  );...free (xname
ce60: 29 3b 0a 09 09 66 72 65 65 20 28 78 64 62 5f 70  );...free (xdb_p
ce70: 72 65 66 69 78 29 3b 0a 09 09 72 65 74 20 3d 20  refix);...ret = 
ce80: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
ce90: 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d  lite, sql_statem
cea0: 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ent, NULL, NULL,
ceb0: 20 4e 55 4c 4c 29 3b 0a 09 09 73 71 6c 69 74 65   NULL);...sqlite
cec0: 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74  3_free (sql_stat
ced0: 65 6d 65 6e 74 29 3b 0a 09 09 69 66 20 28 72 65  ement);...if (re
cee0: 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
cef0: 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ..    goto error
cf00: 3b 0a 09 09 63 6f 75 6e 74 2b 2b 3b 0a 09 09 70  ;...count++;...p
cf10: 20 3d 20 70 2d 3e 6e 65 78 74 3b 0a 09 20 20 20   = p->next;..   
cf20: 20 7d 0a 09 65 72 72 6f 72 3a 0a 09 20 20 66 72   }..error:..  fr
cf30: 65 65 5f 66 64 6f 5f 74 61 62 6c 65 73 20 28 66  ee_fdo_tables (f
cf40: 69 72 73 74 29 3b 0a 09 20 20 73 71 6c 69 74 65  irst);..  sqlite
cf50: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
cf60: 6e 74 65 78 74 2c 20 63 6f 75 6e 74 29 3b 0a 09  ntext, count);..
cf70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
cf80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
cf90: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
cfa0: 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  t, 0);.    retur
cfb0: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
cfc0: 64 0a 66 6e 63 74 5f 43 68 65 63 6b 53 70 61 74  d.fnct_CheckSpat
cfd0: 69 61 6c 4d 65 74 61 44 61 74 61 20 28 73 71 6c  ialMetaData (sql
cfe0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
cff0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
d000: 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f  ,....   sqlite3_
d010: 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
d020: 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
d030: 3a 0a 2f 20 43 68 65 63 6b 53 70 61 74 69 61 6c  :./ CheckSpatial
d040: 4d 65 74 61 44 61 74 61 28 76 6f 69 64 29 0a 2f  MetaData(void)./
d050: 20 20 20 20 20 6f 72 0a 2f 20 43 68 65 63 6b 53       or./ CheckS
d060: 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 28 64  patialMetaData(d
d070: 62 5f 70 72 65 66 69 78 20 54 45 58 54 29 0a 2f  b_prefix TEXT)./
d080: 0a 2f 20 66 6f 72 20 46 44 4f 2d 4f 47 52 20 69  ./ for FDO-OGR i
d090: 6e 74 65 72 6f 70 65 72 61 62 69 6c 69 74 79 3a  nteroperability:
d0a0: 0a 2f 20 74 65 73 74 73 20 74 68 65 20 53 70 61  ./ tests the Spa
d0b0: 74 69 61 6c 4d 65 74 61 64 61 74 61 20 74 79 70  tialMetadata typ
d0c0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 3a 0a 2f 0a  e, returning:./.
d0d0: 2f 20 2d 31 20 2d 20 6f 6e 20 69 6e 76 61 6c 69  / -1 - on invali
d0e0: 64 20 61 72 67 73 20 6f 72 20 69 66 20 6e 6f 20  d args or if no 
d0f0: 41 54 54 41 43 48 45 44 2d 44 42 20 69 64 65 6e  ATTACHED-DB iden
d100: 66 69 65 64 20 62 79 20 64 62 5f 70 72 65 66 69  fied by db_prefi
d110: 78 20 65 78 69 73 74 73 0a 2f 20 30 20 2d 20 69  x exists./ 0 - i
d120: 66 20 6e 6f 20 76 61 6c 69 64 20 53 70 61 74 69  f no valid Spati
d130: 61 6c 4d 65 74 61 44 61 74 61 20 77 65 72 65 20  alMetaData were 
d140: 66 6f 75 6e 64 0a 2f 20 31 20 2d 20 69 66 20 53  found./ 1 - if S
d150: 70 61 74 69 61 4c 69 74 65 2d 6c 65 67 61 63 79  patiaLite-legacy
d160: 20 53 70 61 74 69 61 6c 4d 65 74 61 64 61 74 61   SpatialMetadata
d170: 20 77 65 72 65 20 66 6f 75 6e 64 0a 2f 20 32 20   were found./ 2 
d180: 2d 20 69 66 20 46 44 4f 2d 4f 47 52 2d 6c 69 6b  - if FDO-OGR-lik
d190: 65 20 53 70 61 74 69 61 6c 4d 65 74 61 64 61 74  e SpatialMetadat
d1a0: 61 20 77 65 72 65 20 66 6f 75 6e 64 0a 2f 20 33  a were found./ 3
d1b0: 20 2d 20 69 66 20 53 70 61 74 69 61 4c 69 74 65   - if SpatiaLite
d1c0: 2d 63 75 72 72 65 6e 74 20 53 70 61 74 69 61 6c  -current Spatial
d1d0: 4d 65 74 61 64 61 74 61 20 77 65 72 65 20 66 6f  Metadata were fo
d1e0: 75 6e 64 0a 2f 20 34 20 2d 20 69 66 20 47 65 6f  und./ 4 - if Geo
d1f0: 50 61 63 6b 61 67 65 20 53 70 61 74 69 61 6c 4d  Package SpatialM
d200: 65 74 61 64 61 74 61 20 77 65 72 65 20 66 6f 75  etadata were fou
d210: 6e 64 0a 2f 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73  nd./.*/.    cons
d220: 74 20 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69  t char *db_prefi
d230: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71  x = NULL;.    sq
d240: 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 3b 0a 20  lite3 *sqlite;. 
d250: 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
d260: 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
d270: 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
d280: 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72  NE */.    if (ar
d290: 67 63 20 3d 3d 20 31 29 0a 20 20 20 20 20 20 7b  gc == 1).      {
d2a0: 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
d2b0: 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
d2c0: 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [0]) != SQLITE_T
d2d0: 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  EXT)..    {...sq
d2e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
d2f0: 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
d300: 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
d310: 0a 09 20 20 64 62 5f 70 72 65 66 69 78 20 3d 20  ..  db_prefix = 
d320: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
d330: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
d340: 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
d350: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 20     }.    sqlite 
d360: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
d370: 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
d380: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 20 3d  text);.    ret =
d390: 20 63 68 65 63 6b 53 70 61 74 69 61 6c 4d 65 74   checkSpatialMet
d3a0: 61 44 61 74 61 5f 65 78 20 28 73 71 6c 69 74 65  aData_ex (sqlite
d3b0: 2c 20 64 62 5f 70 72 65 66 69 78 29 3b 0a 20 20  , db_prefix);.  
d3c0: 20 20 69 66 20 28 72 65 74 20 3d 3d 20 33 29 0a    if (ret == 3).
d3d0: 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 74 72        {..  /* tr
d3e0: 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 74  ying to create t
d3f0: 68 65 20 61 64 76 61 6e 63 65 64 20 6d 65 74 61  he advanced meta
d400: 64 61 74 61 20 74 61 62 6c 65 73 20 3e 3d 20 76  data tables >= v
d410: 2e 34 2e 30 2e 30 20 2a 2f 0a 09 20 20 69 66 20  .4.0.0 */..  if 
d420: 28 64 62 5f 70 72 65 66 69 78 20 3d 3d 20 4e 55  (db_prefix == NU
d430: 4c 4c 20 7c 7c 20 73 74 72 63 61 73 65 63 6d 70  LL || strcasecmp
d440: 20 28 64 62 5f 70 72 65 66 69 78 2c 20 22 6d 61   (db_prefix, "ma
d450: 69 6e 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  in") == 0)..    
d460: 20 20 63 72 65 61 74 65 41 64 76 61 6e 63 65 64    createAdvanced
d470: 4d 65 74 61 44 61 74 61 20 28 73 71 6c 69 74 65  MetaData (sqlite
d480: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  );.      }.    s
d490: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
d4a0: 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
d4b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ;.    return;.}.
d4c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
d4d0: 74 5f 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74  t_InitSpatialMet
d4e0: 61 44 61 74 61 20 28 73 71 6c 69 74 65 33 5f 63  aData (sqlite3_c
d4f0: 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
d500: 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
d510: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
d520: 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
d530: 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 6e 69   function:./ Ini
d540: 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61  tSpatialMetaData
d550: 28 29 0a 2f 20 20 20 20 20 6f 72 0a 2f 20 49 6e  ()./     or./ In
d560: 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74  itSpatialMetaDat
d570: 61 28 74 65 78 74 20 6d 6f 64 65 29 0a 2f 20 20  a(text mode)./  
d580: 20 20 20 6f 72 0a 2f 20 49 6e 69 74 53 70 61 74     or./ InitSpat
d590: 69 61 6c 4d 65 74 61 44 61 74 61 28 69 6e 74 65  ialMetaData(inte
d5a0: 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ger transaction)
d5b0: 0a 2f 20 20 20 20 20 6f 72 0a 2f 20 49 6e 69 74  ./     or./ Init
d5c0: 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 28  SpatialMetaData(
d5d0: 69 6e 74 65 67 65 72 20 74 72 61 6e 73 61 63 74  integer transact
d5e0: 69 6f 6e 2c 20 74 65 78 74 20 6d 6f 64 65 29 0a  ion, text mode).
d5f0: 2f 0a 2f 20 63 72 65 61 74 65 73 20 74 68 65 20  /./ creates the 
d600: 53 50 41 54 49 41 4c 5f 52 45 46 5f 53 59 53 20  SPATIAL_REF_SYS 
d610: 61 6e 64 20 47 45 4f 4d 45 54 52 59 5f 43 4f 4c  and GEOMETRY_COL
d620: 55 4d 4e 53 20 74 61 62 6c 65 73 0a 2f 20 72 65  UMNS tables./ re
d630: 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
d640: 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
d650: 65 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20 73 71  e.*/.    char sq
d660: 6c 5b 38 31 39 32 5d 3b 0a 20 20 20 20 63 68 61  l[8192];.    cha
d670: 72 20 2a 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c  r *errMsg = NULL
d680: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
d690: 20 20 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69     int transacti
d6a0: 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  on = 0;.    cons
d6b0: 74 20 63 68 61 72 20 2a 78 6d 6f 64 65 3b 0a 20  t char *xmode;. 
d6c0: 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 47 41     int mode = GA
d6d0: 49 41 5f 45 50 53 47 5f 41 4e 59 3b 0a 20 20 20  IA_EPSG_ANY;.   
d6e0: 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
d6f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
d700: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
d710: 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
d720: 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
d730: 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
d740: 2f 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  /.    if (argc =
d750: 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 1).      {..  
d760: 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
d770: 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
d780: 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
d790: 0a 09 20 20 20 20 7b 0a 09 09 78 6d 6f 64 65 20  ..    {...xmode 
d7a0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
d7b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
d7c0: 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  ext (argv[0]);..
d7d0: 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20  .if (strcasecmp 
d7e0: 28 78 6d 6f 64 65 2c 20 22 4e 4f 4e 45 22 29 20  (xmode, "NONE") 
d7f0: 3d 3d 20 30 0a 09 09 20 20 20 20 7c 7c 20 73 74  == 0...    || st
d800: 72 63 61 73 65 63 6d 70 20 28 78 6d 6f 64 65 2c  rcasecmp (xmode,
d810: 20 22 45 4d 50 54 59 22 29 20 3d 3d 20 30 29 0a   "EMPTY") == 0).
d820: 09 09 20 20 20 20 6d 6f 64 65 20 3d 20 47 41 49  ..    mode = GAI
d830: 41 5f 45 50 53 47 5f 4e 4f 4e 45 3b 0a 09 09 69  A_EPSG_NONE;...i
d840: 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 78  f (strcasecmp (x
d850: 6d 6f 64 65 2c 20 22 57 47 53 38 34 22 29 20 3d  mode, "WGS84") =
d860: 3d 20 30 0a 09 09 20 20 20 20 7c 7c 20 73 74 72  = 0...    || str
d870: 63 61 73 65 63 6d 70 20 28 78 6d 6f 64 65 2c 20  casecmp (xmode, 
d880: 22 57 47 53 38 34 5f 4f 4e 4c 59 22 29 20 3d 3d  "WGS84_ONLY") ==
d890: 20 30 29 0a 09 09 20 20 20 20 6d 6f 64 65 20 3d   0)...    mode =
d8a0: 20 47 41 49 41 5f 45 50 53 47 5f 57 47 53 38 34   GAIA_EPSG_WGS84
d8b0: 5f 4f 4e 4c 59 3b 0a 09 20 20 20 20 7d 0a 09 20  _ONLY;..    }.. 
d8c0: 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
d8d0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
d8e0: 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
d8f0: 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20  _INTEGER)..     
d900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 73   transaction = s
d910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
d920: 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 65   (argv[0]);..  e
d930: 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  lse..    {...spa
d940: 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20 20 20  tialite_e...    
d950: 28 22 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74  ("InitSpatialMet
d960: 61 44 61 74 61 28 29 20 65 72 72 6f 72 3a 20 61  aData() error: a
d970: 72 67 75 6d 65 6e 74 20 31 20 69 73 20 6e 6f 74  rgument 1 is not
d980: 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f   of the String o
d990: 72 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c 6e  r Integer type\n
d9a0: 22 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  ");...sqlite3_re
d9b0: 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
d9c0: 74 2c 20 30 29 3b 0a 09 09 72 65 74 75 72 6e 3b  t, 0);...return;
d9d0: 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
d9e0: 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
d9f0: 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  2).      {..  if
da00: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
da10: 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
da20: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
da30: 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69  )..    {...spati
da40: 61 6c 69 74 65 5f 65 0a 09 09 20 20 20 20 28 22  alite_e...    ("
da50: 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44  InitSpatialMetaD
da60: 61 74 61 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ata() error: arg
da70: 75 6d 65 6e 74 20 31 20 69 73 20 6e 6f 74 20 6f  ument 1 is not o
da80: 66 20 74 68 65 20 49 6e 74 65 67 65 72 20 74 79  f the Integer ty
da90: 70 65 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65  pe\n");...sqlite
daa0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
dab0: 6e 74 65 78 74 2c 20 30 29 3b 0a 09 09 72 65 74  ntext, 0);...ret
dac0: 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  urn;..    }..  i
dad0: 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
dae0: 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
daf0: 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
db00: 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c  .    {...spatial
db10: 69 74 65 5f 65 0a 09 09 20 20 20 20 28 22 49 6e  ite_e...    ("In
db20: 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74  itSpatialMetaDat
db30: 61 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d  a() error: argum
db40: 65 6e 74 20 32 20 69 73 20 6e 6f 74 20 6f 66 20  ent 2 is not of 
db50: 74 68 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c  the String type\
db60: 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  n");...sqlite3_r
db70: 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
db80: 78 74 2c 20 30 29 3b 0a 09 09 72 65 74 75 72 6e  xt, 0);...return
db90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 74 72 61 6e  ;..    }..  tran
dba0: 73 61 63 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  saction = sqlite
dbb0: 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
dbc0: 76 5b 30 5d 29 3b 0a 09 20 20 78 6d 6f 64 65 20  v[0]);..  xmode 
dbd0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
dbe0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
dbf0: 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  ext (argv[1]);..
dc00: 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
dc10: 20 28 78 6d 6f 64 65 2c 20 22 4e 4f 4e 45 22 29   (xmode, "NONE")
dc20: 20 3d 3d 20 30 0a 09 20 20 20 20 20 20 7c 7c 20   == 0..      || 
dc30: 73 74 72 63 61 73 65 63 6d 70 20 28 78 6d 6f 64  strcasecmp (xmod
dc40: 65 2c 20 22 45 4d 50 54 59 22 29 20 3d 3d 20 30  e, "EMPTY") == 0
dc50: 29 0a 09 20 20 20 20 20 20 6d 6f 64 65 20 3d 20  )..      mode = 
dc60: 47 41 49 41 5f 45 50 53 47 5f 4e 4f 4e 45 3b 0a  GAIA_EPSG_NONE;.
dc70: 09 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d  .  if (strcasecm
dc80: 70 20 28 78 6d 6f 64 65 2c 20 22 57 47 53 38 34  p (xmode, "WGS84
dc90: 22 29 20 3d 3d 20 30 0a 09 20 20 20 20 20 20 7c  ") == 0..      |
dca0: 7c 20 73 74 72 63 61 73 65 63 6d 70 20 28 78 6d  | strcasecmp (xm
dcb0: 6f 64 65 2c 20 22 57 47 53 38 34 5f 4f 4e 4c 59  ode, "WGS84_ONLY
dcc0: 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20  ") == 0)..      
dcd0: 6d 6f 64 65 20 3d 20 47 41 49 41 5f 45 50 53 47  mode = GAIA_EPSG
dce0: 5f 57 47 53 38 34 5f 4f 4e 4c 59 3b 0a 20 20 20  _WGS84_ONLY;.   
dcf0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 72     }..    if (tr
dd00: 61 6e 73 61 63 74 69 6f 6e 29 0a 20 20 20 20 20  ansaction).     
dd10: 20 7b 0a 09 20 20 2f 2a 20 73 74 61 72 74 69 6e   {..  /* startin
dd20: 67 20 61 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  g a Transaction 
dd30: 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69  */..  ret = sqli
dd40: 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65  te3_exec (sqlite
dd50: 2c 20 22 42 45 47 49 4e 22 2c 20 4e 55 4c 4c 2c  , "BEGIN", NULL,
dd60: 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b   NULL, &errMsg);
dd70: 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 53  ..  if (ret != S
dd80: 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 20  QLITE_OK)..     
dd90: 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20   goto error;.   
dda0: 20 20 20 7d 0a 0a 2f 2a 20 63 72 65 61 74 69 6e     }../* creatin
ddb0: 67 20 74 68 65 20 53 50 41 54 49 41 4c 5f 52 45  g the SPATIAL_RE
ddc0: 46 5f 53 59 53 20 74 61 62 6c 65 20 2a 2f 0a 20  F_SYS table */. 
ddd0: 20 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20     strcpy (sql, 
dde0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 70  "CREATE TABLE sp
ddf0: 61 74 69 61 6c 5f 72 65 66 5f 73 79 73 20 28 5c  atial_ref_sys (\
de00: 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20  n");.    strcat 
de10: 28 73 71 6c 2c 20 22 73 72 69 64 20 49 4e 54 45  (sql, "srid INTE
de20: 47 45 52 20 4e 4f 54 20 4e 55 4c 4c 20 50 52 49  GER NOT NULL PRI
de30: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 29 3b 0a 20  MARY KEY,\n");. 
de40: 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20     strcat (sql, 
de50: 22 61 75 74 68 5f 6e 61 6d 65 20 54 45 58 54 20  "auth_name TEXT 
de60: 4e 4f 54 20 4e 55 4c 4c 2c 5c 6e 22 29 3b 0a 20  NOT NULL,\n");. 
de70: 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20     strcat (sql, 
de80: 22 61 75 74 68 5f 73 72 69 64 20 49 4e 54 45 47  "auth_srid INTEG
de90: 45 52 20 4e 4f 54 20 4e 55 4c 4c 2c 5c 6e 22 29  ER NOT NULL,\n")
dea0: 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71  ;.    strcat (sq
deb0: 6c 2c 20 22 72 65 66 5f 73 79 73 5f 6e 61 6d 65  l, "ref_sys_name
dec0: 20 54 45 58 54 20 4e 4f 54 20 4e 55 4c 4c 20 44   TEXT NOT NULL D
ded0: 45 46 41 55 4c 54 20 27 55 6e 6b 6e 6f 77 6e 27  EFAULT 'Unknown'
dee0: 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61  ,\n");.    strca
def0: 74 20 28 73 71 6c 2c 20 22 70 72 6f 6a 34 74 65  t (sql, "proj4te
df00: 78 74 20 54 45 58 54 20 4e 4f 54 20 4e 55 4c 4c  xt TEXT NOT NULL
df10: 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61  ,\n");.    strca
df20: 74 20 28 73 71 6c 2c 20 22 73 72 74 65 78 74 20  t (sql, "srtext 
df30: 54 45 58 54 20 4e 4f 54 20 4e 55 4c 4c 20 44 45  TEXT NOT NULL DE
df40: 46 41 55 4c 54 20 27 55 6e 64 65 66 69 6e 65 64  FAULT 'Undefined
df50: 27 29 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ')");.    ret = 
df60: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
df70: 6c 69 74 65 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c  lite, sql, NULL,
df80: 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b   NULL, &errMsg);
df90: 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20  .    if (ret != 
dfa0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f  SQLITE_OK)..goto
dfb0: 20 65 72 72 6f 72 3b 0a 20 20 20 20 73 74 72 63   error;.    strc
dfc0: 70 79 20 28 73 71 6c 2c 20 22 43 52 45 41 54 45  py (sql, "CREATE
dfd0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69 64   UNIQUE INDEX id
dfe0: 78 5f 73 70 61 74 69 61 6c 5f 72 65 66 5f 73 79  x_spatial_ref_sy
dff0: 73 20 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63  s \n");.    strc
e000: 61 74 20 28 73 71 6c 2c 20 22 4f 4e 20 73 70 61  at (sql, "ON spa
e010: 74 69 61 6c 5f 72 65 66 5f 73 79 73 20 28 61 75  tial_ref_sys (au
e020: 74 68 5f 73 72 69 64 2c 20 61 75 74 68 5f 6e 61  th_srid, auth_na
e030: 6d 65 29 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  me)");.    ret =
e040: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73   sqlite3_exec (s
e050: 71 6c 69 74 65 2c 20 73 71 6c 2c 20 4e 55 4c 4c  qlite, sql, NULL
e060: 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29  , NULL, &errMsg)
e070: 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
e080: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74   SQLITE_OK)..got
e090: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 75 70 64  o error;.    upd
e0a0: 61 74 65 53 70 61 74 69 61 4c 69 74 65 48 69 73  ateSpatiaLiteHis
e0b0: 74 6f 72 79 20 28 73 71 6c 69 74 65 2c 20 22 73  tory (sqlite, "s
e0c0: 70 61 74 69 61 6c 5f 72 65 66 5f 73 79 73 22 2c  patial_ref_sys",
e0d0: 20 4e 55 4c 4c 2c 0a 09 09 09 20 20 20 20 20 22   NULL,....     "
e0e0: 74 61 62 6c 65 20 73 75 63 63 65 73 73 66 75 6c  table successful
e0f0: 6c 79 20 63 72 65 61 74 65 64 22 29 3b 0a 0a 2f  ly created");../
e100: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 47  * creating the G
e110: 45 4f 4d 45 54 52 59 5f 43 4f 4c 55 4d 4e 53 20  EOMETRY_COLUMNS 
e120: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 20  table */.    if 
e130: 28 21 63 72 65 61 74 65 47 65 6f 6d 65 74 72 79  (!createGeometry
e140: 43 6f 6c 75 6d 6e 73 20 28 73 71 6c 69 74 65 29  Columns (sqlite)
e150: 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 0a  )..goto error;..
e160: 2f 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  /* creating the 
e170: 47 45 4f 4d 5f 43 4f 4c 53 5f 52 45 46 5f 53 59  GEOM_COLS_REF_SY
e180: 53 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 73 74  S view */.    st
e190: 72 63 70 79 20 28 73 71 6c 2c 20 22 43 52 45 41  rcpy (sql, "CREA
e1a0: 54 45 20 56 49 45 57 20 67 65 6f 6d 5f 63 6f 6c  TE VIEW geom_col
e1b0: 73 5f 72 65 66 5f 73 79 73 20 41 53 5c 6e 22 29  s_ref_sys AS\n")
e1c0: 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71  ;.    strcat (sq
e1d0: 6c 2c 20 22 53 45 4c 45 43 54 20 66 5f 74 61 62  l, "SELECT f_tab
e1e0: 6c 65 5f 6e 61 6d 65 2c 20 66 5f 67 65 6f 6d 65  le_name, f_geome
e1f0: 74 72 79 5f 63 6f 6c 75 6d 6e 2c 20 67 65 6f 6d  try_column, geom
e200: 65 74 72 79 5f 74 79 70 65 2c 5c 6e 22 29 3b 0a  etry_type,\n");.
e210: 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c      strcat (sql,
e220: 20 22 63 6f 6f 72 64 5f 64 69 6d 65 6e 73 69 6f   "coord_dimensio
e230: 6e 2c 20 73 70 61 74 69 61 6c 5f 72 65 66 5f 73  n, spatial_ref_s
e240: 79 73 2e 73 72 69 64 20 41 53 20 73 72 69 64 2c  ys.srid AS srid,
e250: 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74  \n");.    strcat
e260: 20 28 73 71 6c 2c 20 22 61 75 74 68 5f 6e 61 6d   (sql, "auth_nam
e270: 65 2c 20 61 75 74 68 5f 73 72 69 64 2c 20 72 65  e, auth_srid, re
e280: 66 5f 73 79 73 5f 6e 61 6d 65 2c 20 70 72 6f 6a  f_sys_name, proj
e290: 34 74 65 78 74 2c 20 73 72 74 65 78 74 5c 6e 22  4text, srtext\n"
e2a0: 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73  );.    strcat (s
e2b0: 71 6c 2c 20 22 46 52 4f 4d 20 67 65 6f 6d 65 74  ql, "FROM geomet
e2c0: 72 79 5f 63 6f 6c 75 6d 6e 73 2c 20 73 70 61 74  ry_columns, spat
e2d0: 69 61 6c 5f 72 65 66 5f 73 79 73 5c 6e 22 29 3b  ial_ref_sys\n");
e2e0: 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c  .    strcat (sql
e2f0: 2c 20 22 57 48 45 52 45 20 67 65 6f 6d 65 74 72  , "WHERE geometr
e300: 79 5f 63 6f 6c 75 6d 6e 73 2e 73 72 69 64 20 3d  y_columns.srid =
e310: 20 73 70 61 74 69 61 6c 5f 72 65 66 5f 73 79 73   spatial_ref_sys
e320: 2e 73 72 69 64 22 29 3b 0a 20 20 20 20 72 65 74  .srid");.    ret
e330: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20   = sqlite3_exec 
e340: 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 4e 55  (sqlite, sql, NU
e350: 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73  LL, NULL, &errMs
e360: 67 29 3b 0a 20 20 20 20 75 70 64 61 74 65 53 70  g);.    updateSp
e370: 61 74 69 61 4c 69 74 65 48 69 73 74 6f 72 79 20  atiaLiteHistory 
e380: 28 73 71 6c 69 74 65 2c 20 22 67 65 6f 6d 5f 63  (sqlite, "geom_c
e390: 6f 6c 73 5f 72 65 66 5f 73 79 73 22 2c 20 4e 55  ols_ref_sys", NU
e3a0: 4c 4c 2c 0a 09 09 09 20 20 20 20 20 22 76 69 65  LL,....     "vie
e3b0: 77 20 27 67 65 6f 6d 5f 63 6f 6c 73 5f 72 65 66  w 'geom_cols_ref
e3c0: 5f 73 79 73 27 20 73 75 63 63 65 73 73 66 75 6c  _sys' successful
e3d0: 6c 79 20 63 72 65 61 74 65 64 22 29 3b 0a 20 20  ly created");.  
e3e0: 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
e3f0: 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72  ITE_OK)..goto er
e400: 72 6f 72 3b 0a 20 20 20 20 69 66 20 28 73 70 61  ror;.    if (spa
e410: 74 69 61 6c 5f 72 65 66 5f 73 79 73 5f 69 6e 69  tial_ref_sys_ini
e420: 74 32 20 28 73 71 6c 69 74 65 2c 20 6d 6f 64 65  t2 (sqlite, mode
e430: 2c 20 30 29 29 0a 20 20 20 20 20 20 7b 0a 09 20  , 0)).      {.. 
e440: 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 47 41 49   if (mode == GAI
e450: 41 5f 45 50 53 47 5f 4e 4f 4e 45 29 0a 09 20 20  A_EPSG_NONE)..  
e460: 20 20 20 20 75 70 64 61 74 65 53 70 61 74 69 61      updateSpatia
e470: 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c  LiteHistory (sql
e480: 69 74 65 2c 20 22 73 70 61 74 69 61 6c 5f 72 65  ite, "spatial_re
e490: 66 5f 73 79 73 22 2c 20 4e 55 4c 4c 2c 0a 09 09  f_sys", NULL,...
e4a0: 09 09 20 20 20 20 20 20 20 22 74 61 62 6c 65 20  ..       "table 
e4b0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72 65  successfully cre
e4c0: 61 74 65 64 20 5b 65 6d 70 74 79 5d 22 29 3b 0a  ated [empty]");.
e4d0: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 75  .  else..      u
e4e0: 70 64 61 74 65 53 70 61 74 69 61 4c 69 74 65 48  pdateSpatiaLiteH
e4f0: 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c 20  istory (sqlite, 
e500: 22 73 70 61 74 69 61 6c 5f 72 65 66 5f 73 79 73  "spatial_ref_sys
e510: 22 2c 20 4e 55 4c 4c 2c 0a 09 09 09 09 20 20 20  ", NULL,.....   
e520: 20 20 20 20 22 74 61 62 6c 65 20 73 75 63 63 65      "table succe
e530: 73 73 66 75 6c 6c 79 20 70 6f 70 75 6c 61 74 65  ssfully populate
e540: 64 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d");.      }.   
e550: 20 69 66 20 28 21 63 72 65 61 74 65 41 64 76 61   if (!createAdva
e560: 6e 63 65 64 4d 65 74 61 44 61 74 61 20 28 73 71  ncedMetaData (sq
e570: 6c 69 74 65 29 29 0a 09 67 6f 74 6f 20 65 72 72  lite))..goto err
e580: 6f 72 3b 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20  or;./* creating 
e590: 74 68 65 20 53 70 61 74 69 61 6c 49 6e 64 65 78  the SpatialIndex
e5a0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2a   VIRTUAL TABLE *
e5b0: 2f 0a 20 20 20 20 73 74 72 63 70 79 20 28 73 71  /.    strcpy (sq
e5c0: 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52 54 55  l, "CREATE VIRTU
e5d0: 41 4c 20 54 41 42 4c 45 20 53 70 61 74 69 61 6c  AL TABLE Spatial
e5e0: 49 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 73 74  Index ");.    st
e5f0: 72 63 61 74 20 28 73 71 6c 2c 20 22 55 53 49 4e  rcat (sql, "USIN
e600: 47 20 56 69 72 74 75 61 6c 53 70 61 74 69 61 6c  G VirtualSpatial
e610: 49 6e 64 65 78 28 29 22 29 3b 0a 20 20 20 20 72  Index()");.    r
e620: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
e630: 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20  c (sqlite, sql, 
e640: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
e650: 4d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 72 65  Msg);.    if (re
e660: 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
e670: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 2f 2a 20  .goto error;./* 
e680: 63 72 65 61 74 69 6e 67 20 74 68 65 20 45 6c 65  creating the Ele
e690: 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65  mentaryGeometrie
e6a0: 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
e6b0: 2a 2f 0a 20 20 20 20 73 74 72 63 70 79 20 28 73  */.    strcpy (s
e6c0: 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  ql, "CREATE VIRT
e6d0: 55 41 4c 20 54 41 42 4c 45 20 45 6c 65 6d 65 6e  UAL TABLE Elemen
e6e0: 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73 20 22  taryGeometries "
e6f0: 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28 73  );.    strcat (s
e700: 71 6c 2c 20 22 55 53 49 4e 47 20 56 69 72 74 75  ql, "USING Virtu
e710: 61 6c 45 6c 65 6d 65 6e 74 61 72 79 28 29 22 29  alElementary()")
e720: 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69  ;.    ret = sqli
e730: 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65  te3_exec (sqlite
e740: 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  , sql, NULL, NUL
e750: 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20  L, &errMsg);.   
e760: 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49   if (ret != SQLI
e770: 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72  TE_OK)..goto err
e780: 6f 72 3b 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49  or;..#ifndef OMI
e790: 54 5f 4b 4e 4e 09 09 2f 2a 20 6f 6e 6c 79 20 69  T_KNN../* only i
e7a0: 66 20 4b 4e 4e 20 69 73 20 65 6e 61 62 6c 65 64  f KNN is enabled
e7b0: 20 2a 2f 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20   */./* creating 
e7c0: 74 68 65 20 4b 4e 4e 20 56 49 52 54 55 41 4c 20  the KNN VIRTUAL 
e7d0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 73 74 72  TABLE */.    str
e7e0: 63 70 79 20 28 73 71 6c 2c 20 22 43 52 45 41 54  cpy (sql, "CREAT
e7f0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
e800: 4b 4e 4e 20 22 29 3b 0a 20 20 20 20 73 74 72 63  KNN ");.    strc
e810: 61 74 20 28 73 71 6c 2c 20 22 55 53 49 4e 47 20  at (sql, "USING 
e820: 56 69 72 74 75 61 6c 4b 4e 4e 28 29 22 29 3b 0a  VirtualKNN()");.
e830: 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
e840: 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20  3_exec (sqlite, 
e850: 73 71 6c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  sql, NULL, NULL,
e860: 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 69   &errMsg);.    i
e870: 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
e880: 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72  _OK)..goto error
e890: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ;.#endif /* end 
e8a0: 4b 4e 4e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  KNN conditional 
e8b0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 74 72 61 6e  */..    if (tran
e8c0: 73 61 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 7b  saction).      {
e8d0: 0a 09 20 20 2f 2a 20 63 6f 6e 66 69 72 6d 69 6e  ..  /* confirmin
e8e0: 67 20 74 68 65 20 73 74 69 6c 6c 20 70 65 6e 64  g the still pend
e8f0: 69 6e 67 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ing Transaction 
e900: 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69  */..  ret = sqli
e910: 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65  te3_exec (sqlite
e920: 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 4e 55 4c 4c  , "COMMIT", NULL
e930: 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29  , NULL, &errMsg)
e940: 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20  ;..  if (ret != 
e950: 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20  SQLITE_OK)..    
e960: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20    goto error;.  
e970: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
e980: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
e990: 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  ontext, 1);.    
e9a0: 72 65 74 75 72 6e 3b 0a 20 20 65 72 72 6f 72 3a  return;.  error:
e9b0: 0a 20 20 20 20 73 70 61 74 69 61 6c 69 74 65 5f  .    spatialite_
e9c0: 65 20 28 22 49 6e 69 74 53 70 61 74 69 61 4d 65  e ("InitSpatiaMe
e9d0: 74 61 44 61 74 61 28 29 20 65 72 72 6f 72 3a 5c  taData() error:\
e9e0: 22 25 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67  "%s\"\n", errMsg
e9f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ea00: 72 65 65 20 28 65 72 72 4d 73 67 29 3b 0a 20 20  ree (errMsg);.  
ea10: 20 20 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f    if (transactio
ea20: 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  n).      {..  /*
ea30: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 52 6f   performing a Ro
ea40: 6c 6c 62 61 63 6b 20 2a 2f 0a 09 20 20 72 65 74  llback */..  ret
ea50: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20   = sqlite3_exec 
ea60: 28 73 71 6c 69 74 65 2c 20 22 52 4f 4c 4c 42 41  (sqlite, "ROLLBA
ea70: 43 4b 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  CK", NULL, NULL,
ea80: 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20 69 66   &errMsg);..  if
ea90: 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
eaa0: 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  OK)..    {...spa
eab0: 74 69 61 6c 69 74 65 5f 65 20 28 22 20 49 6e 69  tialite_e (" Ini
eac0: 74 53 70 61 74 69 61 4d 65 74 61 44 61 74 61 28  tSpatiaMetaData(
ead0: 29 20 65 72 72 6f 72 3a 5c 22 25 73 5c 22 5c 6e  ) error:\"%s\"\n
eae0: 22 2c 20 65 72 72 4d 73 67 29 3b 0a 09 09 73 71  ", errMsg);...sq
eaf0: 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72 72 4d  lite3_free (errM
eb00: 73 67 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  sg);..    }.    
eb10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
eb20: 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
eb30: 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ext, 0);.    ret
eb40: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  urn;.}..static i
eb50: 6e 74 0a 64 6f 5f 65 78 65 63 75 74 65 5f 73 71  nt.do_execute_sq
eb60: 6c 5f 77 69 74 68 5f 72 65 74 76 61 6c 20 28 73  l_with_retval (s
eb70: 71 6c 69 74 65 33 20 2a 20 73 71 6c 69 74 65 2c  qlite3 * sqlite,
eb80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
eb90: 2c 20 63 68 61 72 20 2a 2a 65 72 72 4d 73 67 29  , char **errMsg)
eba0: 0a 7b 0a 2f 2a 20 68 65 6c 70 65 72 20 66 75 6e  .{./* helper fun
ebb0: 63 74 69 6f 6e 20 66 6f 72 20 49 6e 69 74 53 70  ction for InitSp
ebc0: 61 74 69 61 6c 4d 65 74 61 44 61 74 61 46 75 6c  atialMetaDataFul
ebd0: 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74  l */.    int ret
ebe0: 76 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  val = 0;.    int
ebf0: 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b   ret;.    int i;
ec00: 0a 20 20 20 20 63 68 61 72 20 2a 2a 72 65 73 75  .    char **resu
ec10: 6c 74 73 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77  lts;.    int row
ec20: 73 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6c 75 6d  s;.    int colum
ec30: 6e 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 73  ns;.    char *ms
ec40: 67 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 72  g = NULL;..    r
ec50: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  et = sqlite3_get
ec60: 5f 74 61 62 6c 65 20 28 73 71 6c 69 74 65 2c 20  _table (sqlite, 
ec70: 73 71 6c 2c 20 26 72 65 73 75 6c 74 73 2c 20 26  sql, &results, &
ec80: 72 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c 20  rows, &columns, 
ec90: 26 6d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 72  &msg);.    if (r
eca0: 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  et != SQLITE_OK)
ecb0: 0a 09 67 6f 74 6f 20 65 6e 64 3b 0a 20 20 20 20  ..goto end;.    
ecc0: 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09 3b  if (rows < 1)..;
ecd0: 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
ece0: 7b 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 31 3b  {..  for (i = 1;
ecf0: 20 69 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b 29   i <= rows; i++)
ed00: 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 61 74  ..    {...if (at
ed10: 6f 69 20 28 72 65 73 75 6c 74 73 5b 28 69 20 2a  oi (results[(i *
ed20: 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 29 20   columns) + 0]) 
ed30: 3d 3d 20 31 29 0a 09 09 20 20 20 20 72 65 74 76  == 1)...    retv
ed40: 61 6c 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 20  al = 1;..    }. 
ed50: 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
ed60: 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20 28 72  e3_free_table (r
ed70: 65 73 75 6c 74 73 29 3b 0a 0a 20 20 65 6e 64 3a  esults);..  end:
ed80: 0a 20 20 20 20 2a 65 72 72 4d 73 67 20 3d 20 6d  .    *errMsg = m
ed90: 73 67 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  sg;.    return r
eda0: 65 74 76 61 6c 3b 0a 7d 0a 0a 73 74 61 74 69 63  etval;.}..static
edb0: 20 76 6f 69 64 0a 66 6e 63 74 5f 49 6e 69 74 53   void.fnct_InitS
edc0: 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 46 75  patialMetaDataFu
edd0: 6c 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ll (sqlite3_cont
ede0: 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
edf0: 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20  nt argc,....    
ee00: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
ee10: 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
ee20: 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 6e  L function:./ In
ee30: 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74  itSpatialMetaDat
ee40: 61 46 75 6c 6c 28 29 0a 2f 20 20 20 20 20 6f 72  aFull()./     or
ee50: 0a 2f 20 49 6e 69 74 53 70 61 74 69 61 6c 4d 65  ./ InitSpatialMe
ee60: 74 61 44 61 74 61 46 75 6c 6c 28 74 65 78 74 20  taDataFull(text 
ee70: 6d 6f 64 65 29 0a 2f 20 20 20 20 20 6f 72 0a 2f  mode)./     or./
ee80: 20 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61   InitSpatialMeta
ee90: 44 61 74 61 46 75 6c 6c 28 69 6e 74 65 67 65 72  DataFull(integer
eea0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 2f 20   transaction)./ 
eeb0: 20 20 20 20 6f 72 0a 2f 20 49 6e 69 74 53 70 61      or./ InitSpa
eec0: 74 69 61 6c 4d 65 74 61 44 61 74 61 46 75 6c 6c  tialMetaDataFull
eed0: 28 69 6e 74 65 67 65 72 20 74 72 61 6e 73 61 63  (integer transac
eee0: 74 69 6f 6e 2c 20 74 65 78 74 20 6d 6f 64 65 29  tion, text mode)
eef0: 0a 2f 0a 2f 20 63 6f 6e 76 65 6e 69 65 6e 63 79  ././ conveniency
ef00: 20 22 73 75 70 65 72 22 20 66 75 6e 63 74 69 6f   "super" functio
ef10: 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 61 6c  n internally cal
ef20: 6c 69 6e 67 20 69 6e 20 61 20 73 69 6e 67 6c 65  ling in a single
ef30: 20 73 68 6f 74 3a 0a 2f 20 20 20 20 20 2d 20 49   shot:./     - I
ef40: 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61  nitSpatialMetaDa
ef50: 74 61 28 29 0a 2f 20 20 20 20 20 2d 20 43 72 65  ta()./     - Cre
ef60: 61 74 65 52 61 73 74 65 72 43 6f 76 65 72 61 67  ateRasterCoverag
ef70: 65 73 54 61 62 6c 65 28 29 0a 2f 20 20 20 20 20  esTable()./     
ef80: 2d 20 43 72 65 61 74 65 56 65 63 74 6f 72 43 6f  - CreateVectorCo
ef90: 76 65 72 61 67 65 73 54 61 62 6c 65 73 28 29 0a  veragesTables().
efa0: 2f 20 20 20 20 20 2d 20 43 72 65 61 74 65 53 74  /     - CreateSt
efb0: 79 6c 69 6e 67 54 61 62 6c 65 73 28 29 0a 2f 20  ylingTables()./ 
efc0: 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
efd0: 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
efe0: 75 72 65 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20  ure.*/.    char 
eff0: 2a 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a  *errMsg = NULL;.
f000: 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
f010: 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e   int transaction
f020: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
f030: 63 68 61 72 20 2a 78 6d 6f 64 65 20 3d 20 4e 55  char *xmode = NU
f040: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 76  LL;.    int retv
f050: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71  al;.    char *sq
f060: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  l;.    sqlite3 *
f070: 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
f080: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
f090: 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
f0a0: 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
f0b0: 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
f0c0: 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
f0d0: 61 72 67 63 20 3d 3d 20 31 29 0a 20 20 20 20 20  argc == 1).     
f0e0: 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
f0f0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f100: 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
f110: 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09  _TEXT)..    {...
f120: 78 6d 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20 63  xmode = (const c
f130: 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
f140: 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
f150: 30 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  0]);..    }..  e
f160: 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
f170: 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
f180: 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [0]) == SQLITE_I
f190: 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 74  NTEGER)..      t
f1a0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 73 71 6c  ransaction = sql
f1b0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
f1c0: 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 65 6c 73  argv[0]);..  els
f1d0: 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69  e..    {...spati
f1e0: 61 6c 69 74 65 5f 65 0a 09 09 20 20 20 20 28 22  alite_e...    ("
f1f0: 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44  InitSpatialMetaD
f200: 61 74 61 46 75 6c 6c 28 29 20 65 72 72 6f 72 3a  ataFull() error:
f210: 20 61 72 67 75 6d 65 6e 74 20 31 20 69 73 20 6e   argument 1 is n
f220: 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67  ot of the String
f230: 20 6f 72 20 49 6e 74 65 67 65 72 20 74 79 70 65   or Integer type
f240: 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  \n");...sqlite3_
f250: 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f260: 65 78 74 2c 20 30 29 3b 0a 09 09 72 65 74 75 72  ext, 0);...retur
f270: 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
f280: 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
f290: 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 2).      {..  
f2a0: 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
f2b0: 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
f2c0: 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
f2d0: 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  ER)..    {...spa
f2e0: 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20 20 20  tialite_e...    
f2f0: 28 22 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74  ("InitSpatialMet
f300: 61 44 61 74 61 46 75 6c 6c 28 29 20 65 72 72 6f  aDataFull() erro
f310: 72 3a 20 61 72 67 75 6d 65 6e 74 20 31 20 69 73  r: argument 1 is
f320: 20 6e 6f 74 20 6f 66 20 74 68 65 20 49 6e 74 65   not of the Inte
f330: 67 65 72 20 74 79 70 65 5c 6e 22 29 3b 0a 09 09  ger type\n");...
f340: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f350: 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
f360: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
f370: 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  }..  if (sqlite3
f380: 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f390: 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
f3a0: 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
f3b0: 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20  patialite_e...  
f3c0: 20 20 28 22 49 6e 69 74 53 70 61 74 69 61 6c 4d    ("InitSpatialM
f3d0: 65 74 61 44 61 74 61 46 75 6c 6c 28 29 20 65 72  etaDataFull() er
f3e0: 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 32 20  ror: argument 2 
f3f0: 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
f400: 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09  ring type\n");..
f410: 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
f420: 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
f430: 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
f440: 20 7d 0a 09 20 20 74 72 61 6e 73 61 63 74 69 6f   }..  transactio
f450: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
f460: 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
f470: 0a 09 20 20 78 6d 6f 64 65 20 3d 20 28 63 6f 6e  ..  xmode = (con
f480: 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
f490: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
f4a0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[1]);.      }
f4b0: 0a 0a 20 20 20 20 69 66 20 28 74 72 61 6e 73 61  ..    if (transa
f4c0: 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 7b 0a 09  ction).      {..
f4d0: 20 20 2f 2a 20 73 74 61 72 74 69 6e 67 20 61 20    /* starting a 
f4e0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
f4f0: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
f500: 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 42  exec (sqlite, "B
f510: 45 47 49 4e 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  EGIN", NULL, NUL
f520: 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20  L, &errMsg);..  
f530: 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
f540: 45 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74  E_OK)..      got
f550: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o error;.      }
f560: 0a 0a 2f 2a 20 65 78 65 63 75 74 69 6e 67 20 49  ../* executing I
f570: 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61  nitSpatialMetaDa
f580: 74 61 28 29 20 2a 2f 0a 20 20 20 20 69 66 20 28  ta() */.    if (
f590: 78 6d 6f 64 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  xmode != NULL)..
f5a0: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sql = sqlite3_mp
f5b0: 72 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20 49  rintf ("SELECT I
f5c0: 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61  nitSpatialMetaDa
f5d0: 74 61 28 25 51 29 22 2c 20 78 6d 6f 64 65 29 3b  ta(%Q)", xmode);
f5e0: 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 20 3d  .    else..sql =
f5f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f600: 20 28 22 53 45 4c 45 43 54 20 49 6e 69 74 53 70   ("SELECT InitSp
f610: 61 74 69 61 6c 4d 65 74 61 44 61 74 61 28 29 22  atialMetaData()"
f620: 29 3b 0a 20 20 20 20 72 65 74 76 61 6c 20 3d 20  );.    retval = 
f630: 64 6f 5f 65 78 65 63 75 74 65 5f 73 71 6c 5f 77  do_execute_sql_w
f640: 69 74 68 5f 72 65 74 76 61 6c 20 28 73 71 6c 69  ith_retval (sqli
f650: 74 65 2c 20 73 71 6c 2c 20 26 65 72 72 4d 73 67  te, sql, &errMsg
f660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f670: 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20 20 69  ree (sql);.    i
f680: 66 20 28 72 65 74 76 61 6c 20 21 3d 20 31 29 0a  f (retval != 1).
f690: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 0a 2f 2a  .goto error;../*
f6a0: 20 65 78 65 63 75 74 69 6e 67 20 43 72 65 61 74   executing Creat
f6b0: 65 52 61 73 74 65 72 43 6f 76 65 72 61 67 65 73  eRasterCoverages
f6c0: 54 61 62 6c 65 28 29 20 2a 2f 0a 20 20 20 20 73  Table() */.    s
f6d0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
f6e0: 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20 43 72  intf ("SELECT Cr
f6f0: 65 61 74 65 52 61 73 74 65 72 43 6f 76 65 72 61  eateRasterCovera
f700: 67 65 73 54 61 62 6c 65 28 29 22 29 3b 0a 20 20  gesTable()");.  
f710: 20 20 72 65 74 76 61 6c 20 3d 20 64 6f 5f 65 78    retval = do_ex
f720: 65 63 75 74 65 5f 73 71 6c 5f 77 69 74 68 5f 72  ecute_sql_with_r
f730: 65 74 76 61 6c 20 28 73 71 6c 69 74 65 2c 20 73  etval (sqlite, s
f740: 71 6c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20  ql, &errMsg);.  
f750: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
f760: 73 71 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 65  sql);.    if (re
f770: 74 76 61 6c 20 21 3d 20 31 29 0a 09 67 6f 74 6f  tval != 1)..goto
f780: 20 65 72 72 6f 72 3b 0a 0a 2f 2a 20 65 78 65 63   error;../* exec
f790: 75 74 69 6e 67 20 43 72 65 61 74 65 56 65 63 74  uting CreateVect
f7a0: 6f 72 43 6f 76 65 72 61 67 65 73 54 61 62 6c 65  orCoveragesTable
f7b0: 73 28 29 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d  s() */.    sql =
f7c0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f7d0: 20 28 22 53 45 4c 45 43 54 20 43 72 65 61 74 65   ("SELECT Create
f7e0: 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 73 54  VectorCoveragesT
f7f0: 61 62 6c 65 73 28 29 22 29 3b 0a 20 20 20 20 72  ables()");.    r
f800: 65 74 76 61 6c 20 3d 20 64 6f 5f 65 78 65 63 75  etval = do_execu
f810: 74 65 5f 73 71 6c 5f 77 69 74 68 5f 72 65 74 76  te_sql_with_retv
f820: 61 6c 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c  al (sqlite, sql,
f830: 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   &errMsg);.    s
f840: 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c  qlite3_free (sql
f850: 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 76 61  );.    if (retva
f860: 6c 20 21 3d 20 31 29 0a 09 67 6f 74 6f 20 65 72  l != 1)..goto er
f870: 72 6f 72 3b 0a 0a 2f 2a 20 65 78 65 63 75 74 69  ror;../* executi
f880: 6e 67 20 43 72 65 61 74 65 53 74 79 6c 69 6e 67  ng CreateStyling
f890: 54 61 62 6c 65 73 28 29 20 2a 2f 0a 20 20 20 20  Tables() */.    
f8a0: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sql = sqlite3_mp
f8b0: 72 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20 43  rintf ("SELECT C
f8c0: 72 65 61 74 65 53 74 79 6c 69 6e 67 54 61 62 6c  reateStylingTabl
f8d0: 65 73 28 29 22 29 3b 0a 20 20 20 20 72 65 74 76  es()");.    retv
f8e0: 61 6c 20 3d 20 64 6f 5f 65 78 65 63 75 74 65 5f  al = do_execute_
f8f0: 73 71 6c 5f 77 69 74 68 5f 72 65 74 76 61 6c 20  sql_with_retval 
f900: 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 26 65  (sqlite, sql, &e
f910: 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
f920: 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a  te3_free (sql);.
f930: 20 20 20 20 69 66 20 28 72 65 74 76 61 6c 20 21      if (retval !
f940: 3d 20 31 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72  = 1)..goto error
f950: 3b 0a 0a 2f 2a 20 65 78 65 63 75 74 69 6e 67 20  ;../* executing 
f960: 53 74 6f 72 65 64 50 72 6f 63 5f 43 72 65 61 74  StoredProc_Creat
f970: 65 54 61 62 6c 65 73 28 29 20 2a 2f 0a 20 20 20  eTables() */.   
f980: 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d   sql = sqlite3_m
f990: 70 72 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20  printf ("SELECT 
f9a0: 53 74 6f 72 65 64 50 72 6f 63 5f 43 72 65 61 74  StoredProc_Creat
f9b0: 65 54 61 62 6c 65 73 28 29 22 29 3b 0a 20 20 20  eTables()");.   
f9c0: 20 72 65 74 76 61 6c 20 3d 20 64 6f 5f 65 78 65   retval = do_exe
f9d0: 63 75 74 65 5f 73 71 6c 5f 77 69 74 68 5f 72 65  cute_sql_with_re
f9e0: 74 76 61 6c 20 28 73 71 6c 69 74 65 2c 20 73 71  tval (sqlite, sq
f9f0: 6c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20  l, &errMsg);.   
fa00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73   sqlite3_free (s
fa10: 71 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74  ql);.    if (ret
fa20: 76 61 6c 20 21 3d 20 31 29 0a 09 67 6f 74 6f 20  val != 1)..goto 
fa30: 65 72 72 6f 72 3b 0a 0a 20 20 20 20 69 66 20 28  error;..    if (
fa40: 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 20 20 20  transaction).   
fa50: 20 20 20 7b 0a 09 20 20 2f 2a 20 63 6f 6e 66 69     {..  /* confi
fa60: 72 6d 69 6e 67 20 74 68 65 20 73 74 69 6c 6c 20  rming the still 
fa70: 70 65 6e 64 69 6e 67 20 54 72 61 6e 73 61 63 74  pending Transact
fa80: 69 6f 6e 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20  ion */..  ret = 
fa90: 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
faa0: 6c 69 74 65 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  lite, "COMMIT", 
fab0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
fac0: 4d 73 67 29 3b 0a 09 20 20 69 66 20 28 72 65 74  Msg);..  if (ret
fad0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
fae0: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
faf0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 73  ;.      }..    s
fb00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
fb10: 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
fb20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 65 72      return;.  er
fb30: 72 6f 72 3a 0a 20 20 20 20 73 70 61 74 69 61 6c  ror:.    spatial
fb40: 69 74 65 5f 65 20 28 22 49 6e 69 74 53 70 61 74  ite_e ("InitSpat
fb50: 69 61 4d 65 74 61 44 61 74 61 46 75 6c 6c 28 29  iaMetaDataFull()
fb60: 20 65 72 72 6f 72 3a 5c 22 25 73 5c 22 5c 6e 22   error:\"%s\"\n"
fb70: 2c 20 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73  , errMsg);.    s
fb80: 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72 72  qlite3_free (err
fb90: 4d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 74 72  Msg);.    if (tr
fba0: 61 6e 73 61 63 74 69 6f 6e 29 0a 20 20 20 20 20  ansaction).     
fbb0: 20 7b 0a 09 20 20 2f 2a 20 70 65 72 66 6f 72 6d   {..  /* perform
fbc0: 69 6e 67 20 61 20 52 6f 6c 6c 62 61 63 6b 20 2a  ing a Rollback *
fbd0: 2f 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74  /..  ret = sqlit
fbe0: 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c  e3_exec (sqlite,
fbf0: 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 4e 55 4c   "ROLLBACK", NUL
fc00: 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67  L, NULL, &errMsg
fc10: 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d  );..  if (ret !=
fc20: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20   SQLITE_OK)..   
fc30: 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f   {...spatialite_
fc40: 65 20 28 22 20 49 6e 69 74 53 70 61 74 69 61 4d  e (" InitSpatiaM
fc50: 65 74 61 44 61 74 61 46 75 6c 6c 28 29 20 65 72  etaDataFull() er
fc60: 72 6f 72 3a 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09  ror:\"%s\"\n",..
fc70: 09 09 20 20 20 20 20 20 65 72 72 4d 73 67 29 3b  ..      errMsg);
fc80: 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20  ...sqlite3_free 
fc90: 28 65 72 72 4d 73 67 29 3b 0a 09 20 20 20 20 7d  (errMsg);..    }
fca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  .      }.    sql
fcb0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
fcc0: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
fcd0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61    return;.}..sta
fce0: 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 6c  tic void.fnct_Cl
fcf0: 6f 6e 65 54 61 62 6c 65 20 28 73 71 6c 69 74 65  oneTable (sqlite
fd00: 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
fd10: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
fd20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
fd30: 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
fd40: 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 6c 6f 6e 65  unction:./ Clone
fd50: 54 61 62 6c 65 28 74 65 78 74 20 64 62 5f 70 72  Table(text db_pr
fd60: 65 66 69 78 2c 20 74 65 78 74 20 69 6e 5f 74 61  efix, text in_ta
fd70: 62 6c 65 2c 20 74 65 78 74 20 6f 75 74 5f 74 61  ble, text out_ta
fd80: 62 6c 65 2c 20 69 6e 74 65 67 65 72 20 74 72 61  ble, integer tra
fd90: 6e 73 61 63 74 69 6f 6e 29 0a 2f 20 43 6c 6f 6e  nsaction)./ Clon
fda0: 65 54 61 62 6c 65 28 74 65 78 74 20 64 62 5f 70  eTable(text db_p
fdb0: 72 65 66 69 78 2c 20 74 65 78 74 20 69 6e 5f 74  refix, text in_t
fdc0: 61 62 6c 65 2c 20 74 65 78 74 20 6f 75 74 5f 74  able, text out_t
fdd0: 61 62 6c 65 2c 20 69 6e 74 65 67 65 72 20 74 72  able, integer tr
fde0: 61 6e 73 61 63 74 69 6f 6e 2c 0a 2f 20 20 20 20  ansaction,./    
fdf0: 20 20 20 20 20 20 20 20 2e 2e 2e 20 74 65 78 74          ... text
fe00: 20 6f 70 74 69 6f 6e 31 20 2e 2e 2e 2c 20 2e 2e   option1 ..., ..
fe10: 2e 20 74 65 78 74 20 6f 70 74 69 6f 6e 32 20 2e  . text option2 .
fe20: 2e 2e 2c 20 74 65 78 74 20 6f 70 74 69 6f 6e 31  .., text option1
fe30: 30 29 0a 2f 0a 2f 20 63 6c 6f 6e 69 6e 67 20 61  0)././ cloning a
fe40: 20 77 68 6f 6c 65 20 74 61 62 6c 65 20 5b 43 52   whole table [CR
fe50: 45 41 54 45 20 61 6e 64 20 74 68 65 6e 20 43 4f  EATE and then CO
fe60: 50 59 5d 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  PY]./ returns 1 
fe70: 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
fe80: 6e 20 66 61 69 6c 75 72 65 20 28 4e 55 4c 4c 20  n failure (NULL 
fe90: 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
fea0: 65 6e 74 73 29 0a 2a 2f 0a 20 20 20 20 69 6e 74  ents).*/.    int
feb0: 20 72 65 74 3b 0a 20 20 20 20 63 68 61 72 20 2a   ret;.    char *
fec0: 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  errMsg = NULL;. 
fed0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64     const char *d
fee0: 62 5f 70 72 65 66 69 78 3b 0a 20 20 20 20 63 6f  b_prefix;.    co
fef0: 6e 73 74 20 63 68 61 72 20 2a 69 6e 5f 74 61 62  nst char *in_tab
ff00: 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
ff10: 61 72 20 2a 6f 75 74 5f 74 61 62 6c 65 3b 0a 20  ar *out_table;. 
ff20: 20 20 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69     int transacti
ff30: 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  on = 0;.    int 
ff40: 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  active = 0;.    
ff50: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 63 6c 6f 6e  const void *clon
ff60: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73  er = NULL;.    s
ff70: 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
ff80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
ff90: 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
ffa0: 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
ffb0: 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
ffc0: 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
ffd0: 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
ffe0: 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
fff0: 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e  [0]) == SQLITE_N
10000 55 4c 4c 29 0a 09 64 62 5f 70 72 65 66 69 78 20  ULL)..db_prefix 
10010 3d 20 22 4d 41 49 4e 22 3b 0a 20 20 20 20 65 6c  = "MAIN";.    el
10020 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
10030 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10040 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45  0]) == SQLITE_TE
10050 58 54 29 0a 09 64 62 5f 70 72 65 66 69 78 20 3d  XT)..db_prefix =
10060 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
10070 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
10080 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
10090 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
100a0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
100b0 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61 62        ("CloneTab
100c0 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  le() error: argu
100d0 6d 65 6e 74 20 31 20 69 73 20 6e 6f 74 20 6f 66  ment 1 is not of
100e0 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72 20 54   the String or T
100f0 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  EXT type\n");.. 
10100 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10110 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
10120 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
10130 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
10140 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10150 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
10160 45 5f 54 45 58 54 29 0a 09 69 6e 5f 74 61 62 6c  E_TEXT)..in_tabl
10170 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
10180 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
10190 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
101a0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
101b0 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
101c0 65 0a 09 20 20 20 20 20 20 28 22 43 6c 6f 6e 65  e..      ("Clone
101d0 54 61 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61  Table() error: a
101e0 72 67 75 6d 65 6e 74 20 32 20 69 73 20 6e 6f 74  rgument 2 is not
101f0 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f   of the String o
10200 72 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b  r TEXT type\n");
10210 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
10220 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10230 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
10240 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
10250 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10260 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
10270 4c 49 54 45 5f 54 45 58 54 29 0a 09 6f 75 74 5f  LITE_TEXT)..out_
10280 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  table = (const c
10290 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
102a0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
102b0 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  2]);.    else.  
102c0 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
102d0 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43  ite_e..      ("C
102e0 6c 6f 6e 65 54 61 62 6c 65 28 29 20 65 72 72 6f  loneTable() erro
102f0 72 3a 20 61 72 67 75 6d 65 6e 74 20 33 20 69 73  r: argument 3 is
10300 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69   not of the Stri
10310 6e 67 20 6f 72 20 54 45 58 54 20 74 79 70 65 5c  ng or TEXT type\
10320 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  n");..  sqlite3_
10330 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10340 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
10350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
10360 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10370 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d  type (argv[3]) =
10380 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
10390 29 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d  )..transaction =
103a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
103b0 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20  nt (argv[3]);.  
103c0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
103d0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
103e0 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61 62        ("CloneTab
103f0 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  le() error: argu
10400 6d 65 6e 74 20 34 20 69 73 20 6e 6f 74 20 6f 66  ment 4 is not of
10410 20 74 68 65 20 49 6e 74 65 67 65 72 20 74 79 70   the Integer typ
10420 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65  e\n");..  sqlite
10430 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
10440 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
10450 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  rn;.      }../* 
10460 61 64 64 69 74 69 6f 6e 61 6c 20 6f 70 74 69 6f  additional optio
10470 6e 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72  ns */.    if (ar
10480 67 63 20 3e 20 34 20 26 26 20 73 71 6c 69 74 65  gc > 4 && sqlite
10490 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
104a0 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[4]) != SQLITE
104b0 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
104c0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
104d0 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61 62        ("CloneTab
104e0 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  le() error: argu
104f0 6d 65 6e 74 20 35 20 69 73 20 6e 6f 74 20 6f 66  ment 5 is not of
10500 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72 20 54   the String or T
10510 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  EXT type\n");.. 
10520 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10530 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
10540 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
10550 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
10560 3e 20 35 20 26 26 20 73 71 6c 69 74 65 33 5f 76  > 5 && sqlite3_v
10570 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10580 35 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  5]) != SQLITE_TE
10590 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
105a0 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
105b0 20 20 20 28 22 43 6c 6f 6e 65 54 61 62 6c 65 28     ("CloneTable(
105c0 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
105d0 74 20 36 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  t 6 is not of th
105e0 65 20 53 74 72 69 6e 67 20 6f 72 20 54 45 58 54  e String or TEXT
105f0 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71   type\n");..  sq
10600 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10610 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
10620 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
10630 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 36      if (argc > 6
10640 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
10650 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29  e_type (argv[6])
10660 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
10670 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
10680 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
10690 28 22 43 6c 6f 6e 65 54 61 62 6c 65 28 29 20 65  ("CloneTable() e
106a0 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 37  rror: argument 7
106b0 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53   is not of the S
106c0 74 72 69 6e 67 20 6f 72 20 54 45 58 54 20 74 79  tring or TEXT ty
106d0 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74  pe\n");..  sqlit
106e0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
106f0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
10700 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
10710 20 69 66 20 28 61 72 67 63 20 3e 20 37 20 26 26   if (argc > 7 &&
10720 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
10730 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20 21 3d  ype (argv[7]) !=
10740 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
10750 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
10760 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43  ite_e..      ("C
10770 6c 6f 6e 65 54 61 62 6c 65 28 29 20 65 72 72 6f  loneTable() erro
10780 72 3a 20 61 72 67 75 6d 65 6e 74 20 38 20 69 73  r: argument 8 is
10790 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69   not of the Stri
107a0 6e 67 20 6f 72 20 54 45 58 54 20 74 79 70 65 5c  ng or TEXT type\
107b0 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  n");..  sqlite3_
107c0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
107d0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
107e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
107f0 20 28 61 72 67 63 20 3e 20 38 20 26 26 20 73 71   (argc > 8 && sq
10800 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10810 20 28 61 72 67 76 5b 38 5d 29 20 21 3d 20 53 51   (argv[8]) != SQ
10820 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
10830 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
10840 5f 65 0a 09 20 20 20 20 20 20 28 22 43 6c 6f 6e  _e..      ("Clon
10850 65 54 61 62 6c 65 28 29 20 65 72 72 6f 72 3a 20  eTable() error: 
10860 61 72 67 75 6d 65 6e 74 20 39 20 69 73 20 6e 6f  argument 9 is no
10870 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20  t of the String 
10880 6f 72 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29  or TEXT type\n")
10890 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
108a0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
108b0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
108c0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
108d0 72 67 63 20 3e 20 39 20 26 26 20 73 71 6c 69 74  rgc > 9 && sqlit
108e0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
108f0 72 67 76 5b 39 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[9]) != SQLIT
10900 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
10910 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
10920 09 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61  .      ("CloneTa
10930 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
10940 75 6d 65 6e 74 20 31 30 20 69 73 20 6e 6f 74 20  ument 10 is not 
10950 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
10960 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
10970 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10980 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10990 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
109a0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
109b0 63 20 3e 20 31 30 20 26 26 20 73 71 6c 69 74 65  c > 10 && sqlite
109c0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
109d0 67 76 5b 31 30 5d 29 20 21 3d 20 53 51 4c 49 54  gv[10]) != SQLIT
109e0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
109f0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
10a00 09 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61  .      ("CloneTa
10a10 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
10a20 75 6d 65 6e 74 20 31 31 20 69 73 20 6e 6f 74 20  ument 11 is not 
10a30 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
10a40 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
10a50 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10a60 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10a70 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
10a80 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
10a90 63 20 3e 20 31 31 20 26 26 20 73 71 6c 69 74 65  c > 11 && sqlite
10aa0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10ab0 67 76 5b 31 31 5d 29 20 21 3d 20 53 51 4c 49 54  gv[11]) != SQLIT
10ac0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
10ad0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
10ae0 09 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61  .      ("CloneTa
10af0 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
10b00 75 6d 65 6e 74 20 31 32 20 69 73 20 6e 6f 74 20  ument 12 is not 
10b10 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
10b20 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
10b30 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10b40 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10b50 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
10b60 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
10b70 63 20 3e 20 31 32 20 26 26 20 73 71 6c 69 74 65  c > 12 && sqlite
10b80 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10b90 67 76 5b 31 32 5d 29 20 21 3d 20 53 51 4c 49 54  gv[12]) != SQLIT
10ba0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
10bb0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
10bc0 09 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61  .      ("CloneTa
10bd0 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
10be0 75 6d 65 6e 74 20 31 33 20 69 73 20 6e 6f 74 20  ument 13 is not 
10bf0 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
10c00 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
10c10 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10c20 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10c30 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
10c40 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
10c50 63 20 3e 20 31 33 20 26 26 20 73 71 6c 69 74 65  c > 13 && sqlite
10c60 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10c70 67 76 5b 31 33 5d 29 20 21 3d 20 53 51 4c 49 54  gv[13]) != SQLIT
10c80 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
10c90 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
10ca0 09 20 20 20 20 20 20 28 22 43 6c 6f 6e 65 54 61  .      ("CloneTa
10cb0 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
10cc0 75 6d 65 6e 74 20 31 34 20 69 73 20 6e 6f 74 20  ument 14 is not 
10cd0 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
10ce0 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
10cf0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10d00 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10d10 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
10d20 20 20 20 7d 0a 0a 20 20 20 20 63 6c 6f 6e 65 72     }..    cloner
10d30 20 3d 20 67 61 69 61 41 75 78 43 6c 6f 6e 65 72   = gaiaAuxCloner
10d40 43 72 65 61 74 65 20 28 73 71 6c 69 74 65 2c 20  Create (sqlite, 
10d50 64 62 5f 70 72 65 66 69 78 2c 20 69 6e 5f 74 61  db_prefix, in_ta
10d60 62 6c 65 2c 20 6f 75 74 5f 74 61 62 6c 65 29 3b  ble, out_table);
10d70 0a 20 20 20 20 69 66 20 28 63 6c 6f 6e 65 72 20  .    if (cloner 
10d80 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
10d90 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
10da0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10db0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
10dc0 20 20 20 20 7d 0a 0a 2f 2a 20 61 64 64 69 74 69      }../* additi
10dd0 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  onal options */.
10de0 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 34      if (argc > 4
10df0 29 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e 65 72  )..gaiaAuxCloner
10e00 41 64 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65  AddOption (clone
10e10 72 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68  r,.....(const ch
10e20 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
10e30 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 34  lue_text (argv[4
10e40 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67  ]));.    if (arg
10e50 63 20 3e 20 35 29 0a 09 67 61 69 61 41 75 78 43  c > 5)..gaiaAuxC
10e60 6c 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20 28  lonerAddOption (
10e70 63 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f 6e  cloner,.....(con
10e80 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
10e90 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
10ea0 72 67 76 5b 35 5d 29 29 3b 0a 20 20 20 20 69 66  rgv[5]));.    if
10eb0 20 28 61 72 67 63 20 3e 20 36 29 0a 09 67 61 69   (argc > 6)..gai
10ec0 61 41 75 78 43 6c 6f 6e 65 72 41 64 64 4f 70 74  aAuxClonerAddOpt
10ed0 69 6f 6e 20 28 63 6c 6f 6e 65 72 2c 0a 09 09 09  ion (cloner,....
10ee0 09 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  .(const char *) 
10ef0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
10f00 78 74 20 28 61 72 67 76 5b 36 5d 29 29 3b 0a 20  xt (argv[6]));. 
10f10 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 37 29     if (argc > 7)
10f20 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e 65 72 41  ..gaiaAuxClonerA
10f30 64 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65 72  ddOption (cloner
10f40 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68 61  ,.....(const cha
10f50 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
10f60 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 37 5d  ue_text (argv[7]
10f70 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63  ));.    if (argc
10f80 20 3e 20 38 29 0a 09 67 61 69 61 41 75 78 43 6c   > 8)..gaiaAuxCl
10f90 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20 28 63  onerAddOption (c
10fa0 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f 6e 73  loner,.....(cons
10fb0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
10fc0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
10fd0 67 76 5b 38 5d 29 29 3b 0a 20 20 20 20 69 66 20  gv[8]));.    if 
10fe0 28 61 72 67 63 20 3e 20 39 29 0a 09 67 61 69 61  (argc > 9)..gaia
10ff0 41 75 78 43 6c 6f 6e 65 72 41 64 64 4f 70 74 69  AuxClonerAddOpti
11000 6f 6e 20 28 63 6c 6f 6e 65 72 2c 0a 09 09 09 09  on (cloner,.....
11010 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
11020 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11030 74 20 28 61 72 67 76 5b 39 5d 29 29 3b 0a 20 20  t (argv[9]));.  
11040 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 30 29    if (argc > 10)
11050 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e 65 72 41  ..gaiaAuxClonerA
11060 64 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65 72  ddOption (cloner
11070 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68 61  ,.....(const cha
11080 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
11090 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 30  ue_text (argv[10
110a0 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67  ]));.    if (arg
110b0 63 20 3e 20 31 31 29 0a 09 67 61 69 61 41 75 78  c > 11)..gaiaAux
110c0 43 6c 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20  ClonerAddOption 
110d0 28 63 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f  (cloner,.....(co
110e0 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
110f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
11100 61 72 67 76 5b 31 31 5d 29 29 3b 0a 20 20 20 20  argv[11]));.    
11110 69 66 20 28 61 72 67 63 20 3e 20 31 32 29 0a 09  if (argc > 12)..
11120 67 61 69 61 41 75 78 43 6c 6f 6e 65 72 41 64 64  gaiaAuxClonerAdd
11130 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65 72 2c 0a  Option (cloner,.
11140 09 09 09 09 28 63 6f 6e 73 74 20 63 68 61 72 20  ....(const char 
11150 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
11160 5f 74 65 78 74 20 28 61 72 67 76 5b 31 32 5d 29  _text (argv[12])
11170 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  );.    if (argc 
11180 3e 20 31 33 29 0a 09 67 61 69 61 41 75 78 43 6c  > 13)..gaiaAuxCl
11190 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20 28 63  onerAddOption (c
111a0 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f 6e 73  loner,.....(cons
111b0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
111c0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
111d0 67 76 5b 31 33 5d 29 29 3b 0a 0a 20 20 20 20 69  gv[13]));..    i
111e0 66 20 28 21 67 61 69 61 41 75 78 43 6c 6f 6e 65  f (!gaiaAuxClone
111f0 72 43 68 65 63 6b 56 61 6c 69 64 54 61 72 67 65  rCheckValidTarge
11200 74 20 28 63 6c 6f 6e 65 72 29 29 0a 09 67 6f 74  t (cloner))..got
11210 6f 20 65 72 72 6f 72 3b 0a 0a 20 20 20 20 69 66  o error;..    if
11220 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 20   (transaction). 
11230 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 74 61       {..  /* sta
11240 72 74 69 6e 67 20 61 20 54 72 61 6e 73 61 63 74  rting a Transact
11250 69 6f 6e 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20  ion */..  ret = 
11260 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
11270 6c 69 74 65 2c 20 22 42 45 47 49 4e 22 2c 20 4e  lite, "BEGIN", N
11280 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d  ULL, NULL, &errM
11290 73 67 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20  sg);..  if (ret 
112a0 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20  != SQLITE_OK).. 
112b0 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b       goto error;
112c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 61 63 74  .      }.    act
112d0 69 76 65 20 3d 20 31 3b 0a 0a 20 20 20 20 69 66  ive = 1;..    if
112e0 20 28 21 67 61 69 61 41 75 78 43 6c 6f 6e 65 72   (!gaiaAuxCloner
112f0 45 78 65 63 75 74 65 20 28 63 6c 6f 6e 65 72 29  Execute (cloner)
11300 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  )..goto error;. 
11310 20 20 20 67 61 69 61 41 75 78 43 6c 6f 6e 65 72     gaiaAuxCloner
11320 44 65 73 74 72 6f 79 20 28 63 6c 6f 6e 65 72 29  Destroy (cloner)
11330 3b 0a 20 20 20 20 75 70 64 61 74 65 53 70 61 74  ;.    updateSpat
11340 69 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73  iaLiteHistory (s
11350 71 6c 69 74 65 2c 20 6f 75 74 5f 74 61 62 6c 65  qlite, out_table
11360 2c 20 4e 55 4c 4c 2c 0a 09 09 09 20 20 20 20 20  , NULL,....     
11370 22 74 61 62 6c 65 20 73 75 63 63 65 73 73 66 75  "table successfu
11380 6c 6c 79 20 63 6c 6f 6e 65 64 22 29 3b 0a 0a 20  lly cloned");.. 
11390 20 20 20 69 66 20 28 74 72 61 6e 73 61 63 74 69     if (transacti
113a0 6f 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  on).      {..  /
113b0 2a 20 63 6f 6e 66 69 72 6d 69 6e 67 20 74 68 65  * confirming the
113c0 20 73 74 69 6c 6c 20 70 65 6e 64 69 6e 67 20 54   still pending T
113d0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 20  ransaction */.. 
113e0 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65   ret = sqlite3_e
113f0 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 43 4f  xec (sqlite, "CO
11400 4d 4d 49 54 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  MMIT", NULL, NUL
11410 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20  L, &errMsg);..  
11420 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
11430 45 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74  E_OK)..      got
11440 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o error;.      }
11450 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ..    sqlite3_re
11460 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
11470 74 2c 20 31 29 3b 0a 20 20 20 20 72 65 74 75 72  t, 1);.    retur
11480 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20  n;.  error:.    
11490 69 66 20 28 63 6c 6f 6e 65 72 20 21 3d 20 4e 55  if (cloner != NU
114a0 4c 4c 29 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e  LL)..gaiaAuxClon
114b0 65 72 44 65 73 74 72 6f 79 20 28 63 6c 6f 6e 65  erDestroy (clone
114c0 72 29 3b 0a 20 20 20 20 73 70 61 74 69 61 6c 69  r);.    spatiali
114d0 74 65 5f 65 20 28 22 43 6c 6f 6e 65 54 61 62 6c  te_e ("CloneTabl
114e0 65 28 29 20 65 72 72 6f 72 3a 5c 22 25 73 5c 22  e() error:\"%s\"
114f0 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b 0a 20 20  \n", errMsg);.  
11500 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
11510 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 20  errMsg);.    if 
11520 28 74 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  (transaction && 
11530 61 63 74 69 76 65 29 0a 20 20 20 20 20 20 7b 0a  active).      {.
11540 09 20 20 2f 2a 20 70 65 72 66 6f 72 6d 69 6e 67  .  /* performing
11550 20 61 20 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 09   a Rollback */..
11560 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
11570 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 52  exec (sqlite, "R
11580 4f 4c 4c 42 41 43 4b 22 2c 20 4e 55 4c 4c 2c 20  OLLBACK", NULL, 
11590 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a  NULL, &errMsg);.
115a0 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51  .  if (ret != SQ
115b0 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 7b 0a  LITE_OK)..    {.
115c0 09 09 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28  ..spatialite_e (
115d0 22 43 6c 6f 6e 65 54 61 62 6c 65 28 29 20 65 72  "CloneTable() er
115e0 72 6f 72 3a 5c 22 25 73 5c 22 5c 6e 22 2c 20 65  ror:\"%s\"\n", e
115f0 72 72 4d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65  rrMsg);...sqlite
11600 33 5f 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b  3_free (errMsg);
11610 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
11620 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
11630 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
11640 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
11650 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11660 66 6e 63 74 5f 43 72 65 61 74 65 43 6c 6f 6e 65  fnct_CreateClone
11670 64 54 61 62 6c 65 20 28 73 71 6c 69 74 65 33 5f  dTable (sqlite3_
11680 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
11690 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09  t, int argc,....
116a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
116b0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
116c0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 72 65 61  function:./ Crea
116d0 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 28 74 65  teClonedTable(te
116e0 78 74 20 64 62 5f 70 72 65 66 69 78 2c 20 74 65  xt db_prefix, te
116f0 78 74 20 69 6e 5f 74 61 62 6c 65 2c 20 74 65 78  xt in_table, tex
11700 74 20 6f 75 74 5f 74 61 62 6c 65 2c 20 69 6e 74  t out_table, int
11710 65 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  eger transaction
11720 29 0a 2f 20 43 72 65 61 74 65 43 6c 6f 6e 65 64  )./ CreateCloned
11730 54 61 62 6c 65 28 74 65 78 74 20 64 62 5f 70 72  Table(text db_pr
11740 65 66 69 78 2c 20 74 65 78 74 20 69 6e 5f 74 61  efix, text in_ta
11750 62 6c 65 2c 20 74 65 78 74 20 6f 75 74 5f 74 61  ble, text out_ta
11760 62 6c 65 2c 20 69 6e 74 65 67 65 72 20 74 72 61  ble, integer tra
11770 6e 73 61 63 74 69 6f 6e 2c 0a 2f 20 20 20 20 20  nsaction,./     
11780 20 20 20 20 20 20 20 2e 2e 2e 20 74 65 78 74 20         ... text 
11790 6f 70 74 69 6f 6e 31 20 2e 2e 2e 2c 20 2e 2e 2e  option1 ..., ...
117a0 20 74 65 78 74 20 6f 70 74 69 6f 6e 32 20 2e 2e   text option2 ..
117b0 2e 2c 20 74 65 78 74 20 6f 70 74 69 6f 6e 31 30  ., text option10
117c0 29 0a 2f 0a 2f 20 63 72 65 61 74 69 6e 67 20 61  )././ creating a
117d0 20 63 6c 6f 6e 65 64 20 74 61 62 6c 65 20 5b 43   cloned table [C
117e0 52 45 41 54 45 20 6f 6e 6c 79 20 77 69 74 68 6f  REATE only witho
117f0 75 74 20 43 4f 50 59 69 6e 67 5d 0a 2f 20 72 65  ut COPYing]./ re
11800 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
11810 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
11820 65 20 28 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c  e (NULL on inval
11830 69 64 20 61 72 67 75 6d 65 6e 74 73 29 0a 2a 2f  id arguments).*/
11840 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
11850 20 20 63 68 61 72 20 2a 65 72 72 4d 73 67 20 3d    char *errMsg =
11860 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
11870 20 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69 78   char *db_prefix
11880 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
11890 20 2a 69 6e 5f 74 61 62 6c 65 3b 0a 20 20 20 20   *in_table;.    
118a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 75 74 5f  const char *out_
118b0 74 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 74  table;.    int t
118c0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 3b 0a  ransaction = 0;.
118d0 20 20 20 20 69 6e 74 20 61 63 74 69 76 65 20 3d      int active =
118e0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   0;.    const vo
118f0 69 64 20 2a 63 6c 6f 6e 65 72 20 3d 20 4e 55 4c  id *cloner = NUL
11900 4c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  L;.    sqlite3 *
11910 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
11920 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
11930 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
11940 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
11950 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
11960 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
11970 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
11980 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
11990 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 64 62  SQLITE_TEXT)..db
119a0 5f 70 72 65 66 69 78 20 3d 20 28 63 6f 6e 73 74  _prefix = (const
119b0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
119c0 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
119d0 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a  v[0]);.    else.
119e0 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
119f0 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28  alite_e..      (
11a00 22 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61 62  "CreateClonedTab
11a10 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  le() error: argu
11a20 6d 65 6e 74 20 31 20 69 73 20 6e 6f 74 20 6f 66  ment 1 is not of
11a30 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72 20 54   the String or T
11a40 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  EXT type\n");.. 
11a50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11a60 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
11a70 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
11a80 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
11a90 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
11aa0 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
11ab0 45 5f 54 45 58 54 29 0a 09 69 6e 5f 74 61 62 6c  E_TEXT)..in_tabl
11ac0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
11ad0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
11ae0 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
11af0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
11b00 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
11b10 65 0a 09 20 20 20 20 20 20 28 22 43 72 65 61 74  e..      ("Creat
11b20 65 43 6c 6f 6e 65 64 54 61 62 6c 65 28 29 20 65  eClonedTable() e
11b30 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 32  rror: argument 2
11b40 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53   is not of the S
11b50 74 72 69 6e 67 20 6f 72 20 54 45 58 54 20 74 79  tring or TEXT ty
11b60 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74  pe\n");..  sqlit
11b70 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
11b80 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
11b90 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
11ba0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
11bb0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
11bc0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
11bd0 29 0a 09 6f 75 74 5f 74 61 62 6c 65 20 3d 20 28  )..out_table = (
11be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
11bf0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
11c00 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20   (argv[2]);.    
11c10 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
11c20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20  spatialite_e..  
11c30 20 20 20 20 28 22 43 72 65 61 74 65 43 6c 6f 6e      ("CreateClon
11c40 65 64 54 61 62 6c 65 28 29 20 65 72 72 6f 72 3a  edTable() error:
11c50 20 61 72 67 75 6d 65 6e 74 20 33 20 69 73 20 6e   argument 3 is n
11c60 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67  ot of the String
11c70 20 6f 72 20 54 45 58 54 20 74 79 70 65 5c 6e 22   or TEXT type\n"
11c80 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
11c90 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
11ca0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
11cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
11cc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
11cd0 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
11ce0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
11cf0 09 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 73  .transaction = s
11d00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
11d10 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20   (argv[3]);.    
11d20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
11d30 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20  spatialite_e..  
11d40 20 20 20 20 28 22 43 72 65 61 74 65 43 6c 6f 6e      ("CreateClon
11d50 65 64 54 61 62 6c 65 28 29 20 65 72 72 6f 72 3a  edTable() error:
11d60 20 61 72 67 75 6d 65 6e 74 20 34 20 69 73 20 6e   argument 4 is n
11d70 6f 74 20 6f 66 20 74 68 65 20 49 6e 74 65 67 65  ot of the Intege
11d80 72 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73  r type\n");..  s
11d90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
11da0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
11db0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
11dc0 0a 0a 0a 2f 2a 20 61 64 64 69 74 69 6f 6e 61 6c  .../* additional
11dd0 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20   options */.    
11de0 69 66 20 28 61 72 67 63 20 3e 20 34 20 26 26 20  if (argc > 4 && 
11df0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
11e00 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21 3d 20  pe (argv[4]) != 
11e10 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
11e20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
11e30 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43 72  te_e..      ("Cr
11e40 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 28  eateClonedTable(
11e50 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
11e60 74 20 35 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  t 5 is not of th
11e70 65 20 53 74 72 69 6e 67 20 6f 72 20 54 45 58 54  e String or TEXT
11e80 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71   type\n");..  sq
11e90 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
11ea0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
11eb0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
11ec0 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 35      if (argc > 5
11ed0 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
11ee0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29  e_type (argv[5])
11ef0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
11f00 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
11f10 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
11f20 28 22 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61  ("CreateClonedTa
11f30 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
11f40 75 6d 65 6e 74 20 36 20 69 73 20 6e 6f 74 20 6f  ument 6 is not o
11f50 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72 20  f the String or 
11f60 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09  TEXT type\n");..
11f70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
11f80 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
11f90 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
11fa0 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
11fb0 20 3e 20 36 20 26 26 20 73 71 6c 69 74 65 33 5f   > 6 && sqlite3_
11fc0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
11fd0 5b 36 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [6]) != SQLITE_T
11fe0 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
11ff0 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20  spatialite_e..  
12000 20 20 20 20 28 22 43 72 65 61 74 65 43 6c 6f 6e      ("CreateClon
12010 65 64 54 61 62 6c 65 28 29 20 65 72 72 6f 72 3a  edTable() error:
12020 20 61 72 67 75 6d 65 6e 74 20 37 20 69 73 20 6e   argument 7 is n
12030 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67  ot of the String
12040 20 6f 72 20 54 45 58 54 20 74 79 70 65 5c 6e 22   or TEXT type\n"
12050 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
12060 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
12070 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
12080 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
12090 61 72 67 63 20 3e 20 37 20 26 26 20 73 71 6c 69  argc > 7 && sqli
120a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
120b0 61 72 67 76 5b 37 5d 29 20 21 3d 20 53 51 4c 49  argv[7]) != SQLI
120c0 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
120d0 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65  ..  spatialite_e
120e0 0a 09 20 20 20 20 20 20 28 22 43 72 65 61 74 65  ..      ("Create
120f0 43 6c 6f 6e 65 64 54 61 62 6c 65 28 29 20 65 72  ClonedTable() er
12100 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 38 20  ror: argument 8 
12110 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
12120 72 69 6e 67 20 6f 72 20 54 45 58 54 20 74 79 70  ring or TEXT typ
12130 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65  e\n");..  sqlite
12140 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
12150 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
12160 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
12170 69 66 20 28 61 72 67 63 20 3e 20 38 20 26 26 20  if (argc > 8 && 
12180 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
12190 70 65 20 28 61 72 67 76 5b 38 5d 29 20 21 3d 20  pe (argv[8]) != 
121a0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
121b0 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
121c0 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43 72  te_e..      ("Cr
121d0 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 28  eateClonedTable(
121e0 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
121f0 74 20 39 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  t 9 is not of th
12200 65 20 53 74 72 69 6e 67 20 6f 72 20 54 45 58 54  e String or TEXT
12210 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71   type\n");..  sq
12220 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
12230 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
12240 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
12250 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 39      if (argc > 9
12260 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
12270 65 5f 74 79 70 65 20 28 61 72 67 76 5b 39 5d 29  e_type (argv[9])
12280 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
12290 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
122a0 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
122b0 28 22 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61  ("CreateClonedTa
122c0 62 6c 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ble() error: arg
122d0 75 6d 65 6e 74 20 31 30 20 69 73 20 6e 6f 74 20  ument 10 is not 
122e0 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
122f0 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
12300 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
12310 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
12320 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
12330 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
12340 63 20 3e 20 31 30 20 26 26 20 73 71 6c 69 74 65  c > 10 && sqlite
12350 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
12360 67 76 5b 31 30 5d 29 20 21 3d 20 53 51 4c 49 54  gv[10]) != SQLIT
12370 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
12380 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
12390 09 20 20 20 20 20 20 28 22 43 72 65 61 74 65 43  .      ("CreateC
123a0 6c 6f 6e 65 64 54 61 62 6c 65 28 29 20 65 72 72  lonedTable() err
123b0 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 31 31 20  or: argument 11 
123c0 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
123d0 72 69 6e 67 20 6f 72 20 54 45 58 54 20 74 79 70  ring or TEXT typ
123e0 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65  e\n");..  sqlite
123f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
12400 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
12410 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
12420 69 66 20 28 61 72 67 63 20 3e 20 31 31 20 26 26  if (argc > 11 &&
12430 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
12440 79 70 65 20 28 61 72 67 76 5b 31 31 5d 29 20 21  ype (argv[11]) !
12450 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
12460 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
12470 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22  lite_e..      ("
12480 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c  CreateClonedTabl
12490 65 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d  e() error: argum
124a0 65 6e 74 20 31 32 20 69 73 20 6e 6f 74 20 6f 66  ent 12 is not of
124b0 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72 20 54   the String or T
124c0 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  EXT type\n");.. 
124d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
124e0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
124f0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
12500 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
12510 3e 20 31 32 20 26 26 20 73 71 6c 69 74 65 33 5f  > 12 && sqlite3_
12520 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
12530 5b 31 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  [12]) != SQLITE_
12540 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
12550 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
12560 20 20 20 20 20 28 22 43 72 65 61 74 65 43 6c 6f       ("CreateClo
12570 6e 65 64 54 61 62 6c 65 28 29 20 65 72 72 6f 72  nedTable() error
12580 3a 20 61 72 67 75 6d 65 6e 74 20 31 33 20 69 73  : argument 13 is
12590 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69   not of the Stri
125a0 6e 67 20 6f 72 20 54 45 58 54 20 74 79 70 65 5c  ng or TEXT type\
125b0 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  n");..  sqlite3_
125c0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
125d0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
125e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
125f0 20 28 61 72 67 63 20 3e 20 31 33 20 26 26 20 73   (argc > 13 && s
12600 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
12610 65 20 28 61 72 67 76 5b 31 33 5d 29 20 21 3d 20  e (argv[13]) != 
12620 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
12630 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
12640 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43 72  te_e..      ("Cr
12650 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 28  eateClonedTable(
12660 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
12670 74 20 31 34 20 69 73 20 6e 6f 74 20 6f 66 20 74  t 14 is not of t
12680 68 65 20 53 74 72 69 6e 67 20 6f 72 20 54 45 58  he String or TEX
12690 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73  T type\n");..  s
126a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
126b0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
126c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
126d0 0a 0a 20 20 20 20 63 6c 6f 6e 65 72 20 3d 20 67  ..    cloner = g
126e0 61 69 61 41 75 78 43 6c 6f 6e 65 72 43 72 65 61  aiaAuxClonerCrea
126f0 74 65 45 78 20 28 73 71 6c 69 74 65 2c 20 64 62  teEx (sqlite, db
12700 5f 70 72 65 66 69 78 2c 20 69 6e 5f 74 61 62 6c  _prefix, in_tabl
12710 65 2c 20 6f 75 74 5f 74 61 62 6c 65 2c 20 31 29  e, out_table, 1)
12720 3b 0a 20 20 20 20 69 66 20 28 63 6c 6f 6e 65 72  ;.    if (cloner
12730 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   == NULL).      
12740 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
12750 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
12760 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
12770 20 20 20 20 20 7d 0a 0a 2f 2a 20 61 64 64 69 74       }../* addit
12780 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 20 2a 2f  ional options */
12790 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20  .    if (argc > 
127a0 34 29 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e 65  4)..gaiaAuxClone
127b0 72 41 64 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e  rAddOption (clon
127c0 65 72 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63  er,.....(const c
127d0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
127e0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
127f0 34 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72  4]));.    if (ar
12800 67 63 20 3e 20 35 29 0a 09 67 61 69 61 41 75 78  gc > 5)..gaiaAux
12810 43 6c 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20  ClonerAddOption 
12820 28 63 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f  (cloner,.....(co
12830 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
12840 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
12850 61 72 67 76 5b 35 5d 29 29 3b 0a 20 20 20 20 69  argv[5]));.    i
12860 66 20 28 61 72 67 63 20 3e 20 36 29 0a 09 67 61  f (argc > 6)..ga
12870 69 61 41 75 78 43 6c 6f 6e 65 72 41 64 64 4f 70  iaAuxClonerAddOp
12880 74 69 6f 6e 20 28 63 6c 6f 6e 65 72 2c 0a 09 09  tion (cloner,...
12890 09 09 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  ..(const char *)
128a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
128b0 65 78 74 20 28 61 72 67 76 5b 36 5d 29 29 3b 0a  ext (argv[6]));.
128c0 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 37      if (argc > 7
128d0 29 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e 65 72  )..gaiaAuxCloner
128e0 41 64 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65  AddOption (clone
128f0 72 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68  r,.....(const ch
12900 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
12910 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 37  lue_text (argv[7
12920 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67  ]));.    if (arg
12930 63 20 3e 20 38 29 0a 09 67 61 69 61 41 75 78 43  c > 8)..gaiaAuxC
12940 6c 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20 28  lonerAddOption (
12950 63 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f 6e  cloner,.....(con
12960 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
12970 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
12980 72 67 76 5b 38 5d 29 29 3b 0a 20 20 20 20 69 66  rgv[8]));.    if
12990 20 28 61 72 67 63 20 3e 20 39 29 0a 09 67 61 69   (argc > 9)..gai
129a0 61 41 75 78 43 6c 6f 6e 65 72 41 64 64 4f 70 74  aAuxClonerAddOpt
129b0 69 6f 6e 20 28 63 6c 6f 6e 65 72 2c 0a 09 09 09  ion (cloner,....
129c0 09 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  .(const char *) 
129d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
129e0 78 74 20 28 61 72 67 76 5b 39 5d 29 29 3b 0a 20  xt (argv[9]));. 
129f0 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 30     if (argc > 10
12a00 29 0a 09 67 61 69 61 41 75 78 43 6c 6f 6e 65 72  )..gaiaAuxCloner
12a10 41 64 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65  AddOption (clone
12a20 72 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68  r,.....(const ch
12a30 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
12a40 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
12a50 30 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72  0]));.    if (ar
12a60 67 63 20 3e 20 31 31 29 0a 09 67 61 69 61 41 75  gc > 11)..gaiaAu
12a70 78 43 6c 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e  xClonerAddOption
12a80 20 28 63 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63   (cloner,.....(c
12a90 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
12aa0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
12ab0 28 61 72 67 76 5b 31 31 5d 29 29 3b 0a 20 20 20  (argv[11]));.   
12ac0 20 69 66 20 28 61 72 67 63 20 3e 20 31 32 29 0a   if (argc > 12).
12ad0 09 67 61 69 61 41 75 78 43 6c 6f 6e 65 72 41 64  .gaiaAuxClonerAd
12ae0 64 4f 70 74 69 6f 6e 20 28 63 6c 6f 6e 65 72 2c  dOption (cloner,
12af0 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68 61 72  .....(const char
12b00 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
12b10 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 32 5d  e_text (argv[12]
12b20 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63  ));.    if (argc
12b30 20 3e 20 31 33 29 0a 09 67 61 69 61 41 75 78 43   > 13)..gaiaAuxC
12b40 6c 6f 6e 65 72 41 64 64 4f 70 74 69 6f 6e 20 28  lonerAddOption (
12b50 63 6c 6f 6e 65 72 2c 0a 09 09 09 09 28 63 6f 6e  cloner,.....(con
12b60 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
12b70 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
12b80 72 67 76 5b 31 33 5d 29 29 3b 0a 0a 20 20 20 20  rgv[13]));..    
12b90 69 66 20 28 21 67 61 69 61 41 75 78 43 6c 6f 6e  if (!gaiaAuxClon
12ba0 65 72 43 68 65 63 6b 56 61 6c 69 64 54 61 72 67  erCheckValidTarg
12bb0 65 74 20 28 63 6c 6f 6e 65 72 29 29 0a 09 67 6f  et (cloner))..go
12bc0 74 6f 20 65 72 72 6f 72 3b 0a 0a 20 20 20 20 69  to error;..    i
12bd0 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a  f (transaction).
12be0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 74        {..  /* st
12bf0 61 72 74 69 6e 67 20 61 20 54 72 61 6e 73 61 63  arting a Transac
12c00 74 69 6f 6e 20 2a 2f 0a 09 20 20 72 65 74 20 3d  tion */..  ret =
12c10 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73   sqlite3_exec (s
12c20 71 6c 69 74 65 2c 20 22 42 45 47 49 4e 22 2c 20  qlite, "BEGIN", 
12c30 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
12c40 4d 73 67 29 3b 0a 09 20 20 69 66 20 28 72 65 74  Msg);..  if (ret
12c50 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
12c60 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
12c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 61 63  ;.      }.    ac
12c80 74 69 76 65 20 3d 20 31 3b 0a 0a 20 20 20 20 69  tive = 1;..    i
12c90 66 20 28 21 67 61 69 61 41 75 78 43 6c 6f 6e 65  f (!gaiaAuxClone
12ca0 72 45 78 65 63 75 74 65 20 28 63 6c 6f 6e 65 72  rExecute (cloner
12cb0 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  ))..goto error;.
12cc0 20 20 20 20 67 61 69 61 41 75 78 43 6c 6f 6e 65      gaiaAuxClone
12cd0 72 44 65 73 74 72 6f 79 20 28 63 6c 6f 6e 65 72  rDestroy (cloner
12ce0 29 3b 0a 20 20 20 20 75 70 64 61 74 65 53 70 61  );.    updateSpa
12cf0 74 69 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28  tiaLiteHistory (
12d00 73 71 6c 69 74 65 2c 20 6f 75 74 5f 74 61 62 6c  sqlite, out_tabl
12d10 65 2c 20 4e 55 4c 4c 2c 0a 09 09 09 20 20 20 20  e, NULL,....    
12d20 20 22 74 61 62 6c 65 20 73 75 63 63 65 73 73 66   "table successf
12d30 75 6c 6c 79 20 63 6c 6f 6e 65 64 22 29 3b 0a 0a  ully cloned");..
12d40 20 20 20 20 69 66 20 28 74 72 61 6e 73 61 63 74      if (transact
12d50 69 6f 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ion).      {..  
12d60 2f 2a 20 63 6f 6e 66 69 72 6d 69 6e 67 20 74 68  /* confirming th
12d70 65 20 73 74 69 6c 6c 20 70 65 6e 64 69 6e 67 20  e still pending 
12d80 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
12d90 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
12da0 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 43  exec (sqlite, "C
12db0 4f 4d 4d 49 54 22 2c 20 4e 55 4c 4c 2c 20 4e 55  OMMIT", NULL, NU
12dc0 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20  LL, &errMsg);.. 
12dd0 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49   if (ret != SQLI
12de0 54 45 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f  TE_OK)..      go
12df0 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to error;.      
12e00 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  }..    sqlite3_r
12e10 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
12e20 78 74 2c 20 31 29 3b 0a 20 20 20 20 72 65 74 75  xt, 1);.    retu
12e30 72 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20  rn;.  error:.   
12e40 20 69 66 20 28 63 6c 6f 6e 65 72 20 21 3d 20 4e   if (cloner != N
12e50 55 4c 4c 29 0a 09 67 61 69 61 41 75 78 43 6c 6f  ULL)..gaiaAuxClo
12e60 6e 65 72 44 65 73 74 72 6f 79 20 28 63 6c 6f 6e  nerDestroy (clon
12e70 65 72 29 3b 0a 20 20 20 20 73 70 61 74 69 61 6c  er);.    spatial
12e80 69 74 65 5f 65 20 28 22 43 72 65 61 74 65 43 6c  ite_e ("CreateCl
12e90 6f 6e 65 64 54 61 62 6c 65 28 29 20 65 72 72 6f  onedTable() erro
12ea0 72 3a 5c 22 25 73 5c 22 5c 6e 22 2c 20 65 72 72  r:\"%s\"\n", err
12eb0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
12ec0 33 5f 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b  3_free (errMsg);
12ed0 0a 20 20 20 20 69 66 20 28 74 72 61 6e 73 61 63  .    if (transac
12ee0 74 69 6f 6e 20 26 26 20 61 63 74 69 76 65 29 0a  tion && active).
12ef0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 65        {..  /* pe
12f00 72 66 6f 72 6d 69 6e 67 20 61 20 52 6f 6c 6c 62  rforming a Rollb
12f10 61 63 6b 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20  ack */..  ret = 
12f20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
12f30 6c 69 74 65 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  lite, "ROLLBACK"
12f40 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65  , NULL, NULL, &e
12f50 72 72 4d 73 67 29 3b 0a 09 20 20 69 66 20 28 72  rrMsg);..  if (r
12f60 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  et != SQLITE_OK)
12f70 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61  ..    {...spatia
12f80 6c 69 74 65 5f 65 20 28 22 43 72 65 61 74 65 43  lite_e ("CreateC
12f90 6c 6f 6e 65 64 54 61 62 6c 65 28 29 20 65 72 72  lonedTable() err
12fa0 6f 72 3a 5c 22 25 73 5c 22 5c 6e 22 2c 20 65 72  or:\"%s\"\n", er
12fb0 72 4d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 33  rMsg);...sqlite3
12fc0 5f 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b 0a  _free (errMsg);.
12fd0 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
12fe0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
12ff0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
13000 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
13010 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
13020 6e 63 74 5f 43 68 65 63 6b 47 65 6f 50 61 63 6b  nct_CheckGeoPack
13030 61 67 65 4d 65 74 61 44 61 74 61 20 28 73 71 6c  ageMetaData (sql
13040 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
13050 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
13060 2c 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 74  ,....      sqlit
13070 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
13080 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
13090 69 6f 6e 3a 0a 2f 20 43 68 65 63 6b 47 65 6f 50  ion:./ CheckGeoP
130a0 61 63 6b 61 67 65 4d 65 74 61 44 61 74 61 28 76  ackageMetaData(v
130b0 6f 69 64 29 0a 2f 20 20 20 20 20 6f 72 0a 2f 20  oid)./     or./ 
130c0 43 68 65 63 6b 47 65 6f 50 61 63 6b 61 67 65 4d  CheckGeoPackageM
130d0 65 74 61 44 61 74 61 28 64 62 5f 70 72 65 66 69  etaData(db_prefi
130e0 78 20 54 45 58 54 29 0a 2f 0a 2f 20 66 6f 72 20  x TEXT)././ for 
130f0 4f 47 43 20 47 65 6f 50 61 63 6b 61 67 65 20 69  OGC GeoPackage i
13100 6e 74 65 72 6f 70 65 72 61 62 69 6c 69 74 79 3a  nteroperability:
13110 0a 2f 20 74 65 73 74 73 20 69 66 20 47 65 6f 50  ./ tests if GeoP
13120 61 63 6b 61 67 65 20 6d 65 74 61 64 61 74 61 20  ackage metadata 
13130 74 61 62 6c 65 73 20 61 72 65 20 66 6f 75 6e 64  tables are found
13140 0a 2f 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ./.*/.    const 
13150 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69 78 20  char *db_prefix 
13160 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69  = NULL;.    sqli
13170 74 65 33 20 2a 73 71 6c 69 74 65 3b 0a 20 20 20  te3 *sqlite;.   
13180 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 47 41   int ret;.    GA
13190 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
131a0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
131b0 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 67 63   */.    if (argc
131c0 20 3d 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09   == 1).      {..
131d0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
131e0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
131f0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
13200 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  T)..    {...sqli
13210 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
13220 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09  context, -1);...
13230 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
13240 20 20 64 62 5f 70 72 65 66 69 78 20 3d 20 28 63    db_prefix = (c
13250 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
13260 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
13270 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
13280 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 20 3d 20   }.    sqlite = 
13290 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
132a0 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65  db_handle (conte
132b0 78 74 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 63  xt);.    ret = c
132c0 68 65 63 6b 47 65 6f 50 61 63 6b 61 67 65 20 28  heckGeoPackage (
132d0 73 71 6c 69 74 65 2c 20 64 62 5f 70 72 65 66 69  sqlite, db_prefi
132e0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
132f0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
13300 65 78 74 2c 20 72 65 74 29 3b 0a 20 20 20 20 72  ext, ret);.    r
13310 65 74 75 72 6e 3b 0a 7d 0a 0a 23 69 66 64 65 66  eturn;.}..#ifdef
13320 20 45 4e 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41   ENABLE_GEOPACKA
13330 47 45 09 2f 2a 20 65 6e 61 62 6c 69 6e 67 20 47  GE./* enabling G
13340 65 6f 50 61 63 6b 61 67 65 20 65 78 74 65 6e 73  eoPackage extens
13350 69 6f 6e 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ions */..static 
13360 76 6f 69 64 0a 61 64 64 5f 67 70 6b 67 5f 74 61  void.add_gpkg_ta
13370 62 6c 65 20 28 73 74 72 75 63 74 20 67 70 6b 67  ble (struct gpkg
13380 5f 74 61 62 6c 65 20 2a 2a 66 69 72 73 74 2c 20  _table **first, 
13390 73 74 72 75 63 74 20 67 70 6b 67 5f 74 61 62 6c  struct gpkg_tabl
133a0 65 20 2a 2a 6c 61 73 74 2c 0a 09 09 63 6f 6e 73  e **last,...cons
133b0 74 20 63 68 61 72 20 2a 74 61 62 6c 65 2c 20 69  t char *table, i
133c0 6e 74 20 6c 65 6e 29 0a 7b 0a 2f 2a 20 61 64 64  nt len).{./* add
133d0 73 20 61 20 47 50 4b 47 20 47 65 6f 6d 65 74 72  s a GPKG Geometr
133e0 79 20 54 61 62 6c 65 20 74 6f 20 63 6f 72 72 65  y Table to corre
133f0 73 70 6f 6e 64 69 6e 67 20 6c 69 6e 6b 65 64 20  sponding linked 
13400 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 72 75  list */.    stru
13410 63 74 20 67 70 6b 67 5f 74 61 62 6c 65 20 2a 70  ct gpkg_table *p
13420 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f   = malloc (sizeo
13430 66 20 28 73 74 72 75 63 74 20 67 70 6b 67 5f 74  f (struct gpkg_t
13440 61 62 6c 65 29 29 3b 0a 20 20 20 20 70 2d 3e 74  able));.    p->t
13450 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c  able = malloc (l
13460 65 6e 20 2b 20 31 29 3b 0a 20 20 20 20 73 74 72  en + 1);.    str
13470 63 70 79 20 28 70 2d 3e 74 61 62 6c 65 2c 20 74  cpy (p->table, t
13480 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 6e 65  able);.    p->ne
13490 78 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  xt = NULL;.    i
134a0 66 20 28 21 28 2a 66 69 72 73 74 29 29 0a 09 28  f (!(*first))..(
134b0 2a 66 69 72 73 74 29 20 3d 20 70 3b 0a 20 20 20  *first) = p;.   
134c0 20 69 66 20 28 28 2a 6c 61 73 74 29 29 0a 09 28   if ((*last))..(
134d0 2a 6c 61 73 74 29 2d 3e 6e 65 78 74 20 3d 20 70  *last)->next = p
134e0 3b 0a 20 20 20 20 28 2a 6c 61 73 74 29 20 3d 20  ;.    (*last) = 
134f0 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  p;.}..static voi
13500 64 0a 66 72 65 65 5f 67 70 6b 67 5f 74 61 62 6c  d.free_gpkg_tabl
13510 65 73 20 28 73 74 72 75 63 74 20 67 70 6b 67 5f  es (struct gpkg_
13520 74 61 62 6c 65 20 2a 66 69 72 73 74 29 0a 7b 0a  table *first).{.
13530 2f 2a 20 6d 65 6d 6f 72 79 20 63 6c 65 61 6e 75  /* memory cleanu
13540 70 3b 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  p; destroying th
13550 65 20 47 50 4b 47 20 74 61 62 6c 65 73 20 6c 69  e GPKG tables li
13560 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nked list */.   
13570 20 73 74 72 75 63 74 20 67 70 6b 67 5f 74 61 62   struct gpkg_tab
13580 6c 65 20 2a 70 3b 0a 20 20 20 20 73 74 72 75 63  le *p;.    struc
13590 74 20 67 70 6b 67 5f 74 61 62 6c 65 20 2a 70 6e  t gpkg_table *pn
135a0 3b 0a 20 20 20 20 70 20 3d 20 66 69 72 73 74 3b  ;.    p = first;
135b0 0a 20 20 20 20 77 68 69 6c 65 20 28 70 29 0a 20  .    while (p). 
135c0 20 20 20 20 20 7b 0a 09 20 20 70 6e 20 3d 20 70       {..  pn = p
135d0 2d 3e 6e 65 78 74 3b 0a 09 20 20 69 66 20 28 70  ->next;..  if (p
135e0 2d 3e 74 61 62 6c 65 29 0a 09 20 20 20 20 20 20  ->table)..      
135f0 66 72 65 65 20 28 70 2d 3e 74 61 62 6c 65 29 3b  free (p->table);
13600 0a 09 20 20 66 72 65 65 20 28 70 29 3b 0a 09 20  ..  free (p);.. 
13610 20 70 20 3d 20 70 6e 3b 0a 20 20 20 20 20 20 7d   p = pn;.      }
13620 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
13630 66 6e 63 74 5f 41 75 74 6f 47 50 4b 47 53 74 61  fnct_AutoGPKGSta
13640 72 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  rt (sqlite3_cont
13650 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
13660 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
13670 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
13680 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
13690 6e 3a 0a 2f 20 41 75 74 6f 47 50 4b 47 53 74 61  n:./ AutoGPKGSta
136a0 72 74 28 76 6f 69 64 29 0a 2f 20 20 20 20 20 6f  rt(void)./     o
136b0 72 0a 2f 20 41 75 74 6f 47 50 4b 47 53 74 61 72  r./ AutoGPKGStar
136c0 74 28 64 62 5f 70 72 65 66 69 78 20 54 45 58 54  t(db_prefix TEXT
136d0 29 0a 2f 0a 2f 20 66 6f 72 20 4f 43 47 20 47 65  )././ for OCG Ge
136e0 6f 50 61 63 6b 61 67 65 20 69 6e 74 65 72 6f 70  oPackage interop
136f0 65 72 61 62 69 6c 69 74 79 3a 0a 2f 20 74 65 73  erability:./ tes
13700 74 73 20 74 68 65 20 44 42 20 6c 61 79 6f 75 74  ts the DB layout
13710 2c 20 74 68 65 6e 20 61 75 74 6f 6d 61 74 69 63  , then automatic
13720 61 6c 6c 79 0a 2f 20 63 72 65 61 74 69 6e 67 20  ally./ creating 
13730 61 20 56 69 72 74 75 61 6c 47 50 47 4b 20 74 61  a VirtualGPGK ta
13740 62 6c 65 20 66 6f 72 20 65 61 63 68 20 47 50 4b  ble for each GPK
13750 47 20 6d 61 69 6e 20 74 61 62 6c 65 20 0a 2f 20  G main table ./ 
13760 64 65 63 6c 61 72 65 64 20 77 69 74 68 69 6e 20  declared within 
13770 67 70 6b 67 5f 67 65 6f 6d 65 74 72 79 5f 63 6f  gpkg_geometry_co
13780 6c 75 6d 73 0a 2f 0a 2a 2f 0a 20 20 20 20 69 6e  lums./.*/.    in
13790 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  t ret;.    const
137a0 20 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69 78   char *db_prefix
137b0 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   = "main";.    c
137c0 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b  onst char *name;
137d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
137e0 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a  char **results;.
137f0 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20      int rows;.  
13800 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20    int columns;. 
13810 20 20 20 63 68 61 72 20 2a 73 71 6c 5f 73 74 61     char *sql_sta
13820 74 65 6d 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20  tement;.    int 
13830 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  count = 0;.    s
13840 74 72 75 63 74 20 67 70 6b 67 5f 74 61 62 6c 65  truct gpkg_table
13850 20 2a 66 69 72 73 74 20 3d 20 4e 55 4c 4c 3b 0a   *first = NULL;.
13860 20 20 20 20 73 74 72 75 63 74 20 67 70 6b 67 5f      struct gpkg_
13870 74 61 62 6c 65 20 2a 6c 61 73 74 20 3d 20 4e 55  table *last = NU
13880 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67  LL;.    struct g
13890 70 6b 67 5f 74 61 62 6c 65 20 2a 70 3b 0a 20 20  pkg_table *p;.  
138a0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
138b0 68 61 72 20 2a 78 6e 61 6d 65 3b 0a 20 20 20 20  har *xname;.    
138c0 63 68 61 72 20 2a 78 78 6e 61 6d 65 3b 0a 20 20  char *xxname;.  
138d0 20 20 63 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a    char *xtable;.
138e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
138f0 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
13900 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
13910 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
13920 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
13930 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
13940 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 67  E */.    if (arg
13950 63 20 3d 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a  c == 1).      {.
13960 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
13970 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
13980 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55  0]) == SQLITE_NU
13990 4c 4c 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20  LL)..      goto 
139a0 6e 75 6c 6c 5f 70 72 65 66 69 78 3b 0a 09 20 20  null_prefix;..  
139b0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
139c0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
139d0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
139e0 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
139f0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
13a00 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65  ntext, -1);...re
13a10 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
13a20 64 62 5f 70 72 65 66 69 78 20 3d 20 28 63 6f 6e  db_prefix = (con
13a30 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
13a40 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
13a50 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[0]);.      }
13a60 0a 20 20 6e 75 6c 6c 5f 70 72 65 66 69 78 3a 0a  .  null_prefix:.
13a70 20 20 20 20 69 66 20 28 63 68 65 63 6b 47 65 6f      if (checkGeo
13a80 50 61 63 6b 61 67 65 20 28 73 71 6c 69 74 65 2c  Package (sqlite,
13a90 20 64 62 5f 70 72 65 66 69 78 29 29 0a 20 20 20   db_prefix)).   
13aa0 20 20 20 7b 0a 09 20 20 2f 2a 20 6f 6b 2c 20 63     {..  /* ok, c
13ab0 72 65 61 74 69 6e 67 20 56 69 72 74 75 61 6c 47  reating VirtualG
13ac0 50 4b 47 20 74 61 62 6c 65 73 20 2a 2f 0a 09 20  PKG tables */.. 
13ad0 20 63 68 61 72 20 2a 78 64 62 5f 70 72 65 66 69   char *xdb_prefi
13ae0 78 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75  x = gaiaDoubleQu
13af0 6f 74 65 64 53 71 6c 20 28 64 62 5f 70 72 65 66  otedSql (db_pref
13b00 69 78 29 3b 0a 09 20 20 73 71 6c 5f 73 74 61 74  ix);..  sql_stat
13b10 65 6d 65 6e 74 20 3d 0a 09 20 20 20 20 20 20 73  ement =..      s
13b20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09  qlite3_mprintf..
13b30 20 20 20 20 20 20 28 22 53 45 4c 45 43 54 20 44        ("SELECT D
13b40 49 53 54 49 4e 43 54 20 74 61 62 6c 65 5f 6e 61  ISTINCT table_na
13b50 6d 65 20 46 52 4f 4d 20 5c 22 25 73 5c 22 2e 67  me FROM \"%s\".g
13b60 70 6b 67 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c  pkg_geometry_col
13b70 75 6d 6e 73 22 2c 0a 09 20 20 20 20 20 20 20 78  umns",..       x
13b80 64 62 5f 70 72 65 66 69 78 29 3b 0a 09 20 20 66  db_prefix);..  f
13b90 72 65 65 20 28 78 64 62 5f 70 72 65 66 69 78 29  ree (xdb_prefix)
13ba0 3b 0a 09 20 20 72 65 74 20 3d 0a 09 20 20 20 20  ;..  ret =..    
13bb0 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61    sqlite3_get_ta
13bc0 62 6c 65 20 28 73 71 6c 69 74 65 2c 20 73 71 6c  ble (sqlite, sql
13bd0 5f 73 74 61 74 65 6d 65 6e 74 2c 20 26 72 65 73  _statement, &res
13be0 75 6c 74 73 2c 20 26 72 6f 77 73 2c 0a 09 09 09  ults, &rows,....
13bf0 09 20 26 63 6f 6c 75 6d 6e 73 2c 20 4e 55 4c 4c  . &columns, NULL
13c00 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
13c10 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e  ee (sql_statemen
13c20 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21  t);..  if (ret !
13c30 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20  = SQLITE_OK)..  
13c40 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
13c50 09 20 20 69 66 20 28 72 6f 77 73 20 3c 20 31 29  .  if (rows < 1)
13c60 0a 09 20 20 20 20 20 20 3b 0a 09 20 20 65 6c 73  ..      ;..  els
13c70 65 0a 09 20 20 20 20 7b 0a 09 09 66 6f 72 20 28  e..    {...for (
13c80 69 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f 77 73  i = 1; i <= rows
13c90 3b 20 69 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20  ; i++)...  {... 
13ca0 20 20 20 20 20 6e 61 6d 65 20 3d 20 72 65 73 75       name = resu
13cb0 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73  lts[(i * columns
13cc0 29 20 2b 20 30 5d 3b 0a 09 09 20 20 20 20 20 20  ) + 0];...      
13cd0 69 66 20 28 6e 61 6d 65 29 0a 09 09 09 7b 0a 09  if (name)....{..
13ce0 09 09 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  ..    len = strl
13cf0 65 6e 20 28 6e 61 6d 65 29 3b 0a 09 09 09 20 20  en (name);....  
13d00 20 20 61 64 64 5f 67 70 6b 67 5f 74 61 62 6c 65    add_gpkg_table
13d10 20 28 26 66 69 72 73 74 2c 20 26 6c 61 73 74 2c   (&first, &last,
13d20 20 6e 61 6d 65 2c 20 6c 65 6e 29 3b 0a 09 09 09   name, len);....
13d30 7d 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09  }...  }..    }..
13d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74    sqlite3_free_t
13d50 61 62 6c 65 20 28 72 65 73 75 6c 74 73 29 3b 0a  able (results);.
13d60 09 20 20 70 20 3d 20 66 69 72 73 74 3b 0a 09 20  .  p = first;.. 
13d70 20 77 68 69 6c 65 20 28 70 29 0a 09 20 20 20 20   while (p)..    
13d80 7b 0a 09 09 2f 2a 20 64 65 73 74 72 6f 79 69 6e  {.../* destroyin
13d90 67 20 74 68 65 20 56 69 72 74 75 61 6c 47 50 4b  g the VirtualGPK
13da0 47 20 74 61 62 6c 65 20 5b 69 66 20 65 78 69 73  G table [if exis
13db0 74 69 6e 67 5d 20 2a 2f 0a 09 09 78 64 62 5f 70  ting] */...xdb_p
13dc0 72 65 66 69 78 20 3d 20 67 61 69 61 44 6f 75 62  refix = gaiaDoub
13dd0 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 64 62 5f  leQuotedSql (db_
13de0 70 72 65 66 69 78 29 3b 0a 09 09 78 78 6e 61 6d  prefix);...xxnam
13df0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
13e00 6e 74 66 20 28 22 76 67 70 6b 67 5f 25 73 22 2c  ntf ("vgpkg_%s",
13e10 20 70 2d 3e 74 61 62 6c 65 29 3b 0a 09 09 78 6e   p->table);...xn
13e20 61 6d 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  ame = gaiaDouble
13e30 51 75 6f 74 65 64 53 71 6c 20 28 78 78 6e 61 6d  QuotedSql (xxnam
13e40 65 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72  e);...sqlite3_fr
13e50 65 65 20 28 78 78 6e 61 6d 65 29 3b 0a 09 09 73  ee (xxname);...s
13e60 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09  ql_statement =..
13e70 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
13e80 69 6e 74 66 20 28 22 44 52 4f 50 20 54 41 42 4c  intf ("DROP TABL
13e90 45 20 49 46 20 45 58 49 53 54 53 20 5c 22 25 73  E IF EXISTS \"%s
13ea0 5c 22 2e 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09  \".\"%s\"",.....
13eb0 20 20 20 20 20 78 64 62 5f 70 72 65 66 69 78 2c       xdb_prefix,
13ec0 20 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65 65 20   xname);...free 
13ed0 28 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65 65 20  (xname);...free 
13ee0 28 78 64 62 5f 70 72 65 66 69 78 29 3b 0a 09 09  (xdb_prefix);...
13ef0 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  ret = sqlite3_ex
13f00 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f  ec (sqlite, sql_
13f10 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c  statement, NULL,
13f20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09   NULL, NULL);...
13f30 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
13f40 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 09 09  l_statement);...
13f50 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
13f60 45 5f 4f 4b 29 0a 09 09 20 20 20 20 67 6f 74 6f  E_OK)...    goto
13f70 20 65 72 72 6f 72 3b 0a 09 09 2f 2a 20 63 72 65   error;.../* cre
13f80 61 74 69 6e 67 20 74 68 65 20 56 69 72 74 75 61  ating the Virtua
13f90 6c 47 50 4b 47 20 74 61 62 6c 65 20 2a 2f 0a 09  lGPKG table */..
13fa0 09 78 64 62 5f 70 72 65 66 69 78 20 3d 20 67 61  .xdb_prefix = ga
13fb0 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71  iaDoubleQuotedSq
13fc0 6c 20 28 64 62 5f 70 72 65 66 69 78 29 3b 0a 09  l (db_prefix);..
13fd0 09 78 78 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  .xxname = sqlite
13fe0 33 5f 6d 70 72 69 6e 74 66 20 28 22 76 67 70 6b  3_mprintf ("vgpk
13ff0 67 5f 25 73 22 2c 20 70 2d 3e 74 61 62 6c 65 29  g_%s", p->table)
14000 3b 0a 09 09 78 6e 61 6d 65 20 3d 20 67 61 69 61  ;...xname = gaia
14010 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20  DoubleQuotedSql 
14020 28 78 78 6e 61 6d 65 29 3b 0a 09 09 73 71 6c 69  (xxname);...sqli
14030 74 65 33 5f 66 72 65 65 20 28 78 78 6e 61 6d 65  te3_free (xxname
14040 29 3b 0a 09 09 78 74 61 62 6c 65 20 3d 20 67 61  );...xtable = ga
14050 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71  iaDoubleQuotedSq
14060 6c 20 28 70 2d 3e 74 61 62 6c 65 29 3b 0a 09 09  l (p->table);...
14070 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a  sql_statement =.
14080 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70  ..    sqlite3_mp
14090 72 69 6e 74 66 0a 09 09 20 20 20 20 28 22 43 52  rintf...    ("CR
140a0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
140b0 4c 45 20 5c 22 25 73 5c 22 2e 5c 22 25 73 5c 22  LE \"%s\".\"%s\"
140c0 20 55 53 49 4e 47 20 56 69 72 74 75 61 6c 47 50   USING VirtualGP
140d0 4b 47 28 5c 22 25 73 5c 22 2c 20 5c 22 25 73 5c  KG(\"%s\", \"%s\
140e0 22 29 22 2c 0a 09 09 20 20 20 20 20 78 64 62 5f  ")",...     xdb_
140f0 70 72 65 66 69 78 2c 20 78 6e 61 6d 65 2c 20 78  prefix, xname, x
14100 64 62 5f 70 72 65 66 69 78 2c 20 78 74 61 62 6c  db_prefix, xtabl
14110 65 29 3b 0a 09 09 66 72 65 65 20 28 78 6e 61 6d  e);...free (xnam
14120 65 29 3b 0a 09 09 66 72 65 65 20 28 78 74 61 62  e);...free (xtab
14130 6c 65 29 3b 0a 09 09 66 72 65 65 20 28 78 64 62  le);...free (xdb
14140 5f 70 72 65 66 69 78 29 3b 0a 09 09 72 65 74 20  _prefix);...ret 
14150 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28  = sqlite3_exec (
14160 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74  sqlite, sql_stat
14170 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  ement, NULL, NUL
14180 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 73 71 6c 69  L, NULL);...sqli
14190 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74  te3_free (sql_st
141a0 61 74 65 6d 65 6e 74 29 3b 0a 09 09 69 66 20 28  atement);...if (
141b0 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
141c0 29 0a 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72  )...    goto err
141d0 6f 72 3b 0a 09 09 63 6f 75 6e 74 2b 2b 3b 0a 09  or;...count++;..
141e0 09 70 20 3d 20 70 2d 3e 6e 65 78 74 3b 0a 09 20  .p = p->next;.. 
141f0 20 20 20 7d 0a 09 65 72 72 6f 72 3a 0a 09 20 20     }..error:..  
14200 66 72 65 65 5f 67 70 6b 67 5f 74 61 62 6c 65 73  free_gpkg_tables
14210 20 28 66 69 72 73 74 29 3b 0a 09 20 20 73 71 6c   (first);..  sql
14220 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
14230 28 63 6f 6e 74 65 78 74 2c 20 63 6f 75 6e 74 29  (context, count)
14240 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
14250 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14260 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
14270 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  text, 0);.    re
14280 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  turn;.}..static 
14290 76 6f 69 64 0a 66 6e 63 74 5f 41 75 74 6f 47 50  void.fnct_AutoGP
142a0 4b 47 53 74 6f 70 20 28 73 71 6c 69 74 65 33 5f  KGStop (sqlite3_
142b0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
142c0 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
142d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
142e0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
142f0 63 74 69 6f 6e 3a 0a 2f 20 41 75 74 6f 47 50 4b  ction:./ AutoGPK
14300 47 53 74 6f 70 28 76 6f 69 64 29 0a 2f 20 20 20  GStop(void)./   
14310 20 20 6f 72 0a 2f 20 41 75 74 6f 47 50 4b 47 53    or./ AutoGPKGS
14320 74 6f 70 28 64 62 5f 70 72 65 66 69 78 20 54 45  top(db_prefix TE
14330 58 54 29 0a 2f 0a 2f 20 66 6f 72 20 4f 47 43 20  XT)././ for OGC 
14340 47 65 6f 50 61 63 6b 61 67 65 20 69 6e 74 65 72  GeoPackage inter
14350 6f 70 65 72 61 62 69 6c 69 74 79 3a 0a 2f 20 74  operability:./ t
14360 65 73 74 73 20 74 68 65 20 44 42 20 6c 61 79 6f  ests the DB layo
14370 75 74 2c 20 74 68 65 6e 20 61 75 74 6f 6d 61 74  ut, then automat
14380 69 63 61 6c 6c 79 20 72 65 6d 6f 76 65 73 20 61  ically removes a
14390 6e 79 20 56 69 72 74 75 61 6c 47 50 4b 47 20 74  ny VirtualGPKG t
143a0 61 62 6c 65 20 0a 2f 0a 2a 2f 0a 20 20 20 20 69  able ./.*/.    i
143b0 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73  nt ret;.    cons
143c0 74 20 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69  t char *db_prefi
143d0 78 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  x = "main";.    
143e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
143f0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
14400 20 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b   char **results;
14410 0a 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20  .    int rows;. 
14420 20 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a     int columns;.
14430 20 20 20 20 63 68 61 72 20 2a 73 71 6c 5f 73 74      char *sql_st
14440 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 69 6e 74  atement;.    int
14450 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20   count = 0;.    
14460 73 74 72 75 63 74 20 67 70 6b 67 5f 74 61 62 6c  struct gpkg_tabl
14470 65 20 2a 66 69 72 73 74 20 3d 20 4e 55 4c 4c 3b  e *first = NULL;
14480 0a 20 20 20 20 73 74 72 75 63 74 20 67 70 6b 67  .    struct gpkg
14490 5f 74 61 62 6c 65 20 2a 6c 61 73 74 20 3d 20 4e  _table *last = N
144a0 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ULL;.    struct 
144b0 67 70 6b 67 5f 74 61 62 6c 65 20 2a 70 3b 0a 20  gpkg_table *p;. 
144c0 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
144d0 63 68 61 72 20 2a 78 6e 61 6d 65 3b 0a 20 20 20  char *xname;.   
144e0 20 63 68 61 72 20 2a 78 78 6e 61 6d 65 3b 0a 20   char *xxname;. 
144f0 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
14500 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
14510 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
14520 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
14530 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
14540 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
14550 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 67 63   */.    if (argc
14560 20 3d 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09   == 1).      {..
14570 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
14580 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
14590 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ]) == SQLITE_NUL
145a0 4c 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 6e  L)..      goto n
145b0 75 6c 6c 5f 70 72 65 66 69 78 3b 0a 09 20 20 69  ull_prefix;..  i
145c0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
145d0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
145e0 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
145f0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
14600 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
14610 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74  text, -1);...ret
14620 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 64  urn;..    }..  d
14630 62 5f 70 72 65 66 69 78 20 3d 20 28 63 6f 6e 73  b_prefix = (cons
14640 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
14650 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
14660 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[0]);.      }.
14670 20 20 6e 75 6c 6c 5f 70 72 65 66 69 78 3a 0a 20    null_prefix:. 
14680 20 20 20 69 66 20 28 63 68 65 63 6b 47 65 6f 50     if (checkGeoP
14690 61 63 6b 61 67 65 20 28 73 71 6c 69 74 65 2c 20  ackage (sqlite, 
146a0 64 62 5f 70 72 65 66 69 78 29 29 0a 20 20 20 20  db_prefix)).    
146b0 20 20 7b 0a 09 20 20 2f 2a 20 6f 6b 2c 20 72 65    {..  /* ok, re
146c0 6d 6f 76 69 6e 67 20 56 69 72 74 75 61 6c 47 50  moving VirtualGP
146d0 4b 47 20 74 61 62 6c 65 73 20 2a 2f 0a 09 20 20  KG tables */..  
146e0 63 68 61 72 20 2a 78 64 62 5f 70 72 65 66 69 78  char *xdb_prefix
146f0 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f   = gaiaDoubleQuo
14700 74 65 64 53 71 6c 20 28 64 62 5f 70 72 65 66 69  tedSql (db_prefi
14710 78 29 3b 0a 09 20 20 73 71 6c 5f 73 74 61 74 65  x);..  sql_state
14720 6d 65 6e 74 20 3d 0a 09 20 20 20 20 20 20 73 71  ment =..      sq
14730 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 20  lite3_mprintf.. 
14740 20 20 20 20 20 28 22 53 45 4c 45 43 54 20 44 49       ("SELECT DI
14750 53 54 49 4e 43 54 20 74 61 62 6c 65 5f 6e 61 6d  STINCT table_nam
14760 65 20 46 52 4f 4d 20 5c 22 25 73 5c 22 2e 67 70  e FROM \"%s\".gp
14770 6b 67 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75  kg_geometry_colu
14780 6d 6e 73 22 2c 0a 09 20 20 20 20 20 20 20 78 64  mns",..       xd
14790 62 5f 70 72 65 66 69 78 29 3b 0a 09 20 20 66 72  b_prefix);..  fr
147a0 65 65 20 28 78 64 62 5f 70 72 65 66 69 78 29 3b  ee (xdb_prefix);
147b0 0a 09 20 20 72 65 74 20 3d 0a 09 20 20 20 20 20  ..  ret =..     
147c0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
147d0 6c 65 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f  le (sqlite, sql_
147e0 73 74 61 74 65 6d 65 6e 74 2c 20 26 72 65 73 75  statement, &resu
147f0 6c 74 73 2c 20 26 72 6f 77 73 2c 0a 09 09 09 09  lts, &rows,.....
14800 20 26 63 6f 6c 75 6d 6e 73 2c 20 4e 55 4c 4c 29   &columns, NULL)
14810 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
14820 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e (sql_statement
14830 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d  );..  if (ret !=
14840 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20   SQLITE_OK)..   
14850 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
14860 20 20 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a    if (rows < 1).
14870 09 20 20 20 20 20 20 3b 0a 09 20 20 65 6c 73 65  .      ;..  else
14880 0a 09 20 20 20 20 7b 0a 09 09 66 6f 72 20 28 69  ..    {...for (i
14890 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f 77 73 3b   = 1; i <= rows;
148a0 20 69 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20   i++)...  {...  
148b0 20 20 20 20 6e 61 6d 65 20 3d 20 72 65 73 75 6c      name = resul
148c0 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29  ts[(i * columns)
148d0 20 2b 20 30 5d 3b 0a 09 09 20 20 20 20 20 20 69   + 0];...      i
148e0 66 20 28 6e 61 6d 65 29 0a 09 09 09 7b 0a 09 09  f (name)....{...
148f0 09 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
14900 6e 20 28 6e 61 6d 65 29 3b 0a 09 09 09 20 20 20  n (name);....   
14910 20 61 64 64 5f 67 70 6b 67 5f 74 61 62 6c 65 20   add_gpkg_table 
14920 28 26 66 69 72 73 74 2c 20 26 6c 61 73 74 2c 20  (&first, &last, 
14930 6e 61 6d 65 2c 20 6c 65 6e 29 3b 0a 09 09 09 7d  name, len);....}
14940 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20  ...  }..    }.. 
14950 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
14960 62 6c 65 20 28 72 65 73 75 6c 74 73 29 3b 0a 09  ble (results);..
14970 20 20 70 20 3d 20 66 69 72 73 74 3b 0a 09 20 20    p = first;..  
14980 77 68 69 6c 65 20 28 70 29 0a 09 20 20 20 20 7b  while (p)..    {
14990 0a 09 09 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67  .../* destroying
149a0 20 74 68 65 20 56 69 72 74 75 61 6c 47 50 4b 47   the VirtualGPKG
149b0 20 74 61 62 6c 65 20 5b 69 66 20 65 78 69 73 74   table [if exist
149c0 69 6e 67 5d 20 2a 2f 0a 09 09 78 64 62 5f 70 72  ing] */...xdb_pr
149d0 65 66 69 78 20 3d 20 67 61 69 61 44 6f 75 62 6c  efix = gaiaDoubl
149e0 65 51 75 6f 74 65 64 53 71 6c 20 28 64 62 5f 70  eQuotedSql (db_p
149f0 72 65 66 69 78 29 3b 0a 09 09 78 78 6e 61 6d 65  refix);...xxname
14a00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14a10 74 66 20 28 22 76 67 70 6b 67 5f 25 73 22 2c 20  tf ("vgpkg_%s", 
14a20 70 2d 3e 74 61 62 6c 65 29 3b 0a 09 09 78 6e 61  p->table);...xna
14a30 6d 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51  me = gaiaDoubleQ
14a40 75 6f 74 65 64 53 71 6c 20 28 78 78 6e 61 6d 65  uotedSql (xxname
14a50 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65  );...sqlite3_fre
14a60 65 20 28 78 78 6e 61 6d 65 29 3b 0a 09 09 73 71  e (xxname);...sq
14a70 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09 09  l_statement =...
14a80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
14a90 6e 74 66 20 28 22 44 52 4f 50 20 54 41 42 4c 45  ntf ("DROP TABLE
14aa0 20 49 46 20 45 58 49 53 54 53 20 5c 22 25 73 5c   IF EXISTS \"%s\
14ab0 22 2e 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 20  ".\"%s\"",..... 
14ac0 20 20 20 20 78 64 62 5f 70 72 65 66 69 78 2c 20      xdb_prefix, 
14ad0 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65 65 20 28  xname);...free (
14ae0 78 6e 61 6d 65 29 3b 0a 09 09 66 72 65 65 20 28  xname);...free (
14af0 78 64 62 5f 70 72 65 66 69 78 29 3b 0a 09 09 72  xdb_prefix);...r
14b00 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
14b10 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73  c (sqlite, sql_s
14b20 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20  tatement, NULL, 
14b30 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 73  NULL, NULL);...s
14b40 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c  qlite3_free (sql
14b50 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 09 09 69  _statement);...i
14b60 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
14b70 5f 4f 4b 29 0a 09 09 20 20 20 20 67 6f 74 6f 20  _OK)...    goto 
14b80 65 72 72 6f 72 3b 0a 09 09 63 6f 75 6e 74 2b 2b  error;...count++
14b90 3b 0a 09 09 70 20 3d 20 70 2d 3e 6e 65 78 74 3b  ;...p = p->next;
14ba0 0a 09 20 20 20 20 7d 0a 09 65 72 72 6f 72 3a 0a  ..    }..error:.
14bb0 09 20 20 66 72 65 65 5f 67 70 6b 67 5f 74 61 62  .  free_gpkg_tab
14bc0 6c 65 73 20 28 66 69 72 73 74 29 3b 0a 09 20 20  les (first);..  
14bd0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
14be0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 63 6f 75  nt (context, cou
14bf0 6e 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  nt);..  return;.
14c00 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69        }.    sqli
14c10 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
14c20 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  context, 0);.   
14c30 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 23 65 6e 64   return;.}..#end
14c40 69 66 20 2f 2a 20 65 6e 64 20 65 6e 61 62 6c 69  if /* end enabli
14c50 6e 67 20 47 65 6f 50 61 63 6b 61 67 65 20 65 78  ng GeoPackage ex
14c60 74 65 6e 73 69 6f 6e 73 20 2a 2f 0a 0a 73 74 61  tensions */..sta
14c70 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 6e  tic void.fnct_In
14c80 73 65 72 74 45 70 73 67 53 72 69 64 20 28 73 71  sertEpsgSrid (sq
14c90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
14ca0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
14cb0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
14cc0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
14cd0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49  QL function:./ I
14ce0 6e 73 65 72 74 45 70 73 67 53 72 69 64 28 69 6e  nsertEpsgSrid(in
14cf0 74 20 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75  t srid)././ retu
14d00 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
14d10 3a 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a  : 0 on failure.*
14d20 2f 0a 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a  /.    int srid;.
14d30 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
14d40 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
14d50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
14d60 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
14d70 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
14d80 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
14d90 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
14da0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
14db0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
14dc0 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
14dd0 5f 49 4e 54 45 47 45 52 29 0a 09 73 72 69 64 20  _INTEGER)..srid 
14de0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14df0 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  int (argv[0]);. 
14e00 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
14e10 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14e20 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
14e30 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  0);..  return;. 
14e40 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 20 3d       }.    ret =
14e50 20 69 6e 73 65 72 74 5f 65 70 73 67 5f 73 72 69   insert_epsg_sri
14e60 64 20 28 73 71 6c 69 74 65 2c 20 73 72 69 64 29  d (sqlite, srid)
14e70 3b 0a 20 20 20 20 69 66 20 28 21 72 65 74 29 0a  ;.    if (!ret).
14e80 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
14e90 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
14ea0 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
14eb0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
14ec0 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 7d 0a 0a  context, 1);.}..
14ed0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
14ee0 5f 53 72 69 64 49 73 47 65 6f 67 72 61 70 68 69  _SridIsGeographi
14ef0 63 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c (sqlite3_conte
14f00 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
14f10 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20  t argc,...      
14f20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14f30 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
14f40 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 72 69   function:./ Sri
14f50 64 49 73 47 65 6f 67 72 61 70 68 69 63 28 69 6e  dIsGeographic(in
14f60 74 20 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75  t srid)././ retu
14f70 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
14f80 3a 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2f  : 0 on failure./
14f90 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64   NULL on invalid
14fa0 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 20 20 20   argument.*/.   
14fb0 20 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20 69   int srid;.    i
14fc0 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20  nt ret;.    int 
14fd0 67 65 6f 67 72 61 70 68 69 63 3b 0a 20 20 20 20  geographic;.    
14fe0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
14ff0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
15000 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
15010 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
15020 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
15030 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
15040 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
15050 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
15060 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
15070 49 4e 54 45 47 45 52 29 0a 09 73 72 69 64 20 3d  INTEGER)..srid =
15080 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
15090 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  nt (argv[0]);.  
150a0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
150b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
150c0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
150d0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
150e0 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 73 72    }.    ret = sr
150f0 69 64 5f 69 73 5f 67 65 6f 67 72 61 70 68 69 63  id_is_geographic
15100 20 28 73 71 6c 69 74 65 2c 20 73 72 69 64 2c 20   (sqlite, srid, 
15110 26 67 65 6f 67 72 61 70 68 69 63 29 3b 0a 20 20  &geographic);.  
15120 20 20 69 66 20 28 21 72 65 74 29 0a 09 73 71 6c    if (!ret)..sql
15130 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
15140 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
15150 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
15160 69 66 20 28 67 65 6f 67 72 61 70 68 69 63 29 0a  if (geographic).
15170 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
15180 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
15190 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 1);..  else.
151a0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
151b0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
151c0 78 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  xt, 0);.      }.
151d0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
151e0 6e 63 74 5f 53 72 69 64 49 73 50 72 6f 6a 65 63  nct_SridIsProjec
151f0 74 65 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ted (sqlite3_con
15200 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
15210 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20  int argc,...    
15220 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15230 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
15240 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 72  L function:./ Sr
15250 69 64 49 73 50 72 6f 6a 65 63 74 65 64 28 69 6e  idIsProjected(in
15260 74 20 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75  t srid)././ retu
15270 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
15280 3a 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2f  : 0 on failure./
15290 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64   NULL on invalid
152a0 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 20 20 20   argument.*/.   
152b0 20 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20 69   int srid;.    i
152c0 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20  nt ret;.    int 
152d0 70 72 6f 6a 65 63 74 65 64 3b 0a 20 20 20 20 73  projected;.    s
152e0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
152f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
15300 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
15310 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
15320 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
15330 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
15340 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
15350 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
15360 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [0]) == SQLITE_I
15370 4e 54 45 47 45 52 29 0a 09 73 72 69 64 20 3d 20  NTEGER)..srid = 
15380 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
15390 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
153a0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
153b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
153c0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
153d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
153e0 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 73 72 69   }.    ret = sri
153f0 64 5f 69 73 5f 70 72 6f 6a 65 63 74 65 64 20 28  d_is_projected (
15400 73 71 6c 69 74 65 2c 20 73 72 69 64 2c 20 26 70  sqlite, srid, &p
15410 72 6f 6a 65 63 74 65 64 29 3b 0a 20 20 20 20 69  rojected);.    i
15420 66 20 28 21 72 65 74 29 0a 09 73 71 6c 69 74 65  f (!ret)..sqlite
15430 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
15440 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
15450 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  e.      {..  if 
15460 28 70 72 6f 6a 65 63 74 65 64 29 0a 09 20 20 20  (projected)..   
15470 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
15480 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
15490 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  1);..  else..   
154a0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
154b0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
154c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73  0);.      }.}..s
154d0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
154e0 53 72 69 64 48 61 73 46 6c 69 70 70 65 64 41 78  SridHasFlippedAx
154f0 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  es (sqlite3_cont
15500 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
15510 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 73 71 6c  nt argc,.... sql
15520 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
15530 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
15540 63 74 69 6f 6e 3a 0a 2f 20 53 72 69 64 48 61 73  ction:./ SridHas
15550 46 6c 69 70 70 65 64 41 78 65 73 28 69 6e 74 20  FlippedAxes(int 
15560 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  srid)././ return
15570 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 3a 20  s 1 on success: 
15580 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2f 20 4e  0 on failure./ N
15590 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ULL on invalid a
155a0 72 67 75 6d 65 6e 74 0a 2a 2f 0a 20 20 20 20 69  rgument.*/.    i
155b0 6e 74 20 73 72 69 64 3b 0a 20 20 20 20 69 6e 74  nt srid;.    int
155c0 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 66 6c   ret;.    int fl
155d0 69 70 70 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ipped;.    sqlit
155e0 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
155f0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
15600 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
15610 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
15620 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
15630 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
15640 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
15650 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
15660 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
15670 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69  ER)..srid = sqli
15680 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
15690 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
156a0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
156b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
156c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
156d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
156e0 20 20 20 72 65 74 20 3d 20 73 72 69 64 5f 68 61     ret = srid_ha
156f0 73 5f 66 6c 69 70 70 65 64 5f 61 78 65 73 20 28  s_flipped_axes (
15700 73 71 6c 69 74 65 2c 20 73 72 69 64 2c 20 26 66  sqlite, srid, &f
15710 6c 69 70 70 65 64 29 3b 0a 20 20 20 20 69 66 20  lipped);.    if 
15720 28 21 72 65 74 29 0a 09 73 71 6c 69 74 65 33 5f  (!ret)..sqlite3_
15730 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
15740 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
15750 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 66        {..  if (f
15760 6c 69 70 70 65 64 29 0a 09 20 20 20 20 20 20 73  lipped)..      s
15770 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
15780 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
15790 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
157a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
157b0 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
157c0 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69        }.}..stati
157d0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 72 69 64  c void.fnct_Srid
157e0 47 65 74 53 70 68 65 72 6f 69 64 20 28 73 71 6c  GetSpheroid (sql
157f0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
15800 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
15810 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  ,...      sqlite
15820 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
15830 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
15840 6f 6e 3a 0a 2f 20 53 72 69 64 47 65 74 53 70 68  on:./ SridGetSph
15850 65 72 6f 69 64 28 69 6e 74 20 73 72 69 64 29 0a  eroid(int srid).
15860 2f 20 6f 72 0a 2f 20 53 72 69 64 47 65 74 45 6c  / or./ SridGetEl
15870 6c 69 70 73 6f 69 64 28 69 6e 74 20 73 72 69 64  lipsoid(int srid
15880 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68  )././ returns th
15890 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 53 70  e name of the Sp
158a0 68 65 72 6f 69 64 20 6f 6e 20 73 75 63 63 65 73  heroid on succes
158b0 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 66 61 69 6c  s./ NULL on fail
158c0 75 72 65 20 6f 72 20 6f 6e 20 69 6e 76 61 6c 69  ure or on invali
158d0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 20 20  d argument.*/.  
158e0 20 20 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20    int srid;.    
158f0 63 68 61 72 20 2a 73 70 68 65 72 6f 69 64 20 3d  char *spheroid =
15900 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74   NULL;.    sqlit
15910 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
15920 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
15930 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
15940 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
15950 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
15960 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
15970 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
15980 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
15990 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
159a0 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69  ER)..srid = sqli
159b0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
159c0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
159d0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
159e0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
159f0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
15a00 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
15a10 20 20 20 73 70 68 65 72 6f 69 64 20 3d 20 73 72     spheroid = sr
15a20 69 64 5f 67 65 74 5f 73 70 68 65 72 6f 69 64 20  id_get_spheroid 
15a30 28 73 71 6c 69 74 65 2c 20 73 72 69 64 29 3b 0a  (sqlite, srid);.
15a40 20 20 20 20 69 66 20 28 73 70 68 65 72 6f 69 64      if (spheroid
15a50 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
15a60 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
15a70 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
15a80 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  se..sqlite3_resu
15a90 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74  lt_text (context
15aa0 2c 20 73 70 68 65 72 6f 69 64 2c 20 73 74 72 6c  , spheroid, strl
15ab0 65 6e 20 28 73 70 68 65 72 6f 69 64 29 2c 20 66  en (spheroid), f
15ac0 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ree);.}..static 
15ad0 76 6f 69 64 0a 66 6e 63 74 5f 53 72 69 64 47 65  void.fnct_SridGe
15ae0 74 50 72 69 6d 65 4d 65 72 69 64 69 61 6e 20 28  tPrimeMeridian (
15af0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
15b00 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
15b10 72 67 63 2c 0a 09 09 09 20 20 20 73 71 6c 69 74  rgc,....   sqlit
15b20 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
15b30 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
15b40 69 6f 6e 3a 0a 2f 20 53 72 69 64 47 65 74 50 72  ion:./ SridGetPr
15b50 69 6d 65 4d 65 72 69 64 69 61 6e 28 69 6e 74 20  imeMeridian(int 
15b60 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  srid)././ return
15b70 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
15b80 65 20 50 72 69 6d 65 20 4d 65 72 69 64 69 61 6e  e Prime Meridian
15b90 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 4e 55   on success./ NU
15ba0 4c 4c 20 6f 6e 20 66 61 69 6c 75 72 65 20 6f 72  LL on failure or
15bb0 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
15bc0 6d 65 6e 74 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ment.*/.    int 
15bd0 73 72 69 64 3b 0a 20 20 20 20 63 68 61 72 20 2a  srid;.    char *
15be0 70 72 69 6d 65 5f 6d 65 72 69 64 69 61 6e 20 3d  prime_meridian =
15bf0 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74   NULL;.    sqlit
15c00 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
15c10 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
15c20 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
15c30 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
15c40 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
15c50 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
15c60 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
15c70 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
15c80 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
15c90 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69  ER)..srid = sqli
15ca0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
15cb0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
15cc0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
15cd0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
15ce0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
15cf0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
15d00 20 20 20 70 72 69 6d 65 5f 6d 65 72 69 64 69 61     prime_meridia
15d10 6e 20 3d 20 73 72 69 64 5f 67 65 74 5f 70 72 69  n = srid_get_pri
15d20 6d 65 5f 6d 65 72 69 64 69 61 6e 20 28 73 71 6c  me_meridian (sql
15d30 69 74 65 2c 20 73 72 69 64 29 3b 0a 20 20 20 20  ite, srid);.    
15d40 69 66 20 28 70 72 69 6d 65 5f 6d 65 72 69 64 69  if (prime_meridi
15d50 61 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c  an == NULL)..sql
15d60 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
15d70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
15d80 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
15d90 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
15da0 78 74 2c 20 70 72 69 6d 65 5f 6d 65 72 69 64 69  xt, prime_meridi
15db0 61 6e 2c 20 73 74 72 6c 65 6e 20 28 70 72 69 6d  an, strlen (prim
15dc0 65 5f 6d 65 72 69 64 69 61 6e 29 2c 0a 09 09 09  e_meridian),....
15dd0 20 20 20 20 20 66 72 65 65 29 3b 0a 7d 0a 0a 73       free);.}..s
15de0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
15df0 53 72 69 64 47 65 74 50 72 6f 6a 65 63 74 69 6f  SridGetProjectio
15e00 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  n (sqlite3_conte
15e10 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
15e20 74 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74  t argc,....sqlit
15e30 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
15e40 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
15e50 69 6f 6e 3a 0a 2f 20 53 72 69 64 47 65 74 50 72  ion:./ SridGetPr
15e60 6f 6a 65 63 74 69 6f 6e 28 69 6e 74 20 73 72 69  ojection(int sri
15e70 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74  d)././ returns t
15e80 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 50  he name of the P
15e90 72 6f 6a 65 63 74 69 6f 6e 20 6f 6e 20 73 75 63  rojection on suc
15ea0 63 65 73 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 66  cess./ NULL on f
15eb0 61 69 6c 75 72 65 20 6f 72 20 6f 6e 20 69 6e 76  ailure or on inv
15ec0 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  alid argument.*/
15ed0 0a 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a 20  .    int srid;. 
15ee0 20 20 20 63 68 61 72 20 2a 70 72 6f 6a 65 63 74     char *project
15ef0 69 6f 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ion = NULL;.    
15f00 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
15f10 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
15f20 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
15f30 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
15f40 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
15f50 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
15f60 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
15f70 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
15f80 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
15f90 49 4e 54 45 47 45 52 29 0a 09 73 72 69 64 20 3d  INTEGER)..srid =
15fa0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
15fb0 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  nt (argv[0]);.  
15fc0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
15fd0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
15fe0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
15ff0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
16000 20 20 7d 0a 20 20 20 20 70 72 6f 6a 65 63 74 69    }.    projecti
16010 6f 6e 20 3d 20 73 72 69 64 5f 67 65 74 5f 70 72  on = srid_get_pr
16020 6f 6a 65 63 74 69 6f 6e 20 28 73 71 6c 69 74 65  ojection (sqlite
16030 2c 20 73 72 69 64 29 3b 0a 20 20 20 20 69 66 20  , srid);.    if 
16040 28 70 72 6f 6a 65 63 74 69 6f 6e 20 3d 3d 20 4e  (projection == N
16050 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  ULL)..sqlite3_re
16060 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
16070 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73  xt);.    else..s
16080 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
16090 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 70 72 6f  xt (context, pro
160a0 6a 65 63 74 69 6f 6e 2c 20 73 74 72 6c 65 6e 20  jection, strlen 
160b0 28 70 72 6f 6a 65 63 74 69 6f 6e 29 2c 20 66 72  (projection), fr
160c0 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ee);.}..static v
160d0 6f 69 64 0a 66 6e 63 74 5f 53 72 69 64 47 65 74  oid.fnct_SridGet
160e0 44 61 74 75 6d 20 28 73 71 6c 69 74 65 33 5f 63  Datum (sqlite3_c
160f0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
16100 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
16110 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
16120 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
16130 74 69 6f 6e 3a 0a 2f 20 53 72 69 64 47 65 74 44  tion:./ SridGetD
16140 61 74 75 6d 28 69 6e 74 20 73 72 69 64 29 0a 2f  atum(int srid)./
16150 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ./ returns the n
16160 61 6d 65 20 6f 66 20 74 68 65 20 44 61 74 75 6d  ame of the Datum
16170 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 4e 55   on success./ NU
16180 4c 4c 20 6f 6e 20 66 61 69 6c 75 72 65 20 6f 72  LL on failure or
16190 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
161a0 6d 65 6e 74 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ment.*/.    int 
161b0 73 72 69 64 3b 0a 20 20 20 20 63 68 61 72 20 2a  srid;.    char *
161c0 64 61 74 75 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20  datum = NULL;.  
161d0 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
161e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
161f0 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
16200 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
16210 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
16220 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
16230 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
16240 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
16250 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
16260 45 5f 49 4e 54 45 47 45 52 29 0a 09 73 72 69 64  E_INTEGER)..srid
16270 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16280 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  _int (argv[0]);.
16290 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
162a0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
162b0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
162c0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
162d0 20 20 20 20 7d 0a 20 20 20 20 64 61 74 75 6d 20      }.    datum 
162e0 3d 20 73 72 69 64 5f 67 65 74 5f 64 61 74 75 6d  = srid_get_datum
162f0 20 28 73 71 6c 69 74 65 2c 20 73 72 69 64 29 3b   (sqlite, srid);
16300 0a 20 20 20 20 69 66 20 28 64 61 74 75 6d 20 3d  .    if (datum =
16310 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
16320 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
16330 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
16340 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
16350 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
16360 64 61 74 75 6d 2c 20 73 74 72 6c 65 6e 20 28 64  datum, strlen (d
16370 61 74 75 6d 29 2c 20 66 72 65 65 29 3b 0a 7d 0a  atum), free);.}.
16380 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
16390 74 5f 53 72 69 64 47 65 74 55 6e 69 74 20 28 73  t_SridGetUnit (s
163a0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
163b0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
163c0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
163d0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
163e0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
163f0 53 72 69 64 47 65 74 55 6e 69 74 28 69 6e 74 20  SridGetUnit(int 
16400 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  srid)././ return
16410 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
16420 65 20 53 70 68 65 72 6f 69 64 20 6f 6e 20 73 75  e Spheroid on su
16430 63 63 65 73 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20  ccess./ NULL on 
16440 66 61 69 6c 75 72 65 20 6f 72 20 6f 6e 20 69 6e  failure or on in
16450 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 0a 2a  valid argument.*
16460 2f 0a 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a  /.    int srid;.
16470 20 20 20 20 63 68 61 72 20 2a 75 6e 69 74 20 3d      char *unit =
16480 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74   NULL;.    sqlit
16490 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
164a0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
164b0 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
164c0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
164d0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
164e0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
164f0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
16500 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
16510 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
16520 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69  ER)..srid = sqli
16530 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
16540 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
16550 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
16560 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
16570 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
16580 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
16590 20 20 20 75 6e 69 74 20 3d 20 73 72 69 64 5f 67     unit = srid_g
165a0 65 74 5f 75 6e 69 74 20 28 73 71 6c 69 74 65 2c  et_unit (sqlite,
165b0 20 73 72 69 64 29 3b 0a 20 20 20 20 69 66 20 28   srid);.    if (
165c0 75 6e 69 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73  unit == NULL)..s
165d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
165e0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
165f0 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
16600 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e  result_text (con
16610 74 65 78 74 2c 20 75 6e 69 74 2c 20 73 74 72 6c  text, unit, strl
16620 65 6e 20 28 75 6e 69 74 29 2c 20 66 72 65 65 29  en (unit), free)
16630 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
16640 0a 63 6f 6d 6d 6f 6e 5f 73 72 69 64 5f 61 78 69  .common_srid_axi
16650 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  s (sqlite3_conte
16660 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
16670 74 20 61 72 67 63 2c 0a 09 09 20 20 73 71 6c 69  t argc,...  sqli
16680 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
16690 76 2c 20 63 68 61 72 20 61 78 69 73 2c 20 63 68  v, char axis, ch
166a0 61 72 20 6d 6f 64 65 29 0a 7b 0a 2f 2a 20 63 6f  ar mode).{./* co
166b0 6d 6d 6f 6e 6e 20 69 6d 70 6c 65 6e 74 61 74 69  mmonn implentati
166c0 6f 6e 20 2d 20 53 52 49 44 20 47 65 74 20 41 78  on - SRID Get Ax
166d0 69 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 72  is */.    int sr
166e0 69 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 72 65  id;.    char *re
166f0 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  sult = NULL;.   
16700 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
16710 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
16720 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
16730 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
16740 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
16750 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
16760 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
16770 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
16780 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
16790 5f 49 4e 54 45 47 45 52 29 0a 09 73 72 69 64 20  _INTEGER)..srid 
167a0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
167b0 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  int (argv[0]);. 
167c0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
167d0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
167e0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
167f0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
16800 20 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 20     }.    result 
16810 3d 20 73 72 69 64 5f 67 65 74 5f 61 78 69 73 20  = srid_get_axis 
16820 28 73 71 6c 69 74 65 2c 20 73 72 69 64 2c 20 61  (sqlite, srid, a
16830 78 69 73 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20  xis, mode);.    
16840 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55  if (result == NU
16850 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
16860 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
16870 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
16880 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
16890 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 75  t (context, resu
168a0 6c 74 2c 20 73 74 72 6c 65 6e 20 28 72 65 73 75  lt, strlen (resu
168b0 6c 74 29 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73  lt), free);.}..s
168c0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
168d0 53 72 69 64 47 65 74 41 78 69 73 31 4e 61 6d 65  SridGetAxis1Name
168e0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
168f0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
16900 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20   argc,...       
16910 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
16920 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
16930 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 72 69 64  function:./ Srid
16940 47 65 74 41 78 69 73 5f 31 5f 4e 61 6d 65 28 69  GetAxis_1_Name(i
16950 6e 74 20 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74  nt srid)././ ret
16960 75 72 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  urns the name of
16970 20 74 68 65 20 66 69 72 73 74 20 41 78 69 73 20   the first Axis 
16980 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 4e 55 4c  on success./ NUL
16990 4c 20 6f 6e 20 66 61 69 6c 75 72 65 20 6f 72 20  L on failure or 
169a0 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
169b0 65 6e 74 0a 2a 2f 0a 20 20 20 20 63 6f 6d 6d 6f  ent.*/.    commo
169c0 6e 5f 73 72 69 64 5f 61 78 69 73 20 28 63 6f 6e  n_srid_axis (con
169d0 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
169e0 2c 20 53 50 4c 49 54 45 5f 41 58 49 53 5f 31 2c  , SPLITE_AXIS_1,
169f0 20 53 50 4c 49 54 45 5f 41 58 49 53 5f 4e 41 4d   SPLITE_AXIS_NAM
16a00 45 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  E);.}..static vo
16a10 69 64 0a 66 6e 63 74 5f 53 72 69 64 47 65 74 41  id.fnct_SridGetA
16a20 78 69 73 31 4f 72 69 65 6e 74 61 74 69 6f 6e 20  xis1Orientation 
16a30 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
16a40 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
16a50 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20 20 73  argc,....      s
16a60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
16a70 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
16a80 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 72 69 64 47  unction:./ SridG
16a90 65 74 41 78 69 73 5f 31 5f 4f 72 69 65 6e 74 61  etAxis_1_Orienta
16aa0 74 69 6f 6e 28 69 6e 74 20 73 72 69 64 29 0a 2f  tion(int srid)./
16ab0 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 6f  ./ returns the o
16ac0 72 69 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  rientation of th
16ad0 65 20 66 69 72 73 74 20 41 78 69 73 20 6f 6e 20  e first Axis on 
16ae0 73 75 63 63 65 73 73 0a 2f 20 4e 55 4c 4c 20 6f  success./ NULL o
16af0 6e 20 66 61 69 6c 75 72 65 20 6f 72 20 6f 6e 20  n failure or on 
16b00 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
16b10 0a 2a 2f 0a 20 20 20 20 63 6f 6d 6d 6f 6e 5f 73  .*/.    common_s
16b20 72 69 64 5f 61 78 69 73 20 28 63 6f 6e 74 65 78  rid_axis (contex
16b30 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 53  t, argc, argv, S
16b40 50 4c 49 54 45 5f 41 58 49 53 5f 31 2c 0a 09 09  PLITE_AXIS_1,...
16b50 20 20 20 20 20 20 53 50 4c 49 54 45 5f 41 58 49        SPLITE_AXI
16b60 53 5f 4f 52 49 45 4e 54 41 54 49 4f 4e 29 3b 0a  S_ORIENTATION);.
16b70 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
16b80 6e 63 74 5f 53 72 69 64 47 65 74 41 78 69 73 32  nct_SridGetAxis2
16b90 4e 61 6d 65 20 28 73 71 6c 69 74 65 33 5f 63 6f  Name (sqlite3_co
16ba0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
16bb0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
16bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
16bd0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
16be0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
16bf0 53 72 69 64 47 65 74 41 78 69 73 5f 32 5f 4e 61  SridGetAxis_2_Na
16c00 6d 65 28 69 6e 74 20 73 72 69 64 29 0a 2f 0a 2f  me(int srid)././
16c10 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 61 6d   returns the nam
16c20 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  e of the second 
16c30 41 78 69 73 20 6f 6e 20 73 75 63 63 65 73 73 0a  Axis on success.
16c40 2f 20 4e 55 4c 4c 20 6f 6e 20 66 61 69 6c 75 72  / NULL on failur
16c50 65 20 6f 72 20 6f 6e 20 69 6e 76 61 6c 69 64 20  e or on invalid 
16c60 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 20 20 20 20  argument.*/.    
16c70 63 6f 6d 6d 6f 6e 5f 73 72 69 64 5f 61 78 69 73  common_srid_axis
16c80 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
16c90 20 61 72 67 76 2c 20 53 50 4c 49 54 45 5f 41 58   argv, SPLITE_AX
16ca0 49 53 5f 32 2c 20 53 50 4c 49 54 45 5f 41 58 49  IS_2, SPLITE_AXI
16cb0 53 5f 4e 41 4d 45 29 3b 0a 7d 0a 0a 73 74 61 74  S_NAME);.}..stat
16cc0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 72 69  ic void.fnct_Sri
16cd0 64 47 65 74 41 78 69 73 32 4f 72 69 65 6e 74 61  dGetAxis2Orienta
16ce0 74 69 6f 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f  tion (sqlite3_co
16cf0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
16d00 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20   int argc,....  
16d10 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
16d20 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
16d30 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
16d40 53 72 69 64 47 65 74 41 78 69 73 5f 32 5f 4f 72  SridGetAxis_2_Or
16d50 69 65 6e 74 61 74 69 6f 6e 28 69 6e 74 20 73 72  ientation(int sr
16d60 69 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  id)././ returns 
16d70 74 68 65 20 6f 72 69 65 6e 74 61 74 69 6f 6e 20  the orientation 
16d80 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 41 78  of the second Ax
16d90 69 73 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20  is on success./ 
16da0 4e 55 4c 4c 20 6f 6e 20 66 61 69 6c 75 72 65 20  NULL on failure 
16db0 6f 72 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  or on invalid ar
16dc0 67 75 6d 65 6e 74 0a 2a 2f 0a 20 20 20 20 63 6f  gument.*/.    co
16dd0 6d 6d 6f 6e 5f 73 72 69 64 5f 61 78 69 73 20 28  mmon_srid_axis (
16de0 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
16df0 72 67 76 2c 20 53 50 4c 49 54 45 5f 41 58 49 53  rgv, SPLITE_AXIS
16e00 5f 32 2c 0a 09 09 20 20 20 20 20 20 53 50 4c 49  _2,...      SPLI
16e10 54 45 5f 41 58 49 53 5f 4f 52 49 45 4e 54 41 54  TE_AXIS_ORIENTAT
16e20 49 4f 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ION);.}..static 
16e30 69 6e 74 0a 72 65 63 6f 76 65 72 47 65 6f 6d 43  int.recoverGeomC
16e40 6f 6c 75 6d 6e 20 28 73 71 6c 69 74 65 33 20 2a  olumn (sqlite3 *
16e50 20 73 71 6c 69 74 65 2c 20 63 6f 6e 73 74 20 63   sqlite, const c
16e60 68 61 72 20 2a 74 61 62 6c 65 2c 0a 09 09 20 20  har *table,...  
16e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
16e80 75 6d 6e 2c 20 69 6e 74 20 78 74 79 70 65 2c 20  umn, int xtype, 
16e90 69 6e 74 20 64 69 6d 73 2c 20 69 6e 74 20 73 72  int dims, int sr
16ea0 69 64 29 0a 7b 0a 2f 2a 20 63 68 65 63 6b 73 20  id).{./* checks 
16eb0 69 66 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20  if TABLE.COLUMN 
16ec0 65 78 69 73 74 73 20 61 6e 64 20 68 61 73 20 74  exists and has t
16ed0 68 65 20 72 65 71 75 69 72 65 64 20 66 65 61 74  he required feat
16ee0 75 72 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ures */.    int 
16ef0 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  ok = 1;.    int 
16f00 74 79 70 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  type;.    sqlite
16f10 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b 0a 20 20  3_stmt *stmt;.  
16f20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
16f30 72 20 67 65 6f 6d 3b 0a 20 20 20 20 63 6f 6e 73  r geom;.    cons
16f40 74 20 76 6f 69 64 20 2a 62 6c 6f 62 5f 76 61 6c  t void *blob_val
16f50 75 65 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ue;.    int len;
16f60 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
16f70 20 20 69 6e 74 20 69 5f 63 6f 6c 3b 0a 20 20 20    int i_col;.   
16f80 20 69 6e 74 20 69 73 5f 6e 75 6c 6c 61 62 6c 65   int is_nullable
16f90 20 3d 20 31 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 1;.    char *
16fa0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61  p_table;.    cha
16fb0 72 20 2a 70 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20  r *p_column;.   
16fc0 20 63 68 61 72 20 2a 73 71 6c 5f 73 74 61 74 65   char *sql_state
16fd0 6d 65 6e 74 3b 0a 0a 2f 2a 20 74 65 73 74 69 6e  ment;../* testin
16fe0 67 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f  g if NOT NULL */
16ff0 0a 20 20 20 20 70 5f 74 61 62 6c 65 20 3d 20 67  .    p_table = g
17000 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53  aiaDoubleQuotedS
17010 71 6c 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 20  ql (table);.    
17020 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20  sql_statement = 
17030 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
17040 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ("PRAGMA table_i
17050 6e 66 6f 28 5c 22 25 73 5c 22 29 22 2c 20 70 5f  nfo(\"%s\")", p_
17060 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  table);.    free
17070 20 28 70 5f 74 61 62 6c 65 29 3b 0a 20 20 20 20   (p_table);.    
17080 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 70 72  ret = sqlite3_pr
17090 65 70 61 72 65 5f 76 32 20 28 73 71 6c 69 74 65  epare_v2 (sqlite
170a0 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c  , sql_statement,
170b0 20 73 74 72 6c 65 6e 20 28 73 71 6c 5f 73 74 61   strlen (sql_sta
170c0 74 65 6d 65 6e 74 29 2c 0a 09 09 09 20 20 20 20  tement),....    
170d0 20 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a    &stmt, NULL);.
170e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
170f0 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
17100 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
17110 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20   SQLITE_OK).    
17120 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
17130 65 5f 65 20 28 22 72 65 63 6f 76 65 72 47 65 6f  e_e ("recoverGeo
17140 6d 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c  mColumn: \"%s\"\
17150 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
17160 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20  sg (sqlite));.. 
17170 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
17180 20 7d 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29   }.    while (1)
17190 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73  .      {..  /* s
171a0 63 72 6f 6c 6c 69 6e 67 20 74 68 65 20 72 65 73  crolling the res
171b0 75 6c 74 20 73 65 74 20 72 6f 77 73 20 2a 2f 0a  ult set rows */.
171c0 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
171d0 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20  _step (stmt);.. 
171e0 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49   if (ret == SQLI
171f0 54 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20 20  TE_DONE)..      
17200 62 72 65 61 6b 3b 09 09 2f 2a 20 65 6e 64 20 6f  break;../* end o
17210 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
17220 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51  .  if (ret == SQ
17230 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 7b  LITE_ROW)..    {
17240 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  ...if (strcasecm
17250 70 0a 09 09 20 20 20 20 28 63 6f 6c 75 6d 6e 2c  p...    (column,
17260 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
17270 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
17280 65 78 74 20 28 73 74 6d 74 2c 20 31 29 29 20 3d  ext (stmt, 1)) =
17290 3d 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  = 0)...  {...   
172a0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 63     if (sqlite3_c
172b0 6f 6c 75 6d 6e 5f 69 6e 74 20 28 73 74 6d 74 2c  olumn_int (stmt,
172c0 20 32 29 20 21 3d 20 30 29 0a 09 09 09 20 20 69   2) != 0)....  i
172d0 73 5f 6e 75 6c 6c 61 62 6c 65 20 3d 20 30 3b 0a  s_nullable = 0;.
172e0 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20  ..  }..    }.   
172f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17300 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29  _finalize (stmt)
17310 3b 0a 0a 20 20 20 20 70 5f 74 61 62 6c 65 20 3d  ;..    p_table =
17320 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65   gaiaDoubleQuote
17330 64 53 71 6c 20 28 74 61 62 6c 65 29 3b 0a 20 20  dSql (table);.  
17340 20 20 70 5f 63 6f 6c 75 6d 6e 20 3d 20 67 61 69    p_column = gai
17350 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c  aDoubleQuotedSql
17360 20 28 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73   (column);.    s
17370 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09  ql_statement =..
17380 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
17390 28 22 53 45 4c 45 43 54 20 5c 22 25 73 5c 22 20  ("SELECT \"%s\" 
173a0 46 52 4f 4d 20 5c 22 25 73 5c 22 22 2c 20 70 5f  FROM \"%s\"", p_
173b0 63 6f 6c 75 6d 6e 2c 20 70 5f 74 61 62 6c 65 29  column, p_table)
173c0 3b 0a 20 20 20 20 66 72 65 65 20 28 70 5f 74 61  ;.    free (p_ta
173d0 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 20 28  ble);.    free (
173e0 70 5f 63 6f 6c 75 6d 6e 29 3b 0a 2f 2a 20 63 6f  p_column);./* co
173f0 6d 70 69 6c 69 6e 67 20 53 51 4c 20 70 72 65 70  mpiling SQL prep
17400 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
17410 2f 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69  /.    ret = sqli
17420 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28  te3_prepare_v2 (
17430 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74  sqlite, sql_stat
17440 65 6d 65 6e 74 2c 20 73 74 72 6c 65 6e 20 28 73  ement, strlen (s
17450 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 2c 0a 09  ql_statement),..
17460 09 09 20 20 20 20 20 20 26 73 74 6d 74 2c 20 4e  ..      &stmt, N
17470 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ULL);.    sqlite
17480 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74  3_free (sql_stat
17490 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28  ement);.    if (
174a0 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
174b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61  ).      {..  spa
174c0 74 69 61 6c 69 74 65 5f 65 20 28 22 72 65 63 6f  tialite_e ("reco
174d0 76 65 72 47 65 6f 6d 43 6f 6c 75 6d 6e 3a 20 65  verGeomColumn: e
174e0 72 72 6f 72 20 25 64 20 5c 22 25 73 5c 22 5c 6e  rror %d \"%s\"\n
174f0 22 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 65 72  ",....sqlite3_er
17500 72 63 6f 64 65 20 28 73 71 6c 69 74 65 29 2c 20  rcode (sqlite), 
17510 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28  sqlite3_errmsg (
17520 73 71 6c 69 74 65 29 29 3b 0a 09 20 20 72 65 74  sqlite));..  ret
17530 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
17540 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
17550 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c   (stmt);.    sql
17560 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
17570 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20  ngs (stmt);.    
17580 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
17590 74 20 28 73 74 6d 74 2c 20 31 2c 20 74 61 62 6c  t (stmt, 1, tabl
175a0 65 2c 20 73 74 72 6c 65 6e 20 28 74 61 62 6c 65  e, strlen (table
175b0 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ), SQLITE_STATIC
175c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
175d0 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20  ind_text (stmt, 
175e0 32 2c 20 63 6f 6c 75 6d 6e 2c 20 73 74 72 6c 65  2, column, strle
175f0 6e 20 28 63 6f 6c 75 6d 6e 29 2c 20 53 51 4c 49  n (column), SQLI
17600 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
17610 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20  while (1).      
17620 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e  {..  /* scrollin
17630 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
17640 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20   rows */..  ret 
17650 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28  = sqlite3_step (
17660 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65  stmt);..  if (re
17670 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  t == SQLITE_DONE
17680 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09  )..      break;.
17690 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c  ./* end of resul
176a0 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28  t set */..  if (
176b0 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f  ret == SQLITE_RO
176c0 57 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63  W)..    {.../* c
176d0 68 65 63 6b 69 6e 67 20 47 65 6f 6d 65 74 72 79  hecking Geometry
176e0 20 66 65 61 74 75 72 65 73 20 2a 2f 0a 09 09 67   features */...g
176f0 65 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f  eom = NULL;...fo
17700 72 20 28 69 5f 63 6f 6c 20 3d 20 30 3b 20 69 5f  r (i_col = 0; i_
17710 63 6f 6c 20 3c 20 73 71 6c 69 74 65 33 5f 63 6f  col < sqlite3_co
17720 6c 75 6d 6e 5f 63 6f 75 6e 74 20 28 73 74 6d 74  lumn_count (stmt
17730 29 3b 20 69 5f 63 6f 6c 2b 2b 29 0a 09 09 20 20  ); i_col++)...  
17740 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 73 71  {...      if (sq
17750 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
17760 65 20 28 73 74 6d 74 2c 20 69 5f 63 6f 6c 29 20  e (stmt, i_col) 
17770 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a  == SQLITE_NULL).
17780 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20 66  ...{....    /* f
17790 6f 75 6e 64 20 61 20 4e 55 4c 4c 20 67 65 6f 6d  ound a NULL geom
177a0 65 74 72 79 20 2a 2f 0a 09 09 09 20 20 20 20 69  etry */....    i
177b0 66 20 28 21 69 73 5f 6e 75 6c 6c 61 62 6c 65 29  f (!is_nullable)
177c0 0a 09 09 09 09 6f 6b 20 3d 20 30 3b 0a 09 09 09  .....ok = 0;....
177d0 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 69  }...      else i
177e0 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f (sqlite3_colum
177f0 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 69 5f  n_type (stmt, i_
17800 63 6f 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  col) != SQLITE_B
17810 4c 4f 42 29 0a 09 09 09 20 20 6f 6b 20 3d 20 30  LOB)....  ok = 0
17820 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09  ;...      else..
17830 09 09 7b 0a 09 09 09 20 20 20 20 62 6c 6f 62 5f  ..{....    blob_
17840 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
17850 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 28 73 74 6d  column_blob (stm
17860 74 2c 20 69 5f 63 6f 6c 29 3b 0a 09 09 09 20 20  t, i_col);....  
17870 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
17880 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 28 73 74  column_bytes (st
17890 6d 74 2c 20 69 5f 63 6f 6c 29 3b 0a 09 09 09 20  mt, i_col);.... 
178a0 20 20 20 67 65 6f 6d 20 3d 20 67 61 69 61 46 72     geom = gaiaFr
178b0 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
178c0 57 6b 62 20 28 62 6c 6f 62 5f 76 61 6c 75 65 2c  Wkb (blob_value,
178d0 20 6c 65 6e 29 3b 0a 09 09 09 20 20 20 20 69 66   len);....    if
178e0 20 28 21 67 65 6f 6d 29 0a 09 09 09 09 6f 6b 20   (!geom).....ok 
178f0 3d 20 30 3b 0a 09 09 09 20 20 20 20 65 6c 73 65  = 0;....    else
17900 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09  ....      {.....
17910 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65    if (geom->Dime
17920 6e 73 69 6f 6e 4d 6f 64 65 6c 20 21 3d 20 64 69  nsionModel != di
17930 6d 73 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b  ms).....      ok
17940 20 3d 20 30 3b 0a 09 09 09 09 20 20 69 66 20 28   = 0;.....  if (
17950 67 65 6f 6d 2d 3e 53 72 69 64 20 21 3d 20 73 72  geom->Srid != sr
17960 69 64 29 0a 09 09 09 09 20 20 20 20 20 20 6f 6b  id).....      ok
17970 20 3d 20 30 3b 0a 09 09 09 09 20 20 74 79 70 65   = 0;.....  type
17980 20 3d 20 67 61 69 61 47 65 6f 6d 65 74 72 79 54   = gaiaGeometryT
17990 79 70 65 20 28 67 65 6f 6d 29 3b 0a 09 09 09 09  ype (geom);.....
179a0 20 20 69 66 20 28 78 74 79 70 65 20 3d 3d 20 2d    if (xtype == -
179b0 31 29 0a 09 09 09 09 20 20 20 20 20 20 3b 09 2f  1).....      ;./
179c0 2a 20 47 45 4f 4d 45 54 52 59 20 2a 2f 0a 09 09  * GEOMETRY */...
179d0 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 20 20  ..  else.....   
179e0 20 7b 0a 09 09 09 09 09 69 66 20 28 78 74 79 70   {......if (xtyp
179f0 65 20 3d 3d 20 74 79 70 65 29 0a 09 09 09 09 09  e == type)......
17a00 20 20 20 20 3b 0a 09 09 09 09 09 65 6c 73 65 0a      ;......else.
17a10 09 09 09 09 09 20 20 20 20 6f 6b 20 3d 20 30 3b  .....    ok = 0;
17a20 0a 09 09 09 09 20 20 20 20 7d 0a 09 09 09 09 20  .....    }..... 
17a30 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
17a40 6c 20 28 67 65 6f 6d 29 3b 0a 09 09 09 20 20 20  l (geom);....   
17a50 20 20 20 7d 0a 09 09 09 7d 0a 09 09 20 20 7d 0a     }....}...  }.
17a60 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 21 6f  .    }..  if (!o
17a70 6b 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b  k)..      break;
17a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .      }.    ret
17a90 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
17aa0 69 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20  ize (stmt);.    
17ab0 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
17ac0 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20  E_OK).      {.. 
17ad0 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22   spatialite_e ("
17ae0 72 65 63 6f 76 65 72 47 65 6f 6d 43 6f 6c 75 6d  recoverGeomColum
17af0 6e 3a 20 65 72 72 6f 72 20 25 64 20 5c 22 25 73  n: error %d \"%s
17b00 5c 22 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 74 65  \"\n",....sqlite
17b10 33 5f 65 72 72 63 6f 64 65 20 28 73 71 6c 69 74  3_errcode (sqlit
17b20 65 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  e), sqlite3_errm
17b30 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20  sg (sqlite));.. 
17b40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
17b50 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b   }.    return ok
17b60 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
17b70 0a 66 6e 63 74 5f 41 64 64 47 65 6f 6d 65 74 72  .fnct_AddGeometr
17b80 79 43 6f 6c 75 6d 6e 20 28 73 71 6c 69 74 65 33  yColumn (sqlite3
17b90 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
17ba0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
17bb0 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
17bc0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
17bd0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41 64 64   function:./ Add
17be0 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 74  GeometryColumn(t
17bf0 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 73 72  able, column, sr
17c00 69 64 2c 20 74 79 70 65 20 5b 20 2c 20 64 69 6d  id, type [ , dim
17c10 65 6e 73 69 6f 6e 20 20 5b 20 20 2c 20 6e 6f 74  ension  [  , not
17c20 2d 6e 75 6c 6c 20 5d 20 5d 20 29 0a 2f 0a 2f 20  -null ] ] )././ 
17c30 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 43 4f  creates a new CO
17c40 4c 55 4d 4e 20 6f 66 20 67 69 76 65 6e 20 54 59  LUMN of given TY
17c50 50 45 20 69 6e 74 6f 20 54 41 42 4c 45 0a 2f 20  PE into TABLE./ 
17c60 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
17c70 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
17c80 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ure.*/.    const
17c90 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20   char *table;.  
17ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
17cb0 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  lumn;.    const 
17cc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
17cd0 79 70 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ype;.    const u
17ce0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 78  nsigned char *tx
17cf0 74 5f 64 69 6d 73 3b 0a 20 20 20 20 69 6e 74 20  t_dims;.    int 
17d00 78 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 73  xtype;.    int s
17d10 72 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  rid = -1;.    in
17d20 74 20 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 32 3b  t dimension = 2;
17d30 0a 20 20 20 20 69 6e 74 20 64 69 6d 73 20 3d 20  .    int dims = 
17d40 2d 31 3b 0a 20 20 20 20 69 6e 74 20 61 75 74 6f  -1;.    int auto
17d50 5f 64 69 6d 73 20 3d 20 2d 31 3b 0a 20 20 20 20  _dims = -1;.    
17d60 63 68 61 72 20 73 71 6c 5b 31 30 32 34 5d 3b 0a  char sql[1024];.
17d70 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
17d80 20 69 6e 74 20 6e 6f 74 4e 75 6c 6c 20 3d 20 30   int notNull = 0
17d90 3b 0a 20 20 20 20 69 6e 74 20 6d 65 74 61 64 61  ;.    int metada
17da0 74 61 5f 76 65 72 73 69 6f 6e 3b 0a 20 20 20 20  ta_version;.    
17db0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74  sqlite3_stmt *st
17dc0 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 5f  mt;.    char *p_
17dd0 74 61 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  table = NULL;.  
17de0 20 20 63 68 61 72 20 2a 71 75 6f 74 65 64 5f 74    char *quoted_t
17df0 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  able;.    char *
17e00 71 75 6f 74 65 64 5f 63 6f 6c 75 6d 6e 3b 0a 20  quoted_column;. 
17e10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
17e20 5f 74 79 70 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _type = NULL;.  
17e30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 5f    const char *p_
17e40 64 69 6d 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  dims = NULL;.   
17e50 20 69 6e 74 20 6e 5f 74 79 70 65 20 3d 20 30 3b   int n_type = 0;
17e60 0a 20 20 20 20 69 6e 74 20 6e 5f 64 69 6d 73 20  .    int n_dims 
17e70 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  = 0;.    char *s
17e80 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20  ql_statement;.  
17e90 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
17ea0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
17eb0 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
17ec0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 66 20  ontext);.    if 
17ed0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
17ee0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
17ef0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
17f00 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
17f10 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 41  ite_e..      ("A
17f20 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  ddGeometryColumn
17f30 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65  () error: argume
17f40 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61 6d 65  nt 1 [table_name
17f50 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20  ] is not of the 
17f60 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b  String type\n");
17f70 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
17f80 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
17f90 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
17fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c        }.    tabl
17fb0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
17fc0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
17fd0 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
17fe0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
17ff0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
18000 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
18010 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
18020 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
18030 20 20 20 20 20 28 22 41 64 64 47 65 6f 6d 65 74       ("AddGeomet
18040 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72  ryColumn() error
18050 3a 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 63 6f  : argument 2 [co
18060 6c 75 6d 6e 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f  lumn_name] is no
18070 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20  t of the String 
18080 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  type\n");..  sql
18090 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
180a0 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
180b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
180c0 0a 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 28 63  .    column = (c
180d0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
180e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
180f0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
18100 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
18110 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
18120 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
18130 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70  R).      {..  sp
18140 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20  atialite_e..    
18150 20 20 28 22 41 64 64 47 65 6f 6d 65 74 72 79 43    ("AddGeometryC
18160 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61  olumn() error: a
18170 72 67 75 6d 65 6e 74 20 33 20 5b 53 52 49 44 5d  rgument 3 [SRID]
18180 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 49   is not of the I
18190 6e 74 65 67 65 72 20 74 79 70 65 5c 6e 22 29 3b  nteger type\n");
181a0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
181b0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
181c0 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
181d0 20 20 20 20 20 20 7d 0a 20 20 20 20 73 72 69 64        }.    srid
181e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
181f0 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  _int (argv[2]);.
18200 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
18210 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
18220 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [3]) != SQLITE_T
18230 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
18240 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20  spatialite_e..  
18250 20 20 20 20 28 22 41 64 64 47 65 6f 6d 65 74 72      ("AddGeometr
18260 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
18270 20 61 72 67 75 6d 65 6e 74 20 34 20 5b 67 65 6f   argument 4 [geo
18280 6d 65 74 72 79 5f 74 79 70 65 5d 20 69 73 20 6e  metry_type] is n
18290 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67  ot of the String
182a0 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71   type\n");..  sq
182b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
182c0 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09   (context, 0);..
182d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
182e0 7d 0a 20 20 20 20 74 79 70 65 20 3d 20 73 71 6c  }.    type = sql
182f0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
18300 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69  (argv[3]);.    i
18310 66 20 28 61 72 67 63 20 3e 20 34 29 0a 20 20 20  f (argc > 4).   
18320 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
18330 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
18340 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
18350 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
18360 20 7b 0a 09 09 64 69 6d 65 6e 73 69 6f 6e 20 3d   {...dimension =
18370 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
18380 6e 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 09  nt (argv[4]);...
18390 69 66 20 28 64 69 6d 65 6e 73 69 6f 6e 20 3d 3d  if (dimension ==
183a0 20 32 29 0a 09 09 20 20 20 20 64 69 6d 73 20 3d   2)...    dims =
183b0 20 47 41 49 41 5f 58 59 3b 0a 09 09 69 66 20 28   GAIA_XY;...if (
183c0 64 69 6d 65 6e 73 69 6f 6e 20 3d 3d 20 33 29 0a  dimension == 3).
183d0 09 09 20 20 20 20 64 69 6d 73 20 3d 20 47 41 49  ..    dims = GAI
183e0 41 5f 58 59 5f 5a 3b 0a 09 09 69 66 20 28 64 69  A_XY_Z;...if (di
183f0 6d 65 6e 73 69 6f 6e 20 3d 3d 20 34 29 0a 09 09  mension == 4)...
18400 20 20 20 20 64 69 6d 73 20 3d 20 47 41 49 41 5f      dims = GAIA_
18410 58 59 5f 5a 5f 4d 3b 0a 09 20 20 20 20 7d 0a 09  XY_Z_M;..    }..
18420 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
18430 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
18440 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[4]) == SQLIT
18450 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09  E_TEXT)..    {..
18460 09 74 78 74 5f 64 69 6d 73 20 3d 20 73 71 6c 69  .txt_dims = sqli
18470 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
18480 61 72 67 76 5b 34 5d 29 3b 0a 09 09 69 66 20 28  argv[4]);...if (
18490 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61  strcasecmp ((cha
184a0 72 20 2a 29 20 74 78 74 5f 64 69 6d 73 2c 20 22  r *) txt_dims, "
184b0 58 59 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20  XY") == 0)...   
184c0 20 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b   dims = GAIA_XY;
184d0 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  ...if (strcasecm
184e0 70 20 28 28 63 68 61 72 20 2a 29 20 74 78 74 5f  p ((char *) txt_
184f0 64 69 6d 73 2c 20 22 58 59 5a 22 29 20 3d 3d 20  dims, "XYZ") == 
18500 30 29 0a 09 09 20 20 20 20 64 69 6d 73 20 3d 20  0)...    dims = 
18510 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 09 69 66 20  GAIA_XY_Z;...if 
18520 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68  (strcasecmp ((ch
18530 61 72 20 2a 29 20 74 78 74 5f 64 69 6d 73 2c 20  ar *) txt_dims, 
18540 22 58 59 4d 22 29 20 3d 3d 20 30 29 0a 09 09 20  "XYM") == 0)... 
18550 20 20 20 64 69 6d 73 20 3d 20 47 41 49 41 5f 58     dims = GAIA_X
18560 59 5f 4d 3b 0a 09 09 69 66 20 28 73 74 72 63 61  Y_M;...if (strca
18570 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20  secmp ((char *) 
18580 74 78 74 5f 64 69 6d 73 2c 20 22 58 59 5a 4d 22  txt_dims, "XYZM"
18590 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 64 69  ) == 0)...    di
185a0 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  ms = GAIA_XY_Z_M
185b0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
185c0 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61  ..    {...spatia
185d0 6c 69 74 65 5f 65 0a 09 09 20 20 20 20 28 22 41  lite_e...    ("A
185e0 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  ddGeometryColumn
185f0 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65  () error: argume
18600 6e 74 20 35 20 5b 64 69 6d 65 6e 73 69 6f 6e 5d  nt 5 [dimension]
18610 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 49   is not of the I
18620 6e 74 65 67 65 72 20 6f 72 20 54 65 78 74 20 74  nteger or Text t
18630 79 70 65 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74  ype\n");...sqlit
18640 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
18650 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 09 72 65  ontext, 0);...re
18660 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
18670 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
18680 63 20 3d 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a  c == 6).      {.
18690 09 20 20 2f 2a 20 6f 70 74 69 6f 6e 61 6c 20 4e  .  /* optional N
186a0 4f 54 20 4e 55 4c 4c 20 61 72 67 20 2a 2f 0a 09  OT NULL arg */..
186b0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
186c0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
186d0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) != SQLITE_INT
186e0 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73  EGER)..    {...s
186f0 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20  patialite_e...  
18700 20 20 28 22 41 64 64 47 65 6f 6d 65 74 72 79 43    ("AddGeometryC
18710 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61  olumn() error: a
18720 72 67 75 6d 65 6e 74 20 36 20 5b 6e 6f 74 20 6e  rgument 6 [not n
18730 75 6c 6c 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74  ull] is not of t
18740 68 65 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c  he Integer type\
18750 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  n");...sqlite3_r
18760 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
18770 78 74 2c 20 30 29 3b 0a 09 09 72 65 74 75 72 6e  xt, 0);...return
18780 3b 0a 09 20 20 20 20 7d 0a 09 20 20 6e 6f 74 4e  ;..    }..  notN
18790 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ull = sqlite3_va
187a0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 35 5d  lue_int (argv[5]
187b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 78  );.      }.    x
187c0 74 79 70 65 20 3d 20 47 41 49 41 5f 55 4e 4b 4e  type = GAIA_UNKN
187d0 4f 57 4e 3b 0a 20 20 20 20 69 66 20 28 73 74 72  OWN;.    if (str
187e0 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a  casecmp ((char *
187f0 29 20 74 79 70 65 2c 20 22 50 4f 49 4e 54 22 29  ) type, "POINT")
18800 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09   == 0).      {..
18810 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41    auto_dims = GA
18820 49 41 5f 58 59 3b 0a 09 20 20 78 74 79 70 65 20  IA_XY;..  xtype 
18830 3d 20 47 41 49 41 5f 50 4f 49 4e 54 3b 0a 20 20  = GAIA_POINT;.  
18840 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
18850 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
18860 2a 29 20 74 79 70 65 2c 20 22 4c 49 4e 45 53 54  *) type, "LINEST
18870 52 49 4e 47 22 29 20 3d 3d 20 30 29 0a 20 20 20  RING") == 0).   
18880 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
18890 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20 20  s = GAIA_XY;..  
188a0 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e  xtype = GAIA_LIN
188b0 45 53 54 52 49 4e 47 3b 0a 20 20 20 20 20 20 7d  ESTRING;.      }
188c0 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
188d0 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
188e0 70 65 2c 20 22 50 4f 4c 59 47 4f 4e 22 29 20 3d  pe, "POLYGON") =
188f0 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 0).      {..  
18900 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41  auto_dims = GAIA
18910 5f 58 59 3b 0a 09 20 20 78 74 79 70 65 20 3d 20  _XY;..  xtype = 
18920 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 20 20  GAIA_POLYGON;.  
18930 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
18940 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
18950 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 50  *) type, "MULTIP
18960 4f 49 4e 54 22 29 20 3d 3d 20 30 29 0a 20 20 20  OINT") == 0).   
18970 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
18980 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20 20  s = GAIA_XY;..  
18990 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c  xtype = GAIA_MUL
189a0 54 49 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d  TIPOINT;.      }
189b0 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
189c0 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
189d0 70 65 2c 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54  pe, "MULTILINEST
189e0 52 49 4e 47 22 29 20 3d 3d 20 30 29 0a 20 20 20  RING") == 0).   
189f0 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
18a00 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20 20  s = GAIA_XY;..  
18a10 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c  xtype = GAIA_MUL
18a20 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 20 20  TILINESTRING;.  
18a30 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
18a40 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
18a50 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 50  *) type, "MULTIP
18a60 4f 4c 59 47 4f 4e 22 29 20 3d 3d 20 30 29 0a 20  OLYGON") == 0). 
18a70 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64       {..  auto_d
18a80 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09  ims = GAIA_XY;..
18a90 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d    xtype = GAIA_M
18aa0 55 4c 54 49 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20  ULTIPOLYGON;.   
18ab0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 72     }.    if (str
18ac0 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a  casecmp ((char *
18ad0 29 20 74 79 70 65 2c 20 22 47 45 4f 4d 45 54 52  ) type, "GEOMETR
18ae0 59 43 4f 4c 4c 45 43 54 49 4f 4e 22 29 20 3d 3d  YCOLLECTION") ==
18af0 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61   0).      {..  a
18b00 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f  uto_dims = GAIA_
18b10 58 59 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47  XY;..  xtype = G
18b20 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
18b30 45 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a  ECTION;.      }.
18b40 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63      if (strcasec
18b50 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79 70  mp ((char *) typ
18b60 65 2c 20 22 47 45 4f 4d 45 54 52 59 22 29 20 3d  e, "GEOMETRY") =
18b70 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 0).      {..  
18b80 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41  auto_dims = GAIA
18b90 5f 58 59 3b 0a 09 20 20 78 74 79 70 65 20 3d 20  _XY;..  xtype = 
18ba0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
18bb0 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
18bc0 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22  (char *) type, "
18bd0 50 4f 49 4e 54 5a 22 29 20 3d 3d 20 30 29 0a 20  POINTZ") == 0). 
18be0 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64       {..  auto_d
18bf0 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b  ims = GAIA_XY_Z;
18c00 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41  ..  xtype = GAIA
18c10 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a  _POINT;.      }.
18c20 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63      if (strcasec
18c30 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79 70  mp ((char *) typ
18c40 65 2c 20 22 4c 49 4e 45 53 54 52 49 4e 47 5a 22  e, "LINESTRINGZ"
18c50 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  ) == 0).      {.
18c60 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47  .  auto_dims = G
18c70 41 49 41 5f 58 59 5f 5a 3b 0a 09 20 20 78 74 79  AIA_XY_Z;..  xty
18c80 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54  pe = GAIA_LINEST
18c90 52 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RING;.      }.  
18ca0 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
18cb0 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c   ((char *) type,
18cc0 20 22 50 4f 4c 59 47 4f 4e 5a 22 29 20 3d 3d 20   "POLYGONZ") == 
18cd0 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75  0).      {..  au
18ce0 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58  to_dims = GAIA_X
18cf0 59 5f 5a 3b 0a 09 20 20 78 74 79 70 65 20 3d 20  Y_Z;..  xtype = 
18d00 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 20 20  GAIA_POLYGON;.  
18d10 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
18d20 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
18d30 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 50  *) type, "MULTIP
18d40 4f 49 4e 54 5a 22 29 20 3d 3d 20 30 29 0a 20 20  OINTZ") == 0).  
18d50 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69      {..  auto_di
18d60 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a  ms = GAIA_XY_Z;.
18d70 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f  .  xtype = GAIA_
18d80 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 20 20 20 20  MULTIPOINT;.    
18d90 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63    }.    if (strc
18da0 61 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29  asecmp ((char *)
18db0 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 4c 49 4e   type, "MULTILIN
18dc0 45 53 54 52 49 4e 47 5a 22 29 20 3d 3d 20 30 29  ESTRINGZ") == 0)
18dd0 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f  .      {..  auto
18de0 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f  _dims = GAIA_XY_
18df0 5a 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41  Z;..  xtype = GA
18e00 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
18e10 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NG;.      }.    
18e20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
18e30 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22  (char *) type, "
18e40 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 22 29 20  MULTIPOLYGONZ") 
18e50 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
18e60 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49   auto_dims = GAI
18e70 41 5f 58 59 5f 5a 3b 0a 09 20 20 78 74 79 70 65  A_XY_Z;..  xtype
18e80 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c   = GAIA_MULTIPOL
18e90 59 47 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  YGON;.      }.  
18ea0 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
18eb0 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c   ((char *) type,
18ec0 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43   "GEOMETRYCOLLEC
18ed0 54 49 4f 4e 5a 22 29 20 3d 3d 20 30 29 0a 20 20  TIONZ") == 0).  
18ee0 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69      {..  auto_di
18ef0 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a  ms = GAIA_XY_Z;.
18f00 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f  .  xtype = GAIA_
18f10 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
18f20 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ON;.      }.    
18f30 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
18f40 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22  (char *) type, "
18f50 47 45 4f 4d 45 54 52 59 5a 22 29 20 3d 3d 20 30  GEOMETRYZ") == 0
18f60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74  ).      {..  aut
18f70 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  o_dims = GAIA_XY
18f80 5f 5a 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 2d  _Z;..  xtype = -
18f90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  1;.      }.    i
18fa0 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28  f (strcasecmp ((
18fb0 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 50  char *) type, "P
18fc0 4f 49 4e 54 4d 22 29 20 3d 3d 20 30 29 0a 20 20  OINTM") == 0).  
18fd0 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69      {..  auto_di
18fe0 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a  ms = GAIA_XY_M;.
18ff0 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f  .  xtype = GAIA_
19000 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20  POINT;.      }. 
19010 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d     if (strcasecm
19020 70 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65  p ((char *) type
19030 2c 20 22 4c 49 4e 45 53 54 52 49 4e 47 4d 22 29  , "LINESTRINGM")
19040 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09   == 0).      {..
19050 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41    auto_dims = GA
19060 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 78 74 79 70  IA_XY_M;..  xtyp
19070 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  e = GAIA_LINESTR
19080 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
19090 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
190a0 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
190b0 22 50 4f 4c 59 47 4f 4e 4d 22 29 20 3d 3d 20 30  "POLYGONM") == 0
190c0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74  ).      {..  aut
190d0 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  o_dims = GAIA_XY
190e0 5f 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47  _M;..  xtype = G
190f0 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20  AIA_POLYGON;.   
19100 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 72     }.    if (str
19110 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a  casecmp ((char *
19120 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f  ) type, "MULTIPO
19130 49 4e 54 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20  INTM") == 0).   
19140 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
19150 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a 09  s = GAIA_XY_M;..
19160 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d    xtype = GAIA_M
19170 55 4c 54 49 50 4f 49 4e 54 3b 0a 20 20 20 20 20  ULTIPOINT;.     
19180 20 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63 61   }.    if (strca
19190 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20  secmp ((char *) 
191a0 74 79 70 65 2c 20 22 4d 55 4c 54 49 4c 49 4e 45  type, "MULTILINE
191b0 53 54 52 49 4e 47 4d 22 29 20 3d 3d 20 30 29 0a  STRINGM") == 0).
191c0 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f        {..  auto_
191d0 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d  dims = GAIA_XY_M
191e0 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41 49  ;..  xtype = GAI
191f0 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
19200 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  G;.      }.    i
19210 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28  f (strcasecmp ((
19220 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 4d  char *) type, "M
19230 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 22 29 20 3d  ULTIPOLYGONM") =
19240 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 0).      {..  
19250 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41  auto_dims = GAIA
19260 5f 58 59 5f 4d 3b 0a 09 20 20 78 74 79 70 65 20  _XY_M;..  xtype 
19270 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
19280 47 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  GON;.      }.   
19290 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
192a0 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
192b0 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  "GEOMETRYCOLLECT
192c0 49 4f 4e 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20  IONM") == 0).   
192d0 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
192e0 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a 09  s = GAIA_XY_M;..
192f0 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 47    xtype = GAIA_G
19300 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
19310 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  N;.      }.    i
19320 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28  f (strcasecmp ((
19330 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 47  char *) type, "G
19340 45 4f 4d 45 54 52 59 4d 22 29 20 3d 3d 20 30 29  EOMETRYM") == 0)
19350 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f  .      {..  auto
19360 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f  _dims = GAIA_XY_
19370 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 2d 31  M;..  xtype = -1
19380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
19390 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63   (strcasecmp ((c
193a0 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 50 4f  har *) type, "PO
193b0 49 4e 54 5a 4d 22 29 20 3d 3d 20 30 29 0a 20 20  INTZM") == 0).  
193c0 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69      {..  auto_di
193d0 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  ms = GAIA_XY_Z_M
193e0 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41 49  ;..  xtype = GAI
193f0 41 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d  A_POINT;.      }
19400 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
19410 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
19420 70 65 2c 20 22 4c 49 4e 45 53 54 52 49 4e 47 5a  pe, "LINESTRINGZ
19430 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  M") == 0).      
19440 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d  {..  auto_dims =
19450 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20   GAIA_XY_Z_M;.. 
19460 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49   xtype = GAIA_LI
19470 4e 45 53 54 52 49 4e 47 3b 0a 20 20 20 20 20 20  NESTRING;.      
19480 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73  }.    if (strcas
19490 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74  ecmp ((char *) t
194a0 79 70 65 2c 20 22 50 4f 4c 59 47 4f 4e 5a 4d 22  ype, "POLYGONZM"
194b0 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  ) == 0).      {.
194c0 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47  .  auto_dims = G
194d0 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78  AIA_XY_Z_M;..  x
194e0 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59  type = GAIA_POLY
194f0 47 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  GON;.      }.   
19500 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
19510 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
19520 22 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 22 29 20  "MULTIPOINTZM") 
19530 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
19540 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49   auto_dims = GAI
19550 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79  A_XY_Z_M;..  xty
19560 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
19570 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OINT;.      }.  
19580 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
19590 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c   ((char *) type,
195a0 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e   "MULTILINESTRIN
195b0 47 5a 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20 20  GZM") == 0).    
195c0 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73    {..  auto_dims
195d0 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a   = GAIA_XY_Z_M;.
195e0 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f  .  xtype = GAIA_
195f0 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b  MULTILINESTRING;
19600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
19610 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68  (strcasecmp ((ch
19620 61 72 20 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c  ar *) type, "MUL
19630 54 49 50 4f 4c 59 47 4f 4e 5a 4d 22 29 20 3d 3d  TIPOLYGONZM") ==
19640 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61   0).      {..  a
19650 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f  uto_dims = GAIA_
19660 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79 70 65  XY_Z_M;..  xtype
19670 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c   = GAIA_MULTIPOL
19680 59 47 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  YGON;.      }.  
19690 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
196a0 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c   ((char *) type,
196b0 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43   "GEOMETRYCOLLEC
196c0 54 49 4f 4e 5a 4d 22 29 20 3d 3d 20 30 29 0a 20  TIONZM") == 0). 
196d0 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64       {..  auto_d
196e0 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  ims = GAIA_XY_Z_
196f0 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41  M;..  xtype = GA
19700 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
19710 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  CTION;.      }. 
19720 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d     if (strcasecm
19730 70 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65  p ((char *) type
19740 2c 20 22 47 45 4f 4d 45 54 52 59 5a 4d 22 29 20  , "GEOMETRYZM") 
19750 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
19760 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49   auto_dims = GAI
19770 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79  A_XY_Z_M;..  xty
19780 70 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  pe = -1;.      }
19790 0a 20 20 20 20 69 66 20 28 78 74 79 70 65 20 3d  .    if (xtype =
197a0 3d 20 47 41 49 41 5f 55 4e 4b 4e 4f 57 4e 29 0a  = GAIA_UNKNOWN).
197b0 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
197c0 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28  alite_e..      (
197d0 22 41 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75  "AddGeometryColu
197e0 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  mn() error: argu
197f0 6d 65 6e 74 20 34 20 5b 67 65 6f 6d 65 74 72 79  ment 4 [geometry
19800 5f 74 79 70 65 5d 20 68 61 73 20 61 6e 20 69 6c  _type] has an il
19810 6c 65 67 61 6c 20 76 61 6c 75 65 5c 6e 22 29 3b  legal value\n");
19820 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
19830 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
19840 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
19850 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
19860 64 69 6d 73 20 3c 20 30 29 0a 09 64 69 6d 73 20  dims < 0)..dims 
19870 3d 20 61 75 74 6f 5f 64 69 6d 73 3b 0a 20 20 20  = auto_dims;.   
19880 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49   if (dims == GAI
19890 41 5f 58 59 20 7c 7c 20 64 69 6d 73 20 3d 3d 20  A_XY || dims == 
198a0 47 41 49 41 5f 58 59 5f 5a 20 7c 7c 20 64 69 6d  GAIA_XY_Z || dim
198b0 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 0a 09  s == GAIA_XY_M..
198c0 7c 7c 20 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f  || dims == GAIA_
198d0 58 59 5f 5a 5f 4d 29 0a 09 3b 0a 20 20 20 20 65  XY_Z_M)..;.    e
198e0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
198f0 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
19900 20 20 20 28 22 41 64 64 47 65 6f 6d 65 74 72 79     ("AddGeometry
19910 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20  Column() error: 
19920 61 72 67 75 6d 65 6e 74 20 35 20 5b 64 69 6d 65  argument 5 [dime
19930 6e 73 69 6f 6e 5d 20 49 4c 4c 45 47 41 4c 20 56  nsion] ILLEGAL V
19940 41 4c 55 45 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  ALUE\n");..  sql
19950 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
19960 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
19970 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
19980 0a 20 20 20 20 69 66 20 28 61 75 74 6f 5f 64 69  .    if (auto_di
19990 6d 73 20 21 3d 20 47 41 49 41 5f 58 59 20 26 26  ms != GAIA_XY &&
199a0 20 64 69 6d 73 20 21 3d 20 61 75 74 6f 5f 64 69   dims != auto_di
199b0 6d 73 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  ms).      {..  s
199c0 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
199d0 20 20 20 28 22 41 64 64 47 65 6f 6d 65 74 72 79     ("AddGeometry
199e0 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20  Column() error: 
199f0 61 72 67 75 6d 65 6e 74 20 35 20 5b 64 69 6d 65  argument 5 [dime
19a00 6e 73 69 6f 6e 5d 20 49 4c 4c 45 47 41 4c 20 56  nsion] ILLEGAL V
19a10 41 4c 55 45 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  ALUE\n");..  sql
19a20 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
19a30 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
19a40 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
19a50 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69 66 20  ./* checking if 
19a60 74 68 65 20 74 61 62 6c 65 20 65 78 69 73 74 73  the table exists
19a70 20 2a 2f 0a 20 20 20 20 73 74 72 63 70 79 20 28   */.    strcpy (
19a80 73 71 6c 2c 0a 09 20 20 20 20 22 53 45 4c 45 43  sql,..    "SELEC
19a90 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
19aa0 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
19ab0 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41  type = 'table' A
19ac0 4e 44 20 4c 6f 77 65 72 28 6e 61 6d 65 29 20 3d  ND Lower(name) =
19ad0 20 4c 6f 77 65 72 28 3f 29 22 29 3b 0a 20 20 20   Lower(?)");.   
19ae0 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 70   ret = sqlite3_p
19af0 72 65 70 61 72 65 5f 76 32 20 28 73 71 6c 69 74  repare_v2 (sqlit
19b00 65 2c 20 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28  e, sql, strlen (
19b10 73 71 6c 29 2c 20 26 73 74 6d 74 2c 20 4e 55 4c  sql), &stmt, NUL
19b20 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20  L);.    if (ret 
19b30 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20  != SQLITE_OK).  
19b40 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
19b50 69 74 65 5f 65 20 28 22 41 64 64 47 65 6f 6d 65  ite_e ("AddGeome
19b60 74 72 79 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c  tryColumn: \"%s\
19b70 22 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "\n", sqlite3_er
19b80 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a  rmsg (sqlite));.
19b90 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
19ba0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
19bb0 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  0);..  return;. 
19bc0 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
19bd0 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b  e3_reset (stmt);
19be0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65  .    sqlite3_cle
19bf0 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d  ar_bindings (stm
19c00 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
19c10 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c  bind_text (stmt,
19c20 20 31 2c 20 74 61 62 6c 65 2c 20 73 74 72 6c 65   1, table, strle
19c30 6e 20 28 74 61 62 6c 65 29 2c 20 53 51 4c 49 54  n (table), SQLIT
19c40 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 77  E_STATIC);.    w
19c50 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b  hile (1).      {
19c60 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67  ..  /* scrolling
19c70 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
19c80 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d  rows */..  ret =
19c90 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73   sqlite3_step (s
19ca0 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74  tmt);..  if (ret
19cb0 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29   == SQLITE_DONE)
19cc0 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09  ..      break;..
19cd0 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74  /* end of result
19ce0 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72   set */..  if (r
19cf0 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  et == SQLITE_ROW
19d00 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70  )..    {...if (p
19d10 5f 74 61 62 6c 65 20 21 3d 20 4e 55 4c 4c 29 0a  _table != NULL).
19d20 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ..    sqlite3_fr
19d30 65 65 20 28 70 5f 74 61 62 6c 65 29 3b 0a 09 09  ee (p_table);...
19d40 70 5f 74 61 62 6c 65 20 3d 0a 09 09 20 20 20 20  p_table =...    
19d50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
19d60 28 22 25 73 22 2c 0a 09 09 09 09 20 20 20 20 20  ("%s",.....     
19d70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
19d80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
19d90 78 74 20 28 73 74 6d 74 2c 0a 09 09 09 09 09 09  xt (stmt,.......
19da0 09 09 09 20 30 29 29 3b 0a 09 20 20 20 20 7d 0a  ... 0));..    }.
19db0 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69        }.    sqli
19dc0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74  te3_finalize (st
19dd0 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 21 70 5f  mt);.    if (!p_
19de0 74 61 62 6c 65 29 0a 20 20 20 20 20 20 7b 0a 09  table).      {..
19df0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
19e00 20 20 20 20 20 20 28 22 41 64 64 47 65 6f 6d 65        ("AddGeome
19e10 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f  tryColumn() erro
19e20 72 3a 20 74 61 62 6c 65 20 27 25 73 27 20 64 6f  r: table '%s' do
19e30 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 2c  es not exist\n",
19e40 20 74 61 62 6c 65 29 3b 0a 09 20 20 73 71 6c 69   table);..  sqli
19e50 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
19e60 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
19e70 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
19e80 2f 2a 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  /* checking for 
19e90 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
19ea0 0a 20 20 20 20 69 66 20 28 69 73 5f 77 69 74 68  .    if (is_with
19eb0 6f 75 74 5f 72 6f 77 69 64 5f 74 61 62 6c 65 20  out_rowid_table 
19ec0 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 29 29  (sqlite, table))
19ed0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
19ee0 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
19ef0 28 22 41 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c  ("AddGeometryCol
19f00 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 74 61 62  umn() error: tab
19f10 6c 65 20 27 25 73 27 20 69 73 20 57 49 54 48 4f  le '%s' is WITHO
19f20 55 54 20 52 4f 57 49 44 5c 6e 22 2c 0a 09 20 20  UT ROWID\n",..  
19f30 20 20 20 20 20 74 61 62 6c 65 29 3b 0a 09 20 20       table);..  
19f40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
19f50 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
19f60 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
19f70 20 20 7d 0a 20 20 20 20 6d 65 74 61 64 61 74 61    }.    metadata
19f80 5f 76 65 72 73 69 6f 6e 20 3d 20 63 68 65 63 6b  _version = check
19f90 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 20  SpatialMetaData 
19fa0 28 73 71 6c 69 74 65 29 3b 0a 20 20 20 20 69 66  (sqlite);.    if
19fb0 20 28 6d 65 74 61 64 61 74 61 5f 76 65 72 73 69   (metadata_versi
19fc0 6f 6e 20 3d 3d 20 31 20 7c 7c 20 6d 65 74 61 64  on == 1 || metad
19fd0 61 74 61 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 33  ata_version == 3
19fe0 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  )..;.    else.  
19ff0 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
1a000 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 41  ite_e..      ("A
1a010 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  ddGeometryColumn
1a020 28 29 20 65 72 72 6f 72 3a 20 75 6e 65 78 70 65  () error: unexpe
1a030 63 74 65 64 20 6d 65 74 61 64 61 74 61 20 6c 61  cted metadata la
1a040 79 6f 75 74 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  yout\n");..  sql
1a050 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
1a060 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
1a070 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
1a080 0a 2f 2a 20 74 72 79 69 6e 67 20 74 6f 20 61 64  ./* trying to ad
1a090 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  d the column */.
1a0a0 20 20 20 20 73 77 69 74 63 68 20 28 78 74 79 70      switch (xtyp
1a0b0 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  e).      {.     
1a0c0 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
1a0d0 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d 20 22 50  :..  p_type = "P
1a0e0 4f 49 4e 54 22 3b 0a 09 20 20 62 72 65 61 6b 3b  OINT";..  break;
1a0f0 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
1a100 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20 20  _LINESTRING:..  
1a110 70 5f 74 79 70 65 20 3d 20 22 4c 49 4e 45 53 54  p_type = "LINEST
1a120 52 49 4e 47 22 3b 0a 09 20 20 62 72 65 61 6b 3b  RING";..  break;
1a130 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
1a140 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 70 5f 74  _POLYGON:..  p_t
1a150 79 70 65 20 3d 20 22 50 4f 4c 59 47 4f 4e 22 3b  ype = "POLYGON";
1a160 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
1a170 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
1a180 50 4f 49 4e 54 3a 0a 09 20 20 70 5f 74 79 70 65  POINT:..  p_type
1a190 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e 54 22 3b   = "MULTIPOINT";
1a1a0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
1a1b0 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
1a1c0 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20 20 70  LINESTRING:..  p
1a1d0 5f 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 4c 49  _type = "MULTILI
1a1e0 4e 45 53 54 52 49 4e 47 22 3b 0a 09 20 20 62 72  NESTRING";..  br
1a1f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
1a200 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
1a210 4e 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d 20 22  N:..  p_type = "
1a220 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 22 3b 0a 09  MULTIPOLYGON";..
1a230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
1a240 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  ase GAIA_GEOMETR
1a250 59 43 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 20 20  YCOLLECTION:..  
1a260 70 5f 74 79 70 65 20 3d 20 22 47 45 4f 4d 45 54  p_type = "GEOMET
1a270 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 22 3b 0a 09  RYCOLLECTION";..
1a280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
1a290 61 73 65 20 2d 31 3a 0a 09 20 20 70 5f 74 79 70  ase -1:..  p_typ
1a2a0 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 22 3b 0a  e = "GEOMETRY";.
1a2b0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
1a2c0 7d 3b 0a 20 20 20 20 71 75 6f 74 65 64 5f 74 61  };.    quoted_ta
1a2d0 62 6c 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  ble = gaiaDouble
1a2e0 51 75 6f 74 65 64 53 71 6c 20 28 70 5f 74 61 62  QuotedSql (p_tab
1a2f0 6c 65 29 3b 0a 20 20 20 20 71 75 6f 74 65 64 5f  le);.    quoted_
1a300 63 6f 6c 75 6d 6e 20 3d 20 67 61 69 61 44 6f 75  column = gaiaDou
1a310 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 63 6f  bleQuotedSql (co
1a320 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 20 28 6e  lumn);.    if (n
1a330 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 20 20 7b 0a  otNull).      {.
1a340 09 20 20 2f 2a 20 61 64 64 69 6e 67 20 61 20 4e  .  /* adding a N
1a350 4f 54 20 4e 55 4c 4c 20 63 6c 61 75 73 65 20 2a  OT NULL clause *
1a360 2f 0a 09 20 20 73 71 6c 5f 73 74 61 74 65 6d 65  /..  sql_stateme
1a370 6e 74 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69  nt =..      sqli
1a380 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 41 4c  te3_mprintf ("AL
1a390 54 45 52 20 54 41 42 4c 45 20 5c 22 25 73 5c 22  TER TABLE \"%s\"
1a3a0 20 41 44 44 20 43 4f 4c 55 4d 4e 20 5c 22 25 73   ADD COLUMN \"%s
1a3b0 5c 22 20 22 0a 09 09 09 20 20 20 20 20 20 20 22  \" "....       "
1a3c0 25 73 20 4e 4f 54 20 4e 55 4c 4c 20 44 45 46 41  %s NOT NULL DEFA
1a3d0 55 4c 54 20 27 27 22 2c 20 71 75 6f 74 65 64 5f  ULT ''", quoted_
1a3e0 74 61 62 6c 65 2c 0a 09 09 09 20 20 20 20 20 20  table,....      
1a3f0 20 71 75 6f 74 65 64 5f 63 6f 6c 75 6d 6e 2c 20   quoted_column, 
1a400 70 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 7d  p_type);.      }
1a410 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 5f 73  .    else..sql_s
1a420 74 61 74 65 6d 65 6e 74 20 3d 0a 09 20 20 20 20  tatement =..    
1a430 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
1a440 28 22 41 4c 54 45 52 20 54 41 42 4c 45 20 5c 22  ("ALTER TABLE \"
1a450 25 73 5c 22 20 41 44 44 20 43 4f 4c 55 4d 4e 20  %s\" ADD COLUMN 
1a460 5c 22 25 73 5c 22 20 25 73 20 22 2c 0a 09 09 09  \"%s\" %s ",....
1a470 20 20 20 20 20 71 75 6f 74 65 64 5f 74 61 62 6c       quoted_tabl
1a480 65 2c 20 71 75 6f 74 65 64 5f 63 6f 6c 75 6d 6e  e, quoted_column
1a490 2c 20 70 5f 74 79 70 65 29 3b 0a 20 20 20 20 66  , p_type);.    f
1a4a0 72 65 65 20 28 71 75 6f 74 65 64 5f 74 61 62 6c  ree (quoted_tabl
1a4b0 65 29 3b 0a 20 20 20 20 66 72 65 65 20 28 71 75  e);.    free (qu
1a4c0 6f 74 65 64 5f 63 6f 6c 75 6d 6e 29 3b 0a 20 20  oted_column);.  
1a4d0 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
1a4e0 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71  exec (sqlite, sq
1a4f0 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c  l_statement, NUL
1a500 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
1a510 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a520 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
1a530 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
1a540 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20   SQLITE_OK).    
1a550 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
1a560 65 5f 65 20 28 22 41 64 64 47 65 6f 6d 65 74 72  e_e ("AddGeometr
1a570 79 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c  yColumn: \"%s\"\
1a580 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
1a590 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20  sg (sqlite));.. 
1a5a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1a5b0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
1a5c0 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
1a5d0 65 20 28 70 5f 74 61 62 6c 65 29 3b 0a 09 20 20  e (p_table);..  
1a5e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1a5f0 2f 2a 20 6f 6b 2c 20 69 6e 73 65 72 74 69 6e 67  /* ok, inserting
1a600 20 69 6e 74 6f 20 67 65 6f 6d 65 74 72 79 5f 63   into geometry_c
1a610 6f 6c 75 6d 6e 73 20 5b 53 70 61 74 69 61 6c 20  olumns [Spatial 
1a620 4d 65 74 61 64 61 74 61 5d 20 2a 2f 0a 20 20 20  Metadata] */.   
1a630 20 69 66 20 28 6d 65 74 61 64 61 74 61 5f 76 65   if (metadata_ve
1a640 72 73 69 6f 6e 20 3d 3d 20 31 29 0a 20 20 20 20  rsion == 1).    
1a650 20 20 7b 0a 09 20 20 2f 2a 20 6c 65 67 61 63 79    {..  /* legacy
1a660 20 6d 65 74 61 64 61 74 61 20 73 74 79 6c 65 20   metadata style 
1a670 3c 3d 20 76 2e 33 2e 31 2e 30 20 2a 2f 0a 09 20  <= v.3.1.0 */.. 
1a680 20 73 77 69 74 63 68 20 28 78 74 79 70 65 29 0a   switch (xtype).
1a690 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65  .    {..    case
1a6a0 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09 70   GAIA_POINT:...p
1a6b0 5f 74 79 70 65 20 3d 20 22 50 4f 49 4e 54 22 3b  _type = "POINT";
1a6c0 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
1a6d0 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  ase GAIA_LINESTR
1a6e0 49 4e 47 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20  ING:...p_type = 
1a6f0 22 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a 09 09  "LINESTRING";...
1a700 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
1a710 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3a 0a 09   GAIA_POLYGON:..
1a720 09 70 5f 74 79 70 65 20 3d 20 22 50 4f 4c 59 47  .p_type = "POLYG
1a730 4f 4e 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  ON";...break;.. 
1a740 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
1a750 54 49 50 4f 49 4e 54 3a 0a 09 09 70 5f 74 79 70  TIPOINT:...p_typ
1a760 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e 54 22  e = "MULTIPOINT"
1a770 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1a780 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c  case GAIA_MULTIL
1a790 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 70 5f 74  INESTRING:...p_t
1a7a0 79 70 65 20 3d 20 22 4d 55 4c 54 49 4c 49 4e 45  ype = "MULTILINE
1a7b0 53 54 52 49 4e 47 22 3b 0a 09 09 62 72 65 61 6b  STRING";...break
1a7c0 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
1a7d0 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09  _MULTIPOLYGON:..
1a7e0 09 70 5f 74 79 70 65 20 3d 20 22 4d 55 4c 54 49  .p_type = "MULTI
1a7f0 50 4f 4c 59 47 4f 4e 22 3b 0a 09 09 62 72 65 61  POLYGON";...brea
1a800 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
1a810 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
1a820 54 49 4f 4e 3a 0a 09 09 70 5f 74 79 70 65 20 3d  TION:...p_type =
1a830 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43   "GEOMETRYCOLLEC
1a840 54 49 4f 4e 22 3b 0a 09 09 62 72 65 61 6b 3b 0a  TION";...break;.
1a850 09 20 20 20 20 63 61 73 65 20 2d 31 3a 0a 09 09  .    case -1:...
1a860 70 5f 74 79 70 65 20 3d 20 22 47 45 4f 4d 45 54  p_type = "GEOMET
1a870 52 59 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  RY";...break;.. 
1a880 20 20 20 7d 3b 0a 09 20 20 73 77 69 74 63 68 20     };..  switch 
1a890 28 64 69 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20  (dims)..    {.. 
1a8a0 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 3a     case GAIA_XY:
1a8b0 0a 09 09 70 5f 64 69 6d 73 20 3d 20 22 58 59 22  ...p_dims = "XY"
1a8c0 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1a8d0 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a  case GAIA_XY_Z:.
1a8e0 09 09 70 5f 64 69 6d 73 20 3d 20 22 58 59 5a 22  ..p_dims = "XYZ"
1a8f0 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1a900 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a  case GAIA_XY_M:.
1a910 09 09 70 5f 64 69 6d 73 20 3d 20 22 58 59 4d 22  ..p_dims = "XYM"
1a920 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1a930 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  case GAIA_XY_Z_M
1a940 3a 0a 09 09 70 5f 64 69 6d 73 20 3d 20 22 58 59  :...p_dims = "XY
1a950 5a 4d 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  ZM";...break;.. 
1a960 20 20 20 7d 3b 0a 09 20 20 73 71 6c 5f 73 74 61     };..  sql_sta
1a970 74 65 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  tement = sqlite3
1a980 5f 6d 70 72 69 6e 74 66 20 28 22 49 4e 53 45 52  _mprintf ("INSER
1a990 54 20 49 4e 54 4f 20 67 65 6f 6d 65 74 72 79 5f  T INTO geometry_
1a9a0 63 6f 6c 75 6d 6e 73 20 22 0a 09 09 09 09 09 20  columns "...... 
1a9b0 20 20 22 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65    "(f_table_name
1a9c0 2c 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c  , f_geometry_col
1a9d0 75 6d 6e 2c 20 74 79 70 65 2c 20 63 6f 6f 72 64  umn, type, coord
1a9e0 5f 64 69 6d 65 6e 73 69 6f 6e 2c 20 73 72 69 64  _dimension, srid
1a9f0 2c 20 22 0a 09 09 09 09 09 20 20 20 22 73 70 61  , "......   "spa
1aa00 74 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c  tial_index_enabl
1aa10 65 64 29 20 56 41 4c 55 45 53 20 28 3f 2c 20 3f  ed) VALUES (?, ?
1aa20 2c 20 25 51 2c 20 25 51 2c 20 3f 2c 20 30 29 22  , %Q, %Q, ?, 0)"
1aa30 2c 0a 09 09 09 09 09 20 20 20 70 5f 74 79 70 65  ,......   p_type
1aa40 2c 20 70 5f 64 69 6d 73 29 3b 0a 20 20 20 20 20  , p_dims);.     
1aa50 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
1aa60 20 20 7b 0a 09 20 20 2f 2a 20 63 75 72 72 65 6e    {..  /* curren
1aa70 74 20 6d 65 74 61 64 61 74 61 20 73 74 79 6c 65  t metadata style
1aa80 20 3e 3d 20 76 2e 34 2e 30 2e 30 20 2a 2f 0a 09   >= v.4.0.0 */..
1aa90 20 20 73 77 69 74 63 68 20 28 78 74 79 70 65 29    switch (xtype)
1aaa0 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73  ..    {..    cas
1aab0 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09  e GAIA_POINT:...
1aac0 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41  if (dims == GAIA
1aad0 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 6e 5f 74  _XY_Z)...    n_t
1aae0 79 70 65 20 3d 20 31 30 30 31 3b 0a 09 09 65 6c  ype = 1001;...el
1aaf0 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  se if (dims == G
1ab00 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20  AIA_XY_M)...    
1ab10 6e 5f 74 79 70 65 20 3d 20 32 30 30 31 3b 0a 09  n_type = 2001;..
1ab20 09 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d  .else if (dims =
1ab30 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
1ab40 09 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 33 30  .    n_type = 30
1ab50 30 31 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20  01;...else...   
1ab60 20 6e 5f 74 79 70 65 20 3d 20 31 3b 0a 09 09 62   n_type = 1;...b
1ab70 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
1ab80 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3a  GAIA_LINESTRING:
1ab90 0a 09 09 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  ...if (dims == G
1aba0 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20  AIA_XY_Z)...    
1abb0 6e 5f 74 79 70 65 20 3d 20 31 30 30 32 3b 0a 09  n_type = 1002;..
1abc0 09 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d  .else if (dims =
1abd0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
1abe0 20 20 20 6e 5f 74 79 70 65 20 3d 20 32 30 30 32     n_type = 2002
1abf0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 64 69 6d  ;...else if (dim
1ac00 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  s == GAIA_XY_Z_M
1ac10 29 0a 09 09 20 20 20 20 6e 5f 74 79 70 65 20 3d  )...    n_type =
1ac20 20 33 30 30 32 3b 0a 09 09 65 6c 73 65 0a 09 09   3002;...else...
1ac30 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 32 3b 0a      n_type = 2;.
1ac40 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
1ac50 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3a  se GAIA_POLYGON:
1ac60 0a 09 09 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  ...if (dims == G
1ac70 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20  AIA_XY_Z)...    
1ac80 6e 5f 74 79 70 65 20 3d 20 31 30 30 33 3b 0a 09  n_type = 1003;..
1ac90 09 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d  .else if (dims =
1aca0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
1acb0 20 20 20 6e 5f 74 79 70 65 20 3d 20 32 30 30 33     n_type = 2003
1acc0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 64 69 6d  ;...else if (dim
1acd0 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  s == GAIA_XY_Z_M
1ace0 29 0a 09 09 20 20 20 20 6e 5f 74 79 70 65 20 3d  )...    n_type =
1acf0 20 33 30 30 33 3b 0a 09 09 65 6c 73 65 0a 09 09   3003;...else...
1ad00 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 33 3b 0a      n_type = 3;.
1ad10 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
1ad20 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49  se GAIA_MULTIPOI
1ad30 4e 54 3a 0a 09 09 69 66 20 28 64 69 6d 73 20 3d  NT:...if (dims =
1ad40 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20  = GAIA_XY_Z)... 
1ad50 20 20 20 6e 5f 74 79 70 65 20 3d 20 31 30 30 34     n_type = 1004
1ad60 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 64 69 6d  ;...else if (dim
1ad70 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  s == GAIA_XY_M).
1ad80 09 09 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 32  ..    n_type = 2
1ad90 30 30 34 3b 0a 09 09 65 6c 73 65 20 69 66 20 28  004;...else if (
1ada0 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f  dims == GAIA_XY_
1adb0 5a 5f 4d 29 0a 09 09 20 20 20 20 6e 5f 74 79 70  Z_M)...    n_typ
1adc0 65 20 3d 20 33 30 30 34 3b 0a 09 09 65 6c 73 65  e = 3004;...else
1add0 0a 09 09 20 20 20 20 6e 5f 74 79 70 65 20 3d 20  ...    n_type = 
1ade0 34 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  4;...break;..   
1adf0 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
1ae00 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 69 66  LINESTRING:...if
1ae10 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58   (dims == GAIA_X
1ae20 59 5f 5a 29 0a 09 09 20 20 20 20 6e 5f 74 79 70  Y_Z)...    n_typ
1ae30 65 20 3d 20 31 30 30 35 3b 0a 09 09 65 6c 73 65  e = 1005;...else
1ae40 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49   if (dims == GAI
1ae50 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 6e 5f  A_XY_M)...    n_
1ae60 74 79 70 65 20 3d 20 32 30 30 35 3b 0a 09 09 65  type = 2005;...e
1ae70 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20  lse if (dims == 
1ae80 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20  GAIA_XY_Z_M)... 
1ae90 20 20 20 6e 5f 74 79 70 65 20 3d 20 33 30 30 35     n_type = 3005
1aea0 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 6e  ;...else...    n
1aeb0 5f 74 79 70 65 20 3d 20 35 3b 0a 09 09 62 72 65  _type = 5;...bre
1aec0 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
1aed0 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a  IA_MULTIPOLYGON:
1aee0 0a 09 09 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  ...if (dims == G
1aef0 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20  AIA_XY_Z)...    
1af00 6e 5f 74 79 70 65 20 3d 20 31 30 30 36 3b 0a 09  n_type = 1006;..
1af10 09 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d  .else if (dims =
1af20 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
1af30 20 20 20 6e 5f 74 79 70 65 20 3d 20 32 30 30 36     n_type = 2006
1af40 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 64 69 6d  ;...else if (dim
1af50 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  s == GAIA_XY_Z_M
1af60 29 0a 09 09 20 20 20 20 6e 5f 74 79 70 65 20 3d  )...    n_type =
1af70 20 33 30 30 36 3b 0a 09 09 65 6c 73 65 0a 09 09   3006;...else...
1af80 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 36 3b 0a      n_type = 6;.
1af90 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
1afa0 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  se GAIA_GEOMETRY
1afb0 43 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 09 69 66  COLLECTION:...if
1afc0 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58   (dims == GAIA_X
1afd0 59 5f 5a 29 0a 09 09 20 20 20 20 6e 5f 74 79 70  Y_Z)...    n_typ
1afe0 65 20 3d 20 31 30 30 37 3b 0a 09 09 65 6c 73 65  e = 1007;...else
1aff0 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49   if (dims == GAI
1b000 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 6e 5f  A_XY_M)...    n_
1b010 74 79 70 65 20 3d 20 32 30 30 37 3b 0a 09 09 65  type = 2007;...e
1b020 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20  lse if (dims == 
1b030 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20  GAIA_XY_Z_M)... 
1b040 20 20 20 6e 5f 74 79 70 65 20 3d 20 33 30 30 37     n_type = 3007
1b050 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 6e  ;...else...    n
1b060 5f 74 79 70 65 20 3d 20 37 3b 0a 09 09 62 72 65  _type = 7;...bre
1b070 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 2d 31  ak;..    case -1
1b080 3a 0a 09 09 69 66 20 28 64 69 6d 73 20 3d 3d 20  :...if (dims == 
1b090 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20  GAIA_XY_Z)...   
1b0a0 20 6e 5f 74 79 70 65 20 3d 20 31 30 30 30 3b 0a   n_type = 1000;.
1b0b0 09 09 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20  ..else if (dims 
1b0c0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
1b0d0 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 32 30 30      n_type = 200
1b0e0 30 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 64 69  0;...else if (di
1b0f0 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  ms == GAIA_XY_Z_
1b100 4d 29 0a 09 09 20 20 20 20 6e 5f 74 79 70 65 20  M)...    n_type 
1b110 3d 20 33 30 30 30 3b 0a 09 09 65 6c 73 65 0a 09  = 3000;...else..
1b120 09 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 30 3b  .    n_type = 0;
1b130 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d  ...break;..    }
1b140 3b 0a 09 20 20 73 77 69 74 63 68 20 28 64 69 6d  ;..  switch (dim
1b150 73 29 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63  s)..    {..    c
1b160 61 73 65 20 47 41 49 41 5f 58 59 3a 0a 09 09 6e  ase GAIA_XY:...n
1b170 5f 64 69 6d 73 20 3d 20 32 3b 0a 09 09 62 72 65  _dims = 2;...bre
1b180 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
1b190 49 41 5f 58 59 5f 5a 3a 0a 09 20 20 20 20 63 61  IA_XY_Z:..    ca
1b1a0 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09  se GAIA_XY_M:...
1b1b0 6e 5f 64 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72  n_dims = 3;...br
1b1c0 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
1b1d0 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 6e 5f  AIA_XY_Z_M:...n_
1b1e0 64 69 6d 73 20 3d 20 34 3b 0a 09 09 62 72 65 61  dims = 4;...brea
1b1f0 6b 3b 0a 09 20 20 20 20 7d 3b 0a 09 20 20 73 71  k;..    };..  sq
1b200 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20 73 71  l_statement = sq
1b210 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
1b220 49 4e 53 45 52 54 20 49 4e 54 4f 20 67 65 6f 6d  INSERT INTO geom
1b230 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 22 0a 09  etry_columns "..
1b240 09 09 09 09 20 20 20 22 28 66 5f 74 61 62 6c 65  ....   "(f_table
1b250 5f 6e 61 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72  _name, f_geometr
1b260 79 5f 63 6f 6c 75 6d 6e 2c 20 67 65 6f 6d 65 74  y_column, geomet
1b270 72 79 5f 74 79 70 65 2c 20 63 6f 6f 72 64 5f 64  ry_type, coord_d
1b280 69 6d 65 6e 73 69 6f 6e 2c 20 22 0a 09 09 09 09  imension, ".....
1b290 09 20 20 20 22 73 72 69 64 2c 20 73 70 61 74 69  .   "srid, spati
1b2a0 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65 64  al_index_enabled
1b2b0 29 20 56 41 4c 55 45 53 20 28 4c 6f 77 65 72 28  ) VALUES (Lower(
1b2c0 3f 29 2c 20 4c 6f 77 65 72 28 3f 29 2c 20 25 64  ?), Lower(?), %d
1b2d0 2c 20 25 64 2c 20 3f 2c 20 30 29 22 2c 0a 09 09  , %d, ?, 0)",...
1b2e0 09 09 09 20 20 20 6e 5f 74 79 70 65 2c 20 6e 5f  ...   n_type, n_
1b2f0 64 69 6d 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dims);.      }. 
1b300 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
1b310 5f 70 72 65 70 61 72 65 5f 76 32 20 28 73 71 6c  _prepare_v2 (sql
1b320 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  ite, sql_stateme
1b330 6e 74 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 5f  nt, strlen (sql_
1b340 73 74 61 74 65 6d 65 6e 74 29 2c 0a 09 09 09 20  statement),.... 
1b350 20 20 20 20 20 26 73 74 6d 74 2c 20 4e 55 4c 4c       &stmt, NULL
1b360 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1b370 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65  ree (sql_stateme
1b380 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74  nt);.    if (ret
1b390 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20   != SQLITE_OK). 
1b3a0 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
1b3b0 6c 69 74 65 5f 65 20 28 22 41 64 64 47 65 6f 6d  lite_e ("AddGeom
1b3c0 65 74 72 79 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73  etryColumn: \"%s
1b3d0 5c 22 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  \"\n", sqlite3_e
1b3e0 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29 3b  rrmsg (sqlite));
1b3f0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
1b400 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
1b410 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f   0);..  sqlite3_
1b420 66 72 65 65 20 28 70 5f 74 61 62 6c 65 29 3b 0a  free (p_table);.
1b430 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
1b440 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
1b450 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20  eset (stmt);.   
1b460 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
1b470 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a  indings (stmt);.
1b480 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b490 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 31 2c 20  _text (stmt, 1, 
1b4a0 70 5f 74 61 62 6c 65 2c 20 73 74 72 6c 65 6e 20  p_table, strlen 
1b4b0 28 70 5f 74 61 62 6c 65 29 2c 20 53 51 4c 49 54  (p_table), SQLIT
1b4c0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
1b4d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1b4e0 20 28 73 74 6d 74 2c 20 32 2c 20 63 6f 6c 75 6d   (stmt, 2, colum
1b4f0 6e 2c 20 73 74 72 6c 65 6e 20 28 63 6f 6c 75 6d  n, strlen (colum
1b500 6e 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  n), SQLITE_STATI
1b510 43 29 3b 0a 20 20 20 20 69 66 20 28 73 72 69 64  C);.    if (srid
1b520 20 3c 20 30 29 0a 09 73 71 6c 69 74 65 33 5f 62   < 0)..sqlite3_b
1b530 69 6e 64 5f 69 6e 74 20 28 73 74 6d 74 2c 20 33  ind_int (stmt, 3
1b540 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a  , -1);.    else.
1b550 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e  .sqlite3_bind_in
1b560 74 20 28 73 74 6d 74 2c 20 33 2c 20 73 72 69 64  t (stmt, 3, srid
1b570 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c  );.    ret = sql
1b580 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29  ite3_step (stmt)
1b590 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 3d 3d  ;.    if (ret ==
1b5a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20   SQLITE_DONE || 
1b5b0 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f  ret == SQLITE_RO
1b5c0 57 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20  W)..;.    else. 
1b5d0 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
1b5e0 6c 69 74 65 5f 65 20 28 22 41 64 64 47 65 6f 6d  lite_e ("AddGeom
1b5f0 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72  etryColumn() err
1b600 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09  or: \"%s\"\n",..
1b610 09 09 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  ..sqlite3_errmsg
1b620 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20 20 73   (sqlite));..  s
1b630 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
1b640 28 73 74 6d 74 29 3b 0a 09 20 20 67 6f 74 6f 20  (stmt);..  goto 
1b650 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
1b660 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1b670 69 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20  ize (stmt);.    
1b680 69 66 20 28 6d 65 74 61 64 61 74 61 5f 76 65 72  if (metadata_ver
1b690 73 69 6f 6e 20 3d 3d 20 33 29 0a 20 20 20 20 20  sion == 3).     
1b6a0 20 7b 0a 09 20 20 2f 2a 20 63 75 72 72 65 6e 74   {..  /* current
1b6b0 20 6d 65 74 61 64 61 74 61 20 73 74 79 6c 65 20   metadata style 
1b6c0 3e 3d 20 76 2e 34 2e 30 2e 30 20 2a 2f 0a 0a 09  >= v.4.0.0 */...
1b6d0 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61    /* inserting a
1b6e0 20 72 6f 77 20 69 6e 74 6f 20 47 45 4f 4d 45 54   row into GEOMET
1b6f0 52 59 5f 43 4f 4c 55 4d 4e 53 5f 41 55 54 48 20  RY_COLUMNS_AUTH 
1b700 2a 2f 0a 09 20 20 73 74 72 63 70 79 20 28 73 71  */..  strcpy (sq
1b710 6c 2c 0a 09 09 20 20 22 49 4e 53 45 52 54 20 4f  l,...  "INSERT O
1b720 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 67  R REPLACE INTO g
1b730 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 5f  eometry_columns_
1b740 61 75 74 68 20 28 66 5f 74 61 62 6c 65 5f 6e 61  auth (f_table_na
1b750 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63  me, f_geometry_c
1b760 6f 6c 75 6d 6e 2c 20 22 29 3b 0a 09 20 20 73 74  olumn, ");..  st
1b770 72 63 61 74 20 28 73 71 6c 2c 20 22 72 65 61 64  rcat (sql, "read
1b780 5f 6f 6e 6c 79 2c 20 68 69 64 64 65 6e 29 20 56  _only, hidden) V
1b790 41 4c 55 45 53 20 28 4c 6f 77 65 72 28 3f 29 2c  ALUES (Lower(?),
1b7a0 20 4c 6f 77 65 72 28 3f 29 2c 20 30 2c 20 30 29   Lower(?), 0, 0)
1b7b0 22 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c  ");..  ret = sql
1b7c0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
1b7d0 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 73 74  (sqlite, sql, st
1b7e0 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d  rlen (sql), &stm
1b7f0 74 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 69 66 20  t, NULL);..  if 
1b800 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f  (ret != SQLITE_O
1b810 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74  K)..    {...spat
1b820 69 61 6c 69 74 65 5f 65 20 28 22 41 64 64 47 65  ialite_e ("AddGe
1b830 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 3a 20 5c 22  ometryColumn: \"
1b840 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 20 20 20 20  %s\"\n",....    
1b850 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
1b860 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 09 73 71   (sqlite));...sq
1b870 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1b880 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09   (context, 0);..
1b890 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70  .sqlite3_free (p
1b8a0 5f 74 61 62 6c 65 29 3b 0a 09 09 72 65 74 75 72  _table);...retur
1b8b0 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c  n;..    }..  sql
1b8c0 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74  ite3_reset (stmt
1b8d0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 6c  );..  sqlite3_cl
1b8e0 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74  ear_bindings (st
1b8f0 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  mt);..  sqlite3_
1b900 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c  bind_text (stmt,
1b910 20 31 2c 20 74 61 62 6c 65 2c 20 73 74 72 6c 65   1, table, strle
1b920 6e 20 28 74 61 62 6c 65 29 2c 20 53 51 4c 49 54  n (table), SQLIT
1b930 45 5f 53 54 41 54 49 43 29 3b 0a 09 20 20 73 71  E_STATIC);..  sq
1b940 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
1b950 28 73 74 6d 74 2c 20 32 2c 20 63 6f 6c 75 6d 6e  (stmt, 2, column
1b960 2c 20 73 74 72 6c 65 6e 20 28 63 6f 6c 75 6d 6e  , strlen (column
1b970 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ), SQLITE_STATIC
1b980 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69  );..  ret = sqli
1b990 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b  te3_step (stmt);
1b9a0 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53  ..  if (ret == S
1b9b0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65  QLITE_DONE || re
1b9c0 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29  t == SQLITE_ROW)
1b9d0 0a 09 20 20 20 20 20 20 3b 0a 09 20 20 65 6c 73  ..      ;..  els
1b9e0 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69  e..    {...spati
1b9f0 61 6c 69 74 65 5f 65 20 28 22 41 64 64 47 65 6f  alite_e ("AddGeo
1ba00 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72  metryColumn() er
1ba10 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  ror: \"%s\"\n",.
1ba20 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
1ba30 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29  _errmsg (sqlite)
1ba40 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 69 6e  );...sqlite3_fin
1ba50 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 09  alize (stmt);...
1ba60 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20  goto error;..   
1ba70 20 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 69   }..  sqlite3_fi
1ba80 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09  nalize (stmt);..
1ba90 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61    /* inserting a
1baa0 20 72 6f 77 20 69 6e 74 6f 20 47 45 4f 4d 45 54   row into GEOMET
1bab0 52 59 5f 43 4f 4c 55 4d 4e 53 5f 53 54 41 54 49  RY_COLUMNS_STATI
1bac0 53 54 49 43 53 20 2a 2f 0a 09 20 20 73 74 72 63  STICS */..  strc
1bad0 70 79 20 28 73 71 6c 2c 0a 09 09 20 20 22 49 4e  py (sql,...  "IN
1bae0 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
1baf0 49 4e 54 4f 20 67 65 6f 6d 65 74 72 79 5f 63 6f  INTO geometry_co
1bb00 6c 75 6d 6e 73 5f 73 74 61 74 69 73 74 69 63 73  lumns_statistics
1bb10 20 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 2c 20   (f_table_name, 
1bb20 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d  f_geometry_colum
1bb30 6e 29 20 22 29 3b 0a 09 20 20 73 74 72 63 61 74  n) ");..  strcat
1bb40 20 28 73 71 6c 2c 20 22 56 41 4c 55 45 53 20 28   (sql, "VALUES (
1bb50 4c 6f 77 65 72 28 3f 29 2c 20 4c 6f 77 65 72 28  Lower(?), Lower(
1bb60 3f 29 29 22 29 3b 0a 09 20 20 72 65 74 20 3d 20  ?))");..  ret = 
1bb70 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1bb80 76 32 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c  v2 (sqlite, sql,
1bb90 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26   strlen (sql), &
1bba0 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  stmt, NULL);..  
1bbb0 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
1bbc0 45 5f 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73  E_OK)..    {...s
1bbd0 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 41 64  patialite_e ("Ad
1bbe0 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 3a  dGeometryColumn:
1bbf0 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 20   \"%s\"\n",.... 
1bc00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
1bc10 6d 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09  msg (sqlite));..
1bc20 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
1bc30 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
1bc40 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65  ;...sqlite3_free
1bc50 20 28 70 5f 74 61 62 6c 65 29 3b 0a 09 09 72 65   (p_table);...re
1bc60 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
1bc70 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73  sqlite3_reset (s
1bc80 74 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  tmt);..  sqlite3
1bc90 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20  _clear_bindings 
1bca0 28 73 74 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74  (stmt);..  sqlit
1bcb0 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74  e3_bind_text (st
1bcc0 6d 74 2c 20 31 2c 20 74 61 62 6c 65 2c 20 73 74  mt, 1, table, st
1bcd0 72 6c 65 6e 20 28 74 61 62 6c 65 29 2c 20 53 51  rlen (table), SQ
1bce0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 09 20  LITE_STATIC);.. 
1bcf0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1bd00 78 74 20 28 73 74 6d 74 2c 20 32 2c 20 63 6f 6c  xt (stmt, 2, col
1bd10 75 6d 6e 2c 20 73 74 72 6c 65 6e 20 28 63 6f 6c  umn, strlen (col
1bd20 75 6d 6e 29 2c 20 53 51 4c 49 54 45 5f 53 54 41  umn), SQLITE_STA
1bd30 54 49 43 29 3b 0a 09 20 20 72 65 74 20 3d 20 73  TIC);..  ret = s
1bd40 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d  qlite3_step (stm
1bd50 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d  t);..  if (ret =
1bd60 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  = SQLITE_DONE ||
1bd70 20 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52   ret == SQLITE_R
1bd80 4f 57 29 0a 09 20 20 20 20 20 20 3b 0a 09 20 20  OW)..      ;..  
1bd90 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 70  else..    {...sp
1bda0 61 74 69 61 6c 69 74 65 5f 65 20 28 22 41 64 64  atialite_e ("Add
1bdb0 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
1bdc0 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e   error: \"%s\"\n
1bdd0 22 2c 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69  ",....      sqli
1bde0 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69  te3_errmsg (sqli
1bdf0 74 65 29 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  te));...sqlite3_
1be00 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b  finalize (stmt);
1be10 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09  ...goto error;..
1be20 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65 33      }..  sqlite3
1be30 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29  _finalize (stmt)
1be40 3b 0a 09 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e  ;..  /* insertin
1be50 67 20 61 20 72 6f 77 20 69 6e 74 6f 20 47 45 4f  g a row into GEO
1be60 4d 45 54 52 59 5f 43 4f 4c 55 4d 4e 53 5f 54 49  METRY_COLUMNS_TI
1be70 4d 45 20 2a 2f 0a 09 20 20 73 74 72 63 70 79 20  ME */..  strcpy 
1be80 28 73 71 6c 2c 0a 09 09 20 20 22 49 4e 53 45 52  (sql,...  "INSER
1be90 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54  T OR REPLACE INT
1bea0 4f 20 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d  O geometry_colum
1beb0 6e 73 5f 74 69 6d 65 20 28 66 5f 74 61 62 6c 65  ns_time (f_table
1bec0 5f 6e 61 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72  _name, f_geometr
1bed0 79 5f 63 6f 6c 75 6d 6e 29 20 22 29 3b 0a 09 20  y_column) ");.. 
1bee0 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 56   strcat (sql, "V
1bef0 41 4c 55 45 53 20 28 4c 6f 77 65 72 28 3f 29 2c  ALUES (Lower(?),
1bf00 20 4c 6f 77 65 72 28 3f 29 29 22 29 3b 0a 09 20   Lower(?))");.. 
1bf10 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 70   ret = sqlite3_p
1bf20 72 65 70 61 72 65 5f 76 32 20 28 73 71 6c 69 74  repare_v2 (sqlit
1bf30 65 2c 20 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28  e, sql, strlen (
1bf40 73 71 6c 29 2c 20 26 73 74 6d 74 2c 20 4e 55 4c  sql), &stmt, NUL
1bf50 4c 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21  L);..  if (ret !
1bf60 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20  = SQLITE_OK)..  
1bf70 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65    {...spatialite
1bf80 5f 65 20 28 22 41 64 64 47 65 6f 6d 65 74 72 79  _e ("AddGeometry
1bf90 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c 6e  Column: \"%s\"\n
1bfa0 22 2c 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69  ",....      sqli
1bfb0 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69  te3_errmsg (sqli
1bfc0 74 65 29 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  te));...sqlite3_
1bfd0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
1bfe0 65 78 74 2c 20 30 29 3b 0a 09 09 73 71 6c 69 74  ext, 0);...sqlit
1bff0 65 33 5f 66 72 65 65 20 28 70 5f 74 61 62 6c 65  e3_free (p_table
1c000 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
1c010 20 20 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    }..  sqlite3_r
1c020 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 09 20 20  eset (stmt);..  
1c030 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
1c040 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a 09  ndings (stmt);..
1c050 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
1c060 65 78 74 20 28 73 74 6d 74 2c 20 31 2c 20 74 61  ext (stmt, 1, ta
1c070 62 6c 65 2c 20 73 74 72 6c 65 6e 20 28 74 61 62  ble, strlen (tab
1c080 6c 65 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  le), SQLITE_STAT
1c090 49 43 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  IC);..  sqlite3_
1c0a0 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c  bind_text (stmt,
1c0b0 20 32 2c 20 63 6f 6c 75 6d 6e 2c 20 73 74 72 6c   2, column, strl
1c0c0 65 6e 20 28 63 6f 6c 75 6d 6e 29 2c 20 53 51 4c  en (column), SQL
1c0d0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 09 20 20  ITE_STATIC);..  
1c0e0 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ret = sqlite3_st
1c0f0 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20 69 66  ep (stmt);..  if
1c100 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f   (ret == SQLITE_
1c110 44 4f 4e 45 20 7c 7c 20 72 65 74 20 3d 3d 20 53  DONE || ret == S
1c120 51 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20  QLITE_ROW)..    
1c130 20 20 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    ;..  else..   
1c140 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f   {...spatialite_
1c150 65 20 28 22 41 64 64 47 65 6f 6d 65 74 72 79 43  e ("AddGeometryC
1c160 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 5c  olumn() error: \
1c170 22 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 20 20 20  "%s\"\n",....   
1c180 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1c190 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 09 73  g (sqlite));...s
1c1a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
1c1b0 28 73 74 6d 74 29 3b 0a 09 09 67 6f 74 6f 20 65  (stmt);...goto e
1c1c0 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rror;..    }..  
1c1d0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1c1e0 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d   (stmt);.      }
1c1f0 0a 20 20 20 20 75 70 64 61 74 65 47 65 6f 6d 65  .    updateGeome
1c200 74 72 79 54 72 69 67 67 65 72 73 20 28 73 71 6c  tryTriggers (sql
1c210 69 74 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75  ite, table, colu
1c220 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mn);.    sqlite3
1c230 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
1c240 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 73 77  text, 1);.    sw
1c250 69 74 63 68 20 28 78 74 79 70 65 29 0a 20 20 20  itch (xtype).   
1c260 20 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20     {.      case 
1c270 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 20 20 70  GAIA_POINT:..  p
1c280 5f 74 79 70 65 20 3d 20 22 50 4f 49 4e 54 22 3b  _type = "POINT";
1c290 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
1c2a0 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
1c2b0 54 52 49 4e 47 3a 0a 09 20 20 70 5f 74 79 70 65  TRING:..  p_type
1c2c0 20 3d 20 22 4c 49 4e 45 53 54 52 49 4e 47 22 3b   = "LINESTRING";
1c2d0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
1c2e0 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47   case GAIA_POLYG
1c2f0 4f 4e 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d 20  ON:..  p_type = 
1c300 22 50 4f 4c 59 47 4f 4e 22 3b 0a 09 20 20 62 72  "POLYGON";..  br
1c310 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
1c320 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3a  GAIA_MULTIPOINT:
1c330 0a 09 20 20 70 5f 74 79 70 65 20 3d 20 22 4d 55  ..  p_type = "MU
1c340 4c 54 49 50 4f 49 4e 54 22 3b 0a 09 20 20 62 72  LTIPOINT";..  br
1c350 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
1c360 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
1c370 52 49 4e 47 3a 0a 09 20 20 70 5f 74 79 70 65 20  RING:..  p_type 
1c380 3d 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  = "MULTILINESTRI
1c390 4e 47 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  NG";..  break;. 
1c3a0 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
1c3b0 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20  ULTIPOLYGON:..  
1c3c0 70 5f 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 50  p_type = "MULTIP
1c3d0 4f 4c 59 47 4f 4e 22 3b 0a 09 20 20 62 72 65 61  OLYGON";..  brea
1c3e0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  k;.      case GA
1c3f0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
1c400 43 54 49 4f 4e 3a 0a 09 20 20 70 5f 74 79 70 65  CTION:..  p_type
1c410 20 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c   = "GEOMETRYCOLL
1c420 45 43 54 49 4f 4e 22 3b 0a 09 20 20 62 72 65 61  ECTION";..  brea
1c430 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 2d 31  k;.      case -1
1c440 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d 20 22 47  :..  p_type = "G
1c450 45 4f 4d 45 54 52 59 22 3b 0a 09 20 20 62 72 65  EOMETRY";..  bre
1c460 61 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  ak;.      };.   
1c470 20 73 77 69 74 63 68 20 28 64 69 6d 73 29 0a 20   switch (dims). 
1c480 20 20 20 20 20 7b 0a 20 20 20 20 20 20 63 61 73       {.      cas
1c490 65 20 47 41 49 41 5f 58 59 3a 0a 09 20 20 70 5f  e GAIA_XY:..  p_
1c4a0 64 69 6d 73 20 3d 20 22 58 59 22 3b 0a 09 20 20  dims = "XY";..  
1c4b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
1c4c0 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 20 20  e GAIA_XY_Z:..  
1c4d0 70 5f 64 69 6d 73 20 3d 20 22 58 59 5a 22 3b 0a  p_dims = "XYZ";.
1c4e0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
1c4f0 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a  case GAIA_XY_M:.
1c500 09 20 20 70 5f 64 69 6d 73 20 3d 20 22 58 59 4d  .  p_dims = "XYM
1c510 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";..  break;.   
1c520 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f     case GAIA_XY_
1c530 5a 5f 4d 3a 0a 09 20 20 70 5f 64 69 6d 73 20 3d  Z_M:..  p_dims =
1c540 20 22 58 59 5a 4d 22 3b 0a 09 20 20 62 72 65 61   "XYZM";..  brea
1c550 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  k;.      };.    
1c560 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a  sql_statement =.
1c570 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  .sqlite3_mprintf
1c580 20 28 22 47 65 6f 6d 65 74 72 79 20 5b 25 73 2c   ("Geometry [%s,
1c590 25 73 2c 53 52 49 44 3d 25 64 5d 20 73 75 63 63  %s,SRID=%d] succ
1c5a0 65 73 73 66 75 6c 6c 79 20 63 72 65 61 74 65 64  essfully created
1c5b0 22 2c 0a 09 09 09 20 70 5f 74 79 70 65 2c 20 70  ",.... p_type, p
1c5c0 5f 64 69 6d 73 2c 20 28 73 72 69 64 20 3c 3d 20  _dims, (srid <= 
1c5d0 30 29 20 3f 20 2d 31 20 3a 20 73 72 69 64 29 3b  0) ? -1 : srid);
1c5e0 0a 20 20 20 20 75 70 64 61 74 65 53 70 61 74 69  .    updateSpati
1c5f0 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73 71  aLiteHistory (sq
1c600 6c 69 74 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c  lite, table, col
1c610 75 6d 6e 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  umn, sql_stateme
1c620 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
1c630 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65  _free (sql_state
1c640 6d 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  ment);.    sqlit
1c650 65 33 5f 66 72 65 65 20 28 70 5f 74 61 62 6c 65  e3_free (p_table
1c660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c670 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69   error:.    sqli
1c680 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
1c690 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  context, 0);.   
1c6a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70   sqlite3_free (p
1c6b0 5f 74 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  _table);.    ret
1c6c0 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  urn;.}..static v
1c6d0 6f 69 64 0a 66 6e 63 74 5f 52 65 63 6f 76 65 72  oid.fnct_Recover
1c6e0 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 20 28  GeometryColumn (
1c6f0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1c700 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
1c710 72 67 63 2c 0a 09 09 09 20 20 20 20 73 71 6c 69  rgc,....    sqli
1c720 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
1c730 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
1c740 74 69 6f 6e 3a 0a 2f 20 52 65 63 6f 76 65 72 47  tion:./ RecoverG
1c750 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 74 61  eometryColumn(ta
1c760 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 73 72 69  ble, column, sri
1c770 64 2c 20 74 79 70 65 20 2c 20 64 69 6d 65 6e 73  d, type , dimens
1c780 69 6f 6e 20 29 0a 2f 0a 2f 20 63 68 65 63 6b 73  ion )././ checks
1c790 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
1c7a0 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 73 61 74  TABLE.COLUMN sat
1c7b0 69 73 66 69 65 73 20 74 68 65 20 72 65 71 75 69  isfies the requi
1c7c0 72 65 64 20 67 65 6f 6d 65 74 72 69 63 20 66 65  red geometric fe
1c7d0 61 74 75 72 65 73 0a 2f 20 69 66 20 79 65 73 20  atures./ if yes 
1c7e0 61 64 64 73 20 69 74 20 74 6f 20 53 70 61 74 69  adds it to Spati
1c7f0 61 6c 4d 65 74 61 44 61 74 61 20 61 6e 64 20 65  alMetaData and e
1c800 6e 61 62 6c 69 6e 67 20 74 72 69 67 67 65 72 73  nabling triggers
1c810 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20  ./ returns 1 on 
1c820 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66  success./ 0 on f
1c830 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f  ailure.*/.    co
1c840 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65 3b  nst char *table;
1c850 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1c860 2a 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e  *column;.    con
1c870 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c880 20 2a 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20   *type;.    int 
1c890 78 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 78  xtype;.    int x
1c8a0 78 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 73  xtype;.    int s
1c8b0 72 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6f  rid = -1;.    co
1c8c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c8d0 72 20 2a 74 78 74 5f 64 69 6d 73 3b 0a 20 20 20  r *txt_dims;.   
1c8e0 20 69 6e 74 20 64 69 6d 65 6e 73 69 6f 6e 20 3d   int dimension =
1c8f0 20 32 3b 0a 20 20 20 20 69 6e 74 20 64 69 6d 73   2;.    int dims
1c900 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 61   = -1;.    int a
1c910 75 74 6f 5f 64 69 6d 73 20 3d 20 2d 31 3b 0a 20  uto_dims = -1;. 
1c920 20 20 20 63 68 61 72 20 73 71 6c 5b 31 30 32 34     char sql[1024
1c930 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  ];.    int ret;.
1c940 20 20 20 20 69 6e 74 20 6d 65 74 61 64 61 74 61      int metadata
1c950 5f 76 65 72 73 69 6f 6e 3b 0a 20 20 20 20 73 71  _version;.    sq
1c960 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74  lite3_stmt *stmt
1c970 3b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  ;.    int exists
1c980 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
1c990 63 68 61 72 20 2a 70 5f 74 79 70 65 20 3d 20 4e  char *p_type = N
1c9a0 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ULL;.    const c
1c9b0 68 61 72 20 2a 70 5f 64 69 6d 73 20 3d 20 4e 55  har *p_dims = NU
1c9c0 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 74 79  LL;.    int n_ty
1c9d0 70 65 20 3d 20 47 41 49 41 5f 55 4e 4b 4e 4f 57  pe = GAIA_UNKNOW
1c9e0 4e 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 64 69 6d  N;.    int n_dim
1c9f0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 63 68 61 72  s = -1;.    char
1ca00 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b   *sql_statement;
1ca10 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
1ca20 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
1ca30 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
1ca40 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
1ca50 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
1ca60 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
1ca70 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
1ca80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1ca90 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
1caa0 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
1cab0 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
1cac0 5f 65 0a 09 20 20 20 20 20 20 28 22 52 65 63 6f  _e..      ("Reco
1cad0 76 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d  verGeometryColum
1cae0 6e 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d  n() error: argum
1caf0 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61 6d  ent 1 [table_nam
1cb00 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65  e] is not of the
1cb10 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22 29   String type\n")
1cb20 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
1cb30 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
1cb40 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  , 0);..  return;
1cb50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62  .      }.    tab
1cb60 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
1cb70 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
1cb80 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
1cb90 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
1cba0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
1cbb0 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
1cbc0 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
1cbd0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
1cbe0 20 20 20 20 20 20 28 22 52 65 63 6f 76 65 72 47        ("RecoverG
1cbf0 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20  eometryColumn() 
1cc00 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20  error: argument 
1cc10 32 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20  2 [column_name] 
1cc20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
1cc30 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09  ring type\n");..
1cc40 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1cc50 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
1cc60 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
1cc70 20 20 20 20 7d 0a 20 20 20 20 63 6f 6c 75 6d 6e      }.    column
1cc80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1cc90 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
1cca0 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
1ccb0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
1ccc0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
1ccd0 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49  [2]) != SQLITE_I
1cce0 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
1ccf0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
1cd00 09 20 20 20 20 20 20 28 22 52 65 63 6f 76 65 72  .      ("Recover
1cd10 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
1cd20 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74   error: argument
1cd30 20 33 20 5b 53 52 49 44 5d 20 69 73 20 6e 6f 74   3 [SRID] is not
1cd40 20 6f 66 20 74 68 65 20 49 6e 74 65 67 65 72 20   of the Integer 
1cd50 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  type\n");..  sql
1cd60 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
1cd70 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
1cd80 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
1cd90 0a 20 20 20 20 73 72 69 64 20 3d 20 73 71 6c 69  .    srid = sqli
1cda0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
1cdb0 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[2]);.    if 
1cdc0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
1cdd0 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 21 3d  ype (argv[3]) !=
1cde0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
1cdf0 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
1ce00 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 52  ite_e..      ("R
1ce10 65 63 6f 76 65 72 47 65 6f 6d 65 74 72 79 43 6f  ecoverGeometryCo
1ce20 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72  lumn() error: ar
1ce30 67 75 6d 65 6e 74 20 34 20 5b 67 65 6f 6d 65 74  gument 4 [geomet
1ce40 72 79 5f 74 79 70 65 5d 20 69 73 20 6e 6f 74 20  ry_type] is not 
1ce50 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74 79  of the String ty
1ce60 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74  pe\n");..  sqlit
1ce70 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
1ce80 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72  ontext, 0);..  r
1ce90 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
1cea0 20 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74 65     type = sqlite
1ceb0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
1cec0 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[3]);.    if (
1ced0 61 72 67 63 20 3d 3d 20 35 29 0a 20 20 20 20 20  argc == 5).     
1cee0 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
1cef0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
1cf00 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[4]) == SQLITE
1cf10 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
1cf20 0a 09 09 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 73  ...dimension = s
1cf30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1cf40 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 09 69 66   (argv[4]);...if
1cf50 20 28 64 69 6d 65 6e 73 69 6f 6e 20 3d 3d 20 32   (dimension == 2
1cf60 29 0a 09 09 20 20 20 20 64 69 6d 73 20 3d 20 47  )...    dims = G
1cf70 41 49 41 5f 58 59 3b 0a 09 09 69 66 20 28 64 69  AIA_XY;...if (di
1cf80 6d 65 6e 73 69 6f 6e 20 3d 3d 20 33 29 0a 09 09  mension == 3)...
1cf90 20 20 20 20 64 69 6d 73 20 3d 20 47 41 49 41 5f      dims = GAIA_
1cfa0 58 59 5f 5a 3b 0a 09 09 69 66 20 28 64 69 6d 65  XY_Z;...if (dime
1cfb0 6e 73 69 6f 6e 20 3d 3d 20 34 29 0a 09 09 20 20  nsion == 4)...  
1cfc0 20 20 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59    dims = GAIA_XY
1cfd0 5f 5a 5f 4d 3b 0a 09 20 20 20 20 7d 0a 09 20 20  _Z_M;..    }..  
1cfe0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
1cff0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
1d000 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[4]) == SQLITE_
1d010 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 74  TEXT)..    {...t
1d020 78 74 5f 64 69 6d 73 20 3d 20 73 71 6c 69 74 65  xt_dims = sqlite
1d030 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
1d040 67 76 5b 34 5d 29 3b 0a 09 09 69 66 20 28 73 74  gv[4]);...if (st
1d050 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
1d060 2a 29 20 74 78 74 5f 64 69 6d 73 2c 20 22 58 59  *) txt_dims, "XY
1d070 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 64  ") == 0)...    d
1d080 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09  ims = GAIA_XY;..
1d090 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20  .if (strcasecmp 
1d0a0 28 28 63 68 61 72 20 2a 29 20 74 78 74 5f 64 69  ((char *) txt_di
1d0b0 6d 73 2c 20 22 58 59 5a 22 29 20 3d 3d 20 30 29  ms, "XYZ") == 0)
1d0c0 0a 09 09 20 20 20 20 64 69 6d 73 20 3d 20 47 41  ...    dims = GA
1d0d0 49 41 5f 58 59 5f 5a 3b 0a 09 09 69 66 20 28 73  IA_XY_Z;...if (s
1d0e0 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72  trcasecmp ((char
1d0f0 20 2a 29 20 74 78 74 5f 64 69 6d 73 2c 20 22 58   *) txt_dims, "X
1d100 59 4d 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20  YM") == 0)...   
1d110 20 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f   dims = GAIA_XY_
1d120 4d 3b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65  M;...if (strcase
1d130 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 78  cmp ((char *) tx
1d140 74 5f 64 69 6d 73 2c 20 22 58 59 5a 4d 22 29 20  t_dims, "XYZM") 
1d150 3d 3d 20 30 29 0a 09 09 20 20 20 20 64 69 6d 73  == 0)...    dims
1d160 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a   = GAIA_XY_Z_M;.
1d170 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
1d180 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69      {...spatiali
1d190 74 65 5f 65 0a 09 09 20 20 20 20 28 22 52 65 63  te_e...    ("Rec
1d1a0 6f 76 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c 75  overGeometryColu
1d1b0 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  mn() error: argu
1d1c0 6d 65 6e 74 20 35 20 5b 64 69 6d 65 6e 73 69 6f  ment 5 [dimensio
1d1d0 6e 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65  n] is not of the
1d1e0 20 49 6e 74 65 67 65 72 20 6f 72 20 54 65 78 74   Integer or Text
1d1f0 20 74 79 70 65 5c 6e 22 29 3b 0a 09 09 73 71 6c   type\n");...sql
1d200 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
1d210 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 09  (context, 0);...
1d220 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20  return;..    }. 
1d230 20 20 20 20 20 7d 0a 20 20 20 20 78 74 79 70 65       }.    xtype
1d240 20 3d 20 47 41 49 41 5f 55 4e 4b 4e 4f 57 4e 3b   = GAIA_UNKNOWN;
1d250 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
1d260 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
1d270 70 65 2c 20 22 50 4f 49 4e 54 22 29 20 3d 3d 20  pe, "POINT") == 
1d280 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75  0).      {..  au
1d290 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58  to_dims = GAIA_X
1d2a0 59 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41  Y;..  xtype = GA
1d2b0 49 41 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20  IA_POINT;.      
1d2c0 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73  }.    if (strcas
1d2d0 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74  ecmp ((char *) t
1d2e0 79 70 65 2c 20 22 4c 49 4e 45 53 54 52 49 4e 47  ype, "LINESTRING
1d2f0 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ") == 0).      {
1d300 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20  ..  auto_dims = 
1d310 47 41 49 41 5f 58 59 3b 0a 09 20 20 78 74 79 70  GAIA_XY;..  xtyp
1d320 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  e = GAIA_LINESTR
1d330 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
1d340 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
1d350 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
1d360 22 50 4f 4c 59 47 4f 4e 22 29 20 3d 3d 20 30 29  "POLYGON") == 0)
1d370 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f  .      {..  auto
1d380 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b  _dims = GAIA_XY;
1d390 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41  ..  xtype = GAIA
1d3a0 5f 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20 20 20 20  _POLYGON;.      
1d3b0 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73  }.    if (strcas
1d3c0 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74  ecmp ((char *) t
1d3d0 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f 49 4e 54  ype, "MULTIPOINT
1d3e0 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ") == 0).      {
1d3f0 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20  ..  auto_dims = 
1d400 47 41 49 41 5f 58 59 3b 0a 09 20 20 78 74 79 70  GAIA_XY;..  xtyp
1d410 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
1d420 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  INT;.      }.   
1d430 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
1d440 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
1d450 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  "MULTILINESTRING
1d460 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ") == 0).      {
1d470 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20  ..  auto_dims = 
1d480 47 41 49 41 5f 58 59 3b 0a 09 20 20 78 74 79 70  GAIA_XY;..  xtyp
1d490 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49  e = GAIA_MULTILI
1d4a0 4e 45 53 54 52 49 4e 47 3b 0a 20 20 20 20 20 20  NESTRING;.      
1d4b0 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73  }.    if (strcas
1d4c0 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74  ecmp ((char *) t
1d4d0 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f 4c 59 47  ype, "MULTIPOLYG
1d4e0 4f 4e 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20  ON") == 0).     
1d4f0 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20   {..  auto_dims 
1d500 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20 20 78 74  = GAIA_XY;..  xt
1d510 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
1d520 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20 20 20 20 7d  POLYGON;.      }
1d530 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
1d540 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
1d550 70 65 2c 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c  pe, "GEOMETRYCOL
1d560 4c 45 43 54 49 4f 4e 22 29 20 3d 3d 20 30 29 0a  LECTION") == 0).
1d570 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f        {..  auto_
1d580 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b 0a  dims = GAIA_XY;.
1d590 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f  .  xtype = GAIA_
1d5a0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
1d5b0 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ON;.      }.    
1d5c0 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
1d5d0 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22  (char *) type, "
1d5e0 47 45 4f 4d 45 54 52 59 22 29 20 3d 3d 20 30 29  GEOMETRY") == 0)
1d5f0 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f  .      {..  auto
1d600 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 3b  _dims = GAIA_XY;
1d610 0a 09 20 20 78 74 79 70 65 20 3d 20 2d 31 3b 0a  ..  xtype = -1;.
1d620 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
1d630 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61  strcasecmp ((cha
1d640 72 20 2a 29 20 74 79 70 65 2c 20 22 50 4f 49 4e  r *) type, "POIN
1d650 54 5a 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20  TZ") == 0).     
1d660 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20   {..  auto_dims 
1d670 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 20 20  = GAIA_XY_Z;..  
1d680 78 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49  xtype = GAIA_POI
1d690 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NT;.      }.    
1d6a0 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
1d6b0 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22  (char *) type, "
1d6c0 4c 49 4e 45 53 54 52 49 4e 47 5a 22 29 20 3d 3d  LINESTRINGZ") ==
1d6d0 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61   0).      {..  a
1d6e0 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f  uto_dims = GAIA_
1d6f0 58 59 5f 5a 3b 0a 09 20 20 78 74 79 70 65 20 3d  XY_Z;..  xtype =
1d700 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
1d710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
1d720 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63   (strcasecmp ((c
1d730 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 50 4f  har *) type, "PO
1d740 4c 59 47 4f 4e 5a 22 29 20 3d 3d 20 30 29 0a 20  LYGONZ") == 0). 
1d750 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64       {..  auto_d
1d760 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b  ims = GAIA_XY_Z;
1d770 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41  ..  xtype = GAIA
1d780 5f 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20 20 20 20  _POLYGON;.      
1d790 7d 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73  }.    if (strcas
1d7a0 65 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74  ecmp ((char *) t
1d7b0 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f 49 4e 54  ype, "MULTIPOINT
1d7c0 5a 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  Z") == 0).      
1d7d0 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d  {..  auto_dims =
1d7e0 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 20 20 78   GAIA_XY_Z;..  x
1d7f0 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
1d800 49 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a  IPOINT;.      }.
1d810 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63      if (strcasec
1d820 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79 70  mp ((char *) typ
1d830 65 2c 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52  e, "MULTILINESTR
1d840 49 4e 47 5a 22 29 20 3d 3d 20 30 29 0a 20 20 20  INGZ") == 0).   
1d850 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
1d860 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09  s = GAIA_XY_Z;..
1d870 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d    xtype = GAIA_M
1d880 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a  ULTILINESTRING;.
1d890 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
1d8a0 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61  strcasecmp ((cha
1d8b0 72 20 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c 54  r *) type, "MULT
1d8c0 49 50 4f 4c 59 47 4f 4e 5a 22 29 20 3d 3d 20 30  IPOLYGONZ") == 0
1d8d0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74  ).      {..  aut
1d8e0 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  o_dims = GAIA_XY
1d8f0 5f 5a 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47  _Z;..  xtype = G
1d900 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
1d910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
1d920 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63   (strcasecmp ((c
1d930 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 47 45  har *) type, "GE
1d940 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
1d950 5a 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  Z") == 0).      
1d960 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d  {..  auto_dims =
1d970 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 20 20 78   GAIA_XY_Z;..  x
1d980 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
1d990 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a  ETRYCOLLECTION;.
1d9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
1d9b0 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61  strcasecmp ((cha
1d9c0 72 20 2a 29 20 74 79 70 65 2c 20 22 47 45 4f 4d  r *) type, "GEOM
1d9d0 45 54 52 59 5a 22 29 20 3d 3d 20 30 29 0a 20 20  ETRYZ") == 0).  
1d9e0 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69      {..  auto_di
1d9f0 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a  ms = GAIA_XY_Z;.
1da00 09 20 20 78 74 79 70 65 20 3d 20 2d 31 3b 0a 20  .  xtype = -1;. 
1da10 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
1da20 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72  trcasecmp ((char
1da30 20 2a 29 20 74 79 70 65 2c 20 22 50 4f 49 4e 54   *) type, "POINT
1da40 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  M") == 0).      
1da50 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d  {..  auto_dims =
1da60 20 47 41 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 78   GAIA_XY_M;..  x
1da70 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e  type = GAIA_POIN
1da80 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  T;.      }.    i
1da90 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28  f (strcasecmp ((
1daa0 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 4c  char *) type, "L
1dab0 49 4e 45 53 54 52 49 4e 47 4d 22 29 20 3d 3d 20  INESTRINGM") == 
1dac0 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75  0).      {..  au
1dad0 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58  to_dims = GAIA_X
1dae0 59 5f 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d 20  Y_M;..  xtype = 
1daf0 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3b  GAIA_LINESTRING;
1db00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
1db10 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68  (strcasecmp ((ch
1db20 61 72 20 2a 29 20 74 79 70 65 2c 20 22 50 4f 4c  ar *) type, "POL
1db30 59 47 4f 4e 4d 22 29 20 3d 3d 20 30 29 0a 20 20  YGONM") == 0).  
1db40 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69      {..  auto_di
1db50 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a  ms = GAIA_XY_M;.
1db60 09 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f  .  xtype = GAIA_
1db70 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20 20 20 20 7d  POLYGON;.      }
1db80 0a 20 20 20 20 69 66 20 28 73 74 72 63 61 73 65  .    if (strcase
1db90 63 6d 70 20 28 28 63 68 61 72 20 2a 29 20 74 79  cmp ((char *) ty
1dba0 70 65 2c 20 22 4d 55 4c 54 49 50 4f 49 4e 54 4d  pe, "MULTIPOINTM
1dbb0 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ") == 0).      {
1dbc0 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20  ..  auto_dims = 
1dbd0 47 41 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 78 74  GAIA_XY_M;..  xt
1dbe0 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
1dbf0 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20  POINT;.      }. 
1dc00 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d     if (strcasecm
1dc10 70 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65  p ((char *) type
1dc20 2c 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  , "MULTILINESTRI
1dc30 4e 47 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20 20  NGM") == 0).    
1dc40 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73    {..  auto_dims
1dc50 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a 09 20   = GAIA_XY_M;.. 
1dc60 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55   xtype = GAIA_MU
1dc70 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 20  LTILINESTRING;. 
1dc80 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
1dc90 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72  trcasecmp ((char
1dca0 20 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49   *) type, "MULTI
1dcb0 50 4f 4c 59 47 4f 4e 4d 22 29 20 3d 3d 20 30 29  POLYGONM") == 0)
1dcc0 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f  .      {..  auto
1dcd0 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f  _dims = GAIA_XY_
1dce0 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47 41  M;..  xtype = GA
1dcf0 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3b  IA_MULTIPOLYGON;
1dd00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
1dd10 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68  (strcasecmp ((ch
1dd20 61 72 20 2a 29 20 74 79 70 65 2c 20 22 47 45 4f  ar *) type, "GEO
1dd30 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
1dd40 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ") == 0).      {
1dd50 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20  ..  auto_dims = 
1dd60 47 41 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 78 74  GAIA_XY_M;..  xt
1dd70 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
1dd80 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 20  TRYCOLLECTION;. 
1dd90 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
1dda0 74 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72  trcasecmp ((char
1ddb0 20 2a 29 20 74 79 70 65 2c 20 22 47 45 4f 4d 45   *) type, "GEOME
1ddc0 54 52 59 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20  TRYM") == 0).   
1ddd0 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d     {..  auto_dim
1dde0 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b 0a 09  s = GAIA_XY_M;..
1ddf0 20 20 78 74 79 70 65 20 3d 20 2d 31 3b 0a 20 20    xtype = -1;.  
1de00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
1de10 72 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20  rcasecmp ((char 
1de20 2a 29 20 74 79 70 65 2c 20 22 50 4f 49 4e 54 5a  *) type, "POINTZ
1de30 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  M") == 0).      
1de40 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d  {..  auto_dims =
1de50 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20   GAIA_XY_Z_M;.. 
1de60 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f   xtype = GAIA_PO
1de70 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  INT;.      }.   
1de80 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
1de90 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20  ((char *) type, 
1dea0 22 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 22 29 20  "LINESTRINGZM") 
1deb0 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
1dec0 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49   auto_dims = GAI
1ded0 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79  A_XY_Z_M;..  xty
1dee0 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54  pe = GAIA_LINEST
1def0 52 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RING;.      }.  
1df00 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
1df10 20 28 28 63 68 61 72 20 2a 29 20 74 79 70 65 2c   ((char *) type,
1df20 20 22 50 4f 4c 59 47 4f 4e 5a 4d 22 29 20 3d 3d   "POLYGONZM") ==
1df30 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61   0).      {..  a
1df40 75 74 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f  uto_dims = GAIA_
1df50 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79 70 65  XY_Z_M;..  xtype
1df60 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b   = GAIA_POLYGON;
1df70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
1df80 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63 68  (strcasecmp ((ch
1df90 61 72 20 2a 29 20 74 79 70 65 2c 20 22 4d 55 4c  ar *) type, "MUL
1dfa0 54 49 50 4f 49 4e 54 5a 4d 22 29 20 3d 3d 20 30  TIPOINTZM") == 0
1dfb0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74  ).      {..  aut
1dfc0 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  o_dims = GAIA_XY
1dfd0 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d  _Z_M;..  xtype =
1dfe0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
1dff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
1e000 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63   (strcasecmp ((c
1e010 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 4d 55  har *) type, "MU
1e020 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 22  LTILINESTRINGZM"
1e030 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  ) == 0).      {.
1e040 09 20 20 61 75 74 6f 5f 64 69 6d 73 20 3d 20 47  .  auto_dims = G
1e050 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20 20 78  AIA_XY_Z_M;..  x
1e060 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
1e070 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 20 20 20  ILINESTRING;.   
1e080 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 72     }.    if (str
1e090 63 61 73 65 63 6d 70 20 28 28 63 68 61 72 20 2a  casecmp ((char *
1e0a0 29 20 74 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f  ) type, "MULTIPO
1e0b0 4c 59 47 4f 4e 5a 4d 22 29 20 3d 3d 20 30 29 0a  LYGONZM") == 0).
1e0c0 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74 6f 5f        {..  auto_
1e0d0 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a  dims = GAIA_XY_Z
1e0e0 5f 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d 20 47  _M;..  xtype = G
1e0f0 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
1e100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
1e110 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28 63   (strcasecmp ((c
1e120 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 47 45  har *) type, "GE
1e130 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
1e140 5a 4d 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20  ZM") == 0).     
1e150 20 7b 0a 09 20 20 61 75 74 6f 5f 64 69 6d 73 20   {..  auto_dims 
1e160 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09  = GAIA_XY_Z_M;..
1e170 20 20 78 74 79 70 65 20 3d 20 47 41 49 41 5f 47    xtype = GAIA_G
1e180 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
1e190 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  N;.      }.    i
1e1a0 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 28  f (strcasecmp ((
1e1b0 63 68 61 72 20 2a 29 20 74 79 70 65 2c 20 22 47  char *) type, "G
1e1c0 45 4f 4d 45 54 52 59 5a 4d 22 29 20 3d 3d 20 30  EOMETRYZM") == 0
1e1d0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 75 74  ).      {..  aut
1e1e0 6f 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59  o_dims = GAIA_XY
1e1f0 5f 5a 5f 4d 3b 0a 09 20 20 78 74 79 70 65 20 3d  _Z_M;..  xtype =
1e200 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1e210 20 69 66 20 28 64 69 6d 73 20 3c 20 30 29 0a 09   if (dims < 0)..
1e220 64 69 6d 73 20 3d 20 61 75 74 6f 5f 64 69 6d 73  dims = auto_dims
1e230 3b 0a 20 20 20 20 69 66 20 28 78 74 79 70 65 20  ;.    if (xtype 
1e240 3d 3d 20 47 41 49 41 5f 55 4e 4b 4e 4f 57 4e 29  == GAIA_UNKNOWN)
1e250 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
1e260 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
1e270 28 22 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72  ("RecoverGeometr
1e280 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
1e290 20 61 72 67 75 6d 65 6e 74 20 34 20 5b 67 65 6f   argument 4 [geo
1e2a0 6d 65 74 72 79 5f 74 79 70 65 5d 20 68 61 73 20  metry_type] has 
1e2b0 61 6e 20 69 6c 6c 65 67 61 6c 20 76 61 6c 75 65  an illegal value
1e2c0 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  \n");..  sqlite3
1e2d0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
1e2e0 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74  text, 0);..  ret
1e2f0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
1e300 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49   if (dims == GAI
1e310 41 5f 58 59 20 7c 7c 20 64 69 6d 73 20 3d 3d 20  A_XY || dims == 
1e320 47 41 49 41 5f 58 59 5f 5a 20 7c 7c 20 64 69 6d  GAIA_XY_Z || dim
1e330 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 0a 09  s == GAIA_XY_M..
1e340 7c 7c 20 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f  || dims == GAIA_
1e350 58 59 5f 5a 5f 4d 29 0a 09 3b 0a 20 20 20 20 65  XY_Z_M)..;.    e
1e360 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
1e370 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
1e380 20 20 20 28 22 52 65 63 6f 76 65 72 47 65 6f 6d     ("RecoverGeom
1e390 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72  etryColumn() err
1e3a0 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 35 20 5b  or: argument 5 [
1e3b0 64 69 6d 65 6e 73 69 6f 6e 5d 20 49 4c 4c 45 47  dimension] ILLEG
1e3c0 41 4c 20 56 41 4c 55 45 5c 6e 22 29 3b 0a 09 20  AL VALUE\n");.. 
1e3d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1e3e0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
1e3f0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
1e400 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 75 74     }.    if (aut
1e410 6f 5f 64 69 6d 73 20 21 3d 20 47 41 49 41 5f 58  o_dims != GAIA_X
1e420 59 20 26 26 20 64 69 6d 73 20 21 3d 20 61 75 74  Y && dims != aut
1e430 6f 5f 64 69 6d 73 29 0a 20 20 20 20 20 20 7b 0a  o_dims).      {.
1e440 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
1e450 09 20 20 20 20 20 20 28 22 52 65 63 6f 76 65 72  .      ("Recover
1e460 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
1e470 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74   error: argument
1e480 20 35 20 5b 64 69 6d 65 6e 73 69 6f 6e 5d 20 49   5 [dimension] I
1e490 4c 4c 45 47 41 4c 20 56 41 4c 55 45 5c 6e 22 29  LLEGAL VALUE\n")
1e4a0 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
1e4b0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
1e4c0 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  , 0);..  return;
1e4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6d 65 74  .      }.    met
1e4e0 61 64 61 74 61 5f 76 65 72 73 69 6f 6e 20 3d 20  adata_version = 
1e4f0 63 68 65 63 6b 53 70 61 74 69 61 6c 4d 65 74 61  checkSpatialMeta
1e500 44 61 74 61 20 28 73 71 6c 69 74 65 29 3b 0a 20  Data (sqlite);. 
1e510 20 20 20 69 66 20 28 6d 65 74 61 64 61 74 61 5f     if (metadata_
1e520 76 65 72 73 69 6f 6e 20 3d 3d 20 31 20 7c 7c 20  version == 1 || 
1e530 6d 65 74 61 64 61 74 61 5f 76 65 72 73 69 6f 6e  metadata_version
1e540 20 3d 3d 20 33 29 0a 09 3b 0a 20 20 20 20 65 6c   == 3)..;.    el
1e550 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70  se.      {..  sp
1e560 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20  atialite_e..    
1e570 20 20 28 22 52 65 63 6f 76 65 72 47 65 6f 6d 65    ("RecoverGeome
1e580 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f  tryColumn() erro
1e590 72 3a 20 75 6e 65 78 70 65 63 74 65 64 20 6d 65  r: unexpected me
1e5a0 74 61 64 61 74 61 20 6c 61 79 6f 75 74 5c 6e 22  tadata layout\n"
1e5b0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
1e5c0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
1e5d0 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e  t, 0);..  return
1e5e0 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 68 65  ;.      }./* che
1e5f0 63 6b 69 6e 67 20 69 66 20 74 68 65 20 74 61 62  cking if the tab
1e600 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
1e610 20 73 74 72 63 70 79 20 28 73 71 6c 2c 0a 09 20   strcpy (sql,.. 
1e620 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
1e630 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1e640 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
1e650 27 74 61 62 6c 65 27 20 41 4e 44 20 4c 6f 77 65  'table' AND Lowe
1e660 72 28 6e 61 6d 65 29 20 3d 20 4c 6f 77 65 72 28  r(name) = Lower(
1e670 3f 29 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ?)");.    ret = 
1e680 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1e690 76 32 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c  v2 (sqlite, sql,
1e6a0 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26   strlen (sql), &
1e6b0 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  stmt, NULL);.   
1e6c0 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49   if (ret != SQLI
1e6d0 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09  TE_OK).      {..
1e6e0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28    spatialite_e (
1e6f0 22 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72 79  "RecoverGeometry
1e700 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c 6e  Column: \"%s\"\n
1e710 22 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 65 72  ",....sqlite3_er
1e720 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a  rmsg (sqlite));.
1e730 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1e740 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
1e750 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  0);..  return;. 
1e760 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
1e770 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b  e3_reset (stmt);
1e780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65  .    sqlite3_cle
1e790 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d  ar_bindings (stm
1e7a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1e7b0 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c  bind_text (stmt,
1e7c0 20 31 2c 20 74 61 62 6c 65 2c 20 73 74 72 6c 65   1, table, strle
1e7d0 6e 20 28 74 61 62 6c 65 29 2c 20 53 51 4c 49 54  n (table), SQLIT
1e7e0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 77  E_STATIC);.    w
1e7f0 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b  hile (1).      {
1e800 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67  ..  /* scrolling
1e810 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1e820 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d  rows */..  ret =
1e830 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73   sqlite3_step (s
1e840 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74  tmt);..  if (ret
1e850 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29   == SQLITE_DONE)
1e860 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09  ..      break;..
1e870 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74  /* end of result
1e880 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72   set */..  if (r
1e890 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  et == SQLITE_ROW
1e8a0 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 73  )..    {...if (s
1e8b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1e8c0 70 65 20 28 73 74 6d 74 2c 20 30 29 20 3d 3d 20  pe (stmt, 0) == 
1e8d0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 09 20  SQLITE_TEXT)... 
1e8e0 20 20 20 65 78 69 73 74 73 20 3d 20 31 3b 0a 09     exists = 1;..
1e8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e900 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1e910 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69  ze (stmt);.    i
1e920 66 20 28 21 65 78 69 73 74 73 29 0a 20 20 20 20  f (!exists).    
1e930 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
1e940 65 5f 65 0a 09 20 20 20 20 20 20 28 22 52 65 63  e_e..      ("Rec
1e950 6f 76 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c 75  overGeometryColu
1e960 6d 6e 28 29 20 65 72 72 6f 72 3a 20 74 61 62 6c  mn() error: tabl
1e970 65 20 27 25 73 27 20 64 6f 65 73 20 6e 6f 74 20  e '%s' does not 
1e980 65 78 69 73 74 5c 6e 22 2c 0a 09 20 20 20 20 20  exist\n",..     
1e990 20 20 74 61 62 6c 65 29 3b 0a 09 20 20 73 71 6c    table);..  sql
1e9a0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
1e9b0 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
1e9c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
1e9d0 0a 20 20 20 20 69 66 20 28 69 73 5f 77 69 74 68  .    if (is_with
1e9e0 6f 75 74 5f 72 6f 77 69 64 5f 74 61 62 6c 65 20  out_rowid_table 
1e9f0 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 29 29  (sqlite, table))
1ea00 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
1ea10 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
1ea20 28 22 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72  ("RecoverGeometr
1ea30 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
1ea40 20 74 61 62 6c 65 20 27 25 73 27 20 69 73 20 57   table '%s' is W
1ea50 49 54 48 4f 55 54 20 52 4f 57 49 44 5c 6e 22 2c  ITHOUT ROWID\n",
1ea60 0a 09 20 20 20 20 20 20 20 74 61 62 6c 65 29 3b  ..       table);
1ea70 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
1ea80 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
1ea90 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
1eaa0 20 20 20 20 20 20 7d 0a 2f 2a 20 61 64 6a 75 73        }./* adjus
1eab0 74 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c 20  ting the actual 
1eac0 47 65 6f 6d 65 74 72 79 54 79 70 65 20 2a 2f 0a  GeometryType */.
1ead0 20 20 20 20 78 78 74 79 70 65 20 3d 20 78 74 79      xxtype = xty
1eae0 70 65 3b 0a 20 20 20 20 78 74 79 70 65 20 3d 20  pe;.    xtype = 
1eaf0 47 41 49 41 5f 55 4e 4b 4e 4f 57 4e 3b 0a 20 20  GAIA_UNKNOWN;.  
1eb00 20 20 69 66 20 28 78 78 74 79 70 65 20 3d 3d 20    if (xxtype == 
1eb10 47 41 49 41 5f 50 4f 49 4e 54 29 0a 20 20 20 20  GAIA_POINT).    
1eb20 20 20 7b 0a 09 20 20 73 77 69 74 63 68 20 28 64    {..  switch (d
1eb30 69 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20 20 20  ims)..    {..   
1eb40 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a   case GAIA_XY_Z:
1eb50 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f  ...xtype = GAIA_
1eb60 50 4f 49 4e 54 5a 3b 0a 09 09 62 72 65 61 6b 3b  POINTZ;...break;
1eb70 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
1eb80 58 59 5f 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20  XY_M:...xtype = 
1eb90 47 41 49 41 5f 50 4f 49 4e 54 4d 3b 0a 09 09 62  GAIA_POINTM;...b
1eba0 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
1ebb0 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 78  GAIA_XY_Z_M:...x
1ebc0 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e  type = GAIA_POIN
1ebd0 54 5a 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  TZM;...break;.. 
1ebe0 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 78 74     default:...xt
1ebf0 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54  ype = GAIA_POINT
1ec00 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1ec10 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  };.      }.    i
1ec20 66 20 28 78 78 74 79 70 65 20 3d 3d 20 47 41 49  f (xxtype == GAI
1ec30 41 5f 4c 49 4e 45 53 54 52 49 4e 47 29 0a 20 20  A_LINESTRING).  
1ec40 20 20 20 20 7b 0a 09 20 20 73 77 69 74 63 68 20      {..  switch 
1ec50 28 64 69 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20  (dims)..    {.. 
1ec60 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f     case GAIA_XY_
1ec70 5a 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  Z:...xtype = GAI
1ec80 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3b 0a 09  A_LINESTRINGZ;..
1ec90 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
1eca0 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 78  e GAIA_XY_M:...x
1ecb0 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45  type = GAIA_LINE
1ecc0 53 54 52 49 4e 47 4d 3b 0a 09 09 62 72 65 61 6b  STRINGM;...break
1ecd0 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
1ece0 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65  _XY_Z_M:...xtype
1ecf0 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49   = GAIA_LINESTRI
1ed00 4e 47 5a 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  NGZM;...break;..
1ed10 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 78      default:...x
1ed20 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45  type = GAIA_LINE
1ed30 53 54 52 49 4e 47 3b 0a 09 09 62 72 65 61 6b 3b  STRING;...break;
1ed40 0a 09 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d  ..    };.      }
1ed50 0a 20 20 20 20 69 66 20 28 78 78 74 79 70 65 20  .    if (xxtype 
1ed60 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 29  == GAIA_POLYGON)
1ed70 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 77 69 74  .      {..  swit
1ed80 63 68 20 28 64 69 6d 73 29 0a 09 20 20 20 20 7b  ch (dims)..    {
1ed90 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
1eda0 58 59 5f 5a 3a 0a 09 09 78 74 79 70 65 20 3d 20  XY_Z:...xtype = 
1edb0 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3b 0a 09  GAIA_POLYGONZ;..
1edc0 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
1edd0 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 78  e GAIA_XY_M:...x
1ede0 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59  type = GAIA_POLY
1edf0 47 4f 4e 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  GONM;...break;..
1ee00 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59      case GAIA_XY
1ee10 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20  _Z_M:...xtype = 
1ee20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a  GAIA_POLYGONZM;.
1ee30 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64 65  ..break;..    de
1ee40 66 61 75 6c 74 3a 0a 09 09 78 74 79 70 65 20 3d  fault:...xtype =
1ee50 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 09   GAIA_POLYGON;..
1ee60 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a  .break;..    };.
1ee70 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
1ee80 78 78 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  xxtype == GAIA_M
1ee90 55 4c 54 49 50 4f 49 4e 54 29 0a 20 20 20 20 20  ULTIPOINT).     
1eea0 20 7b 0a 09 20 20 73 77 69 74 63 68 20 28 64 69   {..  switch (di
1eeb0 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20 20 20 20  ms)..    {..    
1eec0 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a  case GAIA_XY_Z:.
1eed0 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f 4d  ..xtype = GAIA_M
1eee0 55 4c 54 49 50 4f 49 4e 54 5a 3b 0a 09 09 62 72  ULTIPOINTZ;...br
1eef0 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
1ef00 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 78 74 79 70  AIA_XY_M:...xtyp
1ef10 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
1ef20 49 4e 54 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  INTM;...break;..
1ef30 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59      case GAIA_XY
1ef40 5f 5a 5f 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20  _Z_M:...xtype = 
1ef50 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a  GAIA_MULTIPOINTZ
1ef60 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  M;...break;..   
1ef70 20 64 65 66 61 75 6c 74 3a 0a 09 09 78 74 79 70   default:...xtyp
1ef80 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
1ef90 49 4e 54 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  INT;...break;.. 
1efa0 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20     };.      }.  
1efb0 20 20 69 66 20 28 78 78 74 79 70 65 20 3d 3d 20    if (xxtype == 
1efc0 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
1efd0 52 49 4e 47 29 0a 20 20 20 20 20 20 7b 0a 09 20  RING).      {.. 
1efe0 20 73 77 69 74 63 68 20 28 64 69 6d 73 29 0a 09   switch (dims)..
1eff0 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20      {..    case 
1f000 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09 78 74 79  GAIA_XY_Z:...xty
1f010 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
1f020 49 4e 45 53 54 52 49 4e 47 5a 3b 0a 09 09 62 72  INESTRINGZ;...br
1f030 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
1f040 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 78 74 79 70  AIA_XY_M:...xtyp
1f050 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49  e = GAIA_MULTILI
1f060 4e 45 53 54 52 49 4e 47 4d 3b 0a 09 09 62 72 65  NESTRINGM;...bre
1f070 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
1f080 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 78 74 79  IA_XY_Z_M:...xty
1f090 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
1f0a0 49 4e 45 53 54 52 49 4e 47 5a 4d 3b 0a 09 09 62  INESTRINGZM;...b
1f0b0 72 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75  reak;..    defau
1f0c0 6c 74 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41  lt:...xtype = GA
1f0d0 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
1f0e0 4e 47 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  NG;...break;..  
1f0f0 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    };.      }.   
1f100 20 69 66 20 28 78 78 74 79 70 65 20 3d 3d 20 47   if (xxtype == G
1f110 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
1f120 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 77 69  ).      {..  swi
1f130 74 63 68 20 28 64 69 6d 73 29 0a 09 20 20 20 20  tch (dims)..    
1f140 7b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  {..    case GAIA
1f150 5f 58 59 5f 5a 3a 0a 09 09 78 74 79 70 65 20 3d  _XY_Z:...xtype =
1f160 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
1f170 4f 4e 5a 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  ONZ;...break;.. 
1f180 20 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f     case GAIA_XY_
1f190 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  M:...xtype = GAI
1f1a0 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 3b  A_MULTIPOLYGONM;
1f1b0 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
1f1c0 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a  ase GAIA_XY_Z_M:
1f1d0 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f  ...xtype = GAIA_
1f1e0 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a  MULTIPOLYGONZM;.
1f1f0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64 65  ..break;..    de
1f200 66 61 75 6c 74 3a 0a 09 09 78 74 79 70 65 20 3d  fault:...xtype =
1f210 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
1f220 4f 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  ON;...break;..  
1f230 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    };.      }.   
1f240 20 69 66 20 28 78 78 74 79 70 65 20 3d 3d 20 47   if (xxtype == G
1f250 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
1f260 45 43 54 49 4f 4e 29 0a 20 20 20 20 20 20 7b 0a  ECTION).      {.
1f270 09 20 20 73 77 69 74 63 68 20 28 64 69 6d 73 29  .  switch (dims)
1f280 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73  ..    {..    cas
1f290 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09 78  e GAIA_XY_Z:...x
1f2a0 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
1f2b0 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b  ETRYCOLLECTIONZ;
1f2c0 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
1f2d0 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09  ase GAIA_XY_M:..
1f2e0 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45  .xtype = GAIA_GE
1f2f0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
1f300 4d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  M;...break;..   
1f310 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f   case GAIA_XY_Z_
1f320 4d 3a 0a 09 09 78 74 79 70 65 20 3d 20 47 41 49  M:...xtype = GAI
1f330 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
1f340 54 49 4f 4e 5a 4d 3b 0a 09 09 62 72 65 61 6b 3b  TIONZM;...break;
1f350 0a 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ..    default:..
1f360 09 78 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45  .xtype = GAIA_GE
1f370 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
1f380 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1f390 7d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  };.      }.    i
1f3a0 66 20 28 78 78 74 79 70 65 20 3d 3d 20 2d 31 29  f (xxtype == -1)
1f3b0 0a 09 78 74 79 70 65 20 3d 20 2d 31 3b 09 09 2f  ..xtype = -1;../
1f3c0 2a 20 47 45 4f 4d 45 54 52 59 20 2a 2f 0a 20 20  * GEOMETRY */.  
1f3d0 20 20 69 66 20 28 21 72 65 63 6f 76 65 72 47 65    if (!recoverGe
1f3e0 6f 6d 43 6f 6c 75 6d 6e 20 28 73 71 6c 69 74 65  omColumn (sqlite
1f3f0 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c  , table, column,
1f400 20 78 74 79 70 65 2c 20 64 69 6d 73 2c 20 73 72   xtype, dims, sr
1f410 69 64 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  id)).      {..  
1f420 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 52  spatialite_e ("R
1f430 65 63 6f 76 65 72 47 65 6f 6d 65 74 72 79 43 6f  ecoverGeometryCo
1f440 6c 75 6d 6e 28 29 3a 20 76 61 6c 69 64 61 74 69  lumn(): validati
1f450 6f 6e 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 09  on failed\n");..
1f460 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1f470 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
1f480 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
1f490 20 20 20 20 7d 0a 2f 2a 20 64 65 6c 65 74 69 6e      }./* deletin
1f4a0 67 20 61 6e 79 77 61 79 20 61 6e 79 20 70 72 65  g anyway any pre
1f4b0 76 69 6f 75 73 20 64 65 66 69 6e 69 74 69 6f 6e  vious definition
1f4c0 20 2a 2f 0a 20 20 20 20 73 71 6c 5f 73 74 61 74   */.    sql_stat
1f4d0 65 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  ement = sqlite3_
1f4e0 6d 70 72 69 6e 74 66 20 28 22 44 45 4c 45 54 45  mprintf ("DELETE
1f4f0 20 46 52 4f 4d 20 67 65 6f 6d 65 74 72 79 5f 63   FROM geometry_c
1f500 6f 6c 75 6d 6e 73 20 22 0a 09 09 09 09 20 20 20  olumns ".....   
1f510 20 20 22 57 48 45 52 45 20 4c 6f 77 65 72 28 66    "WHERE Lower(f
1f520 5f 74 61 62 6c 65 5f 6e 61 6d 65 29 20 3d 20 4c  _table_name) = L
1f530 6f 77 65 72 28 3f 29 20 41 4e 44 20 22 0a 09 09  ower(?) AND "...
1f540 09 09 20 20 20 20 20 22 4c 6f 77 65 72 28 66 5f  ..     "Lower(f_
1f550 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 29  geometry_column)
1f560 20 3d 20 4c 6f 77 65 72 28 3f 29 22 29 3b 0a 20   = Lower(?)");. 
1f570 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
1f580 5f 70 72 65 70 61 72 65 5f 76 32 20 28 73 71 6c  _prepare_v2 (sql
1f590 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  ite, sql_stateme
1f5a0 6e 74 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 5f  nt, strlen (sql_
1f5b0 73 74 61 74 65 6d 65 6e 74 29 2c 0a 09 09 09 20  statement),.... 
1f5c0 20 20 20 20 20 26 73 74 6d 74 2c 20 4e 55 4c 4c       &stmt, NULL
1f5d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1f5e0 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65  ree (sql_stateme
1f5f0 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74  nt);.    if (ret
1f600 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20   != SQLITE_OK). 
1f610 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
1f620 6c 69 74 65 5f 65 20 28 22 52 65 63 6f 76 65 72  lite_e ("Recover
1f630 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 3a 20  GeometryColumn: 
1f640 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 73 71  \"%s\"\n",....sq
1f650 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71  lite3_errmsg (sq
1f660 6c 69 74 65 29 29 3b 0a 09 20 20 73 71 6c 69 74  lite));..  sqlit
1f670 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
1f680 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72  ontext, 0);..  r
1f690 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
1f6a0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
1f6b0 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c   (stmt);.    sql
1f6c0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
1f6d0 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20  ngs (stmt);.    
1f6e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1f6f0 74 20 28 73 74 6d 74 2c 20 31 2c 20 74 61 62 6c  t (stmt, 1, tabl
1f700 65 2c 20 73 74 72 6c 65 6e 20 28 74 61 62 6c 65  e, strlen (table
1f710 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ), SQLITE_STATIC
1f720 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
1f730 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20  ind_text (stmt, 
1f740 32 2c 20 63 6f 6c 75 6d 6e 2c 20 73 74 72 6c 65  2, column, strle
1f750 6e 20 28 63 6f 6c 75 6d 6e 29 2c 20 53 51 4c 49  n (column), SQLI
1f760 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1f770 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ret = sqlite3_st
1f780 65 70 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69  ep (stmt);.    i
1f790 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45  f (ret == SQLITE
1f7a0 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 20 3d 3d 20  _DONE || ret == 
1f7b0 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 3b 0a 20  SQLITE_ROW)..;. 
1f7c0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
1f7d0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20  .  spatialite_e 
1f7e0 28 22 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72  ("RecoverGeometr
1f7f0 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
1f800 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 73   \"%s\"\n",....s
1f810 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73  qlite3_errmsg (s
1f820 71 6c 69 74 65 29 29 3b 0a 09 20 20 73 71 6c 69  qlite));..  sqli
1f830 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74  te3_finalize (st
1f840 6d 74 29 3b 0a 09 20 20 67 6f 74 6f 20 65 72 72  mt);..  goto err
1f850 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
1f860 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1f870 20 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66   (stmt);..    if
1f880 20 28 6d 65 74 61 64 61 74 61 5f 76 65 72 73 69   (metadata_versi
1f890 6f 6e 20 3d 3d 20 31 29 0a 20 20 20 20 20 20 7b  on == 1).      {
1f8a0 0a 09 20 20 2f 2a 20 6c 65 67 61 63 79 20 6d 65  ..  /* legacy me
1f8b0 74 61 64 61 74 61 20 73 74 79 6c 65 20 3c 3d 20  tadata style <= 
1f8c0 76 2e 33 2e 31 2e 30 20 2a 2f 0a 09 20 20 73 77  v.3.1.0 */..  sw
1f8d0 69 74 63 68 20 28 78 74 79 70 65 29 0a 09 20 20  itch (xtype)..  
1f8e0 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20 47 41    {..    case GA
1f8f0 49 41 5f 50 4f 49 4e 54 3a 0a 09 20 20 20 20 63  IA_POINT:..    c
1f900 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 3a  ase GAIA_POINTZ:
1f910 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
1f920 50 4f 49 4e 54 4d 3a 0a 09 20 20 20 20 63 61 73  POINTM:..    cas
1f930 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a 0a  e GAIA_POINTZM:.
1f940 09 09 70 5f 74 79 70 65 20 3d 20 22 50 4f 49 4e  ..p_type = "POIN
1f950 54 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  T";...break;..  
1f960 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45    case GAIA_LINE
1f970 53 54 52 49 4e 47 3a 0a 09 20 20 20 20 63 61 73  STRING:..    cas
1f980 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  e GAIA_LINESTRIN
1f990 47 5a 3a 0a 09 20 20 20 20 63 61 73 65 20 47 41  GZ:..    case GA
1f9a0 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a  IA_LINESTRINGM:.
1f9b0 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c  .    case GAIA_L
1f9c0 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 09 09 70  INESTRINGZM:...p
1f9d0 5f 74 79 70 65 20 3d 20 22 4c 49 4e 45 53 54 52  _type = "LINESTR
1f9e0 49 4e 47 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  ING";...break;..
1f9f0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f      case GAIA_PO
1fa00 4c 59 47 4f 4e 3a 0a 09 20 20 20 20 63 61 73 65  LYGON:..    case
1fa10 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a   GAIA_POLYGONZ:.
1fa20 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50  .    case GAIA_P
1fa30 4f 4c 59 47 4f 4e 4d 3a 0a 09 20 20 20 20 63 61  OLYGONM:..    ca
1fa40 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a  se GAIA_POLYGONZ
1fa50 4d 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 50  M:...p_type = "P
1fa60 4f 4c 59 47 4f 4e 22 3b 0a 09 09 62 72 65 61 6b  OLYGON";...break
1fa70 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
1fa80 5f 4d 55 4c 54 49 50 4f 49 4e 54 3a 0a 09 20 20  _MULTIPOINT:..  
1fa90 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
1faa0 49 50 4f 49 4e 54 5a 3a 0a 09 20 20 20 20 63 61  IPOINTZ:..    ca
1fab0 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49  se GAIA_MULTIPOI
1fac0 4e 54 4d 3a 0a 09 20 20 20 20 63 61 73 65 20 47  NTM:..    case G
1fad0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d  AIA_MULTIPOINTZM
1fae0 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 4d 55  :...p_type = "MU
1faf0 4c 54 49 50 4f 49 4e 54 22 3b 0a 09 09 62 72 65  LTIPOINT";...bre
1fb00 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
1fb10 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
1fb20 4e 47 3a 0a 09 20 20 20 20 63 61 73 65 20 47 41  NG:..    case GA
1fb30 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
1fb40 4e 47 5a 3a 0a 09 20 20 20 20 63 61 73 65 20 47  NGZ:..    case G
1fb50 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
1fb60 49 4e 47 4d 3a 0a 09 20 20 20 20 63 61 73 65 20  INGM:..    case 
1fb70 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
1fb80 52 49 4e 47 5a 4d 3a 0a 09 09 70 5f 74 79 70 65  RINGZM:...p_type
1fb90 20 3d 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52   = "MULTILINESTR
1fba0 49 4e 47 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  ING";...break;..
1fbb0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
1fbc0 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 20  LTIPOLYGON:..   
1fbd0 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
1fbe0 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 20 20 63  POLYGONZ:..    c
1fbf0 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
1fc00 4c 59 47 4f 4e 4d 3a 0a 09 20 20 20 20 63 61 73  LYGONM:..    cas
1fc10 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  e GAIA_MULTIPOLY
1fc20 47 4f 4e 5a 4d 3a 0a 09 09 70 5f 74 79 70 65 20  GONZM:...p_type 
1fc30 3d 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 22  = "MULTIPOLYGON"
1fc40 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
1fc50 63 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54  case GAIA_GEOMET
1fc60 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 20  RYCOLLECTION:.. 
1fc70 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f     case GAIA_GEO
1fc80 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
1fc90 3a 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  :..    case GAIA
1fca0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
1fcb0 49 4f 4e 4d 3a 0a 09 20 20 20 20 63 61 73 65 20  IONM:..    case 
1fcc0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
1fcd0 4c 45 43 54 49 4f 4e 5a 4d 3a 0a 09 09 70 5f 74  LECTIONZM:...p_t
1fce0 79 70 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43  ype = "GEOMETRYC
1fcf0 4f 4c 4c 45 43 54 49 4f 4e 22 3b 0a 09 09 62 72  OLLECTION";...br
1fd00 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 2d  eak;..    case -
1fd10 31 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 47  1:...p_type = "G
1fd20 45 4f 4d 45 54 52 59 22 3b 0a 09 09 62 72 65 61  EOMETRY";...brea
1fd30 6b 3b 0a 09 20 20 20 20 7d 3b 0a 09 20 20 73 74  k;..    };..  st
1fd40 72 63 61 74 20 28 73 71 6c 2c 20 22 27 2c 20 27  rcat (sql, "', '
1fd50 22 29 3b 0a 09 20 20 73 77 69 74 63 68 20 28 64  ");..  switch (d
1fd60 69 6d 73 29 0a 09 20 20 20 20 7b 0a 09 20 20 20  ims)..    {..   
1fd70 20 63 61 73 65 20 47 41 49 41 5f 58 59 3a 0a 09   case GAIA_XY:..
1fd80 09 70 5f 64 69 6d 73 20 3d 20 22 58 59 22 3b 0a  .p_dims = "XY";.
1fd90 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
1fda0 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09  se GAIA_XY_Z:...
1fdb0 70 5f 64 69 6d 73 20 3d 20 22 58 59 5a 22 3b 0a  p_dims = "XYZ";.
1fdc0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
1fdd0 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09  se GAIA_XY_M:...
1fde0 70 5f 64 69 6d 73 20 3d 20 22 58 59 4d 22 3b 0a  p_dims = "XYM";.
1fdf0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
1fe00 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a  se GAIA_XY_Z_M:.
1fe10 09 09 70 5f 64 69 6d 73 20 3d 20 22 58 59 5a 4d  ..p_dims = "XYZM
1fe20 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  ";...break;..   
1fe30 20 7d 3b 0a 2f 2a 20 53 61 6e 64 72 6f 20 32 30   };./* Sandro 20
1fe40 31 33 2d 30 31 2d 30 37 0a 2f 20 66 69 78 69 6e  13-01-07./ fixin
1fe50 67 20 61 6e 20 69 73 73 75 65 20 72 65 70 6f 72  g an issue repor
1fe60 74 65 64 20 62 79 20 50 65 74 65 72 20 41 72 6f  ted by Peter Aro
1fe70 6e 73 6f 6e 20 5b 45 53 52 49 5d 20 3c 70 61 72  nson [ESRI] <par
1fe80 6f 6e 73 6f 6e 40 65 73 72 69 2e 63 6f 6d 3e 0a  onson@esri.com>.
1fe90 09 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  .  sql_statement
1fea0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1feb0 74 66 20 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  tf ("INSERT INTO
1fec0 20 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e   geometry_column
1fed0 73 20 22 0a 09 09 09 09 09 20 20 20 22 28 66 5f  s "......   "(f_
1fee0 74 61 62 6c 65 5f 6e 61 6d 65 2c 20 66 5f 67 65  table_name, f_ge
1fef0 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 2c 20 74  ometry_column, t
1ff00 79 70 65 2c 20 63 6f 6f 72 64 5f 64 69 6d 65 6e  ype, coord_dimen
1ff10 73 69 6f 6e 2c 20 73 72 69 64 2c 20 22 0a 09 09  sion, srid, "...
1ff20 09 09 09 20 20 20 22 73 70 61 74 69 61 6c 5f 69  ...   "spatial_i
1ff30 6e 64 65 78 5f 65 6e 61 62 6c 65 64 29 20 56 41  ndex_enabled) VA
1ff40 4c 55 45 53 20 28 4c 6f 77 65 72 28 3f 29 2c 20  LUES (Lower(?), 
1ff50 4c 6f 77 65 72 28 3f 29 2c 20 25 51 2c 20 25 51  Lower(?), %Q, %Q
1ff60 2c 20 3f 2c 20 30 29 22 2c 0a 09 09 09 09 09 20  , ?, 0)",...... 
1ff70 20 20 70 5f 74 79 70 65 2c 20 70 5f 64 69 6d 73    p_type, p_dims
1ff80 29 3b 0a 2a 2f 0a 09 20 20 73 71 6c 5f 73 74 61  );.*/..  sql_sta
1ff90 74 65 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  tement = sqlite3
1ffa0 5f 6d 70 72 69 6e 74 66 20 28 22 49 4e 53 45 52  _mprintf ("INSER
1ffb0 54 20 49 4e 54 4f 20 67 65 6f 6d 65 74 72 79 5f  T INTO geometry_
1ffc0 63 6f 6c 75 6d 6e 73 20 22 0a 09 09 09 09 09 20  columns "...... 
1ffd0 20 20 22 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65    "(f_table_name
1ffe0 2c 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c  , f_geometry_col
1fff0 75 6d 6e 2c 20 74 79 70 65 2c 20 63 6f 6f 72 64  umn, type, coord
20000 5f 64 69 6d 65 6e 73 69 6f 6e 2c 20 73 72 69 64  _dimension, srid
20010 2c 20 22 0a 09 09 09 09 09 20 20 20 22 73 70 61  , "......   "spa
20020 74 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c  tial_index_enabl
20030 65 64 29 20 56 41 4c 55 45 53 20 28 3f 2c 20 3f  ed) VALUES (?, ?
20040 2c 20 25 51 2c 20 25 51 2c 20 3f 2c 20 30 29 22  , %Q, %Q, ?, 0)"
20050 2c 0a 09 09 09 09 09 20 20 20 70 5f 74 79 70 65  ,......   p_type
20060 2c 20 70 5f 64 69 6d 73 29 3b 0a 20 20 20 20 20  , p_dims);.     
20070 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
20080 20 20 7b 0a 09 20 20 2f 2a 20 63 75 72 72 65 6e    {..  /* curren
20090 74 20 6d 65 74 61 64 61 74 61 20 73 74 79 6c 65  t metadata style
200a0 20 3e 3d 20 76 2e 34 2e 30 2e 30 20 2a 2f 0a 09   >= v.4.0.0 */..
200b0 20 20 73 77 69 74 63 68 20 28 78 74 79 70 65 29    switch (xtype)
200c0 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73  ..    {..    cas
200d0 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09  e GAIA_POINT:...
200e0 6e 5f 74 79 70 65 20 3d 20 31 3b 0a 09 09 6e 5f  n_type = 1;...n_
200f0 64 69 6d 73 20 3d 20 32 3b 0a 09 09 62 72 65 61  dims = 2;...brea
20100 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
20110 41 5f 50 4f 49 4e 54 5a 3a 0a 09 09 6e 5f 74 79  A_POINTZ:...n_ty
20120 70 65 20 3d 20 31 30 30 31 3b 0a 09 09 6e 5f 64  pe = 1001;...n_d
20130 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72 65 61 6b  ims = 3;...break
20140 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
20150 5f 50 4f 49 4e 54 4d 3a 0a 09 09 6e 5f 74 79 70  _POINTM:...n_typ
20160 65 20 3d 20 32 30 30 31 3b 0a 09 09 6e 5f 64 69  e = 2001;...n_di
20170 6d 73 20 3d 20 33 3b 0a 09 09 62 72 65 61 6b 3b  ms = 3;...break;
20180 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
20190 50 4f 49 4e 54 5a 4d 3a 0a 09 09 6e 5f 74 79 70  POINTZM:...n_typ
201a0 65 20 3d 20 33 30 30 31 3b 0a 09 09 6e 5f 64 69  e = 3001;...n_di
201b0 6d 73 20 3d 20 34 3b 0a 09 09 62 72 65 61 6b 3b  ms = 4;...break;
201c0 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
201d0 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 6e 5f  LINESTRING:...n_
201e0 74 79 70 65 20 3d 20 32 3b 0a 09 09 6e 5f 64 69  type = 2;...n_di
201f0 6d 73 20 3d 20 32 3b 0a 09 09 62 72 65 61 6b 3b  ms = 2;...break;
20200 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
20210 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09 09 6e  LINESTRINGZ:...n
20220 5f 74 79 70 65 20 3d 20 31 30 30 32 3b 0a 09 09  _type = 1002;...
20230 6e 5f 64 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72  n_dims = 3;...br
20240 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
20250 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 3a  AIA_LINESTRINGM:
20260 0a 09 09 6e 5f 74 79 70 65 20 3d 20 32 30 30 32  ...n_type = 2002
20270 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20 33 3b 0a  ;...n_dims = 3;.
20280 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
20290 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  se GAIA_LINESTRI
202a0 4e 47 5a 4d 3a 0a 09 09 6e 5f 74 79 70 65 20 3d  NGZM:...n_type =
202b0 20 33 30 30 32 3b 0a 09 09 6e 5f 64 69 6d 73 20   3002;...n_dims 
202c0 3d 20 34 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  = 4;...break;.. 
202d0 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c     case GAIA_POL
202e0 59 47 4f 4e 3a 0a 09 09 6e 5f 74 79 70 65 20 3d  YGON:...n_type =
202f0 20 33 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20 32   3;...n_dims = 2
20300 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
20310 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
20320 4e 5a 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20 31  NZ:...n_type = 1
20330 30 30 33 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20  003;...n_dims = 
20340 33 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  3;...break;..   
20350 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47   case GAIA_POLYG
20360 4f 4e 4d 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20  ONM:...n_type = 
20370 32 30 30 33 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d  2003;...n_dims =
20380 20 33 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20   3;...break;..  
20390 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59    case GAIA_POLY
203a0 47 4f 4e 5a 4d 3a 0a 09 09 6e 5f 74 79 70 65 20  GONZM:...n_type 
203b0 3d 20 33 30 30 33 3b 0a 09 09 6e 5f 64 69 6d 73  = 3003;...n_dims
203c0 20 3d 20 34 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   = 4;...break;..
203d0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
203e0 4c 54 49 50 4f 49 4e 54 3a 0a 09 09 6e 5f 74 79  LTIPOINT:...n_ty
203f0 70 65 20 3d 20 34 3b 0a 09 09 6e 5f 64 69 6d 73  pe = 4;...n_dims
20400 20 3d 20 32 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   = 2;...break;..
20410 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
20420 4c 54 49 50 4f 49 4e 54 5a 3a 0a 09 09 6e 5f 74  LTIPOINTZ:...n_t
20430 79 70 65 20 3d 20 31 30 30 34 3b 0a 09 09 6e 5f  ype = 1004;...n_
20440 64 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72 65 61  dims = 3;...brea
20450 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
20460 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 3a 0a 09  A_MULTIPOINTM:..
20470 09 6e 5f 74 79 70 65 20 3d 20 32 30 30 34 3b 0a  .n_type = 2004;.
20480 09 09 6e 5f 64 69 6d 73 20 3d 20 33 3b 0a 09 09  ..n_dims = 3;...
20490 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
204a0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
204b0 5a 4d 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20 33  ZM:...n_type = 3
204c0 30 30 34 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20  004;...n_dims = 
204d0 34 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  4;...break;..   
204e0 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
204f0 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 6e 5f  LINESTRING:...n_
20500 74 79 70 65 20 3d 20 35 3b 0a 09 09 6e 5f 64 69  type = 5;...n_di
20510 6d 73 20 3d 20 32 3b 0a 09 09 62 72 65 61 6b 3b  ms = 2;...break;
20520 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
20530 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a  MULTILINESTRINGZ
20540 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20 31 30 30  :...n_type = 100
20550 35 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20 33 3b  5;...n_dims = 3;
20560 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
20570 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49  ase GAIA_MULTILI
20580 4e 45 53 54 52 49 4e 47 4d 3a 0a 09 09 6e 5f 74  NESTRINGM:...n_t
20590 79 70 65 20 3d 20 32 30 30 35 3b 0a 09 09 6e 5f  ype = 2005;...n_
205a0 64 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72 65 61  dims = 3;...brea
205b0 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
205c0 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
205d0 47 5a 4d 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20  GZM:...n_type = 
205e0 33 30 30 35 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d  3005;...n_dims =
205f0 20 34 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20   4;...break;..  
20600 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
20610 49 50 4f 4c 59 47 4f 4e 3a 0a 09 09 6e 5f 74 79  IPOLYGON:...n_ty
20620 70 65 20 3d 20 36 3b 0a 09 09 6e 5f 64 69 6d 73  pe = 6;...n_dims
20630 20 3d 20 32 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   = 2;...break;..
20640 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
20650 4c 54 49 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 09 6e  LTIPOLYGONZ:...n
20660 5f 74 79 70 65 20 3d 20 31 30 30 36 3b 0a 09 09  _type = 1006;...
20670 6e 5f 64 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72  n_dims = 3;...br
20680 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
20690 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
206a0 4d 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20 32 30  M:...n_type = 20
206b0 30 36 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20 33  06;...n_dims = 3
206c0 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
206d0 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50  case GAIA_MULTIP
206e0 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 09 6e 5f 74 79  OLYGONZM:...n_ty
206f0 70 65 20 3d 20 33 30 30 36 3b 0a 09 09 6e 5f 64  pe = 3006;...n_d
20700 69 6d 73 20 3d 20 34 3b 0a 09 09 62 72 65 61 6b  ims = 4;...break
20710 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
20720 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
20730 49 4f 4e 3a 0a 09 09 6e 5f 74 79 70 65 20 3d 20  ION:...n_type = 
20740 37 3b 0a 09 09 6e 5f 64 69 6d 73 20 3d 20 32 3b  7;...n_dims = 2;
20750 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
20760 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  ase GAIA_GEOMETR
20770 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3a 0a 09 09  YCOLLECTIONZ:...
20780 6e 5f 74 79 70 65 20 3d 20 31 30 30 37 3b 0a 09  n_type = 1007;..
20790 09 6e 5f 64 69 6d 73 20 3d 20 33 3b 0a 09 09 62  .n_dims = 3;...b
207a0 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
207b0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
207c0 4c 45 43 54 49 4f 4e 4d 3a 0a 09 09 6e 5f 74 79  LECTIONM:...n_ty
207d0 70 65 20 3d 20 32 30 30 37 3b 0a 09 09 6e 5f 64  pe = 2007;...n_d
207e0 69 6d 73 20 3d 20 33 3b 0a 09 09 62 72 65 61 6b  ims = 3;...break
207f0 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
20800 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
20810 49 4f 4e 5a 4d 3a 0a 09 09 6e 5f 74 79 70 65 20  IONZM:...n_type 
20820 3d 20 33 30 30 37 3b 0a 09 09 6e 5f 64 69 6d 73  = 3007;...n_dims
20830 20 3d 20 34 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   = 4;...break;..
20840 20 20 20 20 63 61 73 65 20 2d 31 3a 0a 09 09 73      case -1:...s
20850 77 69 74 63 68 20 28 64 69 6d 73 29 0a 09 09 20  witch (dims)... 
20860 20 7b 0a 09 09 20 20 63 61 73 65 20 47 41 49 41   {...  case GAIA
20870 5f 58 59 3a 0a 09 09 20 20 20 20 20 20 6e 5f 74  _XY:...      n_t
20880 79 70 65 20 3d 20 30 3b 0a 09 09 20 20 20 20 20  ype = 0;...     
20890 20 6e 5f 64 69 6d 73 20 3d 20 32 3b 0a 09 09 20   n_dims = 2;... 
208a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20       break;...  
208b0 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a  case GAIA_XY_Z:.
208c0 09 09 20 20 20 20 20 20 6e 5f 74 79 70 65 20 3d  ..      n_type =
208d0 20 31 30 30 30 3b 0a 09 09 20 20 20 20 20 20 6e   1000;...      n
208e0 5f 64 69 6d 73 20 3d 20 33 3b 0a 09 09 20 20 20  _dims = 3;...   
208f0 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61     break;...  ca
20900 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09  se GAIA_XY_M:...
20910 20 20 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 32        n_type = 2
20920 30 30 30 3b 0a 09 09 20 20 20 20 20 20 6e 5f 64  000;...      n_d
20930 69 6d 73 20 3d 20 33 3b 0a 09 09 20 20 20 20 20  ims = 3;...     
20940 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65   break;...  case
20950 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09   GAIA_XY_Z_M:...
20960 20 20 20 20 20 20 6e 5f 74 79 70 65 20 3d 20 33        n_type = 3
20970 30 30 30 3b 0a 09 09 20 20 20 20 20 20 6e 5f 64  000;...      n_d
20980 69 6d 73 20 3d 20 34 3b 0a 09 09 20 20 20 20 20  ims = 4;...     
20990 20 62 72 65 61 6b 3b 0a 09 09 20 20 7d 3b 0a 09   break;...  };..
209a0 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a  .break;..    };.
209b0 09 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  .  sql_statement
209c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
209d0 74 66 20 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  tf ("INSERT INTO
209e0 20 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e   geometry_column
209f0 73 20 22 0a 09 09 09 09 09 20 20 20 22 28 66 5f  s "......   "(f_
20a00 74 61 62 6c 65 5f 6e 61 6d 65 2c 20 66 5f 67 65  table_name, f_ge
20a10 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 2c 20 67  ometry_column, g
20a20 65 6f 6d 65 74 72 79 5f 74 79 70 65 2c 20 63 6f  eometry_type, co
20a30 6f 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 2c 20 22  ord_dimension, "
20a40 0a 09 09 09 09 09 20 20 20 22 73 72 69 64 2c 20  ......   "srid, 
20a50 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 5f 65 6e  spatial_index_en
20a60 61 62 6c 65 64 29 20 56 41 4c 55 45 53 20 28 4c  abled) VALUES (L
20a70 6f 77 65 72 28 3f 29 2c 20 4c 6f 77 65 72 28 3f  ower(?), Lower(?
20a80 29 2c 20 25 64 2c 20 25 64 2c 20 3f 2c 20 30 29  ), %d, %d, ?, 0)
20a90 22 2c 0a 09 09 09 09 09 20 20 20 6e 5f 74 79 70  ",......   n_typ
20aa0 65 2c 20 6e 5f 64 69 6d 73 29 3b 0a 20 20 20 20  e, n_dims);.    
20ab0 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 73 71    }.    ret = sq
20ac0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
20ad0 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74   (sqlite, sql_st
20ae0 61 74 65 6d 65 6e 74 2c 20 73 74 72 6c 65 6e 20  atement, strlen 
20af0 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 2c  (sql_statement),
20b00 0a 09 09 09 20 20 20 20 20 20 26 73 74 6d 74 2c  ....      &stmt,
20b10 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69   NULL);.    sqli
20b20 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74  te3_free (sql_st
20b30 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66  atement);.    if
20b40 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
20b50 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OK).      {..  s
20b60 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 52 65  patialite_e ("Re
20b70 63 6f 76 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c  coverGeometryCol
20b80 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  umn: \"%s\"\n",.
20b90 09 09 09 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ...sqlite3_errms
20ba0 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20 20  g (sqlite));..  
20bb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
20bc0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
20bd0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
20be0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
20bf0 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20  reset (stmt);.  
20c00 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f    sqlite3_clear_
20c10 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b  bindings (stmt);
20c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
20c30 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 31 2c  d_text (stmt, 1,
20c40 20 74 61 62 6c 65 2c 20 73 74 72 6c 65 6e 20 28   table, strlen (
20c50 74 61 62 6c 65 29 2c 20 53 51 4c 49 54 45 5f 53  table), SQLITE_S
20c60 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
20c70 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 28 73  te3_bind_text (s
20c80 74 6d 74 2c 20 32 2c 20 63 6f 6c 75 6d 6e 2c 20  tmt, 2, column, 
20c90 73 74 72 6c 65 6e 20 28 63 6f 6c 75 6d 6e 29 2c  strlen (column),
20ca0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
20cb0 0a 20 20 20 20 69 66 20 28 73 72 69 64 20 3c 20  .    if (srid < 
20cc0 30 29 0a 09 73 71 6c 69 74 65 33 5f 62 69 6e 64  0)..sqlite3_bind
20cd0 5f 69 6e 74 20 28 73 74 6d 74 2c 20 33 2c 20 2d  _int (stmt, 3, -
20ce0 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  1);.    else..sq
20cf0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 28  lite3_bind_int (
20d00 73 74 6d 74 2c 20 33 2c 20 73 72 69 64 29 3b 0a  stmt, 3, srid);.
20d10 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
20d20 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 20  3_step (stmt);. 
20d30 20 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51     if (ret == SQ
20d40 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 74  LITE_DONE || ret
20d50 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a   == SQLITE_ROW).
20d60 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .;.    else.    
20d70 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
20d80 65 5f 65 20 28 22 52 65 63 6f 76 65 72 47 65 6f  e_e ("RecoverGeo
20d90 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72  metryColumn() er
20da0 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  ror: \"%s\"\n",.
20db0 09 09 09 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ...sqlite3_errms
20dc0 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20 20  g (sqlite));..  
20dd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
20de0 20 28 73 74 6d 74 29 3b 0a 09 20 20 67 6f 74 6f   (stmt);..  goto
20df0 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a   error;.      }.
20e00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
20e10 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20  lize (stmt);.   
20e20 20 69 66 20 28 6d 65 74 61 64 61 74 61 5f 76 65   if (metadata_ve
20e30 72 73 69 6f 6e 20 3d 3d 20 33 29 0a 20 20 20 20  rsion == 3).    
20e40 20 20 7b 0a 09 20 20 2f 2a 20 63 75 72 72 65 6e    {..  /* curren
20e50 74 20 6d 65 74 61 64 61 74 61 20 73 74 79 6c 65  t metadata style
20e60 20 3e 3d 20 76 2e 34 2e 30 2e 30 20 2a 2f 0a 0a   >= v.4.0.0 */..
20e70 09 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20  .  /* inserting 
20e80 61 20 72 6f 77 20 69 6e 74 6f 20 47 45 4f 4d 45  a row into GEOME
20e90 54 52 59 5f 43 4f 4c 55 4d 4e 53 5f 41 55 54 48  TRY_COLUMNS_AUTH
20ea0 20 2a 2f 0a 09 20 20 73 74 72 63 70 79 20 28 73   */..  strcpy (s
20eb0 71 6c 2c 0a 09 09 20 20 22 49 4e 53 45 52 54 20  ql,...  "INSERT 
20ec0 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
20ed0 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73  geometry_columns
20ee0 5f 61 75 74 68 20 28 66 5f 74 61 62 6c 65 5f 6e  _auth (f_table_n
20ef0 61 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72 79 5f  ame, f_geometry_
20f00 63 6f 6c 75 6d 6e 2c 20 22 29 3b 0a 09 20 20 73  column, ");..  s
20f10 74 72 63 61 74 20 28 73 71 6c 2c 20 22 72 65 61  trcat (sql, "rea
20f20 64 5f 6f 6e 6c 79 2c 20 68 69 64 64 65 6e 29 20  d_only, hidden) 
20f30 56 41 4c 55 45 53 20 28 4c 6f 77 65 72 28 3f 29  VALUES (Lower(?)
20f40 2c 20 4c 6f 77 65 72 28 3f 29 2c 20 30 2c 20 30  , Lower(?), 0, 0
20f50 29 22 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71  )");..  ret = sq
20f60 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
20f70 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 73   (sqlite, sql, s
20f80 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74  trlen (sql), &st
20f90 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 69 66  mt, NULL);..  if
20fa0 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
20fb0 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  OK)..    {...spa
20fc0 74 69 61 6c 69 74 65 5f 65 20 28 22 52 65 63 6f  tialite_e ("Reco
20fd0 76 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d  verGeometryColum
20fe0 6e 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09 09  n: \"%s\"\n",...
20ff0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
21000 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29 3b  rrmsg (sqlite));
21010 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
21020 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
21030 30 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  0);...return;.. 
21040 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f     }..  sqlite3_
21050 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 09 20  reset (stmt);.. 
21060 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
21070 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a  indings (stmt);.
21080 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
21090 74 65 78 74 20 28 73 74 6d 74 2c 20 31 2c 20 74  text (stmt, 1, t
210a0 61 62 6c 65 2c 20 73 74 72 6c 65 6e 20 28 74 61  able, strlen (ta
210b0 62 6c 65 29 2c 20 53 51 4c 49 54 45 5f 53 54 41  ble), SQLITE_STA
210c0 54 49 43 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  TIC);..  sqlite3
210d0 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74  _bind_text (stmt
210e0 2c 20 32 2c 20 63 6f 6c 75 6d 6e 2c 20 73 74 72  , 2, column, str
210f0 6c 65 6e 20 28 63 6f 6c 75 6d 6e 29 2c 20 53 51  len (column), SQ
21100 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 09 20  LITE_STATIC);.. 
21110 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73   ret = sqlite3_s
21120 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20 69  tep (stmt);..  i
21130 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45  f (ret == SQLITE
21140 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 20 3d 3d 20  _DONE || ret == 
21150 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 20  SQLITE_ROW)..   
21160 20 20 20 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20     ;..  else..  
21170 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65    {...spatialite
21180 5f 65 20 28 22 52 65 63 6f 76 65 72 47 65 6f 6d  _e ("RecoverGeom
21190 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72  etryColumn() err
211a0 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09  or: \"%s\"\n",..
211b0 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
211c0 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29  errmsg (sqlite))
211d0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;...sqlite3_fina
211e0 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 09 67  lize (stmt);...g
211f0 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20  oto error;..    
21200 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  }..  sqlite3_fin
21210 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 20  alize (stmt);.. 
21220 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61 20   /* inserting a 
21230 72 6f 77 20 69 6e 74 6f 20 47 45 4f 4d 45 54 52  row into GEOMETR
21240 59 5f 43 4f 4c 55 4d 4e 53 5f 53 54 41 54 49 53  Y_COLUMNS_STATIS
21250 54 49 43 53 20 2a 2f 0a 09 20 20 73 74 72 63 70  TICS */..  strcp
21260 79 20 28 73 71 6c 2c 0a 09 09 20 20 22 49 4e 53  y (sql,...  "INS
21270 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
21280 4e 54 4f 20 67 65 6f 6d 65 74 72 79 5f 63 6f 6c  NTO geometry_col
21290 75 6d 6e 73 5f 73 74 61 74 69 73 74 69 63 73 20  umns_statistics 
212a0 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 2c 20 66  (f_table_name, f
212b0 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e  _geometry_column
212c0 29 20 22 29 3b 0a 09 20 20 73 74 72 63 61 74 20  ) ");..  strcat 
212d0 28 73 71 6c 2c 20 22 56 41 4c 55 45 53 20 28 4c  (sql, "VALUES (L
212e0 6f 77 65 72 28 3f 29 2c 20 4c 6f 77 65 72 28 3f  ower(?), Lower(?
212f0 29 29 22 29 3b 0a 09 20 20 72 65 74 20 3d 20 73  ))");..  ret = s
21300 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
21310 32 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20  2 (sqlite, sql, 
21320 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73  strlen (sql), &s
21330 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 69  tmt, NULL);..  i
21340 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
21350 5f 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70  _OK)..    {...sp
21360 61 74 69 61 6c 69 74 65 5f 65 20 28 22 52 65 63  atialite_e ("Rec
21370 6f 76 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c 75  overGeometryColu
21380 6d 6e 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09  mn: \"%s\"\n",..
21390 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
213a0 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29  errmsg (sqlite))
213b0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
213c0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
213d0 20 30 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09   0);...return;..
213e0 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65 33      }..  sqlite3
213f0 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 09  _reset (stmt);..
21400 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f    sqlite3_clear_
21410 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b  bindings (stmt);
21420 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
21430 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 31 2c 20  _text (stmt, 1, 
21440 74 61 62 6c 65 2c 20 73 74 72 6c 65 6e 20 28 74  table, strlen (t
21450 61 62 6c 65 29 2c 20 53 51 4c 49 54 45 5f 53 54  able), SQLITE_ST
21460 41 54 49 43 29 3b 0a 09 20 20 73 71 6c 69 74 65  ATIC);..  sqlite
21470 33 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d  3_bind_text (stm
21480 74 2c 20 32 2c 20 63 6f 6c 75 6d 6e 2c 20 73 74  t, 2, column, st
21490 72 6c 65 6e 20 28 63 6f 6c 75 6d 6e 29 2c 20 53  rlen (column), S
214a0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 09  QLITE_STATIC);..
214b0 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
214c0 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20  step (stmt);..  
214d0 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54  if (ret == SQLIT
214e0 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 20 3d 3d  E_DONE || ret ==
214f0 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20   SQLITE_ROW)..  
21500 20 20 20 20 3b 0a 09 20 20 65 6c 73 65 0a 09 20      ;..  else.. 
21510 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74     {...spatialit
21520 65 5f 65 20 28 22 52 65 63 6f 76 65 72 47 65 6f  e_e ("RecoverGeo
21530 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72  metryColumn() er
21540 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  ror: \"%s\"\n",.
21550 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
21560 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29  _errmsg (sqlite)
21570 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 69 6e  );...sqlite3_fin
21580 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 09  alize (stmt);...
21590 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20  goto error;..   
215a0 20 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 69   }..  sqlite3_fi
215b0 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09  nalize (stmt);..
215c0 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61    /* inserting a
215d0 20 72 6f 77 20 69 6e 74 6f 20 47 45 4f 4d 45 54   row into GEOMET
215e0 52 59 5f 43 4f 4c 55 4d 4e 53 5f 54 49 4d 45 20  RY_COLUMNS_TIME 
215f0 2a 2f 0a 09 20 20 73 74 72 63 70 79 20 28 73 71  */..  strcpy (sq
21600 6c 2c 0a 09 09 20 20 22 49 4e 53 45 52 54 20 4f  l,...  "INSERT O
21610 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 67  R REPLACE INTO g
21620 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 5f  eometry_columns_
21630 74 69 6d 65 20 28 66 5f 74 61 62 6c 65 5f 6e 61  time (f_table_na
21640 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63  me, f_geometry_c
21650 6f 6c 75 6d 6e 29 20 22 29 3b 0a 09 20 20 73 74  olumn) ");..  st
21660 72 63 61 74 20 28 73 71 6c 2c 20 22 56 41 4c 55  rcat (sql, "VALU
21670 45 53 20 28 4c 6f 77 65 72 28 3f 29 2c 20 4c 6f  ES (Lower(?), Lo
21680 77 65 72 28 3f 29 29 22 29 3b 0a 09 20 20 72 65  wer(?))");..  re
21690 74 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  t = sqlite3_prep
216a0 61 72 65 5f 76 32 20 28 73 71 6c 69 74 65 2c 20  are_v2 (sqlite, 
216b0 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c  sql, strlen (sql
216c0 29 2c 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b  ), &stmt, NULL);
216d0 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 53  ..  if (ret != S
216e0 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 7b  QLITE_OK)..    {
216f0 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f 65 20  ...spatialite_e 
21700 28 22 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72  ("RecoverGeometr
21710 79 43 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c  yColumn: \"%s\"\
21720 6e 22 2c 0a 09 09 09 20 20 20 20 20 20 73 71 6c  n",....      sql
21730 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c  ite3_errmsg (sql
21740 69 74 65 29 29 3b 0a 09 09 73 71 6c 69 74 65 33  ite));...sqlite3
21750 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
21760 74 65 78 74 2c 20 30 29 3b 0a 09 09 72 65 74 75  text, 0);...retu
21770 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 71  rn;..    }..  sq
21780 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d  lite3_reset (stm
21790 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  t);..  sqlite3_c
217a0 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73  lear_bindings (s
217b0 74 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  tmt);..  sqlite3
217c0 5f 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74  _bind_text (stmt
217d0 2c 20 31 2c 20 74 61 62 6c 65 2c 20 73 74 72 6c  , 1, table, strl
217e0 65 6e 20 28 74 61 62 6c 65 29 2c 20 53 51 4c 49  en (table), SQLI
217f0 54 45 5f 53 54 41 54 49 43 29 3b 0a 09 20 20 73  TE_STATIC);..  s
21800 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
21810 20 28 73 74 6d 74 2c 20 32 2c 20 63 6f 6c 75 6d   (stmt, 2, colum
21820 6e 2c 20 73 74 72 6c 65 6e 20 28 63 6f 6c 75 6d  n, strlen (colum
21830 6e 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  n), SQLITE_STATI
21840 43 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c  C);..  ret = sql
21850 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29  ite3_step (stmt)
21860 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20  ;..  if (ret == 
21870 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
21880 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  et == SQLITE_ROW
21890 29 0a 09 20 20 20 20 20 20 3b 0a 09 20 20 65 6c  )..      ;..  el
218a0 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74  se..    {...spat
218b0 69 61 6c 69 74 65 5f 65 20 28 22 52 65 63 6f 76  ialite_e ("Recov
218c0 65 72 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  erGeometryColumn
218d0 28 29 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22  () error: \"%s\"
218e0 5c 6e 22 2c 0a 09 09 09 20 20 20 20 20 20 73 71  \n",....      sq
218f0 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71  lite3_errmsg (sq
21900 6c 69 74 65 29 29 3b 0a 09 09 73 71 6c 69 74 65  lite));...sqlite
21910 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74  3_finalize (stmt
21920 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b  );...goto error;
21930 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74  ..    }..  sqlit
21940 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d  e3_finalize (stm
21950 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
21960 75 70 64 61 74 65 47 65 6f 6d 65 74 72 79 54 72  updateGeometryTr
21970 69 67 67 65 72 73 20 28 73 71 6c 69 74 65 2c 20  iggers (sqlite, 
21980 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a  table, column);.
21990 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
219a0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
219b0 20 31 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20   1);.    switch 
219c0 28 78 74 79 70 65 29 0a 20 20 20 20 20 20 7b 0a  (xtype).      {.
219d0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
219e0 50 4f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  POINT:.      cas
219f0 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 3a 0a 20  e GAIA_POINTZ:. 
21a00 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50       case GAIA_P
21a10 4f 49 4e 54 4d 3a 0a 20 20 20 20 20 20 63 61 73  OINTM:.      cas
21a20 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a 0a  e GAIA_POINTZM:.
21a30 09 20 20 70 5f 74 79 70 65 20 3d 20 22 50 4f 49  .  p_type = "POI
21a40 4e 54 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  NT";..  break;. 
21a50 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c       case GAIA_L
21a60 49 4e 45 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  INESTRING:.     
21a70 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
21a80 54 52 49 4e 47 5a 3a 0a 20 20 20 20 20 20 63 61  TRINGZ:.      ca
21a90 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  se GAIA_LINESTRI
21aa0 4e 47 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NGM:.      case 
21ab0 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a  GAIA_LINESTRINGZ
21ac0 4d 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d 20 22  M:..  p_type = "
21ad0 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a 09 20 20  LINESTRING";..  
21ae0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
21af0 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3a 0a  e GAIA_POLYGON:.
21b00 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
21b10 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20 20 20 20 20  POLYGONZ:.      
21b20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
21b30 4e 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  NM:.      case G
21b40 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09  AIA_POLYGONZM:..
21b50 20 20 70 5f 74 79 70 65 20 3d 20 22 50 4f 4c 59    p_type = "POLY
21b60 47 4f 4e 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  GON";..  break;.
21b70 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
21b80 4d 55 4c 54 49 50 4f 49 4e 54 3a 0a 20 20 20 20  MULTIPOINT:.    
21b90 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
21ba0 49 50 4f 49 4e 54 5a 3a 0a 20 20 20 20 20 20 63  IPOINTZ:.      c
21bb0 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
21bc0 49 4e 54 4d 3a 0a 20 20 20 20 20 20 63 61 73 65  INTM:.      case
21bd0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
21be0 5a 4d 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d 20  ZM:..  p_type = 
21bf0 22 4d 55 4c 54 49 50 4f 49 4e 54 22 3b 0a 09 20  "MULTIPOINT";.. 
21c00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
21c10 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e  se GAIA_MULTILIN
21c20 45 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 63  ESTRING:.      c
21c30 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49  ase GAIA_MULTILI
21c40 4e 45 53 54 52 49 4e 47 5a 3a 0a 20 20 20 20 20  NESTRINGZ:.     
21c50 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
21c60 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 20 20 20  LINESTRINGM:.   
21c70 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
21c80 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a  TILINESTRINGZM:.
21c90 09 20 20 70 5f 74 79 70 65 20 3d 20 22 4d 55 4c  .  p_type = "MUL
21ca0 54 49 4c 49 4e 45 53 54 52 49 4e 47 22 3b 0a 09  TILINESTRING";..
21cb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
21cc0 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
21cd0 4c 59 47 4f 4e 3a 0a 20 20 20 20 20 20 63 61 73  LYGON:.      cas
21ce0 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  e GAIA_MULTIPOLY
21cf0 47 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73 65  GONZ:.      case
21d00 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
21d10 4f 4e 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ONM:.      case 
21d20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
21d30 4e 5a 4d 3a 0a 09 20 20 70 5f 74 79 70 65 20 3d  NZM:..  p_type =
21d40 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 22 3b   "MULTIPOLYGON";
21d50 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
21d60 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45   case GAIA_GEOME
21d70 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 20  TRYCOLLECTION:. 
21d80 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47       case GAIA_G
21d90 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
21da0 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  NZ:.      case G
21db0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
21dc0 45 43 54 49 4f 4e 4d 3a 0a 20 20 20 20 20 20 63  ECTIONM:.      c
21dd0 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  ase GAIA_GEOMETR
21de0 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3a 0a 09  YCOLLECTIONZM:..
21df0 20 20 70 5f 74 79 70 65 20 3d 20 22 47 45 4f 4d    p_type = "GEOM
21e00 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 22 3b  ETRYCOLLECTION";
21e10 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
21e20 20 63 61 73 65 20 2d 31 3a 0a 09 20 20 70 5f 74   case -1:..  p_t
21e30 79 70 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 22  ype = "GEOMETRY"
21e40 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
21e50 20 20 7d 3b 0a 20 20 20 20 73 77 69 74 63 68 20    };.    switch 
21e60 28 64 69 6d 73 29 0a 20 20 20 20 20 20 7b 0a 20  (dims).      {. 
21e70 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58       case GAIA_X
21e80 59 3a 0a 09 20 20 70 5f 64 69 6d 73 20 3d 20 22  Y:..  p_dims = "
21e90 58 59 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  XY";..  break;. 
21ea0 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 58       case GAIA_X
21eb0 59 5f 5a 3a 0a 09 20 20 70 5f 64 69 6d 73 20 3d  Y_Z:..  p_dims =
21ec0 20 22 58 59 5a 22 3b 0a 09 20 20 62 72 65 61 6b   "XYZ";..  break
21ed0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
21ee0 41 5f 58 59 5f 4d 3a 0a 09 20 20 70 5f 64 69 6d  A_XY_M:..  p_dim
21ef0 73 20 3d 20 22 58 59 4d 22 3b 0a 09 20 20 62 72  s = "XYM";..  br
21f00 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
21f10 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 20 20  GAIA_XY_Z_M:..  
21f20 70 5f 64 69 6d 73 20 3d 20 22 58 59 5a 4d 22 3b  p_dims = "XYZM";
21f30 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
21f40 20 7d 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61 74   };.    sql_stat
21f50 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65 33  ement =..sqlite3
21f60 5f 6d 70 72 69 6e 74 66 20 28 22 47 65 6f 6d 65  _mprintf ("Geome
21f70 74 72 79 20 5b 25 73 2c 25 73 2c 53 52 49 44 3d  try [%s,%s,SRID=
21f80 25 64 5d 20 73 75 63 63 65 73 73 66 75 6c 6c 79  %d] successfully
21f90 20 72 65 63 6f 76 65 72 65 64 22 2c 0a 09 09 09   recovered",....
21fa0 20 70 5f 74 79 70 65 2c 20 70 5f 64 69 6d 73 2c   p_type, p_dims,
21fb0 20 28 73 72 69 64 20 3c 3d 20 30 29 20 3f 20 2d   (srid <= 0) ? -
21fc0 31 20 3a 20 73 72 69 64 29 3b 0a 20 20 20 20 75  1 : srid);.    u
21fd0 70 64 61 74 65 53 70 61 74 69 61 4c 69 74 65 48  pdateSpatiaLiteH
21fe0 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c 20  istory (sqlite, 
21ff0 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 73  table, column, s
22000 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ql_statement);. 
22010 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20     sqlite3_free 
22020 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b  (sql_statement);
22030 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 65  .    return;.  e
22040 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 65  rror:.    sqlite
22050 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
22060 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72  ntext, 0);.    r
22070 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
22080 20 76 6f 69 64 0a 66 6e 63 74 5f 44 69 73 63 61   void.fnct_Disca
22090 72 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  rdGeometryColumn
220a0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
220b0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
220c0 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 73 71   argc,....    sq
220d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
220e0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
220f0 6e 63 74 69 6f 6e 3a 0a 2f 20 44 69 73 63 61 72  nction:./ Discar
22100 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28  dGeometryColumn(
22110 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 0a 2f  table, column)./
22120 0a 2f 20 72 65 6d 6f 76 65 73 20 54 41 42 4c 45  ./ removes TABLE
22130 2e 43 4f 4c 55 4d 4e 20 66 72 6f 6d 20 74 68 65  .COLUMN from the
22140 20 53 70 61 74 69 61 6c 20 4d 65 74 61 44 61 74   Spatial MetaDat
22150 61 20 5b 74 68 75 73 20 64 69 73 61 62 6c 69 6e  a [thus disablin
22160 67 20 74 72 69 67 67 65 72 73 20 74 6f 6f 5d 0a  g triggers too].
22170 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
22180 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
22190 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e  ilure.*/.    con
221a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
221b0 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e   *table;.    con
221c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
221d0 20 2a 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 68   *column;.    ch
221e0 61 72 20 2a 70 5f 74 61 62 6c 65 20 3d 20 4e 55  ar *p_table = NU
221f0 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 5f  LL;.    char *p_
22200 63 6f 6c 75 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 20  column = NULL;. 
22210 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
22220 2a 73 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  *stmt;.    char 
22230 2a 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a  *sql_statement;.
22240 20 20 20 20 63 68 61 72 20 2a 72 61 77 3b 0a 20      char *raw;. 
22250 20 20 20 63 68 61 72 20 2a 71 75 6f 74 65 64 3b     char *quoted;
22260 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72 4d 73  .    char *errMs
22270 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  g = NULL;.    in
22280 74 20 72 65 74 3b 0a 20 20 20 20 73 71 6c 69 74  t ret;.    sqlit
22290 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
222a0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
222b0 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
222c0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
222d0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
222e0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
222f0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
22300 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
22310 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
22320 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
22330 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
22340 28 22 44 69 73 63 61 72 64 47 65 6f 6d 65 74 72  ("DiscardGeometr
22350 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
22360 20 61 72 67 75 6d 65 6e 74 20 31 20 5b 74 61 62   argument 1 [tab
22370 6c 65 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74 20  le_name] is not 
22380 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74 79  of the String ty
22390 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74  pe\n");..  sqlit
223a0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
223b0 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72  ontext, 0);..  r
223c0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
223d0 20 20 20 74 61 62 6c 65 20 3d 20 73 71 6c 69 74     table = sqlit
223e0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
223f0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[0]);.    if 
22400 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
22410 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
22420 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
22430 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
22440 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 44  ite_e..      ("D
22450 69 73 63 61 72 64 47 65 6f 6d 65 74 72 79 43 6f  iscardGeometryCo
22460 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72  lumn() error: ar
22470 67 75 6d 65 6e 74 20 32 20 5b 63 6f 6c 75 6d 6e  gument 2 [column
22480 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66  _name] is not of
22490 20 74 68 65 20 53 74 72 69 6e 67 20 74 79 70 65   the String type
224a0 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  \n");..  sqlite3
224b0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
224c0 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74  text, 0);..  ret
224d0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
224e0 20 63 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74 65   column = sqlite
224f0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
22500 67 76 5b 31 5d 29 3b 0a 0a 20 20 20 20 73 71 6c  gv[1]);..    sql
22510 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20 73 71 6c  _statement = sql
22520 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 44  ite3_mprintf ("D
22530 45 4c 45 54 45 20 46 52 4f 4d 20 67 65 6f 6d 65  ELETE FROM geome
22540 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 22 0a 09 09  try_columns "...
22550 09 09 20 20 20 20 20 22 57 48 45 52 45 20 4c 6f  ..     "WHERE Lo
22560 77 65 72 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65  wer(f_table_name
22570 29 20 3d 20 4c 6f 77 65 72 28 3f 29 20 22 0a 09  ) = Lower(?) "..
22580 09 09 09 20 20 20 20 20 22 41 4e 44 20 4c 6f 77  ...     "AND Low
22590 65 72 28 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f  er(f_geometry_co
225a0 6c 75 6d 6e 29 20 3d 20 4c 6f 77 65 72 28 3f 29  lumn) = Lower(?)
225b0 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  ");.    ret = sq
225c0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
225d0 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74   (sqlite, sql_st
225e0 61 74 65 6d 65 6e 74 2c 20 73 74 72 6c 65 6e 20  atement, strlen 
225f0 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 2c  (sql_statement),
22600 0a 09 09 09 20 20 20 20 20 20 26 73 74 6d 74 2c  ....      &stmt,
22610 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69   NULL);.    sqli
22620 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74  te3_free (sql_st
22630 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66  atement);.    if
22640 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
22650 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OK).      {..  s
22660 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 44 69  patialite_e ("Di
22670 73 63 61 72 64 47 65 6f 6d 65 74 72 79 43 6f 6c  scardGeometryCol
22680 75 6d 6e 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  umn: \"%s\"\n",.
22690 09 09 09 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ...sqlite3_errms
226a0 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20 20  g (sqlite));..  
226b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
226c0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
226d0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
226e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
226f0 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20  reset (stmt);.  
22700 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f    sqlite3_clear_
22710 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b  bindings (stmt);
22720 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
22730 64 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 31 2c  d_text (stmt, 1,
22740 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
22750 74 61 62 6c 65 2c 0a 09 09 20 20 20 20 20 20 20  table,...       
22760 73 74 72 6c 65 6e 20 28 28 63 6f 6e 73 74 20 63  strlen ((const c
22770 68 61 72 20 2a 29 20 74 61 62 6c 65 29 2c 20 53  har *) table), S
22780 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
22790 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
227a0 74 65 78 74 20 28 73 74 6d 74 2c 20 32 2c 20 28  text (stmt, 2, (
227b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 63 6f  const char *) co
227c0 6c 75 6d 6e 2c 0a 09 09 20 20 20 20 20 20 20 73  lumn,...       s
227d0 74 72 6c 65 6e 20 28 28 63 6f 6e 73 74 20 63 68  trlen ((const ch
227e0 61 72 20 2a 29 20 63 6f 6c 75 6d 6e 29 2c 20 53  ar *) column), S
227f0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
22800 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
22810 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 20 20  _step (stmt);.  
22820 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c    if (ret == SQL
22830 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 20  ITE_DONE || ret 
22840 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09  == SQLITE_ROW)..
22850 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
22860 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
22870 5f 65 20 28 22 44 69 73 63 61 72 64 47 65 6f 6d  _e ("DiscardGeom
22880 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72  etryColumn() err
22890 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09  or: \"%s\"\n",..
228a0 09 09 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  ..sqlite3_errmsg
228b0 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 20 20 73   (sqlite));..  s
228c0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
228d0 28 73 74 6d 74 29 3b 0a 09 20 20 67 6f 74 6f 20  (stmt);..  goto 
228e0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
228f0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
22900 69 7a 65 20 28 73 74 6d 74 29 3b 0a 2f 2a 20 72  ize (stmt);./* r
22910 65 6d 6f 76 69 6e 67 20 74 72 69 67 67 65 72 73  emoving triggers
22920 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28   too */.    if (
22930 21 67 65 74 52 65 61 6c 53 51 4c 6e 61 6d 65 73  !getRealSQLnames
22940 0a 09 28 73 71 6c 69 74 65 2c 20 28 63 6f 6e 73  ..(sqlite, (cons
22950 74 20 63 68 61 72 20 2a 29 20 74 61 62 6c 65 2c  t char *) table,
22960 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
22970 63 6f 6c 75 6d 6e 2c 20 26 70 5f 74 61 62 6c 65  column, &p_table
22980 2c 0a 09 20 26 70 5f 63 6f 6c 75 6d 6e 29 29 0a  ,.. &p_column)).
22990 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
229a0 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28  alite_e..      (
229b0 22 44 69 73 63 61 72 64 47 65 6f 6d 65 74 72 79  "DiscardGeometry
229c0 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20  Column() error: 
229d0 6e 6f 74 20 65 78 69 73 74 69 6e 67 20 54 61 62  not existing Tab
229e0 6c 65 20 6f 72 20 43 6f 6c 75 6d 6e 5c 6e 22 29  le or Column\n")
229f0 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
22a00 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
22a10 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  , 0);..  return;
22a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 61 77  .      }.    raw
22a30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22a40 74 66 20 28 22 67 67 69 5f 25 73 5f 25 73 22 2c  tf ("ggi_%s_%s",
22a50 20 70 5f 74 61 62 6c 65 2c 20 70 5f 63 6f 6c 75   p_table, p_colu
22a60 6d 6e 29 3b 0a 20 20 20 20 71 75 6f 74 65 64 20  mn);.    quoted 
22a70 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74  = gaiaDoubleQuot
22a80 65 64 53 71 6c 20 28 72 61 77 29 3b 0a 20 20 20  edSql (raw);.   
22a90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 72   sqlite3_free (r
22aa0 61 77 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61  aw);.    sql_sta
22ab0 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65  tement =..sqlite
22ac0 33 5f 6d 70 72 69 6e 74 66 20 28 22 44 52 4f 50  3_mprintf ("DROP
22ad0 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53   TRIGGER IF EXIS
22ae0 54 53 20 6d 61 69 6e 2e 5c 22 25 73 5c 22 22 2c  TS main.\"%s\"",
22af0 20 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 66 72   quoted);.    fr
22b00 65 65 20 28 71 75 6f 74 65 64 29 3b 0a 20 20 20  ee (quoted);.   
22b10 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65   ret = sqlite3_e
22b20 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c  xec (sqlite, sql
22b30 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c  _statement, NULL
22b40 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29  , NULL, &errMsg)
22b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22b60 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e  ee (sql_statemen
22b70 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20  t);.    if (ret 
22b80 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67  != SQLITE_OK)..g
22b90 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 72  oto error;.    r
22ba0 61 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  aw = sqlite3_mpr
22bb0 69 6e 74 66 20 28 22 67 67 75 5f 25 73 5f 25 73  intf ("ggu_%s_%s
22bc0 22 2c 20 70 5f 74 61 62 6c 65 2c 20 70 5f 63 6f  ", p_table, p_co
22bd0 6c 75 6d 6e 29 3b 0a 20 20 20 20 71 75 6f 74 65  lumn);.    quote
22be0 64 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75  d = gaiaDoubleQu
22bf0 6f 74 65 64 53 71 6c 20 28 72 61 77 29 3b 0a 20  otedSql (raw);. 
22c00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20     sqlite3_free 
22c10 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c 5f 73  (raw);.    sql_s
22c20 74 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69  tatement =..sqli
22c30 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 44 52  te3_mprintf ("DR
22c40 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
22c50 49 53 54 53 20 6d 61 69 6e 2e 5c 22 25 73 5c 22  ISTS main.\"%s\"
22c60 22 2c 20 71 75 6f 74 65 64 29 3b 0a 20 20 20 20  ", quoted);.    
22c70 66 72 65 65 20 28 71 75 6f 74 65 64 29 3b 0a 20  free (quoted);. 
22c80 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
22c90 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73  _exec (sqlite, s
22ca0 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55  ql_statement, NU
22cb0 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73  LL, NULL, &errMs
22cc0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
22cd0 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d  free (sql_statem
22ce0 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65  ent);.    if (re
22cf0 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
22d00 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
22d10 20 72 61 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d   raw = sqlite3_m
22d20 70 72 69 6e 74 66 20 28 22 67 69 69 5f 25 73 5f  printf ("gii_%s_
22d30 25 73 22 2c 20 70 5f 74 61 62 6c 65 2c 20 70 5f  %s", p_table, p_
22d40 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 71 75 6f  column);.    quo
22d50 74 65 64 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  ted = gaiaDouble
22d60 51 75 6f 74 65 64 53 71 6c 20 28 72 61 77 29 3b  QuotedSql (raw);
22d70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22d80 65 20 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c  e (raw);.    sql
22d90 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71  _statement =..sq
22da0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
22db0 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20  DROP TRIGGER IF 
22dc0 45 58 49 53 54 53 20 6d 61 69 6e 2e 5c 22 25 73  EXISTS main.\"%s
22dd0 5c 22 22 2c 20 71 75 6f 74 65 64 29 3b 0a 20 20  \"", quoted);.  
22de0 20 20 66 72 65 65 20 28 71 75 6f 74 65 64 29 3b    free (quoted);
22df0 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74  .    ret = sqlit
22e00 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c  e3_exec (sqlite,
22e10 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20   sql_statement, 
22e20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
22e30 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
22e40 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74  3_free (sql_stat
22e50 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28  ement);.    if (
22e60 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
22e70 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  )..goto error;. 
22e80 20 20 20 72 61 77 20 3d 20 73 71 6c 69 74 65 33     raw = sqlite3
22e90 5f 6d 70 72 69 6e 74 66 20 28 22 67 69 75 5f 25  _mprintf ("giu_%
22ea0 73 5f 25 73 22 2c 20 70 5f 74 61 62 6c 65 2c 20  s_%s", p_table, 
22eb0 70 5f 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 71  p_column);.    q
22ec0 75 6f 74 65 64 20 3d 20 67 61 69 61 44 6f 75 62  uoted = gaiaDoub
22ed0 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 72 61 77  leQuotedSql (raw
22ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22ef0 72 65 65 20 28 72 61 77 29 3b 0a 20 20 20 20 73  ree (raw);.    s
22f00 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09  ql_statement =..
22f10 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
22f20 28 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49  ("DROP TRIGGER I
22f30 46 20 45 58 49 53 54 53 20 6d 61 69 6e 2e 5c 22  F EXISTS main.\"
22f40 25 73 5c 22 22 2c 20 71 75 6f 74 65 64 29 3b 0a  %s\"", quoted);.
22f50 20 20 20 20 66 72 65 65 20 28 71 75 6f 74 65 64      free (quoted
22f60 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c  );.    ret = sql
22f70 69 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74  ite3_exec (sqlit
22f80 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e, sql_statement
22f90 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65  , NULL, NULL, &e
22fa0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
22fb0 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74  te3_free (sql_st
22fc0 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66  atement);.    if
22fd0 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
22fe0 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  OK)..goto error;
22ff0 0a 20 20 20 20 72 61 77 20 3d 20 73 71 6c 69 74  .    raw = sqlit
23000 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 67 69 64  e3_mprintf ("gid
23010 5f 25 73 5f 25 73 22 2c 20 70 5f 74 61 62 6c 65  _%s_%s", p_table
23020 2c 20 70 5f 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20  , p_column);.   
23030 20 71 75 6f 74 65 64 20 3d 20 67 61 69 61 44 6f   quoted = gaiaDo
23040 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 72  ubleQuotedSql (r
23050 61 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  aw);.    sqlite3
23060 5f 66 72 65 65 20 28 72 61 77 29 3b 0a 20 20 20  _free (raw);.   
23070 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d   sql_statement =
23080 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  ..sqlite3_mprint
23090 66 20 28 22 44 52 4f 50 20 54 52 49 47 47 45 52  f ("DROP TRIGGER
230a0 20 49 46 20 45 58 49 53 54 53 20 6d 61 69 6e 2e   IF EXISTS main.
230b0 5c 22 25 73 5c 22 22 2c 20 71 75 6f 74 65 64 29  \"%s\"", quoted)
230c0 3b 0a 20 20 20 20 66 72 65 65 20 28 71 75 6f 74  ;.    free (quot
230d0 65 64 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  ed);.    ret = s
230e0 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71 6c  qlite3_exec (sql
230f0 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  ite, sql_stateme
23100 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  nt, NULL, NULL, 
23110 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  &errMsg);.    sq
23120 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f  lite3_free (sql_
23130 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
23140 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
23150 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72 6f  E_OK)..goto erro
23160 72 3b 0a 20 20 20 20 72 61 77 20 3d 20 73 71 6c  r;.    raw = sql
23170 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 67  ite3_mprintf ("g
23180 63 69 5f 25 73 5f 25 73 22 2c 20 70 5f 74 61 62  ci_%s_%s", p_tab
23190 6c 65 2c 20 70 5f 63 6f 6c 75 6d 6e 29 3b 0a 20  le, p_column);. 
231a0 20 20 20 71 75 6f 74 65 64 20 3d 20 67 61 69 61     quoted = gaia
231b0 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20  DoubleQuotedSql 
231c0 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  (raw);.    sqlit
231d0 65 33 5f 66 72 65 65 20 28 72 61 77 29 3b 0a 20  e3_free (raw);. 
231e0 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74     sql_statement
231f0 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 69   =..sqlite3_mpri
23200 6e 74 66 20 28 22 44 52 4f 50 20 54 52 49 47 47  ntf ("DROP TRIGG
23210 45 52 20 49 46 20 45 58 49 53 54 53 20 6d 61 69  ER IF EXISTS mai
23220 6e 2e 5c 22 25 73 5c 22 22 2c 20 71 75 6f 74 65  n.\"%s\"", quote
23230 64 29 3b 0a 20 20 20 20 66 72 65 65 20 28 71 75  d);.    free (qu
23240 6f 74 65 64 29 3b 0a 20 20 20 20 72 65 74 20 3d  oted);.    ret =
23250 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73   sqlite3_exec (s
23260 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65  qlite, sql_state
23270 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ment, NULL, NULL
23280 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  , &errMsg);.    
23290 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
232a0 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  l_statement);.  
232b0 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
232c0 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72  ITE_OK)..goto er
232d0 72 6f 72 3b 0a 20 20 20 20 72 61 77 20 3d 20 73  ror;.    raw = s
232e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
232f0 22 67 63 75 5f 25 73 5f 25 73 22 2c 20 70 5f 74  "gcu_%s_%s", p_t
23300 61 62 6c 65 2c 20 70 5f 63 6f 6c 75 6d 6e 29 3b  able, p_column);
23310 0a 20 20 20 20 71 75 6f 74 65 64 20 3d 20 67 61  .    quoted = ga
23320 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 71  iaDoubleQuotedSq
23330 6c 20 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c  l (raw);.    sql
23340 69 74 65 33 5f 66 72 65 65 20 28 72 61 77 29 3b  ite3_free (raw);
23350 0a 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65  .    sql_stateme
23360 6e 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70  nt =..sqlite3_mp
23370 72 69 6e 74 66 20 28 22 44 52 4f 50 20 54 52 49  rintf ("DROP TRI
23380 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20 6d  GGER IF EXISTS m
23390 61 69 6e 2e 5c 22 25 73 5c 22 22 2c 20 71 75 6f  ain.\"%s\"", quo
233a0 74 65 64 29 3b 0a 20 20 20 20 66 72 65 65 20 28  ted);.    free (
233b0 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 72 65 74  quoted);.    ret
233c0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20   = sqlite3_exec 
233d0 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61  (sqlite, sql_sta
233e0 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55  tement, NULL, NU
233f0 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20  LL, &errMsg);.  
23400 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
23410 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a  sql_statement);.
23420 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53      if (ret != S
23430 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20  QLITE_OK)..goto 
23440 65 72 72 6f 72 3b 0a 20 20 20 20 72 61 77 20 3d  error;.    raw =
23450 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
23460 20 28 22 67 63 64 5f 25 73 5f 25 73 22 2c 20 70   ("gcd_%s_%s", p
23470 5f 74 61 62 6c 65 2c 20 70 5f 63 6f 6c 75 6d 6e  _table, p_column
23480 29 3b 0a 20 20 20 20 71 75 6f 74 65 64 20 3d 20  );.    quoted = 
23490 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64  gaiaDoubleQuoted
234a0 53 71 6c 20 28 72 61 77 29 3b 0a 20 20 20 20 73  Sql (raw);.    s
234b0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 72 61 77  qlite3_free (raw
234c0 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61 74 65  );.    sql_state
234d0 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f  ment =..sqlite3_
234e0 6d 70 72 69 6e 74 66 20 28 22 44 52 4f 50 20 54  mprintf ("DROP T
234f0 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53  RIGGER IF EXISTS
23500 20 6d 61 69 6e 2e 5c 22 25 73 5c 22 22 2c 20 71   main.\"%s\"", q
23510 75 6f 74 65 64 29 3b 0a 20 20 20 20 66 72 65 65  uoted);.    free
23520 20 28 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 72   (quoted);.    r
23530 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
23540 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73  c (sqlite, sql_s
23550 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20  tatement, NULL, 
23560 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a  NULL, &errMsg);.
23570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23580 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
23590 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
235a0 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74   SQLITE_OK)..got
235b0 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 61 77  o error;.    raw
235c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
235d0 74 66 20 28 22 74 6d 69 5f 25 73 5f 25 73 22 2c  tf ("tmi_%s_%s",
235e0 20 70 5f 74 61 62 6c 65 2c 20 70 5f 63 6f 6c 75   p_table, p_colu
235f0 6d 6e 29 3b 0a 20 20 20 20 71 75 6f 74 65 64 20  mn);.    quoted 
23600 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74  = gaiaDoubleQuot
23610 65 64 53 71 6c 20 28 72 61 77 29 3b 0a 20 20 20  edSql (raw);.   
23620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 72   sqlite3_free (r
23630 61 77 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61  aw);.    sql_sta
23640 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65  tement =..sqlite
23650 33 5f 6d 70 72 69 6e 74 66 20 28 22 44 52 4f 50  3_mprintf ("DROP
23660 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53   TRIGGER IF EXIS
23670 54 53 20 6d 61 69 6e 2e 5c 22 25 73 5c 22 22 2c  TS main.\"%s\"",
23680 20 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 66 72   quoted);.    fr
23690 65 65 20 28 71 75 6f 74 65 64 29 3b 0a 20 20 20  ee (quoted);.   
236a0 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65   ret = sqlite3_e
236b0 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c  xec (sqlite, sql
236c0 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c  _statement, NULL
236d0 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29  , NULL, &errMsg)
236e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
236f0 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e  ee (sql_statemen
23700 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20  t);.    if (ret 
23710 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67  != SQLITE_OK)..g
23720 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 72  oto error;.    r
23730 61 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  aw = sqlite3_mpr
23740 69 6e 74 66 20 28 22 74 6d 75 5f 25 73 5f 25 73  intf ("tmu_%s_%s
23750 22 2c 20 70 5f 74 61 62 6c 65 2c 20 70 5f 63 6f  ", p_table, p_co
23760 6c 75 6d 6e 29 3b 0a 20 20 20 20 71 75 6f 74 65  lumn);.    quote
23770 64 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75  d = gaiaDoubleQu
23780 6f 74 65 64 53 71 6c 20 28 72 61 77 29 3b 0a 20  otedSql (raw);. 
23790 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20     sqlite3_free 
237a0 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c 5f 73  (raw);.    sql_s
237b0 74 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69  tatement =..sqli
237c0 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 44 52  te3_mprintf ("DR
237d0 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
237e0 49 53 54 53 20 6d 61 69 6e 2e 5c 22 25 73 5c 22  ISTS main.\"%s\"
237f0 22 2c 20 71 75 6f 74 65 64 29 3b 0a 20 20 20 20  ", quoted);.    
23800 66 72 65 65 20 28 71 75 6f 74 65 64 29 3b 0a 20  free (quoted);. 
23810 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
23820 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73  _exec (sqlite, s
23830 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55  ql_statement, NU
23840 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73  LL, NULL, &errMs
23850 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
23860 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d  free (sql_statem
23870 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65  ent);.    if (re
23880 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
23890 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
238a0 20 72 61 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d   raw = sqlite3_m
238b0 70 72 69 6e 74 66 20 28 22 74 6d 64 5f 25 73 5f  printf ("tmd_%s_
238c0 25 73 22 2c 20 70 5f 74 61 62 6c 65 2c 20 70 5f  %s", p_table, p_
238d0 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 71 75 6f  column);.    quo
238e0 74 65 64 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  ted = gaiaDouble
238f0 51 75 6f 74 65 64 53 71 6c 20 28 72 61 77 29 3b  QuotedSql (raw);
23900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23910 65 20 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c  e (raw);.    sql
23920 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71  _statement =..sq
23930 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
23940 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20  DROP TRIGGER IF 
23950 45 58 49 53 54 53 20 6d 61 69 6e 2e 5c 22 25 73  EXISTS main.\"%s
23960 5c 22 22 2c 20 71 75 6f 74 65 64 29 3b 0a 20 20  \"", quoted);.  
23970 20 20 66 72 65 65 20 28 71 75 6f 74 65 64 29 3b    free (quoted);
23980 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74  .    ret = sqlit
23990 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c  e3_exec (sqlite,
239a0 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20   sql_statement, 
239b0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
239c0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
239d0 33 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74  3_free (sql_stat
239e0 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28  ement);.    if (
239f0 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
23a00 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 0a  )..goto error;..
23a10 20 20 20 20 2f 2a 20 74 72 79 69 6e 67 20 74 6f      /* trying to
23a20 20 64 65 6c 65 74 65 20 6f 6c 64 20 76 65 72 73   delete old vers
23a30 69 6f 6e 73 20 5b 76 32 2e 30 2c 20 76 32 2e 32  ions [v2.0, v2.2
23a40 5d 20 74 72 69 67 67 65 72 73 5b 69 66 20 61 6e  ] triggers[if an
23a50 79 5d 20 2a 2f 0a 20 20 20 20 72 61 77 20 3d 20  y] */.    raw = 
23a60 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
23a70 28 22 67 74 69 5f 25 73 5f 25 73 22 2c 20 70 5f  ("gti_%s_%s", p_
23a80 74 61 62 6c 65 2c 20 70 5f 63 6f 6c 75 6d 6e 29  table, p_column)
23a90 3b 0a 20 20 20 20 71 75 6f 74 65 64 20 3d 20 67  ;.    quoted = g
23aa0 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53  aiaDoubleQuotedS
23ab0 71 6c 20 28 72 61 77 29 3b 0a 20 20 20 20 73 71  ql (raw);.    sq
23ac0 6c 69 74 65 33 5f 66 72 65 65 20 28 72 61 77 29  lite3_free (raw)
23ad0 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d  ;.    sql_statem
23ae0 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d  ent =..sqlite3_m
23af0 70 72 69 6e 74 66 20 28 22 44 52 4f 50 20 54 52  printf ("DROP TR
23b00 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20  IGGER IF EXISTS 
23b10 6d 61 69 6e 2e 5c 22 25 73 5c 22 22 2c 20 71 75  main.\"%s\"", qu
23b20 6f 74 65 64 29 3b 0a 20 20 20 20 66 72 65 65 20  oted);.    free 
23b30 28 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 72 65  (quoted);.    re
23b40 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  t = sqlite3_exec
23b50 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74   (sqlite, sql_st
23b60 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e  atement, NULL, N
23b70 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20  ULL, &errMsg);. 
23b80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20     sqlite3_free 
23b90 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b  (sql_statement);
23ba0 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20  .    if (ret != 
23bb0 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f  SQLITE_OK)..goto
23bc0 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 61 77 20   error;.    raw 
23bd0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23be0 66 20 28 22 67 74 75 5f 25 73 5f 25 73 22 2c 20  f ("gtu_%s_%s", 
23bf0 70 5f 74 61 62 6c 65 2c 20 70 5f 63 6f 6c 75 6d  p_table, p_colum
23c00 6e 29 3b 0a 20 20 20 20 71 75 6f 74 65 64 20 3d  n);.    quoted =
23c10 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65   gaiaDoubleQuote
23c20 64 53 71 6c 20 28 72 61 77 29 3b 0a 20 20 20 20  dSql (raw);.    
23c30 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 72 61  sqlite3_free (ra
23c40 77 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61 74  w);.    sql_stat
23c50 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65 33  ement =..sqlite3
23c60 5f 6d 70 72 69 6e 74 66 20 28 22 44 52 4f 50 20  _mprintf ("DROP 
23c70 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54  TRIGGER IF EXIST
23c80 53 20 6d 61 69 6e 2e 5c 22 25 73 5c 22 22 2c 20  S main.\"%s\"", 
23c90 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 66 72 65  quoted);.    fre
23ca0 65 20 28 71 75 6f 74 65 64 29 3b 0a 20 20 20 20  e (quoted);.    
23cb0 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  ret = sqlite3_ex
23cc0 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f  ec (sqlite, sql_
23cd0 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c  statement, NULL,
23ce0 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b   NULL, &errMsg);
23cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23d00 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e (sql_statement
23d10 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
23d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f  = SQLITE_OK)..go
23d30 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 61  to error;.    ra
23d40 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  w = sqlite3_mpri
23d50 6e 74 66 20 28 22 67 73 69 5f 25 73 5f 25 73 22  ntf ("gsi_%s_%s"
23d60 2c 20 70 5f 74 61 62 6c 65 2c 20 70 5f 63 6f 6c  , p_table, p_col
23d70 75 6d 6e 29 3b 0a 20 20 20 20 71 75 6f 74 65 64  umn);.    quoted
23d80 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f   = gaiaDoubleQuo
23d90 74 65 64 53 71 6c 20 28 72 61 77 29 3b 0a 20 20  tedSql (raw);.  
23da0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
23db0 72 61 77 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74  raw);.    sql_st
23dc0 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74  atement =..sqlit
23dd0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 44 52 4f  e3_mprintf ("DRO
23de0 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
23df0 53 54 53 20 6d 61 69 6e 2e 5c 22 25 73 5c 22 22  STS main.\"%s\""
23e00 2c 20 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 66  , quoted);.    f
23e10 72 65 65 20 28 71 75 6f 74 65 64 29 3b 0a 20 20  ree (quoted);.  
23e20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
23e30 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71  exec (sqlite, sq
23e40 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c  l_statement, NUL
23e50 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67  L, NULL, &errMsg
23e60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23e70 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65  ree (sql_stateme
23e80 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74  nt);.    if (ret
23e90 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
23ea0 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
23eb0 72 61 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  raw = sqlite3_mp
23ec0 72 69 6e 74 66 20 28 22 67 73 75 5f 25 73 5f 25  rintf ("gsu_%s_%
23ed0 73 22 2c 20 70 5f 74 61 62 6c 65 2c 20 70 5f 63  s", p_table, p_c
23ee0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 71 75 6f 74  olumn);.    quot
23ef0 65 64 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51  ed = gaiaDoubleQ
23f00 75 6f 74 65 64 53 71 6c 20 28 72 61 77 29 3b 0a  uotedSql (raw);.
23f10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23f20 20 28 72 61 77 29 3b 0a 20 20 20 20 73 71 6c 5f   (raw);.    sql_
23f30 73 74 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c  statement =..sql
23f40 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 44  ite3_mprintf ("D
23f50 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45  ROP TRIGGER IF E
23f60 58 49 53 54 53 20 6d 61 69 6e 2e 5c 22 25 73 5c  XISTS main.\"%s\
23f70 22 22 2c 20 71 75 6f 74 65 64 29 3b 0a 20 20 20  "", quoted);.   
23f80 20 66 72 65 65 20 28 71 75 6f 74 65 64 29 3b 0a   free (quoted);.
23f90 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
23fa0 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20  3_exec (sqlite, 
23fb0 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e  sql_statement, N
23fc0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d  ULL, NULL, &errM
23fd0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
23fe0 5f 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65  _free (sql_state
23ff0 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72  ment);.    if (r
24000 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  et != SQLITE_OK)
24010 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
24020 20 20 2f 2a 20 65 6e 64 20 64 65 6c 65 74 69 6f    /* end deletio
24030 6e 20 6f 6c 64 20 76 65 72 73 69 6f 6e 73 20 5b  n old versions [
24040 76 32 2e 30 2c 20 76 32 2e 32 5d 20 74 72 69 67  v2.0, v2.2] trig
24050 67 65 72 73 5b 69 66 20 61 6e 79 5d 20 2a 2f 0a  gers[if any] */.
24060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
24070 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
24080 2c 20 31 29 3b 0a 20 20 20 20 75 70 64 61 74 65  , 1);.    update
24090 53 70 61 74 69 61 4c 69 74 65 48 69 73 74 6f 72  SpatiaLiteHistor
240a0 79 20 28 73 71 6c 69 74 65 2c 20 70 5f 74 61 62  y (sqlite, p_tab
240b0 6c 65 2c 0a 09 09 09 20 20 20 20 20 70 5f 63 6f  le,....     p_co
240c0 6c 75 6d 6e 2c 20 22 47 65 6f 6d 65 74 72 79 20  lumn, "Geometry 
240d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 64 69 73  successfully dis
240e0 63 61 72 64 65 64 22 29 3b 0a 20 20 20 20 66 72  carded");.    fr
240f0 65 65 20 28 70 5f 74 61 62 6c 65 29 3b 0a 20 20  ee (p_table);.  
24100 20 20 66 72 65 65 20 28 70 5f 63 6f 6c 75 6d 6e    free (p_column
24110 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24120 20 65 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28   error:.    if (
24130 70 5f 74 61 62 6c 65 29 0a 09 66 72 65 65 20 28  p_table)..free (
24140 70 5f 74 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  p_table);.    if
24150 20 28 70 5f 63 6f 6c 75 6d 6e 29 0a 09 66 72 65   (p_column)..fre
24160 65 20 28 70 5f 63 6f 6c 75 6d 6e 29 3b 0a 20 20  e (p_column);.  
24170 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28    spatialite_e (
24180 22 44 69 73 63 61 72 64 47 65 6f 6d 65 74 72 79  "DiscardGeometry
24190 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20  Column() error: 
241a0 5c 22 25 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73  \"%s\"\n", errMs
241b0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
241c0 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b 0a 20  free (errMsg);. 
241d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
241e0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
241f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
24200 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 72 65  }..static int.re
24210 67 69 73 74 65 72 56 69 72 74 75 61 6c 20 28 73  gisterVirtual (s
24220 71 6c 69 74 65 33 20 2a 20 73 71 6c 69 74 65 2c  qlite3 * sqlite,
24230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62   const char *tab
24240 6c 65 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74  le).{./* attempt
24250 69 6e 67 20 74 6f 20 72 65 67 69 73 74 65 72 20  ing to register 
24260 61 20 56 69 72 74 75 61 6c 47 65 6f 6d 65 74 72  a VirtualGeometr
24270 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 67 74  y */.    char gt
24280 79 70 65 5b 36 34 5d 3b 0a 20 20 20 20 69 6e 74  ype[64];.    int
24290 20 78 74 79 70 65 20 3d 20 2d 31 3b 0a 20 20 20   xtype = -1;.   
242a0 20 69 6e 74 20 73 72 69 64 20 3d 20 2d 31 3b 0a   int srid = -1;.
242b0 20 20 20 20 63 68 61 72 20 2a 2a 72 65 73 75 6c      char **resul
242c0 74 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  ts;.    int ret;
242d0 0a 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20  .    int rows;. 
242e0 20 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a     int columns;.
242f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
24300 68 61 72 20 2a 65 72 72 4d 73 67 20 3d 20 4e 55  har *errMsg = NU
24310 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 76  LL;.    int ok_v
24320 69 72 74 5f 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  irt_name = 0;.  
24330 20 20 69 6e 74 20 6f 6b 5f 76 69 72 74 5f 67 65    int ok_virt_ge
24340 6f 6d 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20  ometry = 0;.    
24350 69 6e 74 20 6f 6b 5f 73 72 69 64 20 3d 20 30 3b  int ok_srid = 0;
24360 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 67 65 6f 6d  .    int ok_geom
24370 65 74 72 79 5f 74 79 70 65 20 3d 20 30 3b 0a 20  etry_type = 0;. 
24380 20 20 20 69 6e 74 20 6f 6b 5f 74 79 70 65 20 3d     int ok_type =
24390 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 63   0;.    int ok_c
243a0 6f 6f 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 3d  oord_dimension =
243b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 78 64 69 6d   0;.    int xdim
243c0 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 71 75 6f  s;.    char *quo
243d0 74 65 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ted;.    char *s
243e0 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a 0a 2f  ql_statement;../
243f0 2a 20 74 65 73 74 69 6e 67 20 74 68 65 20 6c 61  * testing the la
24400 79 6f 75 74 20 6f 66 20 76 69 72 74 73 5f 67 65  yout of virts_ge
24410 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 74  ometry_columns t
24420 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 65 74 20  able */.    ret 
24430 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
24440 62 6c 65 20 28 73 71 6c 69 74 65 2c 0a 09 09 09  ble (sqlite,....
24450 20 20 20 20 20 22 50 52 41 47 4d 41 20 74 61 62       "PRAGMA tab
24460 6c 65 5f 69 6e 66 6f 28 76 69 72 74 73 5f 67 65  le_info(virts_ge
24470 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 29 22  ometry_columns)"
24480 2c 0a 09 09 09 20 20 20 20 20 26 72 65 73 75 6c  ,....     &resul
24490 74 73 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c 75  ts, &rows, &colu
244a0 6d 6e 73 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20  mns, &errMsg);. 
244b0 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51     if (ret != SQ
244c0 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b  LITE_OK).      {
244d0 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65  ..  spatialite_e
244e0 20 28 22 52 65 67 69 73 74 65 72 56 69 72 74 75   ("RegisterVirtu
244f0 61 6c 47 65 6f 6d 65 74 72 79 28 29 20 65 72 72  alGeometry() err
24500 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 65  or: \"%s\"\n", e
24510 72 72 4d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74  rrMsg);..  sqlit
24520 65 33 5f 66 72 65 65 20 28 65 72 72 4d 73 67 29  e3_free (errMsg)
24530 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  ;..  return 0;. 
24540 20 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 28       }.    for (
24550 69 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f 77 73  i = 1; i <= rows
24560 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09  ; i++).      {..
24570 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
24580 20 28 22 76 69 72 74 5f 6e 61 6d 65 22 2c 20 72   ("virt_name", r
24590 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75  esults[(i * colu
245a0 6d 6e 73 29 20 2b 20 31 5d 29 20 3d 3d 20 30 29  mns) + 1]) == 0)
245b0 0a 09 20 20 20 20 20 20 6f 6b 5f 76 69 72 74 5f  ..      ok_virt_
245c0 6e 61 6d 65 20 3d 20 31 3b 0a 09 20 20 69 66 20  name = 1;..  if 
245d0 28 73 74 72 63 61 73 65 63 6d 70 20 28 22 76 69  (strcasecmp ("vi
245e0 72 74 5f 67 65 6f 6d 65 74 72 79 22 2c 20 72 65  rt_geometry", re
245f0 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d  sults[(i * colum
24600 6e 73 29 20 2b 20 31 5d 29 20 3d 3d 20 30 29 0a  ns) + 1]) == 0).
24610 09 20 20 20 20 20 20 6f 6b 5f 76 69 72 74 5f 67  .      ok_virt_g
24620 65 6f 6d 65 74 72 79 20 3d 20 31 3b 0a 09 20 20  eometry = 1;..  
24630 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
24640 22 73 72 69 64 22 2c 20 72 65 73 75 6c 74 73 5b  "srid", results[
24650 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20  (i * columns) + 
24660 31 5d 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20  1]) == 0)..     
24670 20 6f 6b 5f 73 72 69 64 20 3d 20 31 3b 0a 09 20   ok_srid = 1;.. 
24680 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
24690 28 22 67 65 6f 6d 65 74 72 79 5f 74 79 70 65 22  ("geometry_type"
246a0 2c 20 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63  , results[(i * c
246b0 6f 6c 75 6d 6e 73 29 20 2b 20 31 5d 29 20 3d 3d  olumns) + 1]) ==
246c0 20 30 29 0a 09 20 20 20 20 20 20 6f 6b 5f 67 65   0)..      ok_ge
246d0 6f 6d 65 74 72 79 5f 74 79 70 65 20 3d 20 31 3b  ometry_type = 1;
246e0 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 65 63  ..  if (strcasec
246f0 6d 70 20 28 22 74 79 70 65 22 2c 20 72 65 73 75  mp ("type", resu
24700 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73  lts[(i * columns
24710 29 20 2b 20 31 5d 29 20 3d 3d 20 30 29 0a 09 20  ) + 1]) == 0).. 
24720 20 20 20 20 20 6f 6b 5f 74 79 70 65 20 3d 20 31       ok_type = 1
24730 3b 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 65  ;..  if (strcase
24740 63 6d 70 20 28 22 63 6f 6f 72 64 5f 64 69 6d 65  cmp ("coord_dime
24750 6e 73 69 6f 6e 22 2c 20 72 65 73 75 6c 74 73 5b  nsion", results[
24760 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20  (i * columns) + 
24770 31 5d 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20  1]) == 0)..     
24780 20 6f 6b 5f 63 6f 6f 72 64 5f 64 69 6d 65 6e 73   ok_coord_dimens
24790 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ion = 1;.      }
247a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
247b0 65 5f 74 61 62 6c 65 20 28 72 65 73 75 6c 74 73  e_table (results
247c0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 6b 5f 76  );..    if (ok_v
247d0 69 72 74 5f 6e 61 6d 65 20 26 26 20 6f 6b 5f 76  irt_name && ok_v
247e0 69 72 74 5f 67 65 6f 6d 65 74 72 79 20 26 26 20  irt_geometry && 
247f0 6f 6b 5f 73 72 69 64 20 26 26 20 6f 6b 5f 67 65  ok_srid && ok_ge
24800 6f 6d 65 74 72 79 5f 74 79 70 65 0a 09 26 26 20  ometry_type..&& 
24810 6f 6b 5f 63 6f 6f 72 64 5f 64 69 6d 65 6e 73 69  ok_coord_dimensi
24820 6f 6e 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 20  on)..;.    else 
24830 69 66 20 28 6f 6b 5f 76 69 72 74 5f 6e 61 6d 65  if (ok_virt_name
24840 20 26 26 20 6f 6b 5f 76 69 72 74 5f 67 65 6f 6d   && ok_virt_geom
24850 65 74 72 79 20 26 26 20 6f 6b 5f 73 72 69 64 20  etry && ok_srid 
24860 26 26 20 6f 6b 5f 74 79 70 65 29 0a 09 3b 0a 20  && ok_type)..;. 
24870 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20     else..return 
24880 30 3b 0a 0a 2f 2a 20 64 65 74 65 72 6d 69 6e 69  0;../* determini
24890 6e 67 20 47 65 6f 6d 65 74 72 79 20 54 79 70 65  ng Geometry Type
248a0 20 61 6e 64 20 64 69 6d 73 20 2a 2f 0a 20 20 20   and dims */.   
248b0 20 71 75 6f 74 65 64 20 3d 20 67 61 69 61 44 6f   quoted = gaiaDo
248c0 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 74  ubleQuotedSql (t
248d0 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 5f 73  able);.    sql_s
248e0 74 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69  tatement =..sqli
248f0 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 53 45  te3_mprintf ("SE
24900 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 22 0a  LECT DISTINCT ".
24910 09 09 09 20 22 53 54 5f 47 65 6f 6d 65 74 72 79  ... "ST_Geometry
24920 54 79 70 65 28 47 65 6f 6d 65 74 72 79 29 2c 20  Type(Geometry), 
24930 53 54 5f 53 72 69 64 28 47 65 6f 6d 65 74 72 79  ST_Srid(Geometry
24940 29 20 46 52 4f 4d 20 5c 22 25 73 5c 22 22 2c 0a  ) FROM \"%s\"",.
24950 09 09 09 20 71 75 6f 74 65 64 29 3b 0a 20 20 20  ... quoted);.   
24960 20 66 72 65 65 20 28 71 75 6f 74 65 64 29 3b 0a   free (quoted);.
24970 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
24980 33 5f 67 65 74 5f 74 61 62 6c 65 20 28 73 71 6c  3_get_table (sql
24990 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  ite, sql_stateme
249a0 6e 74 2c 20 26 72 65 73 75 6c 74 73 2c 20 26 72  nt, &results, &r
249b0 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c 0a 09  ows, &columns,..
249c0 09 09 20 20 20 20 20 26 65 72 72 4d 73 67 29 3b  ..     &errMsg);
249d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
249e0 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e (sql_statement
249f0 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
24a00 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  = SQLITE_OK).   
24a10 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
24a20 74 65 5f 65 20 28 22 52 65 67 69 73 74 65 72 56  te_e ("RegisterV
24a30 69 72 74 75 61 6c 47 65 6f 6d 65 74 72 79 28 29  irtualGeometry()
24a40 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e   error: \"%s\"\n
24a50 22 2c 20 65 72 72 4d 73 67 29 3b 0a 09 20 20 73  ", errMsg);..  s
24a60 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72 72  qlite3_free (err
24a70 4d 73 67 29 3b 0a 09 20 20 72 65 74 75 72 6e 20  Msg);..  return 
24a80 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66  0;.      }.    f
24a90 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 3d 20  or (i = 1; i <= 
24aa0 72 6f 77 73 3b 20 69 2b 2b 29 0a 20 20 20 20 20  rows; i++).     
24ab0 20 7b 0a 09 20 20 69 66 20 28 72 65 73 75 6c 74   {..  if (result
24ac0 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 5d  s[(i * columns)]
24ad0 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   == NULL)..     
24ae0 20 2a 67 74 79 70 65 20 3d 20 27 5c 30 27 3b 0a   *gtype = '\0';.
24af0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
24b00 74 72 63 70 79 20 28 67 74 79 70 65 2c 20 72 65  trcpy (gtype, re
24b10 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d  sults[(i * colum
24b20 6e 73 29 5d 29 3b 0a 09 20 20 69 66 20 28 72 65  ns)]);..  if (re
24b30 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d  sults[(i * colum
24b40 6e 73 29 20 2b 20 31 5d 20 3d 3d 20 4e 55 4c 4c  ns) + 1] == NULL
24b50 29 0a 09 20 20 20 20 20 20 73 72 69 64 20 3d 20  )..      srid = 
24b60 30 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  0;..  else..    
24b70 20 20 73 72 69 64 20 3d 20 61 74 6f 69 20 28 72    srid = atoi (r
24b80 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75  esults[(i * colu
24b90 6d 6e 73 29 20 2b 20 31 5d 29 3b 0a 20 20 20 20  mns) + 1]);.    
24ba0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
24bb0 66 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73 75  free_table (resu
24bc0 6c 74 73 29 3b 0a 0a 2f 2a 20 6e 6f 72 6d 61 6c  lts);../* normal
24bd0 69 7a 65 64 20 47 65 6f 6d 65 74 72 79 20 74 79  ized Geometry ty
24be0 70 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  pe */.    if (st
24bf0 72 63 6d 70 20 28 67 74 79 70 65 2c 20 22 50 4f  rcmp (gtype, "PO
24c00 49 4e 54 22 29 20 3d 3d 20 30 29 0a 09 78 74 79  INT") == 0)..xty
24c10 70 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 28  pe = 1;.    if (
24c20 73 74 72 63 6d 70 20 28 67 74 79 70 65 2c 20 22  strcmp (gtype, "
24c30 50 4f 49 4e 54 20 5a 22 29 20 3d 3d 20 30 29 0a  POINT Z") == 0).
24c40 09 78 74 79 70 65 20 3d 20 31 30 30 31 3b 0a 20  .xtype = 1001;. 
24c50 20 20 20 69 66 20 28 73 74 72 63 6d 70 20 28 67     if (strcmp (g
24c60 74 79 70 65 2c 20 22 50 4f 49 4e 54 20 4d 22 29  type, "POINT M")
24c70 20 3d 3d 20 30 29 0a 09 78 74 79 70 65 20 3d 20   == 0)..xtype = 
24c80 32 30 30 31 3b 0a 20 20 20 20 69 66 20 28 73 74  2001;.    if (st
24c90 72 63 6d 70 20 28 67 74 79 70 65 2c 20 22 50 4f  rcmp (gtype, "PO
24ca0 49 4e 54 20 5a 4d 22 29 20 3d 3d 20 30 29 0a 09  INT ZM") == 0)..
24cb0 78 74 79 70 65 20 3d 20 33 30 30 31 3b 0a 20 20  xtype = 3001;.  
24cc0 20 20 69 66 20 28 73 74 72 63 6d 70 20 28 67 74    if (strcmp (gt
24cd0 79 70 65 2c 20 22 4c 49 4e 45 53 54 52 49 4e 47  ype, "LINESTRING
24ce0 22 29 20 3d 3d 20 30 29 0a 09 78 74 79 70 65 20  ") == 0)..xtype 
24cf0 3d 20 32 3b 0a 20 20 20 20 69 66 20 28 73 74 72  = 2;.    if (str
24d00 63 6d 70 20 28 67 74 79 70 65 2c 20 22 4c 49 4e  cmp (gtype, "LIN
24d10 45 53 54 52 49 4e 47 20 5a 22 29 20 3d 3d 20 30  ESTRING Z") == 0
24d20 29 0a 09 78 74 79 70 65 20 3d 20 31 30 30 32 3b  )..xtype = 1002;
24d30 0a 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 20  .    if (strcmp 
24d40 28 67 74 79 70 65 2c 20 22 4c 49 4e 45 53 54 52  (gtype, "LINESTR
24d50 49 4e 47 20 4d 22 29 20 3d 3d 20 30 29 0a 09 78  ING M") == 0)..x
24d60 74 79 70 65 20 3d 20 32 30 30 32 3b 0a 20 20 20  type = 2002;.   
24d70 20 69 66 20 28 73 74 72 63 6d 70 20 28 67 74 79   if (strcmp (gty
24d80 70 65 2c 20 22 4c 49 4e 45 53 54 52 49 4e 47 20  pe, "LINESTRING 
24d90 5a 4d 22 29 20 3d 3d 20 30 29 0a 09 78 74 79 70  ZM") == 0)..xtyp
24da0 65 20 3d 20 33 30 30 32 3b 0a 20 20 20 20 69 66  e = 3002;.    if
24db0 20 28 73 74 72 63 6d 70 20 28 67 74 79 70 65 2c   (strcmp (gtype,
24dc0 20 22 50 4f 4c 59 47 4f 4e 22 29 20 3d 3d 20 30   "POLYGON") == 0
24dd0 29 0a 09 78 74 79 70 65 20 3d 20 33 3b 0a 20 20  )..xtype = 3;.  
24de0 20 20 69 66 20 28 73 74 72 63 6d 70 20 28 67 74    if (strcmp (gt
24df0 79 70 65 2c 20 22 50 4f 4c 59 47 4f 4e 20 5a 22  ype, "POLYGON Z"
24e00 29 20 3d 3d 20 30 29 0a 09 78 74 79 70 65 20 3d  ) == 0)..xtype =
24e10 20 31 30 30 33 3b 0a 20 20 20 20 69 66 20 28 73   1003;.    if (s
24e20 74 72 63 6d 70 20 28 67 74 79 70 65 2c 20 22 50  trcmp (gtype, "P
24e30 4f 4c 59 47 4f 4e 20 4d 22 29 20 3d 3d 20 30 29  OLYGON M") == 0)
24e40 0a 09 78 74 79 70 65 20 3d 20 32 30 30 33 3b 0a  ..xtype = 2003;.
24e50 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 20 28      if (strcmp (
24e60 67 74 79 70 65 2c 20 22 50 4f 4c 59 47 4f 4e 20  gtype, "POLYGON 
24e70 5a 4d 22 29 20 3d 3d 20 30 29 0a 09 78 74 79 70  ZM") == 0)..xtyp
24e80 65 20 3d 20 33 30 30 33 3b 0a 20 20 20 20 69 66  e = 3003;.    if
24e90 20 28 73 74 72 63 6d 70 20 28 67 74 79 70 65 2c   (strcmp (gtype,
24ea0 20 22 4d 55 4c 54 49 50 4f 49 4e 54 22 29 20 3d   "MULTIPOINT") =
24eb0 3d 20 30 29 0a 09 78 74 79 70 65 20 3d 20 34 3b  = 0)..xtype = 4;
24ec0 0a 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 20  .    if (strcmp 
24ed0 28 67 74 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f  (gtype, "MULTIPO
24ee0 49 4e 54 20 5a 22 29 20 3d 3d 20 30 29 0a 09 78  INT Z") == 0)..x
24ef0 74 79 70 65 20 3d 20 31 30 30 34 3b 0a 20 20 20  type = 1004;.   
24f00 20 69 66 20 28 73 74 72 63 6d 70 20 28 67 74 79   if (strcmp (gty
24f10 70 65 2c 20 22 4d 55 4c 54 49 50 4f 49 4e 54 20  pe, "MULTIPOINT 
24f20 4d 22 29 20 3d 3d 20 30 29 0a 09 78 74 79 70 65  M") == 0)..xtype
24f30 20 3d 20 32 30 30 34 3b 0a 20 20 20 20 69 66 20   = 2004;.    if 
24f40 28 73 74 72 63 6d 70 20 28 67 74 79 70 65 2c 20  (strcmp (gtype, 
24f50 22 4d 55 4c 54 49 50 4f 49 4e 54 20 5a 4d 22 29  "MULTIPOINT ZM")
24f60 20 3d 3d 20 30 29 0a 09 78 74 79 70 65 20 3d 20   == 0)..xtype = 
24f70 33 30 30 34 3b 0a 20 20 20 20 69 66 20 28 73 74  3004;.    if (st
24f80 72 63 6d 70 20 28 67 74 79 70 65 2c 20 22 4d 55  rcmp (gtype, "MU
24f90 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 22 29 20  LTILINESTRING") 
24fa0 3d 3d 20 30 29 0a 09 78 74 79 70 65 20 3d 20 35  == 0)..xtype = 5
24fb0 3b 0a 20 20 20 20 69 66 20 28 73 74 72 63 6d 70  ;.    if (strcmp
24fc0 20 28 67 74 79 70 65 2c 20 22 4d 55 4c 54 49 4c   (gtype, "MULTIL
24fd0 49 4e 45 53 54 52 49 4e 47 20 5a 22 29 20 3d 3d  INESTRING Z") ==
24fe0 20 30 29 0a 09 78 74 79 70 65 20 3d 20 31 30 30   0)..xtype = 100
24ff0 35 3b 0a 20 20 20 20 69 66 20 28 73 74 72 63 6d  5;.    if (strcm
25000 70 20 28 67 74 79 70 65 2c 20 22 4d 55 4c 54 49  p (gtype, "MULTI
25010 4c 49 4e 45 53 54 52 49 4e 47 20 4d 22 29 20 3d  LINESTRING M") =
25020 3d 20 30 29 0a 09 78 74 79 70 65 20 3d 20 32 30  = 0)..xtype = 20
25030 30 35 3b 0a 20 20 20 20 69 66 20 28 73 74 72 63  05;.    if (strc
25040 6d 70 20 28 67 74 79 70 65 2c 20 22 4d 55 4c 54  mp (gtype, "MULT
25050 49 4c 49 4e 45 53 54 52 49 4e 47 20 5a 4d 22 29  ILINESTRING ZM")
25060 20 3d 3d 20 30 29 0a 09 78 74 79 70 65 20 3d 20   == 0)..xtype = 
25070 33 30 30 35 3b 0a 20 20 20 20 69 66 20 28 73 74  3005;.    if (st
25080 72 63 6d 70 20 28 67 74 79 70 65 2c 20 22 4d 55  rcmp (gtype, "MU
25090 4c 54 49 50 4f 4c 59 47 4f 4e 22 29 20 3d 3d 20  LTIPOLYGON") == 
250a0 30 29 0a 09 78 74 79 70 65 20 3d 20 36 3b 0a 20  0)..xtype = 6;. 
250b0 20 20 20 69 66 20 28 73 74 72 63 6d 70 20 28 67     if (strcmp (g
250c0 74 79 70 65 2c 20 22 4d 55 4c 54 49 50 4f 4c 59  type, "MULTIPOLY
250d0 47 4f 4e 20 5a 22 29 20 3d 3d 20 30 29 0a 09 78  GON Z") == 0)..x
250e0 74 79 70 65 20 3d 20 31 30 30 36 3b 0a 20 20 20  type = 1006;.   
250f0 20 69 66 20 28 73 74 72 63 6d 70 20 28 67 74 79   if (strcmp (gty
25100 70 65 2c 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f  pe, "MULTIPOLYGO
25110 4e 20 4d 22 29 20 3d 3d 20 30 29 0a 09 78 74 79  N M") == 0)..xty
25120 70 65 20 3d 20 32 30 30 36 3b 0a 20 20 20 20 69  pe = 2006;.    i
25130 66 20 28 73 74 72 63 6d 70 20 28 67 74 79 70 65  f (strcmp (gtype
25140 2c 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 20  , "MULTIPOLYGON 
25150 5a 4d 22 29 20 3d 3d 20 30 29 0a 09 78 74 79 70  ZM") == 0)..xtyp
25160 65 20 3d 20 33 30 30 36 3b 0a 0a 2f 2a 20 75 70  e = 3006;../* up
25170 64 61 74 69 6e 67 20 6d 65 74 61 64 61 74 61 20  dating metadata 
25180 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 78 64  tables */.    xd
25190 69 6d 73 20 3d 20 2d 31 3b 0a 20 20 20 20 73 77  ims = -1;.    sw
251a0 69 74 63 68 20 28 78 74 79 70 65 29 0a 20 20 20  itch (xtype).   
251b0 20 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20     {.      case 
251c0 31 3a 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a  1:.      case 2:
251d0 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 0a 20  .      case 3:. 
251e0 20 20 20 20 20 63 61 73 65 20 34 3a 0a 20 20 20       case 4:.   
251f0 20 20 20 63 61 73 65 20 35 3a 0a 20 20 20 20 20     case 5:.     
25200 20 63 61 73 65 20 36 3a 0a 09 20 20 78 64 69 6d   case 6:..  xdim
25210 73 20 3d 20 32 3b 0a 09 20 20 62 72 65 61 6b 3b  s = 2;..  break;
25220 0a 20 20 20 20 20 20 63 61 73 65 20 31 30 30 31  .      case 1001
25230 3a 0a 20 20 20 20 20 20 63 61 73 65 20 31 30 30  :.      case 100
25240 32 3a 0a 20 20 20 20 20 20 63 61 73 65 20 31 30  2:.      case 10
25250 30 33 3a 0a 20 20 20 20 20 20 63 61 73 65 20 31  03:.      case 1
25260 30 30 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  004:.      case 
25270 31 30 30 35 3a 0a 20 20 20 20 20 20 63 61 73 65  1005:.      case
25280 20 31 30 30 36 3a 0a 20 20 20 20 20 20 63 61 73   1006:.      cas
25290 65 20 32 30 30 31 3a 0a 20 20 20 20 20 20 63 61  e 2001:.      ca
252a0 73 65 20 32 30 30 32 3a 0a 20 20 20 20 20 20 63  se 2002:.      c
252b0 61 73 65 20 32 30 30 33 3a 0a 20 20 20 20 20 20  ase 2003:.      
252c0 63 61 73 65 20 32 30 30 34 3a 0a 20 20 20 20 20  case 2004:.     
252d0 20 63 61 73 65 20 32 30 30 35 3a 0a 20 20 20 20   case 2005:.    
252e0 20 20 63 61 73 65 20 32 30 30 36 3a 0a 09 20 20    case 2006:..  
252f0 78 64 69 6d 73 20 3d 20 33 3b 0a 09 20 20 62 72  xdims = 3;..  br
25300 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
25310 33 30 30 31 3a 0a 20 20 20 20 20 20 63 61 73 65  3001:.      case
25320 20 33 30 30 32 3a 0a 20 20 20 20 20 20 63 61 73   3002:.      cas
25330 65 20 33 30 30 33 3a 0a 20 20 20 20 20 20 63 61  e 3003:.      ca
25340 73 65 20 33 30 30 34 3a 0a 20 20 20 20 20 20 63  se 3004:.      c
25350 61 73 65 20 33 30 30 35 3a 0a 20 20 20 20 20 20  ase 3005:.      
25360 63 61 73 65 20 33 30 30 36 3a 0a 09 20 20 78 64  case 3006:..  xd
25370 69 6d 73 20 3d 20 34 3b 0a 09 20 20 62 72 65 61  ims = 4;..  brea
25380 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  k;.      };.    
25390 69 66 20 28 6f 6b 5f 67 65 6f 6d 65 74 72 79 5f  if (ok_geometry_
253a0 74 79 70 65 29 0a 20 20 20 20 20 20 7b 0a 09 20  type).      {.. 
253b0 20 2f 2a 20 68 61 73 20 74 68 65 20 22 67 65 6f   /* has the "geo
253c0 6d 65 74 72 79 5f 74 79 70 65 22 20 63 6f 6c 75  metry_type" colu
253d0 6d 6e 20 2a 2f 0a 09 20 20 73 71 6c 5f 73 74 61  mn */..  sql_sta
253e0 74 65 6d 65 6e 74 20 3d 0a 09 20 20 20 20 20 20  tement =..      
253f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a  sqlite3_mprintf.
25400 09 20 20 20 20 20 20 28 22 49 4e 53 45 52 54 20  .      ("INSERT 
25410 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
25420 76 69 72 74 73 5f 67 65 6f 6d 65 74 72 79 5f 63  virts_geometry_c
25430 6f 6c 75 6d 6e 73 20 22 0a 09 20 20 20 20 20 20  olumns "..      
25440 20 22 28 76 69 72 74 5f 6e 61 6d 65 2c 20 76 69   "(virt_name, vi
25450 72 74 5f 67 65 6f 6d 65 74 72 79 2c 20 67 65 6f  rt_geometry, geo
25460 6d 65 74 72 79 5f 74 79 70 65 2c 20 63 6f 6f 72  metry_type, coor
25470 64 5f 64 69 6d 65 6e 73 69 6f 6e 2c 20 73 72 69  d_dimension, sri
25480 64 29 20 22 0a 09 20 20 20 20 20 20 20 22 56 41  d) "..       "VA
25490 4c 55 45 53 20 28 4c 6f 77 65 72 28 25 51 29 2c  LUES (Lower(%Q),
254a0 20 27 67 65 6f 6d 65 74 72 79 27 2c 20 25 64 2c   'geometry', %d,
254b0 20 25 64 2c 20 25 64 29 22 2c 20 74 61 62 6c 65   %d, %d)", table
254c0 2c 20 78 74 79 70 65 2c 0a 09 20 20 20 20 20 20  , xtype,..      
254d0 20 78 64 69 6d 73 2c 20 73 72 69 64 29 3b 0a 20   xdims, srid);. 
254e0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
254f0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 68 61        {..  /* ha
25500 73 20 74 68 65 20 22 74 79 70 65 22 20 63 6f 6c  s the "type" col
25510 75 6d 6e 20 2a 2f 0a 09 20 20 63 6f 6e 73 74 20  umn */..  const 
25520 63 68 61 72 20 2a 78 67 74 79 70 65 20 3d 20 22  char *xgtype = "
25530 55 4e 4b 4e 4f 57 4e 22 3b 0a 09 20 20 73 77 69  UNKNOWN";..  swi
25540 74 63 68 20 28 78 74 79 70 65 29 0a 09 20 20 20  tch (xtype)..   
25550 20 7b 0a 09 20 20 20 20 63 61 73 65 20 31 3a 0a   {..    case 1:.
25560 09 20 20 20 20 63 61 73 65 20 31 30 30 31 3a 0a  .    case 1001:.
25570 09 20 20 20 20 63 61 73 65 20 32 30 30 31 3a 0a  .    case 2001:.
25580 09 20 20 20 20 63 61 73 65 20 33 30 30 31 3a 0a  .    case 3001:.
25590 09 09 78 67 74 79 70 65 20 3d 20 22 50 4f 49 4e  ..xgtype = "POIN
255a0 54 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  T";...break;..  
255b0 20 20 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63    case 2:..    c
255c0 61 73 65 20 31 30 30 32 3a 0a 09 20 20 20 20 63  ase 1002:..    c
255d0 61 73 65 20 32 30 30 32 3a 0a 09 20 20 20 20 63  ase 2002:..    c
255e0 61 73 65 20 33 30 30 32 3a 0a 09 09 78 67 74 79  ase 3002:...xgty
255f0 70 65 20 3d 20 22 4c 49 4e 45 53 54 52 49 4e 47  pe = "LINESTRING
25600 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  ";...break;..   
25610 20 63 61 73 65 20 33 3a 0a 09 20 20 20 20 63 61   case 3:..    ca
25620 73 65 20 31 30 30 33 3a 0a 09 20 20 20 20 63 61  se 1003:..    ca
25630 73 65 20 32 30 30 33 3a 0a 09 20 20 20 20 63 61  se 2003:..    ca
25640 73 65 20 33 30 30 33 3a 0a 09 09 78 67 74 79 70  se 3003:...xgtyp
25650 65 20 3d 20 22 50 4f 4c 59 47 4f 4e 22 3b 0a 09  e = "POLYGON";..
25660 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
25670 65 20 34 3a 0a 09 20 20 20 20 63 61 73 65 20 31  e 4:..    case 1
25680 30 30 34 3a 0a 09 20 20 20 20 63 61 73 65 20 32  004:..    case 2
25690 30 30 34 3a 0a 09 20 20 20 20 63 61 73 65 20 33  004:..    case 3
256a0 30 30 34 3a 0a 09 09 78 67 74 79 70 65 20 3d 20  004:...xgtype = 
256b0 22 4d 55 4c 54 49 50 4f 49 4e 54 22 3b 0a 09 09  "MULTIPOINT";...
256c0 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
256d0 20 35 3a 0a 09 20 20 20 20 63 61 73 65 20 31 30   5:..    case 10
256e0 30 35 3a 0a 09 20 20 20 20 63 61 73 65 20 32 30  05:..    case 20
256f0 30 35 3a 0a 09 20 20 20 20 63 61 73 65 20 33 30  05:..    case 30
25700 30 35 3a 0a 09 09 78 67 74 79 70 65 20 3d 20 22  05:...xgtype = "
25710 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 22  MULTILINESTRING"
25720 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
25730 63 61 73 65 20 36 3a 0a 09 20 20 20 20 63 61 73  case 6:..    cas
25740 65 20 31 30 30 36 3a 0a 09 20 20 20 20 63 61 73  e 1006:..    cas
25750 65 20 32 30 30 36 3a 0a 09 20 20 20 20 63 61 73  e 2006:..    cas
25760 65 20 33 30 30 36 3a 0a 09 09 78 67 74 79 70 65  e 3006:...xgtype
25770 20 3d 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e   = "MULTIPOLYGON
25780 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  ";...break;..   
25790 20 7d 3b 0a 09 20 20 73 71 6c 5f 73 74 61 74 65   };..  sql_state
257a0 6d 65 6e 74 20 3d 0a 09 20 20 20 20 20 20 73 71  ment =..      sq
257b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 20  lite3_mprintf.. 
257c0 20 20 20 20 20 28 22 49 4e 53 45 52 54 20 4f 52       ("INSERT OR
257d0 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 76 69   REPLACE INTO vi
257e0 72 74 73 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c  rts_geometry_col
257f0 75 6d 6e 73 20 22 0a 09 20 20 20 20 20 20 20 22  umns "..       "
25800 28 76 69 72 74 5f 6e 61 6d 65 2c 20 76 69 72 74  (virt_name, virt
25810 5f 67 65 6f 6d 65 74 72 79 2c 20 74 79 70 65 2c  _geometry, type,
25820 20 73 72 69 64 29 20 22 0a 09 20 20 20 20 20 20   srid) "..      
25830 20 22 56 41 4c 55 45 53 20 28 4c 6f 77 65 72 28   "VALUES (Lower(
25840 25 51 29 2c 20 27 67 65 6f 6d 65 74 72 79 27 2c  %Q), 'geometry',
25850 20 25 51 2c 20 25 64 29 22 2c 20 74 61 62 6c 65   %Q, %d)", table
25860 2c 20 78 67 74 79 70 65 2c 20 73 72 69 64 29 3b  , xgtype, srid);
25870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .      }.    ret
25880 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20   = sqlite3_exec 
25890 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61  (sqlite, sql_sta
258a0 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55  tement, NULL, NU
258b0 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20  LL, &errMsg);.  
258c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
258d0 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a  sql_statement);.
258e0 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53      if (ret != S
258f0 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20  QLITE_OK).      
25900 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
25910 65 20 28 22 52 65 67 69 73 74 65 72 56 69 72 74  e ("RegisterVirt
25920 75 61 6c 47 65 6f 6d 65 74 72 79 28 29 20 65 72  ualGeometry() er
25930 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  ror: \"%s\"\n", 
25940 65 72 72 4d 73 67 29 3b 0a 09 20 20 73 71 6c 69  errMsg);..  sqli
25950 74 65 33 5f 66 72 65 65 20 28 65 72 72 4d 73 67  te3_free (errMsg
25960 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a  );..  return 0;.
25970 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
25980 63 68 65 63 6b 53 70 61 74 69 61 6c 4d 65 74 61  checkSpatialMeta
25990 44 61 74 61 20 28 73 71 6c 69 74 65 29 20 3d 3d  Data (sqlite) ==
259a0 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f   3).      {..  /
259b0 2a 20 63 75 72 72 65 6e 74 20 6d 65 74 61 64 61  * current metada
259c0 74 61 20 73 74 79 6c 65 20 3e 3d 20 76 2e 34 2e  ta style >= v.4.
259d0 30 2e 30 20 2a 2f 0a 0a 09 20 20 2f 2a 20 69 6e  0.0 */...  /* in
259e0 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 69 6e  serting a row in
259f0 74 6f 20 56 49 52 54 53 5f 47 45 4f 4d 45 54 52  to VIRTS_GEOMETR
25a00 59 5f 43 4f 4c 55 4d 4e 53 5f 41 55 54 48 20 2a  Y_COLUMNS_AUTH *
25a10 2f 0a 09 20 20 73 71 6c 5f 73 74 61 74 65 6d 65  /..  sql_stateme
25a20 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  nt = sqlite3_mpr
25a30 69 6e 74 66 20 28 22 49 4e 53 45 52 54 20 4f 52  intf ("INSERT OR
25a40 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 22 0a   REPLACE INTO ".
25a50 09 09 09 09 09 20 20 20 22 76 69 72 74 73 5f 67  .....   "virts_g
25a60 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 5f  eometry_columns_
25a70 61 75 74 68 20 28 76 69 72 74 5f 6e 61 6d 65 2c  auth (virt_name,
25a80 20 76 69 72 74 5f 67 65 6f 6d 65 74 72 79 2c 20   virt_geometry, 
25a90 68 69 64 64 65 6e 29 20 22 0a 09 09 09 09 09 20  hidden) "...... 
25aa0 20 20 22 56 41 4c 55 45 53 20 28 4c 6f 77 65 72    "VALUES (Lower
25ab0 28 25 51 29 2c 20 27 67 65 6f 6d 65 74 72 79 27  (%Q), 'geometry'
25ac0 2c 20 30 29 22 2c 0a 09 09 09 09 09 20 20 20 74  , 0)",......   t
25ad0 61 62 6c 65 29 3b 0a 09 20 20 72 65 74 20 3d 20  able);..  ret = 
25ae0 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
25af0 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d  lite, sql_statem
25b00 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ent, NULL, NULL,
25b10 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20 73 71   &errMsg);..  sq
25b20 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f  lite3_free (sql_
25b30 73 74 61 74 65 6d 65 6e 74 29 3b 0a 09 20 20 69  statement);..  i
25b40 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
25b50 5f 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70  _OK)..    {...sp
25b60 61 74 69 61 6c 69 74 65 5f 65 20 28 22 52 65 67  atialite_e ("Reg
25b70 69 73 74 65 72 56 69 72 74 75 61 6c 47 65 6f 6d  isterVirtualGeom
25b80 65 74 72 79 28 29 20 65 72 72 6f 72 3a 20 5c 22  etry() error: \"
25b90 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 20 20 20 20  %s\"\n",....    
25ba0 20 20 65 72 72 4d 73 67 29 3b 0a 09 09 73 71 6c    errMsg);...sql
25bb0 69 74 65 33 5f 66 72 65 65 20 28 65 72 72 4d 73  ite3_free (errMs
25bc0 67 29 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a  g);...return 0;.
25bd0 09 20 20 20 20 7d 0a 09 20 20 2f 2a 20 69 6e 73  .    }..  /* ins
25be0 65 72 74 69 6e 67 20 61 20 72 6f 77 20 69 6e 74  erting a row int
25bf0 6f 20 47 45 4f 4d 45 54 52 59 5f 43 4f 4c 55 4d  o GEOMETRY_COLUM
25c00 4e 53 5f 53 54 41 54 49 53 54 49 43 53 20 2a 2f  NS_STATISTICS */
25c10 0a 09 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e  ..  sql_statemen
25c20 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
25c30 6e 74 66 20 28 22 49 4e 53 45 52 54 20 4f 52 20  ntf ("INSERT OR 
25c40 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 22 0a 09  REPLACE INTO "..
25c50 09 09 09 09 20 20 20 22 76 69 72 74 73 5f 67 65  ....   "virts_ge
25c60 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 5f 73  ometry_columns_s
25c70 74 61 74 69 73 74 69 63 73 20 28 76 69 72 74 5f  tatistics (virt_
25c80 6e 61 6d 65 2c 20 76 69 72 74 5f 67 65 6f 6d 65  name, virt_geome
25c90 74 72 79 29 20 22 0a 09 09 09 09 09 20 20 20 22  try) "......   "
25ca0 56 41 4c 55 45 53 20 28 4c 6f 77 65 72 28 25 51  VALUES (Lower(%Q
25cb0 29 2c 20 27 67 65 6f 6d 65 74 72 79 27 29 22 2c  ), 'geometry')",
25cc0 0a 09 09 09 09 09 20 20 20 74 61 62 6c 65 29 3b  ......   table);
25cd0 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65  ..  ret = sqlite
25ce0 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20  3_exec (sqlite, 
25cf0 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e  sql_statement, N
25d00 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d  ULL, NULL, &errM
25d10 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  sg);..  sqlite3_
25d20 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d  free (sql_statem
25d30 65 6e 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74  ent);..  if (ret
25d40 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
25d50 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69      {...spatiali
25d60 74 65 5f 65 20 28 22 52 65 67 69 73 74 65 72 56  te_e ("RegisterV
25d70 69 72 74 75 61 6c 47 65 6f 6d 65 74 72 79 28 29  irtualGeometry()
25d80 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e   error: \"%s\"\n
25d90 22 2c 0a 09 09 09 20 20 20 20 20 20 65 72 72 4d  ",....      errM
25da0 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66  sg);...sqlite3_f
25db0 72 65 65 20 28 65 72 72 4d 73 67 29 3b 0a 09 09  ree (errMsg);...
25dc0 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d  return 0;..    }
25dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .      }.    ret
25de0 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 1;.}..static
25df0 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73   void.fnct_Regis
25e00 74 65 72 56 69 72 74 75 61 6c 47 65 6f 6d 65 74  terVirtualGeomet
25e10 72 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ry (sqlite3_cont
25e20 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
25e30 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20  nt argc,....    
25e40 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
25e50 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
25e60 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65  L function:./ Re
25e70 67 69 73 74 65 72 56 69 72 74 75 61 6c 47 65 6f  gisterVirtualGeo
25e80 6d 65 74 72 79 28 74 61 62 6c 65 29 0a 2f 0a 2f  metry(table)././
25e90 20 69 6e 73 65 72 74 2f 75 70 64 61 74 65 73 20   insert/updates 
25ea0 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 6e 74  TABLE.COLUMN int
25eb0 6f 20 74 68 65 20 53 70 61 74 69 61 6c 20 4d 65  o the Spatial Me
25ec0 74 61 44 61 74 61 20 5b 56 69 72 74 75 61 6c 20  taData [Virtual 
25ed0 54 61 62 6c 65 5d 0a 2f 20 72 65 74 75 72 6e 73  Table]./ returns
25ee0 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
25ef0 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a  0 on failure.*/.
25f00 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
25f10 65 64 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a  ed char *table;.
25f20 20 20 20 20 63 68 61 72 20 73 71 6c 5b 31 30 32      char sql[102
25f30 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  4];.    sqlite3 
25f40 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
25f50 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
25f60 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
25f70 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
25f80 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
25f90 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
25fa0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
25fb0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
25fc0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
25fd0 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
25fe0 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 52  ite_e..      ("R
25ff0 65 67 69 73 74 65 72 56 69 72 74 75 61 6c 47 65  egisterVirtualGe
26000 6f 6d 65 74 72 79 28 29 20 65 72 72 6f 72 3a 20  ometry() error: 
26010 61 72 67 75 6d 65 6e 74 20 31 20 5b 74 61 62 6c  argument 1 [tabl
26020 65 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f  e_name] is not o
26030 66 20 74 68 65 20 53 74 72 69 6e 67 20 74 79 70  f the String typ
26040 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65  e\n");..  sqlite
26050 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
26060 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65  ntext, 0);..  re
26070 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
26080 20 20 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65    table = sqlite
26090 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
260a0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
260b0 21 72 65 67 69 73 74 65 72 56 69 72 74 75 61 6c  !registerVirtual
260c0 20 28 73 71 6c 69 74 65 2c 20 28 63 68 61 72 20   (sqlite, (char 
260d0 2a 29 20 74 61 62 6c 65 29 29 0a 09 67 6f 74 6f  *) table))..goto
260e0 20 65 72 72 6f 72 3b 0a 20 20 20 20 73 71 6c 69   error;.    sqli
260f0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
26100 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20  context, 1);.   
26110 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22 56   strcpy (sql, "V
26120 69 72 74 75 61 6c 20 47 65 6f 6d 65 74 72 79 20  irtual Geometry 
26130 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 67  successfully reg
26140 69 73 74 65 72 65 64 22 29 3b 0a 20 20 20 20 75  istered");.    u
26150 70 64 61 74 65 53 70 61 74 69 61 4c 69 74 65 48  pdateSpatiaLiteH
26160 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c 20  istory (sqlite, 
26170 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 74  (const char *) t
26180 61 62 6c 65 2c 20 22 47 65 6f 6d 65 74 72 79 22  able, "Geometry"
26190 2c 20 73 71 6c 29 3b 0a 20 20 20 20 72 65 74 75  , sql);.    retu
261a0 72 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20  rn;.  error:.   
261b0 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22   spatialite_e ("
261c0 52 65 67 69 73 74 65 72 56 69 72 74 75 61 6c 47  RegisterVirtualG
261d0 65 6f 6d 65 74 72 79 28 29 20 65 72 72 6f 72 5c  eometry() error\
261e0 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
261f0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
26200 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  text, 0);.    re
26210 74 75 72 6e 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  turn;.}...static
26220 20 76 6f 69 64 0a 66 6e 63 74 5f 44 72 6f 70 56   void.fnct_DropV
26230 69 72 74 75 61 6c 47 65 6f 6d 65 74 72 79 20 28  irtualGeometry (
26240 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
26250 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
26260 72 67 63 2c 0a 09 09 09 20 20 73 71 6c 69 74 65  rgc,....  sqlite
26270 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
26280 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
26290 6f 6e 3a 0a 2f 20 44 72 6f 70 56 69 72 74 75 61  on:./ DropVirtua
262a0 6c 47 65 6f 6d 65 74 72 79 28 74 61 62 6c 65 29  lGeometry(table)
262b0 0a 2f 0a 2f 20 72 65 6d 6f 76 65 73 20 54 41 42  ././ removes TAB
262c0 4c 45 2e 43 4f 4c 55 4d 4e 20 66 72 6f 6d 20 74  LE.COLUMN from t
262d0 68 65 20 53 70 61 74 69 61 6c 20 4d 65 74 61 44  he Spatial MetaD
262e0 61 74 61 20 61 6e 64 20 44 52 4f 50 73 20 74 68  ata and DROPs th
262f0 65 20 56 69 72 74 75 61 6c 20 54 61 62 6c 65 0a  e Virtual Table.
26300 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
26310 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
26320 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e  ilure.*/.    con
26330 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
26340 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61   *table;.    cha
26350 72 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  r *sql_statement
26360 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72 4d  ;.    char *errM
26370 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  sg = NULL;.    i
26380 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 68 61 72  nt ret;.    char
26390 20 2a 71 75 6f 74 65 64 3b 0a 20 20 20 20 73 71   *quoted;.    sq
263a0 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20  lite3 *sqlite = 
263b0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
263c0 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65  db_handle (conte
263d0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
263e0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
263f0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
26400 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
26410 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
26420 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  0]) != SQLITE_TE
26430 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
26440 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
26450 20 20 20 28 22 44 72 6f 70 56 69 72 74 75 61 6c     ("DropVirtual
26460 47 65 6f 6d 65 74 72 79 28 29 20 65 72 72 6f 72  Geometry() error
26470 3a 20 61 72 67 75 6d 65 6e 74 20 31 20 5b 74 61  : argument 1 [ta
26480 62 6c 65 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74  ble_name] is not
26490 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74   of the String t
264a0 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69  ype\n");..  sqli
264b0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
264c0 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
264d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
264e0 20 20 20 20 74 61 62 6c 65 20 3d 20 73 71 6c 69      table = sqli
264f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
26500 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 71  argv[0]);.    sq
26510 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20 73 71  l_statement = sq
26520 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
26530 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 69 72 74  DELETE FROM virt
26540 73 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d  s_geometry_colum
26550 6e 73 20 22 0a 09 09 09 09 20 20 20 20 20 22 57  ns ".....     "W
26560 48 45 52 45 20 4c 6f 77 65 72 28 76 69 72 74 5f  HERE Lower(virt_
26570 6e 61 6d 65 29 20 3d 20 4c 6f 77 65 72 28 25 51  name) = Lower(%Q
26580 29 22 2c 0a 09 09 09 09 20 20 20 20 20 74 61 62  )",.....     tab
26590 6c 65 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  le);.    ret = s
265a0 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71 6c  qlite3_exec (sql
265b0 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  ite, sql_stateme
265c0 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  nt, NULL, NULL, 
265d0 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  &errMsg);.    sq
265e0 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f  lite3_free (sql_
265f0 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
26600 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
26610 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72 6f  E_OK)..goto erro
26620 72 3b 0a 20 20 20 20 71 75 6f 74 65 64 20 3d 20  r;.    quoted = 
26630 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64  gaiaDoubleQuoted
26640 53 71 6c 20 28 28 63 6f 6e 73 74 20 63 68 61 72  Sql ((const char
26650 20 2a 29 20 74 61 62 6c 65 29 3b 0a 20 20 20 20   *) table);.    
26660 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20  sql_statement = 
26670 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
26680 28 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20  ("DROP TABLE IF 
26690 45 58 49 53 54 53 20 5c 22 25 73 5c 22 22 2c 20  EXISTS \"%s\"", 
266a0 71 75 6f 74 65 64 29 3b 0a 20 20 20 20 66 72 65  quoted);.    fre
266b0 65 20 28 71 75 6f 74 65 64 29 3b 0a 20 20 20 20  e (quoted);.    
266c0 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  ret = sqlite3_ex
266d0 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f  ec (sqlite, sql_
266e0 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c  statement, NULL,
266f0 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b   NULL, &errMsg);
26700 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26710 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e (sql_statement
26720 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
26730 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f  = SQLITE_OK)..go
26740 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 73 71  to error;.    sq
26750 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
26760 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20   (context, 1);. 
26770 20 20 20 75 70 64 61 74 65 53 70 61 74 69 61 4c     updateSpatiaL
26780 69 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c 69  iteHistory (sqli
26790 74 65 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  te, (const char 
267a0 2a 29 20 74 61 62 6c 65 2c 20 22 47 65 6f 6d 65  *) table, "Geome
267b0 74 72 79 22 2c 0a 09 09 09 20 20 20 20 20 22 56  try",....     "V
267c0 69 72 74 75 61 6c 20 47 65 6f 6d 65 74 72 79 20  irtual Geometry 
267d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 64 72 6f  successfully dro
267e0 70 70 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  pped");.    retu
267f0 72 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20  rn;.  error:.   
26800 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22   spatialite_e ("
26810 44 72 6f 70 56 69 72 74 75 61 6c 47 65 6f 6d 65  DropVirtualGeome
26820 74 72 79 28 29 20 65 72 72 6f 72 3a 20 5c 22 25  try() error: \"%
26830 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b  s\"\n", errMsg);
26840 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26850 65 20 28 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  e (errMsg);.    
26860 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
26870 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
26880 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
26890 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
268a0 5f 49 6e 69 74 46 44 4f 53 70 61 74 69 61 6c 4d  _InitFDOSpatialM
268b0 65 74 61 44 61 74 61 20 28 73 71 6c 69 74 65 33  etaData (sqlite3
268c0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
268d0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
268e0 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  .     sqlite3_va
268f0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
26900 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
26910 2f 20 49 6e 69 74 46 44 4f 53 70 61 74 69 61 6c  / InitFDOSpatial
26920 4d 65 74 61 44 61 74 61 28 76 6f 69 64 29 0a 2f  MetaData(void)./
26930 0a 2f 20 63 72 65 61 74 65 73 20 74 68 65 20 46  ./ creates the F
26940 44 4f 2d 73 74 79 6c 65 64 20 53 50 41 54 49 41  DO-styled SPATIA
26950 4c 5f 52 45 46 5f 53 59 53 20 61 6e 64 20 47 45  L_REF_SYS and GE
26960 4f 4d 45 54 52 59 5f 43 4f 4c 55 4d 4e 53 20 74  OMETRY_COLUMNS t
26970 61 62 6c 65 73 0a 2f 20 72 65 74 75 72 6e 73 20  ables./ returns 
26980 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30  1 on success./ 0
26990 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20   on failure.*/. 
269a0 20 20 20 63 68 61 72 20 73 71 6c 5b 31 30 32 34     char sql[1024
269b0 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72  ];.    char *err
269c0 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Msg = NULL;.    
269d0 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 73 71 6c  int ret;.    sql
269e0 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
269f0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
26a00 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
26a10 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
26a20 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
26a30 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 2f 2a  _EXCL_LINE */./*
26a40 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 53 50   creating the SP
26a50 41 54 49 41 4c 5f 52 45 46 5f 53 59 53 20 74 61  ATIAL_REF_SYS ta
26a60 62 6c 65 73 20 2a 2f 0a 20 20 20 20 73 74 72 63  bles */.    strc
26a70 70 79 20 28 73 71 6c 2c 20 22 43 52 45 41 54 45  py (sql, "CREATE
26a80 20 54 41 42 4c 45 20 73 70 61 74 69 61 6c 5f 72   TABLE spatial_r
26a90 65 66 5f 73 79 73 20 28 5c 6e 22 29 3b 0a 20 20  ef_sys (\n");.  
26aa0 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22    strcat (sql, "
26ab0 73 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  srid INTEGER PRI
26ac0 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 29 3b 0a 20  MARY KEY,\n");. 
26ad0 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20     strcat (sql, 
26ae0 22 61 75 74 68 5f 6e 61 6d 65 20 54 45 58 54 2c  "auth_name TEXT,
26af0 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74  \n");.    strcat
26b00 20 28 73 71 6c 2c 20 22 61 75 74 68 5f 73 72 69   (sql, "auth_sri
26b10 64 20 49 4e 54 45 47 45 52 2c 5c 6e 22 29 3b 0a  d INTEGER,\n");.
26b20 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c      strcat (sql,
26b30 20 22 73 72 74 65 78 74 20 54 45 58 54 29 22 29   "srtext TEXT)")
26b40 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69  ;.    ret = sqli
26b50 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65  te3_exec (sqlite
26b60 2c 20 73 71 6c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  , sql, NULL, NUL
26b70 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20  L, &errMsg);.   
26b80 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49   if (ret != SQLI
26b90 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72  TE_OK)..goto err
26ba0 6f 72 3b 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20  or;./* creating 
26bb0 74 68 65 20 47 45 4f 4d 45 54 52 59 5f 43 4f 4c  the GEOMETRY_COL
26bc0 55 4d 4e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  UMN tables */.  
26bd0 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22    strcpy (sql, "
26be0 43 52 45 41 54 45 20 54 41 42 4c 45 20 67 65 6f  CREATE TABLE geo
26bf0 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 28 5c  metry_columns (\
26c00 6e 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20  n");.    strcat 
26c10 28 73 71 6c 2c 20 22 66 5f 74 61 62 6c 65 5f 6e  (sql, "f_table_n
26c20 61 6d 65 20 54 45 58 54 2c 5c 6e 22 29 3b 0a 20  ame TEXT,\n");. 
26c30 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20     strcat (sql, 
26c40 22 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75  "f_geometry_colu
26c50 6d 6e 20 54 45 58 54 2c 5c 6e 22 29 3b 0a 20 20  mn TEXT,\n");.  
26c60 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22    strcat (sql, "
26c70 67 65 6f 6d 65 74 72 79 5f 74 79 70 65 20 49 4e  geometry_type IN
26c80 54 45 47 45 52 2c 5c 6e 22 29 3b 0a 20 20 20 20  TEGER,\n");.    
26c90 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 63 6f  strcat (sql, "co
26ca0 6f 72 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 49 4e  ord_dimension IN
26cb0 54 45 47 45 52 2c 5c 6e 22 29 3b 0a 20 20 20 20  TEGER,\n");.    
26cc0 73 74 72 63 61 74 20 28 73 71 6c 2c 20 22 73 72  strcat (sql, "sr
26cd0 69 64 20 49 4e 54 45 47 45 52 2c 5c 6e 22 29 3b  id INTEGER,\n");
26ce0 0a 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c  .    strcat (sql
26cf0 2c 20 22 67 65 6f 6d 65 74 72 79 5f 66 6f 72 6d  , "geometry_form
26d00 61 74 20 54 45 58 54 29 22 29 3b 0a 20 20 20 20  at TEXT)");.    
26d10 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  ret = sqlite3_ex
26d20 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c  ec (sqlite, sql,
26d30 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72   NULL, NULL, &er
26d40 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 20 28 72  rMsg);.    if (r
26d50 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  et != SQLITE_OK)
26d60 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
26d70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26d80 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31  _int (context, 1
26d90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
26da0 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 70 61 74   error:.    spat
26db0 69 61 6c 69 74 65 5f 65 20 28 22 49 6e 69 74 46  ialite_e ("InitF
26dc0 44 4f 53 70 61 74 69 61 4d 65 74 61 44 61 74 61  DOSpatiaMetaData
26dd0 28 29 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22  () error: \"%s\"
26de0 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b 0a 20 20  \n", errMsg);.  
26df0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
26e00 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  errMsg);.    sql
26e10 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
26e20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
26e30 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61    return;.}..sta
26e40 74 69 63 20 69 6e 74 0a 72 65 63 6f 76 65 72 46  tic int.recoverF
26e50 44 4f 47 65 6f 6d 43 6f 6c 75 6d 6e 20 28 73 71  DOGeomColumn (sq
26e60 6c 69 74 65 33 20 2a 20 73 71 6c 69 74 65 2c 20  lite3 * sqlite, 
26e70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
26e80 68 61 72 20 2a 74 61 62 6c 65 2c 0a 09 09 20 20  har *table,...  
26e90 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
26ea0 65 64 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 2c  ed char *column,
26eb0 20 69 6e 74 20 78 74 79 70 65 2c 20 69 6e 74 20   int xtype, int 
26ec0 73 72 69 64 29 0a 7b 0a 2f 2a 20 63 68 65 63 6b  srid).{./* check
26ed0 73 20 69 66 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  s if TABLE.COLUM
26ee0 4e 20 65 78 69 73 74 73 20 61 6e 64 20 68 61 73  N exists and has
26ef0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 66 65   the required fe
26f00 61 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 69 6e  atures */.    in
26f10 74 20 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 63 68  t ok = 1;.    ch
26f20 61 72 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65 6e  ar *sql_statemen
26f30 74 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b  t;.    int type;
26f40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
26f50 74 20 2a 73 74 6d 74 3b 0a 20 20 20 20 67 61 69  t *stmt;.    gai
26f60 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
26f70 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  m;.    const voi
26f80 64 20 2a 62 6c 6f 62 5f 76 61 6c 75 65 3b 0a 20  d *blob_value;. 
26f90 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
26fa0 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e 74  int ret;.    int
26fb0 20 69 5f 63 6f 6c 3b 0a 20 20 20 20 63 68 61 72   i_col;.    char
26fc0 20 2a 78 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63   *xcolumn;.    c
26fd0 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20 20  har *xtable;.   
26fe0 20 78 63 6f 6c 75 6d 6e 20 3d 20 67 61 69 61 44   xcolumn = gaiaD
26ff0 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
27000 28 63 68 61 72 20 2a 29 20 63 6f 6c 75 6d 6e 29  (char *) column)
27010 3b 0a 20 20 20 20 78 74 61 62 6c 65 20 3d 20 67  ;.    xtable = g
27020 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 64 53  aiaDoubleQuotedS
27030 71 6c 20 28 28 63 68 61 72 20 2a 29 20 74 61 62  ql ((char *) tab
27040 6c 65 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61  le);.    sql_sta
27050 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74 65  tement =..sqlite
27060 33 5f 6d 70 72 69 6e 74 66 20 28 22 53 45 4c 45  3_mprintf ("SELE
27070 43 54 20 5c 22 25 73 5c 22 20 46 52 4f 4d 20 5c  CT \"%s\" FROM \
27080 22 25 73 5c 22 22 2c 20 78 63 6f 6c 75 6d 6e 2c  "%s\"", xcolumn,
27090 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 72   xtable);.    fr
270a0 65 65 20 28 78 63 6f 6c 75 6d 6e 29 3b 0a 20 20  ee (xcolumn);.  
270b0 20 20 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b    free (xtable);
270c0 0a 2f 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 53 51  ./* compiling SQ
270d0 4c 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  L prepared state
270e0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 72 65 74 20  ment */.    ret 
270f0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
27100 65 5f 76 32 20 28 73 71 6c 69 74 65 2c 20 73 71  e_v2 (sqlite, sq
27110 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 73 74 72  l_statement, str
27120 6c 65 6e 20 28 73 71 6c 5f 73 74 61 74 65 6d 65  len (sql_stateme
27130 6e 74 29 2c 0a 09 09 09 20 20 20 20 20 20 26 73  nt),....      &s
27140 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tmt, NULL);.    
27150 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
27160 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  l_statement);.  
27170 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
27180 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a  ITE_OK).      {.
27190 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20  .  spatialite_e 
271a0 28 22 72 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d  ("recoverFDOGeom
271b0 43 6f 6c 75 6d 6e 3a 20 65 72 72 6f 72 20 25 64  Column: error %d
271c0 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 73   \"%s\"\n",....s
271d0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 28  qlite3_errcode (
271e0 73 71 6c 69 74 65 29 2c 20 73 71 6c 69 74 65 33  sqlite), sqlite3
271f0 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29  _errmsg (sqlite)
27200 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a  );..  return 0;.
27210 20 20 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c        }.    whil
27220 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 20  e (1).      {.. 
27230 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 74 68   /* scrolling th
27240 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 6f 77  e result set row
27250 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 71  s */..  ret = sq
27260 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74  lite3_step (stmt
27270 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d  );..  if (ret ==
27280 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a 09 20   SQLITE_DONE).. 
27290 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f 2a 20       break;../* 
272a0 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 73 65  end of result se
272b0 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 74 20  t */..  if (ret 
272c0 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09  == SQLITE_ROW)..
272d0 20 20 20 20 7b 0a 09 09 2f 2a 20 63 68 65 63 6b      {.../* check
272e0 69 6e 67 20 47 65 6f 6d 65 74 72 79 20 66 65 61  ing Geometry fea
272f0 74 75 72 65 73 20 2a 2f 0a 09 09 67 65 6f 6d 20  tures */...geom 
27300 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 69  = NULL;...for (i
27310 5f 63 6f 6c 20 3d 20 30 3b 20 69 5f 63 6f 6c 20  _col = 0; i_col 
27320 3c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  < sqlite3_column
27330 5f 63 6f 75 6e 74 20 28 73 74 6d 74 29 3b 20 69  _count (stmt); i
27340 5f 63 6f 6c 2b 2b 29 0a 09 09 20 20 7b 0a 09 09  _col++)...  {...
27350 20 20 20 20 20 20 69 66 20 28 73 71 6c 69 74 65        if (sqlite
27360 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73  3_column_type (s
27370 74 6d 74 2c 20 69 5f 63 6f 6c 29 20 21 3d 20 53  tmt, i_col) != S
27380 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 09 09 09 20  QLITE_BLOB).... 
27390 20 6f 6b 20 3d 20 30 3b 0a 09 09 20 20 20 20 20   ok = 0;...     
273a0 20 65 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20   else....{....  
273b0 20 20 62 6c 6f 62 5f 76 61 6c 75 65 20 3d 20 73    blob_value = s
273c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
273d0 6f 62 20 28 73 74 6d 74 2c 20 69 5f 63 6f 6c 29  ob (stmt, i_col)
273e0 3b 0a 09 09 09 20 20 20 20 6c 65 6e 20 3d 20 73  ;....    len = s
273f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
27400 74 65 73 20 28 73 74 6d 74 2c 20 69 5f 63 6f 6c  tes (stmt, i_col
27410 29 3b 0a 09 09 09 20 20 20 20 67 65 6f 6d 20 3d  );....    geom =
27420 20 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c   gaiaFromSpatiaL
27430 69 74 65 42 6c 6f 62 57 6b 62 20 28 62 6c 6f 62  iteBlobWkb (blob
27440 5f 76 61 6c 75 65 2c 20 6c 65 6e 29 3b 0a 09 09  _value, len);...
27450 09 20 20 20 20 69 66 20 28 21 67 65 6f 6d 29 0a  .    if (!geom).
27460 09 09 09 09 6f 6b 20 3d 20 30 3b 0a 09 09 09 20  ....ok = 0;.... 
27470 20 20 20 65 6c 73 65 0a 09 09 09 20 20 20 20 20     else....     
27480 20 7b 0a 09 09 09 09 20 20 69 66 20 28 67 65 6f   {.....  if (geo
27490 6d 2d 3e 53 72 69 64 20 21 3d 20 73 72 69 64 29  m->Srid != srid)
274a0 0a 09 09 09 09 20 20 20 20 20 20 6f 6b 20 3d 20  .....      ok = 
274b0 30 3b 0a 09 09 09 09 20 20 2f 2a 20 6e 6f 72 6d  0;.....  /* norm
274c0 61 6c 69 7a 69 6e 67 20 47 65 6f 6d 65 74 72 79  alizing Geometry
274d0 20 54 79 70 65 20 2a 2f 0a 09 09 09 09 20 20 73   Type */.....  s
274e0 77 69 74 63 68 20 28 67 61 69 61 47 65 6f 6d 65  witch (gaiaGeome
274f0 74 72 79 54 79 70 65 20 28 67 65 6f 6d 29 29 0a  tryType (geom)).
27500 09 09 09 09 20 20 20 20 7b 0a 09 09 09 09 20 20  ....    {.....  
27510 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e    case GAIA_POIN
27520 54 3a 0a 09 09 09 09 20 20 20 20 63 61 73 65 20  T:.....    case 
27530 47 41 49 41 5f 50 4f 49 4e 54 5a 3a 0a 09 09 09  GAIA_POINTZ:....
27540 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50  .    case GAIA_P
27550 4f 49 4e 54 4d 3a 0a 09 09 09 09 20 20 20 20 63  OINTM:.....    c
27560 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d  ase GAIA_POINTZM
27570 3a 0a 09 09 09 09 09 74 79 70 65 20 3d 20 47 41  :......type = GA
27580 49 41 5f 50 4f 49 4e 54 3b 0a 09 09 09 09 09 62  IA_POINT;......b
27590 72 65 61 6b 3b 0a 09 09 09 09 20 20 20 20 63 61  reak;.....    ca
275a0 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  se GAIA_LINESTRI
275b0 4e 47 3a 0a 09 09 09 09 20 20 20 20 63 61 73 65  NG:.....    case
275c0 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
275d0 5a 3a 0a 09 09 09 09 20 20 20 20 63 61 73 65 20  Z:.....    case 
275e0 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d  GAIA_LINESTRINGM
275f0 3a 0a 09 09 09 09 20 20 20 20 63 61 73 65 20 47  :.....    case G
27600 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d  AIA_LINESTRINGZM
27610 3a 0a 09 09 09 09 09 74 79 70 65 20 3d 20 47 41  :......type = GA
27620 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 09  IA_LINESTRING;..
27630 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 20  ....break;..... 
27640 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c     case GAIA_POL
27650 59 47 4f 4e 3a 0a 09 09 09 09 20 20 20 20 63 61  YGON:.....    ca
27660 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a  se GAIA_POLYGONZ
27670 3a 0a 09 09 09 09 20 20 20 20 63 61 73 65 20 47  :.....    case G
27680 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a 09 09  AIA_POLYGONM:...
27690 09 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
276a0 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 09 09 09 09  POLYGONZM:......
276b0 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59  type = GAIA_POLY
276c0 47 4f 4e 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  GON;......break;
276d0 0a 09 09 09 09 20 20 20 20 63 61 73 65 20 47 41  .....    case GA
276e0 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3a 0a 09  IA_MULTIPOINT:..
276f0 09 09 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ...    case GAIA
27700 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 3a 0a 09 09  _MULTIPOINTZ:...
27710 09 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
27720 4d 55 4c 54 49 50 4f 49 4e 54 4d 3a 0a 09 09 09  MULTIPOINTM:....
27730 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
27740 55 4c 54 49 50 4f 49 4e 54 5a 4d 3a 0a 09 09 09  ULTIPOINTZM:....
27750 09 09 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55  ..type = GAIA_MU
27760 4c 54 49 50 4f 49 4e 54 3b 0a 09 09 09 09 09 62  LTIPOINT;......b
27770 72 65 61 6b 3b 0a 09 09 09 09 20 20 20 20 63 61  reak;.....    ca
27780 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e  se GAIA_MULTILIN
27790 45 53 54 52 49 4e 47 3a 0a 09 09 09 09 20 20 20  ESTRING:.....   
277a0 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
277b0 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09 09 09  LINESTRINGZ:....
277c0 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
277d0 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 4d 3a  ULTILINESTRINGM:
277e0 0a 09 09 09 09 20 20 20 20 63 61 73 65 20 47 41  .....    case GA
277f0 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
27800 4e 47 5a 4d 3a 0a 09 09 09 09 09 74 79 70 65 20  NGZM:......type 
27810 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  = GAIA_MULTILINE
27820 53 54 52 49 4e 47 3b 0a 09 09 09 09 09 62 72 65  STRING;......bre
27830 61 6b 3b 0a 09 09 09 09 20 20 20 20 63 61 73 65  ak;.....    case
27840 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
27850 4f 4e 3a 0a 09 09 09 09 20 20 20 20 63 61 73 65  ON:.....    case
27860 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
27870 4f 4e 5a 3a 0a 09 09 09 09 20 20 20 20 63 61 73  ONZ:.....    cas
27880 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  e GAIA_MULTIPOLY
27890 47 4f 4e 4d 3a 0a 09 09 09 09 20 20 20 20 63 61  GONM:.....    ca
278a0 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
278b0 59 47 4f 4e 5a 4d 3a 0a 09 09 09 09 09 74 79 70  YGONZM:......typ
278c0 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
278d0 4c 59 47 4f 4e 3b 0a 09 09 09 09 09 62 72 65 61  LYGON;......brea
278e0 6b 3b 0a 09 09 09 09 20 20 20 20 63 61 73 65 20  k;.....    case 
278f0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
27900 4c 45 43 54 49 4f 4e 3a 0a 09 09 09 09 20 20 20  LECTION:.....   
27910 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45   case GAIA_GEOME
27920 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3a 0a  TRYCOLLECTIONZ:.
27930 09 09 09 09 20 20 20 20 63 61 73 65 20 47 41 49  ....    case GAI
27940 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
27950 54 49 4f 4e 4d 3a 0a 09 09 09 09 20 20 20 20 63  TIONM:.....    c
27960 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  ase GAIA_GEOMETR
27970 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3a 0a 09  YCOLLECTIONZM:..
27980 09 09 09 09 74 79 70 65 20 3d 20 47 41 49 41 5f  ....type = GAIA_
27990 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
279a0 4f 4e 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ON;......break;.
279b0 09 09 09 09 20 20 20 20 64 65 66 61 75 6c 74 3a  ....    default:
279c0 0a 09 09 09 09 09 74 79 70 65 20 3d 20 2d 31 3b  ......type = -1;
279d0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
279e0 09 20 20 20 20 7d 3b 0a 09 09 09 09 20 20 69 66  .    };.....  if
279f0 20 28 78 74 79 70 65 20 3d 3d 20 74 79 70 65 29   (xtype == type)
27a00 0a 09 09 09 09 20 20 20 20 20 20 3b 0a 09 09 09  .....      ;....
27a10 09 20 20 65 6c 73 65 0a 09 09 09 09 20 20 20 20  .  else.....    
27a20 20 20 6f 6b 20 3d 20 30 3b 0a 09 09 09 09 20 20    ok = 0;.....  
27a30 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
27a40 20 28 67 65 6f 6d 29 3b 0a 09 09 09 20 20 20 20   (geom);....    
27a50 20 20 7d 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09    }....}...  }..
27a60 20 20 20 20 7d 0a 09 20 20 69 66 20 28 21 6f 6b      }..  if (!ok
27a70 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  )..      break;.
27a80 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 20        }.    ret 
27a90 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
27aa0 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69  ze (stmt);.    i
27ab0 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
27ac0 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  _OK).      {..  
27ad0 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 72  spatialite_e ("r
27ae0 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d 43 6f 6c  ecoverFDOGeomCol
27af0 75 6d 6e 3a 20 65 72 72 6f 72 20 25 64 20 5c 22  umn: error %d \"
27b00 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 73 71 6c 69  %s\"\n",....sqli
27b10 74 65 33 5f 65 72 72 63 6f 64 65 20 28 73 71 6c  te3_errcode (sql
27b20 69 74 65 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  ite), sqlite3_er
27b30 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a  rmsg (sqlite));.
27b40 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  .  return 0;.   
27b50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27b60 6f 6b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ok;.}..static vo
27b70 69 64 0a 66 6e 63 74 5f 41 64 64 46 44 4f 47 65  id.fnct_AddFDOGe
27b80 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 20 28 73 71  ometryColumn (sq
27b90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
27ba0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
27bb0 63 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33  c,....   sqlite3
27bc0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
27bd0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
27be0 6e 3a 0a 2f 20 41 64 64 46 44 4f 47 65 6f 6d 65  n:./ AddFDOGeome
27bf0 74 72 79 43 6f 6c 75 6d 6e 28 74 61 62 6c 65 2c  tryColumn(table,
27c00 20 63 6f 6c 75 6d 6e 2c 20 73 72 69 64 2c 20 67   column, srid, g
27c10 65 6f 6d 65 74 72 79 5f 74 79 70 65 20 2c 20 64  eometry_type , d
27c20 69 6d 65 6e 73 69 6f 6e 2c 20 67 65 6f 6d 65 74  imension, geomet
27c30 72 79 5f 66 6f 72 6d 61 74 20 29 0a 2f 0a 2f 20  ry_format )././ 
27c40 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 43 4f  creates a new CO
27c50 4c 55 4d 4e 20 6f 66 20 67 69 76 65 6e 20 54 59  LUMN of given TY
27c60 50 45 20 69 6e 74 6f 20 54 41 42 4c 45 0a 2f 20  PE into TABLE./ 
27c70 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
27c80 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
27c90 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ure.*/.    const
27ca0 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20   char *table;.  
27cb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
27cc0 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  lumn;.    const 
27cd0 63 68 61 72 20 2a 66 6f 72 6d 61 74 3b 0a 20 20  char *format;.  
27ce0 20 20 63 68 61 72 20 78 66 6f 72 6d 61 74 5b 36    char xformat[6
27cf0 34 5d 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65  4];.    int type
27d00 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64 20 3d  ;.    int srid =
27d10 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 64 69 6d   -1;.    int dim
27d20 65 6e 73 69 6f 6e 20 3d 20 32 3b 0a 20 20 20 20  ension = 2;.    
27d30 63 68 61 72 20 2a 73 71 6c 5f 73 74 61 74 65 6d  char *sql_statem
27d40 65 6e 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 65  ent;.    char *e
27d50 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrMsg = NULL;.  
27d60 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
27d70 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a 20  har **results;. 
27d80 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 20     int rows;.   
27d90 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20 20   int columns;.  
27da0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
27db0 20 6f 6b 74 62 6c 3b 0a 20 20 20 20 63 68 61 72   oktbl;.    char
27dc0 20 2a 78 74 61 62 6c 65 3b 0a 20 20 20 20 63 68   *xtable;.    ch
27dd0 61 72 20 2a 78 63 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *xcolumn;.   
27de0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
27df0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
27e00 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
27e10 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
27e20 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
27e30 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
27e40 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
27e50 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
27e60 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
27e70 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
27e80 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
27e90 20 20 20 20 20 20 28 22 41 64 64 46 44 4f 47 65        ("AddFDOGe
27ea0 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65  ometryColumn() e
27eb0 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 31  rror: argument 1
27ec0 20 5b 74 61 62 6c 65 5f 6e 61 6d 65 5d 20 69 73   [table_name] is
27ed0 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69   not of the Stri
27ee0 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20  ng type\n");..  
27ef0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
27f00 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
27f10 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
27f20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d 20    }.    table = 
27f30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
27f40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
27f50 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
27f60 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
27f70 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
27f80 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
27f90 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61  ).      {..  spa
27fa0 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20  tialite_e..     
27fb0 20 28 22 41 64 64 46 44 4f 47 65 6f 6d 65 74 72   ("AddFDOGeometr
27fc0 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
27fd0 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 63 6f 6c   argument 2 [col
27fe0 75 6d 6e 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74  umn_name] is not
27ff0 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74   of the String t
28000 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69  ype\n");..  sqli
28010 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
28020 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
28030 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
28040 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f      column = (co
28050 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
28060 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
28070 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
28080 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
28090 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21  type (argv[2]) !
280a0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
280b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61  ).      {..  spa
280c0 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20  tialite_e..     
280d0 20 28 22 41 64 64 46 44 4f 47 65 6f 6d 65 74 72   ("AddFDOGeometr
280e0 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
280f0 20 61 72 67 75 6d 65 6e 74 20 33 20 5b 53 52 49   argument 3 [SRI
28100 44 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65  D] is not of the
28110 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c 6e 22   Integer type\n"
28120 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
28130 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
28140 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e  t, 0);..  return
28150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 72  ;.      }.    sr
28160 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
28170 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
28180 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
28190 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
281a0 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[3]) != SQLITE
281b0 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
281c0 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
281d0 65 0a 09 20 20 20 20 20 20 28 22 41 64 64 46 44  e..      ("AddFD
281e0 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28  OGeometryColumn(
281f0 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
28200 74 20 34 20 5b 67 65 6f 6d 65 74 72 79 5f 74 79  t 4 [geometry_ty
28210 70 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  pe] is not of th
28220 65 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c 6e  e Integer type\n
28230 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
28240 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
28250 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
28260 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74  n;.      }.    t
28270 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
28280 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d  lue_int (argv[3]
28290 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
282a0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
282b0 72 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[4]) != SQLIT
282c0 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
282d0 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
282e0 5f 65 0a 09 20 20 20 20 20 20 28 22 41 64 64 46  _e..      ("AddF
282f0 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  DOGeometryColumn
28300 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65  () error: argume
28310 6e 74 20 35 20 5b 64 69 6d 65 6e 73 69 6f 6e 5d  nt 5 [dimension]
28320 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 49   is not of the I
28330 6e 74 65 67 65 72 20 74 79 70 65 5c 6e 22 29 3b  nteger type\n");
28340 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
28350 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
28360 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
28370 20 20 20 20 20 20 7d 0a 20 20 20 20 64 69 6d 65        }.    dime
28380 6e 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  nsion = sqlite3_
28390 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
283a0 34 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  4]);.    if (sql
283b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
283c0 28 61 72 67 76 5b 35 5d 29 20 21 3d 20 53 51 4c  (argv[5]) != SQL
283d0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
283e0 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
283f0 65 0a 09 20 20 20 20 20 20 28 22 41 64 64 46 44  e..      ("AddFD
28400 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28  OGeometryColumn(
28410 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
28420 74 20 36 20 5b 67 65 6f 6d 65 74 72 79 5f 66 6f  t 6 [geometry_fo
28430 72 6d 61 74 5d 20 69 73 20 6e 6f 74 20 6f 66 20  rmat] is not of 
28440 74 68 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c  the String type\
28450 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  n");..  sqlite3_
28460 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
28470 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75  ext, 0);..  retu
28480 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
28490 66 6f 72 6d 61 74 20 3d 20 28 63 6f 6e 73 74 20  format = (const 
284a0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
284b0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
284c0 5b 35 5d 29 3b 0a 20 20 20 20 69 66 20 28 74 79  [5]);.    if (ty
284d0 70 65 20 3d 3d 0a 09 47 41 49 41 5f 50 4f 49 4e  pe ==..GAIA_POIN
284e0 54 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 0a 09 47  T..|| type ==..G
284f0 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 0a 09  AIA_LINESTRING..
28500 7c 7c 20 74 79 70 65 20 3d 3d 0a 09 47 41 49 41  || type ==..GAIA
28510 5f 50 4f 4c 59 47 4f 4e 0a 09 7c 7c 20 74 79 70  _POLYGON..|| typ
28520 65 20 3d 3d 0a 09 47 41 49 41 5f 4d 55 4c 54 49  e ==..GAIA_MULTI
28530 50 4f 49 4e 54 0a 09 7c 7c 20 74 79 70 65 20 3d  POINT..|| type =
28540 3d 0a 09 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e  =..GAIA_MULTILIN
28550 45 53 54 52 49 4e 47 0a 09 7c 7c 20 74 79 70 65  ESTRING..|| type
28560 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f   == GAIA_MULTIPO
28570 4c 59 47 4f 4e 20 7c 7c 20 74 79 70 65 20 3d 3d  LYGON || type ==
28580 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
28590 4c 4c 45 43 54 49 4f 4e 29 0a 09 3b 0a 20 20 20  LLECTION)..;.   
285a0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
285b0 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
285c0 20 20 20 20 20 28 22 41 64 64 46 44 4f 47 65 6f       ("AddFDOGeo
285d0 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72  metryColumn() er
285e0 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 34 20  ror: argument 4 
285f0 5b 67 65 6f 6d 65 74 72 79 5f 74 79 70 65 5d 20  [geometry_type] 
28600 68 61 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 76  has an illegal v
28610 61 6c 75 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  alue\n");..  sql
28620 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
28630 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
28640 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
28650 0a 20 20 20 20 69 66 20 28 64 69 6d 65 6e 73 69  .    if (dimensi
28660 6f 6e 20 3c 20 32 20 7c 7c 20 64 69 6d 65 6e 73  on < 2 || dimens
28670 69 6f 6e 20 3e 20 34 29 0a 20 20 20 20 20 20 7b  ion > 4).      {
28680 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65  ..  spatialite_e
28690 0a 09 20 20 20 20 20 20 28 22 41 64 64 46 44 4f  ..      ("AddFDO
286a0 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
286b0 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74   error: argument
286c0 20 35 20 5b 64 69 6d 65 6e 73 69 6f 6e 5d 20 63   5 [dimension] c
286d0 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f  urrent version o
286e0 6e 6c 79 20 61 63 63 65 70 74 73 20 64 69 6d 65  nly accepts dime
286f0 6e 73 69 6f 6e 3d 32 2c 33 2c 34 5c 6e 22 29 3b  nsion=2,3,4\n");
28700 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
28710 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
28720 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
28730 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
28740 73 74 72 63 61 73 65 63 6d 70 20 28 66 6f 72 6d  strcasecmp (form
28750 61 74 2c 20 22 57 4b 54 22 29 20 3d 3d 20 30 29  at, "WKT") == 0)
28760 0a 09 73 74 72 63 70 79 20 28 78 66 6f 72 6d 61  ..strcpy (xforma
28770 74 2c 20 22 57 4b 54 22 29 3b 0a 20 20 20 20 65  t, "WKT");.    e
28780 6c 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63  lse if (strcasec
28790 6d 70 20 28 66 6f 72 6d 61 74 2c 20 22 57 4b 42  mp (format, "WKB
287a0 22 29 20 3d 3d 20 30 29 0a 09 73 74 72 63 70 79  ") == 0)..strcpy
287b0 20 28 78 66 6f 72 6d 61 74 2c 20 22 57 4b 42 22   (xformat, "WKB"
287c0 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
287d0 73 74 72 63 61 73 65 63 6d 70 20 28 66 6f 72 6d  strcasecmp (form
287e0 61 74 2c 20 22 46 47 46 22 29 20 3d 3d 20 30 29  at, "FGF") == 0)
287f0 0a 09 73 74 72 63 70 79 20 28 78 66 6f 72 6d 61  ..strcpy (xforma
28800 74 2c 20 22 46 47 46 22 29 3b 0a 20 20 20 20 65  t, "FGF");.    e
28810 6c 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63  lse if (strcasec
28820 6d 70 20 28 66 6f 72 6d 61 74 2c 20 22 53 50 41  mp (format, "SPA
28830 54 49 41 4c 49 54 45 22 29 20 3d 3d 20 30 29 0a  TIALITE") == 0).
28840 09 73 74 72 63 70 79 20 28 78 66 6f 72 6d 61 74  .strcpy (xformat
28850 2c 20 22 53 50 41 54 49 41 4c 49 54 45 22 29 3b  , "SPATIALITE");
28860 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
28870 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
28880 65 0a 09 20 20 20 20 20 20 28 22 41 64 64 46 44  e..      ("AddFD
28890 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28  OGeometryColumn(
288a0 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
288b0 74 20 36 20 5b 67 65 6f 6d 65 74 72 79 5f 66 6f  t 6 [geometry_fo
288c0 72 6d 61 74 5d 20 68 61 73 20 74 6f 20 62 65 20  rmat] has to be 
288d0 6f 6e 65 20 6f 66 3a 20 57 4b 54 2c 57 4b 42 2c  one of: WKT,WKB,
288e0 46 47 46 2c 53 50 41 54 49 41 4c 49 54 45 5c 6e  FGF,SPATIALITE\n
288f0 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
28900 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
28910 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
28920 6e 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 68  n;.      }./* ch
28930 65 63 6b 69 6e 67 20 69 66 20 74 68 65 20 74 61  ecking if the ta
28940 62 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ble exists */.  
28950 20 20 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44    xtable = gaiaD
28960 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
28970 74 61 62 6c 65 29 3b 0a 20 20 20 20 78 63 6f 6c  table);.    xcol
28980 75 6d 6e 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  umn = gaiaDouble
28990 51 75 6f 74 65 64 53 71 6c 20 28 63 6f 6c 75 6d  QuotedSql (colum
289a0 6e 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61 74  n);.    sql_stat
289b0 65 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  ement = sqlite3_
289c0 6d 70 72 69 6e 74 66 20 28 22 53 45 4c 45 43 54  mprintf ("SELECT
289d0 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
289e0 65 5f 6d 61 73 74 65 72 20 22 0a 09 09 09 09 20  e_master "..... 
289f0 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20      "WHERE type 
28a00 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 55 70  = 'table' AND Up
28a10 70 65 72 28 6e 61 6d 65 29 20 3d 20 55 70 70 65  per(name) = Uppe
28a20 72 28 25 51 29 22 2c 0a 09 09 09 09 20 20 20 20  r(%Q)",.....    
28a30 20 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65   table);.    fre
28a40 65 20 28 78 74 61 62 6c 65 29 3b 0a 20 20 20 20  e (xtable);.    
28a50 66 72 65 65 20 28 78 63 6f 6c 75 6d 6e 29 3b 0a  free (xcolumn);.
28a60 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
28a70 33 5f 67 65 74 5f 74 61 62 6c 65 20 28 73 71 6c  3_get_table (sql
28a80 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65  ite, sql_stateme
28a90 6e 74 2c 20 26 72 65 73 75 6c 74 73 2c 20 26 72  nt, &results, &r
28aa0 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c 0a 09  ows, &columns,..
28ab0 09 09 20 20 20 20 20 26 65 72 72 4d 73 67 29 3b  ..     &errMsg);
28ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28ad0 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e (sql_statement
28ae0 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
28af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  = SQLITE_OK).   
28b00 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
28b10 74 65 5f 65 20 28 22 41 64 64 46 44 4f 47 65 6f  te_e ("AddFDOGeo
28b20 6d 65 74 72 79 43 6f 6c 75 6d 6e 3a 20 5c 22 25  metryColumn: \"%
28b30 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b  s\"\n", errMsg);
28b40 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
28b50 20 28 65 72 72 4d 73 67 29 3b 0a 09 20 20 72 65   (errMsg);..  re
28b60 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
28b70 20 20 6f 6b 74 62 6c 20 3d 20 30 3b 0a 20 20 20    oktbl = 0;.   
28b80 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c   for (i = 1; i <
28b90 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 6f 6b  = rows; i++)..ok
28ba0 74 62 6c 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  tbl = 1;.    sql
28bb0 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20  ite3_free_table 
28bc0 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 20 20 69  (results);.    i
28bd0 66 20 28 21 6f 6b 74 62 6c 29 0a 20 20 20 20 20  f (!oktbl).     
28be0 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
28bf0 5f 65 0a 09 20 20 20 20 20 20 28 22 41 64 64 46  _e..      ("AddF
28c00 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  DOGeometryColumn
28c10 28 29 20 65 72 72 6f 72 3a 20 74 61 62 6c 65 20  () error: table 
28c20 27 25 73 27 20 64 6f 65 73 20 6e 6f 74 20 65 78  '%s' does not ex
28c30 69 73 74 5c 6e 22 2c 0a 09 20 20 20 20 20 20 20  ist\n",..       
28c40 74 61 62 6c 65 29 3b 0a 09 20 20 73 71 6c 69 74  table);..  sqlit
28c50 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
28c60 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72  ontext, 0);..  r
28c70 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 2f  eturn;.      }./
28c80 2a 20 74 72 79 69 6e 67 20 74 6f 20 61 64 64 20  * trying to add 
28c90 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
28ca0 20 20 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44    xtable = gaiaD
28cb0 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
28cc0 74 61 62 6c 65 29 3b 0a 20 20 20 20 78 63 6f 6c  table);.    xcol
28cd0 75 6d 6e 20 3d 20 67 61 69 61 44 6f 75 62 6c 65  umn = gaiaDouble
28ce0 51 75 6f 74 65 64 53 71 6c 20 28 63 6f 6c 75 6d  QuotedSql (colum
28cf0 6e 29 3b 0a 20 20 20 20 73 71 6c 5f 73 74 61 74  n);.    sql_stat
28d00 65 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  ement = sqlite3_
28d10 6d 70 72 69 6e 74 66 20 28 22 41 4c 54 45 52 20  mprintf ("ALTER 
28d20 54 41 42 4c 45 20 5c 22 25 73 5c 22 20 22 0a 09  TABLE \"%s\" "..
28d30 09 09 09 20 20 20 20 20 22 41 44 44 20 43 4f 4c  ...     "ADD COL
28d40 55 4d 4e 20 5c 22 25 73 5c 22 20 42 4c 4f 42 22  UMN \"%s\" BLOB"
28d50 2c 20 78 74 61 62 6c 65 2c 20 78 63 6f 6c 75 6d  , xtable, xcolum
28d60 6e 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78 74  n);.    free (xt
28d70 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 20  able);.    free 
28d80 28 78 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72  (xcolumn);.    r
28d90 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
28da0 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73  c (sqlite, sql_s
28db0 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20  tatement, NULL, 
28dc0 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a  NULL, &errMsg);.
28dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28de0 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
28df0 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
28e00 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74   SQLITE_OK)..got
28e10 6f 20 65 72 72 6f 72 3b 0a 2f 2a 6f 6b 2c 20 69  o error;./*ok, i
28e20 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 67 65  nserting into ge
28e30 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 5b  ometry_columns [
28e40 46 44 4f 20 53 70 61 74 69 61 6c 20 4d 65 74 61  FDO Spatial Meta
28e50 64 61 74 61 5d 20 2a 2f 0a 20 20 20 20 73 71 6c  data] */.    sql
28e60 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20 73 71 6c  _statement = sql
28e70 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 49  ite3_mprintf ("I
28e80 4e 53 45 52 54 20 49 4e 54 4f 20 67 65 6f 6d 65  NSERT INTO geome
28e90 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 22 0a 09 09  try_columns "...
28ea0 09 09 20 20 20 20 20 22 28 66 5f 74 61 62 6c 65  ..     "(f_table
28eb0 5f 6e 61 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72  _name, f_geometr
28ec0 79 5f 63 6f 6c 75 6d 6e 2c 20 67 65 6f 6d 65 74  y_column, geomet
28ed0 72 79 5f 74 79 70 65 2c 20 22 0a 09 09 09 09 20  ry_type, "..... 
28ee0 20 20 20 20 22 63 6f 6f 72 64 5f 64 69 6d 65 6e      "coord_dimen
28ef0 73 69 6f 6e 2c 20 73 72 69 64 2c 20 67 65 6f 6d  sion, srid, geom
28f00 65 74 72 79 5f 66 6f 72 6d 61 74 29 20 56 41 4c  etry_format) VAL
28f10 55 45 53 20 28 25 51 2c 20 25 51 2c 20 25 64 2c  UES (%Q, %Q, %d,
28f20 20 25 64 2c 20 25 64 2c 20 25 51 29 22 2c 0a 09   %d, %d, %Q)",..
28f30 09 09 09 20 20 20 20 20 74 61 62 6c 65 2c 20 63  ...     table, c
28f40 6f 6c 75 6d 6e 2c 20 74 79 70 65 2c 20 64 69 6d  olumn, type, dim
28f50 65 6e 73 69 6f 6e 2c 0a 09 09 09 09 20 20 20 20  ension,.....    
28f60 20 28 73 72 69 64 20 3c 3d 20 30 29 20 3f 20 2d   (srid <= 0) ? -
28f70 31 20 3a 20 73 72 69 64 2c 20 78 66 6f 72 6d 61  1 : srid, xforma
28f80 74 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  t);.    ret = sq
28f90 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69  lite3_exec (sqli
28fa0 74 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e  te, sql_statemen
28fb0 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  t, NULL, NULL, &
28fc0 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  errMsg);.    sql
28fd0 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 5f 73  ite3_free (sql_s
28fe0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69  tatement);.    i
28ff0 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
29000 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72  _OK)..goto error
29010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
29020 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
29030 74 2c 20 31 29 3b 0a 20 20 20 20 72 65 74 75 72  t, 1);.    retur
29040 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20  n;.  error:.    
29050 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 41  spatialite_e ("A
29060 64 64 46 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c  ddFDOGeometryCol
29070 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 5c 22 25  umn() error: \"%
29080 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b  s\"\n", errMsg);
29090 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
290a0 65 20 28 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  e (errMsg);.    
290b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
290c0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
290d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
290e0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
290f0 5f 52 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d 65  _RecoverFDOGeome
29100 74 72 79 43 6f 6c 75 6d 6e 20 28 73 71 6c 69 74  tryColumn (sqlit
29110 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
29120 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
29130 09 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65  ...       sqlite
29140 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
29150 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
29160 6f 6e 3a 0a 2f 20 52 65 63 6f 76 65 72 46 44 4f  on:./ RecoverFDO
29170 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 74  GeometryColumn(t
29180 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 73 72  able, column, sr
29190 69 64 2c 20 67 65 6f 6d 65 74 72 79 5f 74 79 70  id, geometry_typ
291a0 65 20 2c 20 64 69 6d 65 6e 73 69 6f 6e 2c 20 67  e , dimension, g
291b0 65 6f 6d 65 74 72 79 5f 66 6f 72 6d 61 74 20 29  eometry_format )
291c0 0a 2f 0a 2f 20 63 68 65 63 6b 73 20 69 66 20 61  ././ checks if a
291d0 6e 20 65 78 69 73 74 69 6e 67 20 54 41 42 4c 45  n existing TABLE
291e0 2e 43 4f 4c 55 4d 4e 20 73 61 74 69 73 66 69 65  .COLUMN satisfie
291f0 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67  s the required g
29200 65 6f 6d 65 74 72 69 63 20 66 65 61 74 75 72 65  eometric feature
29210 73 0a 2f 20 69 66 20 79 65 73 20 61 64 64 73 20  s./ if yes adds 
29220 69 74 20 74 6f 20 46 44 4f 2d 73 74 79 6c 65 64  it to FDO-styled
29230 20 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61   SpatialMetaData
29240 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e   ./ returns 1 on
29250 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20   success./ 0 on 
29260 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63  failure.*/.    c
29270 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65  onst char *table
29280 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
29290 20 2a 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f   *column;.    co
292a0 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
292b0 3b 0a 20 20 20 20 63 68 61 72 20 78 66 6f 72 6d  ;.    char xform
292c0 61 74 5b 36 34 5d 3b 0a 20 20 20 20 69 6e 74 20  at[64];.    int 
292d0 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 73 72  type;.    int sr
292e0 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  id = -1;.    int
292f0 20 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 32 3b 0a   dimension = 2;.
29300 20 20 20 20 63 68 61 72 20 2a 73 71 6c 5f 73 74      char *sql_st
29310 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 63 68 61  atement;.    cha
29320 72 20 2a 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c  r *errMsg = NULL
29330 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
29340 20 20 20 63 68 61 72 20 2a 2a 72 65 73 75 6c 74     char **result
29350 73 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 73 3b  s;.    int rows;
29360 0a 20 20 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73  .    int columns
29370 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
29380 20 69 6e 74 20 6f 6b 5f 74 62 6c 3b 0a 20 20 20   int ok_tbl;.   
29390 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
293a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
293b0 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
293c0 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
293d0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
293e0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
293f0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
29400 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
29410 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
29420 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
29430 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
29440 20 20 20 20 20 20 28 22 52 65 63 6f 76 65 72 46        ("RecoverF
29450 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  DOGeometryColumn
29460 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65  () error: argume
29470 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61 6d 65  nt 1 [table_name
29480 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20  ] is not of the 
29490 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b  String type\n");
294a0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
294b0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
294c0 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
294d0 20 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c        }.    tabl
294e0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
294f0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
29500 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
29510 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
29520 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
29530 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
29540 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
29550 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
29560 20 20 20 20 20 28 22 52 65 63 6f 76 65 72 46 44       ("RecoverFD
29570 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28  OGeometryColumn(
29580 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
29590 74 20 32 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  t 2 [column_name
295a0 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20  ] is not of the 
295b0 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b  String type\n");
295c0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
295d0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
295e0 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
295f0 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 6c 75        }.    colu
29600 6d 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  mn = (const char
29610 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
29620 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29  e_text (argv[1])
29630 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
29640 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
29650 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[2]) != SQLITE
29660 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
29670 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
29680 65 0a 09 20 20 20 20 20 20 28 22 52 65 63 6f 76  e..      ("Recov
29690 65 72 46 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c  erFDOGeometryCol
296a0 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72 67  umn() error: arg
296b0 75 6d 65 6e 74 20 33 20 5b 53 52 49 44 5d 20 69  ument 3 [SRID] i
296c0 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 49 6e 74  s not of the Int
296d0 65 67 65 72 20 74 79 70 65 5c 6e 22 29 3b 0a 09  eger type\n");..
296e0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
296f0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
29700 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
29710 20 20 20 20 7d 0a 20 20 20 20 73 72 69 64 20 3d      }.    srid =
29720 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
29730 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  nt (argv[2]);.  
29740 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
29750 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33  lue_type (argv[3
29760 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) != SQLITE_INT
29770 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
29780 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
29790 20 20 20 20 20 28 22 52 65 63 6f 76 65 72 46 44       ("RecoverFD
297a0 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28  OGeometryColumn(
297b0 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
297c0 74 20 34 20 5b 67 65 6f 6d 65 74 72 79 5f 74 79  t 4 [geometry_ty
297d0 70 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  pe] is not of th
297e0 65 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c 6e  e Integer type\n
297f0 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
29800 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
29810 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
29820 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74  n;.      }.    t
29830 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
29840 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d  lue_int (argv[3]
29850 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
29860 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
29870 72 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[4]) != SQLIT
29880 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
29890 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
298a0 5f 65 0a 09 20 20 20 20 20 20 28 22 52 65 63 6f  _e..      ("Reco
298b0 76 65 72 46 44 4f 47 65 6f 6d 65 74 72 79 43 6f  verFDOGeometryCo
298c0 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72  lumn() error: ar
298d0 67 75 6d 65 6e 74 20 35 20 5b 64 69 6d 65 6e 73  gument 5 [dimens
298e0 69 6f 6e 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74  ion] is not of t
298f0 68 65 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c  he Integer type\
29900 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  n");..  sqlite3_
29910 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
29920 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75  ext, 0);..  retu
29930 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
29940 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 73 71 6c 69  dimension = sqli
29950 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
29960 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[4]);.    if 
29970 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
29980 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20 21 3d  ype (argv[5]) !=
29990 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
299a0 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
299b0 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 52  ite_e..      ("R
299c0 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d 65 74 72  ecoverFDOGeometr
299d0 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
299e0 20 61 72 67 75 6d 65 6e 74 20 36 20 5b 67 65 6f   argument 6 [geo
299f0 6d 65 74 72 79 5f 66 6f 72 6d 61 74 5d 20 69 73  metry_format] is
29a00 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69   not of the Stri
29a10 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20  ng type\n");..  
29a20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
29a30 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
29a40 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
29a50 20 20 7d 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d    }.    format =
29a60 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
29a70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
29a80 78 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20  xt (argv[5]);.  
29a90 20 20 69 66 20 28 74 79 70 65 20 3d 3d 0a 09 47    if (type ==..G
29aa0 41 49 41 5f 50 4f 49 4e 54 0a 09 7c 7c 20 74 79  AIA_POINT..|| ty
29ab0 70 65 20 3d 3d 0a 09 47 41 49 41 5f 4c 49 4e 45  pe ==..GAIA_LINE
29ac0 53 54 52 49 4e 47 0a 09 7c 7c 20 74 79 70 65 20  STRING..|| type 
29ad0 3d 3d 0a 09 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  ==..GAIA_POLYGON
29ae0 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 0a 09 47 41  ..|| type ==..GA
29af0 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 0a 09 7c  IA_MULTIPOINT..|
29b00 7c 20 74 79 70 65 20 3d 3d 0a 09 47 41 49 41 5f  | type ==..GAIA_
29b10 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 0a  MULTILINESTRING.
29b20 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41  .|| type == GAIA
29b30 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 20 7c 7c  _MULTIPOLYGON ||
29b40 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
29b50 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
29b60 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  )..;.    else.  
29b70 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
29b80 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 52  ite_e..      ("R
29b90 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d 65 74 72  ecoverFDOGeometr
29ba0 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
29bb0 20 61 72 67 75 6d 65 6e 74 20 34 20 5b 67 65 6f   argument 4 [geo
29bc0 6d 65 74 72 79 5f 74 79 70 65 5d 20 68 61 73 20  metry_type] has 
29bd0 61 6e 20 69 6c 6c 65 67 61 6c 20 76 61 6c 75 65  an illegal value
29be0 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  \n");..  sqlite3
29bf0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
29c00 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74  text, 0);..  ret
29c10 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
29c20 20 69 66 20 28 64 69 6d 65 6e 73 69 6f 6e 20 3c   if (dimension <
29c30 20 32 20 7c 7c 20 64 69 6d 65 6e 73 69 6f 6e 20   2 || dimension 
29c40 3e 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  > 4).      {..  
29c50 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20  spatialite_e..  
29c60 20 20 20 20 28 22 52 65 63 6f 76 65 72 46 44 4f      ("RecoverFDO
29c70 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
29c80 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74   error: argument
29c90 20 35 20 5b 64 69 6d 65 6e 73 69 6f 6e 5d 20 63   5 [dimension] c
29ca0 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f  urrent version o
29cb0 6e 6c 79 20 61 63 63 65 70 74 73 20 64 69 6d 65  nly accepts dime
29cc0 6e 73 69 6f 6e 3d 32 2c 33 2c 34 5c 6e 22 29 3b  nsion=2,3,4\n");
29cd0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
29ce0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
29cf0 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
29d00 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
29d10 73 74 72 63 61 73 65 63 6d 70 20 28 66 6f 72 6d  strcasecmp (form
29d20 61 74 2c 20 22 57 4b 54 22 29 20 3d 3d 20 30 29  at, "WKT") == 0)
29d30 0a 09 73 74 72 63 70 79 20 28 78 66 6f 72 6d 61  ..strcpy (xforma
29d40 74 2c 20 22 57 4b 54 22 29 3b 0a 20 20 20 20 65  t, "WKT");.    e
29d50 6c 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63  lse if (strcasec
29d60 6d 70 20 28 66 6f 72 6d 61 74 2c 20 22 57 4b 42  mp (format, "WKB
29d70 22 29 20 3d 3d 20 30 29 0a 09 73 74 72 63 70 79  ") == 0)..strcpy
29d80 20 28 78 66 6f 72 6d 61 74 2c 20 22 57 4b 42 22   (xformat, "WKB"
29d90 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
29da0 73 74 72 63 61 73 65 63 6d 70 20 28 66 6f 72 6d  strcasecmp (form
29db0 61 74 2c 20 22 46 47 46 22 29 20 3d 3d 20 30 29  at, "FGF") == 0)
29dc0 0a 09 73 74 72 63 70 79 20 28 78 66 6f 72 6d 61  ..strcpy (xforma
29dd0 74 2c 20 22 46 47 46 22 29 3b 0a 20 20 20 20 65  t, "FGF");.    e
29de0 6c 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63  lse if (strcasec
29df0 6d 70 20 28 66 6f 72 6d 61 74 2c 20 22 53 50 41  mp (format, "SPA
29e00 54 49 41 4c 49 54 45 22 29 20 3d 3d 20 30 29 0a  TIALITE") == 0).
29e10 09 73 74 72 63 70 79 20 28 78 66 6f 72 6d 61 74  .strcpy (xformat
29e20 2c 20 22 53 50 41 54 49 41 4c 49 54 45 22 29 3b  , "SPATIALITE");
29e30 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
29e40 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
29e50 65 0a 09 20 20 20 20 20 20 28 22 52 65 63 6f 76  e..      ("Recov
29e60 65 72 46 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c  erFDOGeometryCol
29e70 75 6d 6e 28 29 20 65 72 72 6f 72 3a 20 61 72 67  umn() error: arg
29e80 75 6d 65 6e 74 20 36 20 5b 67 65 6f 6d 65 74 72  ument 6 [geometr
29e90 79 5f 66 6f 72 6d 61 74 5d 20 68 61 73 20 74 6f  y_format] has to
29ea0 20 62 65 20 6f 6e 65 20 6f 66 3a 20 57 4b 54 2c   be one of: WKT,
29eb0 57 4b 42 2c 46 47 46 5c 6e 22 29 3b 0a 09 20 20  WKB,FGF\n");..  
29ec0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
29ed0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
29ee0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
29ef0 20 20 7d 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20    }./* checking 
29f00 69 66 20 74 68 65 20 74 61 62 6c 65 20 65 78 69  if the table exi
29f10 73 74 73 20 2a 2f 0a 20 20 20 20 73 71 6c 5f 73  sts */.    sql_s
29f20 74 61 74 65 6d 65 6e 74 20 3d 20 73 71 6c 69 74  tatement = sqlit
29f30 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 53 45 4c  e3_mprintf ("SEL
29f40 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
29f50 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 09 09  lite_master "...
29f60 09 09 20 20 20 20 20 22 57 48 45 52 45 20 74 79  ..     "WHERE ty
29f70 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44  pe = 'table' AND
29f80 20 55 70 70 65 72 28 6e 61 6d 65 29 20 3d 20 55   Upper(name) = U
29f90 70 70 65 72 28 25 51 29 22 2c 0a 09 09 09 09 20  pper(%Q)",..... 
29fa0 20 20 20 20 74 61 62 6c 65 29 3b 0a 20 20 20 20      table);.    
29fb0 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65  ret = sqlite3_ge
29fc0 74 5f 74 61 62 6c 65 20 28 73 71 6c 69 74 65 2c  t_table (sqlite,
29fd0 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20   sql_statement, 
29fe0 26 72 65 73 75 6c 74 73 2c 20 26 72 6f 77 73 2c  &results, &rows,
29ff0 20 26 63 6f 6c 75 6d 6e 73 2c 0a 09 09 09 20 20   &columns,....  
2a000 20 20 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20     &errMsg);.   
2a010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73   sqlite3_free (s
2a020 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ql_statement);. 
2a030 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51     if (ret != SQ
2a040 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b  LITE_OK).      {
2a050 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65  ..  spatialite_e
2a060 20 28 22 52 65 63 6f 76 65 72 46 44 4f 47 65 6f   ("RecoverFDOGeo
2a070 6d 65 74 72 79 43 6f 6c 75 6d 6e 3a 20 5c 22 25  metryColumn: \"%
2a080 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b  s\"\n", errMsg);
2a090 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
2a0a0 20 28 65 72 72 4d 73 67 29 3b 0a 09 20 20 72 65   (errMsg);..  re
2a0b0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
2a0c0 20 20 6f 6b 5f 74 62 6c 20 3d 20 30 3b 0a 20 20    ok_tbl = 0;.  
2a0d0 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20    for (i = 1; i 
2a0e0 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 6f  <= rows; i++)..o
2a0f0 6b 5f 74 62 6c 20 3d 20 31 3b 0a 20 20 20 20 73  k_tbl = 1;.    s
2a100 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
2a110 65 20 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 20  e (results);.   
2a120 20 69 66 20 28 21 6f 6b 5f 74 62 6c 29 0a 20 20   if (!ok_tbl).  
2a130 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
2a140 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 52  ite_e..      ("R
2a150 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d 65 74 72  ecoverFDOGeometr
2a160 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72 3a  yColumn() error:
2a170 20 74 61 62 6c 65 20 27 25 73 27 20 64 6f 65 73   table '%s' does
2a180 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 2c 0a 09   not exist\n",..
2a190 20 20 20 20 20 20 20 74 61 62 6c 65 29 3b 0a 09         table);..
2a1a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2a1b0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
2a1c0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
2a1d0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
2a1e0 65 63 6f 76 65 72 46 44 4f 47 65 6f 6d 43 6f 6c  ecoverFDOGeomCol
2a1f0 75 6d 6e 0a 09 28 73 71 6c 69 74 65 2c 20 28 63  umn..(sqlite, (c
2a200 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2a210 61 72 20 2a 29 20 74 61 62 6c 65 2c 0a 09 20 28  ar *) table,.. (
2a220 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
2a230 68 61 72 20 2a 29 20 63 6f 6c 75 6d 6e 2c 20 74  har *) column, t
2a240 79 70 65 2c 20 73 72 69 64 29 29 0a 20 20 20 20  ype, srid)).    
2a250 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
2a260 65 5f 65 20 28 22 52 65 63 6f 76 65 72 46 44 4f  e_e ("RecoverFDO
2a270 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
2a280 3a 20 76 61 6c 69 64 61 74 69 6f 6e 20 66 61 69  : validation fai
2a290 6c 65 64 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69  led\n");..  sqli
2a2a0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
2a2b0 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
2a2c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2a2d0 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e      sql_statemen
2a2e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
2a2f0 6e 74 66 20 28 22 49 4e 53 45 52 54 20 49 4e 54  ntf ("INSERT INT
2a300 4f 20 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d  O geometry_colum
2a310 6e 73 20 22 0a 09 09 09 09 20 20 20 20 20 22 28  ns ".....     "(
2a320 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 2c 20 66 5f  f_table_name, f_
2a330 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 2c  geometry_column,
2a340 20 67 65 6f 6d 65 74 72 79 5f 74 79 70 65 2c 20   geometry_type, 
2a350 22 0a 09 09 09 09 20 20 20 20 20 22 63 6f 6f 72  ".....     "coor
2a360 64 5f 64 69 6d 65 6e 73 69 6f 6e 2c 20 73 72 69  d_dimension, sri
2a370 64 2c 20 67 65 6f 6d 65 74 72 79 5f 66 6f 72 6d  d, geometry_form
2a380 61 74 29 20 56 41 4c 55 45 53 20 28 25 51 2c 20  at) VALUES (%Q, 
2a390 25 51 2c 20 25 64 2c 20 25 64 2c 20 25 64 2c 20  %Q, %d, %d, %d, 
2a3a0 25 51 29 22 2c 0a 09 09 09 09 20 20 20 20 20 74  %Q)",.....     t
2a3b0 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 74 79  able, column, ty
2a3c0 70 65 2c 20 64 69 6d 65 6e 73 69 6f 6e 2c 0a 09  pe, dimension,..
2a3d0 09 09 09 20 20 20 20 20 28 73 72 69 64 20 3c 3d  ...     (srid <=
2a3e0 20 30 29 20 3f 20 2d 31 20 3a 20 73 72 69 64 2c   0) ? -1 : srid,
2a3f0 20 78 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 72   xformat);.    r
2a400 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
2a410 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73  c (sqlite, sql_s
2a420 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20  tatement, NULL, 
2a430 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a  NULL, &errMsg);.
2a440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a450 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
2a460 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
2a470 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74   SQLITE_OK)..got
2a480 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 73 71 6c  o error;.    sql
2a490 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
2a4a0 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
2a4b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 65 72 72 6f    return;.  erro
2a4c0 72 3a 0a 20 20 20 20 73 70 61 74 69 61 6c 69 74  r:.    spatialit
2a4d0 65 5f 65 20 28 22 52 65 63 6f 76 65 72 46 44 4f  e_e ("RecoverFDO
2a4e0 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 28 29  GeometryColumn()
2a4f0 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e   error: \"%s\"\n
2a500 22 2c 20 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  ", errMsg);.    
2a510 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72  sqlite3_free (er
2a520 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
2a530 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
2a540 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20  ontext, 0);.    
2a550 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
2a560 63 20 76 6f 69 64 0a 66 6e 63 74 5f 44 69 73 63  c void.fnct_Disc
2a570 61 72 64 46 44 4f 47 65 6f 6d 65 74 72 79 43 6f  ardFDOGeometryCo
2a580 6c 75 6d 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f  lumn (sqlite3_co
2a590 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
2a5a0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20   int argc,....  
2a5b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
2a5c0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
2a5d0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
2a5e0 20 44 69 73 63 61 72 64 46 44 4f 47 65 6f 6d 65   DiscardFDOGeome
2a5f0 74 72 79 43 6f 6c 75 6d 6e 28 74 61 62 6c 65 2c  tryColumn(table,
2a600 20 63 6f 6c 75 6d 6e 29 0a 2f 0a 2f 20 72 65 6d   column)././ rem
2a610 6f 76 65 73 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  oves TABLE.COLUM
2a620 4e 20 66 72 6f 6d 20 74 68 65 20 53 70 61 74 69  N from the Spati
2a630 61 6c 20 4d 65 74 61 44 61 74 61 0a 2f 20 72 65  al MetaData./ re
2a640 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
2a650 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
2a660 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  e.*/.    const u
2a670 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 61  nsigned char *ta
2a680 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ble;.    const u
2a690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 6f  nsigned char *co
2a6a0 6c 75 6d 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a  lumn;.    char *
2a6b0 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a 20  sql_statement;. 
2a6c0 20 20 20 63 68 61 72 20 2a 65 72 72 4d 73 67 20     char *errMsg 
2a6d0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
2a6e0 72 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ret;.    sqlite3
2a6f0 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
2a700 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
2a710 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
2a720 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
2a730 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
2a740 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
2a750 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
2a760 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
2a770 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
2a780 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
2a790 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22  lite_e..      ("
2a7a0 44 69 73 63 61 72 64 46 44 4f 47 65 6f 6d 65 74  DiscardFDOGeomet
2a7b0 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72  ryColumn() error
2a7c0 3a 20 61 72 67 75 6d 65 6e 74 20 31 20 5b 74 61  : argument 1 [ta
2a7d0 62 6c 65 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74  ble_name] is not
2a7e0 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74   of the String t
2a7f0 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69  ype\n");..  sqli
2a800 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
2a810 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
2a820 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2a830 20 20 20 20 74 61 62 6c 65 20 3d 20 73 71 6c 69      table = sqli
2a840 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
2a850 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
2a860 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
2a870 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
2a880 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
2a890 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
2a8a0 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22  lite_e..      ("
2a8b0 44 69 73 63 61 72 64 46 44 4f 47 65 6f 6d 65 74  DiscardFDOGeomet
2a8c0 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72 6f 72  ryColumn() error
2a8d0 3a 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 63 6f  : argument 2 [co
2a8e0 6c 75 6d 6e 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f  lumn_name] is no
2a8f0 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20  t of the String 
2a900 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  type\n");..  sql
2a910 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
2a920 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
2a930 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
2a940 0a 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 73 71  .    column = sq
2a950 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2a960 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
2a970 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20 3d 0a  sql_statement =.
2a980 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  .sqlite3_mprintf
2a990 0a 09 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ..("DELETE FROM 
2a9a0 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73  geometry_columns
2a9b0 20 57 48 45 52 45 20 55 70 70 65 72 28 66 5f 74   WHERE Upper(f_t
2a9c0 61 62 6c 65 5f 6e 61 6d 65 29 20 3d 20 22 0a 09  able_name) = "..
2a9d0 20 22 55 70 70 65 72 28 25 51 29 20 41 4e 44 20   "Upper(%Q) AND 
2a9e0 55 70 70 65 72 28 66 5f 67 65 6f 6d 65 74 72 79  Upper(f_geometry
2a9f0 5f 63 6f 6c 75 6d 6e 29 20 3d 20 55 70 70 65 72  _column) = Upper
2aa00 28 25 51 29 22 2c 20 74 61 62 6c 65 2c 20 63 6f  (%Q)", table, co
2aa10 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 74 20 3d  lumn);.    ret =
2aa20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73   sqlite3_exec (s
2aa30 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74 65  qlite, sql_state
2aa40 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ment, NULL, NULL
2aa50 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  , &errMsg);.    
2aa60 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
2aa70 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  l_statement);.  
2aa80 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
2aa90 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72  ITE_OK)..goto er
2aaa0 72 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ror;.    sqlite3
2aab0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
2aac0 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 72 65  text, 1);.    re
2aad0 74 75 72 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20  turn;.  error:. 
2aae0 20 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20     spatialite_e 
2aaf0 28 22 44 69 73 63 61 72 64 46 44 4f 47 65 6f 6d  ("DiscardFDOGeom
2ab00 65 74 72 79 43 6f 6c 75 6d 6e 28 29 20 65 72 72  etryColumn() err
2ab10 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 65  or: \"%s\"\n", e
2ab20 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
2ab30 74 65 33 5f 66 72 65 65 20 28 65 72 72 4d 73 67  te3_free (errMsg
2ab40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2ab50 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
2ab60 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  xt, 0);.    retu
2ab70 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rn;.}..static in
2ab80 74 0a 65 76 61 6c 5f 72 74 72 65 65 5f 65 6e 74  t.eval_rtree_ent
2ab90 72 79 20 28 69 6e 74 20 6f 6b 5f 67 65 6f 6d 2c  ry (int ok_geom,
2aba0 20 64 6f 75 62 6c 65 20 67 65 6f 6d 5f 76 61 6c   double geom_val
2abb0 75 65 2c 20 69 6e 74 20 6f 6b 5f 72 74 72 65 65  ue, int ok_rtree
2abc0 2c 0a 09 09 20 20 64 6f 75 62 6c 65 20 72 74 72  ,...  double rtr
2abd0 65 65 5f 76 61 6c 75 65 29 0a 7b 0a 2f 2a 20 65  ee_value).{./* e
2abe0 76 61 6c 75 61 74 69 6e 67 20 67 65 6f 6d 2d 63  valuating geom-c
2abf0 6f 6f 72 64 20 61 6e 64 20 72 74 72 65 65 2d 63  oord and rtree-c
2ac00 6f 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  oord */.    if (
2ac10 21 6f 6b 5f 67 65 6f 6d 20 26 26 20 21 6f 6b 5f  !ok_geom && !ok_
2ac20 72 74 72 65 65 29 0a 09 72 65 74 75 72 6e 20 31  rtree)..return 1
2ac30 3b 0a 20 20 20 20 69 66 20 28 6f 6b 5f 67 65 6f  ;.    if (ok_geo
2ac40 6d 20 26 26 20 6f 6b 5f 72 74 72 65 65 29 0a 20  m && ok_rtree). 
2ac50 20 20 20 20 20 7b 0a 09 20 20 66 6c 6f 61 74 20       {..  float 
2ac60 67 20 3d 20 28 66 6c 6f 61 74 29 20 67 65 6f 6d  g = (float) geom
2ac70 5f 76 61 6c 75 65 3b 0a 09 20 20 66 6c 6f 61 74  _value;..  float
2ac80 20 72 20 3d 20 28 66 6c 6f 61 74 29 20 72 74 72   r = (float) rtr
2ac90 65 65 5f 76 61 6c 75 65 3b 0a 09 20 20 64 6f 75  ee_value;..  dou
2aca0 62 6c 65 20 74 69 63 20 3d 20 66 61 62 73 20 28  ble tic = fabs (
2acb0 67 65 6f 6d 5f 76 61 6c 75 65 20 2d 20 72 29 20  geom_value - r) 
2acc0 2a 20 32 2e 30 3b 0a 09 20 20 66 6c 6f 61 74 20  * 2.0;..  float 
2acd0 64 69 66 66 20 3d 20 67 20 2d 20 72 3b 0a 09 20  diff = g - r;.. 
2ace0 20 69 66 20 28 64 69 66 66 20 3e 3d 20 31 2e 35   if (diff >= 1.5
2acf0 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20  )..      return 
2ad00 30 3b 0a 09 20 20 69 66 20 28 64 69 66 66 20 3e  0;..  if (diff >
2ad10 20 74 69 63 29 0a 09 20 20 20 20 20 20 72 65 74   tic)..      ret
2ad20 75 72 6e 20 30 3b 0a 09 20 20 72 65 74 75 72 6e  urn 0;..  return
2ad30 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2ad40 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
2ad50 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 5f 73 70  tic int.check_sp
2ad60 61 74 69 61 6c 5f 69 6e 64 65 78 20 28 73 71 6c  atial_index (sql
2ad70 69 74 65 33 20 2a 20 73 71 6c 69 74 65 2c 20 63  ite3 * sqlite, c
2ad80 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2ad90 61 72 20 2a 74 61 62 6c 65 2c 0a 09 09 20 20 20  ar *table,...   
2ada0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
2adb0 20 63 68 61 72 20 2a 67 65 6f 6d 29 0a 7b 0a 2f   char *geom).{./
2adc0 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  * attempting to 
2add0 63 68 65 63 6b 20 61 6e 20 52 2a 54 72 65 65 20  check an R*Tree 
2ade0 66 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  for consistency 
2adf0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 78 74 61  */.    char *xta
2ae00 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ble = NULL;.    
2ae10 63 68 61 72 20 2a 78 67 65 6f 6d 20 3d 20 4e 55  char *xgeom = NU
2ae20 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 69 64  LL;.    char *id
2ae30 78 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  x_name;.    char
2ae40 20 2a 78 69 64 78 5f 6e 61 6d 65 20 3d 20 4e 55   *xidx_name = NU
2ae50 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c  LL;.    char sql
2ae60 5b 31 30 32 34 5d 3b 0a 20 20 20 20 63 68 61 72  [1024];.    char
2ae70 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b   *sql_statement;
2ae80 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
2ae90 20 20 69 6e 74 20 69 73 5f 64 65 66 69 6e 65 64    int is_defined
2aea0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2aeb0 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b 0a 20 20  3_stmt *stmt;.  
2aec0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2aed0 63 6f 75 6e 74 5f 67 65 6f 6d 20 3d 20 30 3b 0a  count_geom = 0;.
2aee0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2aef0 34 20 63 6f 75 6e 74 5f 72 74 72 65 65 20 3d 20  4 count_rtree = 
2af00 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  0;.    sqlite3_i
2af10 6e 74 36 34 20 63 6f 75 6e 74 5f 72 65 76 20 3d  nt64 count_rev =
2af20 20 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 67   0;.    double g
2af30 5f 78 6d 69 6e 20 3d 20 44 42 4c 5f 4d 41 58 3b  _xmin = DBL_MAX;
2af40 0a 20 20 20 20 64 6f 75 62 6c 65 20 67 5f 79 6d  .    double g_ym
2af50 69 6e 20 3d 20 44 42 4c 5f 4d 41 58 3b 0a 20 20  in = DBL_MAX;.  
2af60 20 20 64 6f 75 62 6c 65 20 67 5f 78 6d 61 78 20    double g_xmax 
2af70 3d 20 30 2e 30 20 2d 20 44 42 4c 5f 4d 41 58 3b  = 0.0 - DBL_MAX;
2af80 0a 20 20 20 20 64 6f 75 62 6c 65 20 67 5f 79 6d  .    double g_ym
2af90 61 78 20 3d 20 30 2e 30 20 2d 20 44 42 4c 5f 4d  ax = 0.0 - DBL_M
2afa0 41 58 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 67  AX;.    int ok_g
2afb0 5f 78 6d 69 6e 3b 0a 20 20 20 20 69 6e 74 20 6f  _xmin;.    int o
2afc0 6b 5f 67 5f 79 6d 69 6e 3b 0a 20 20 20 20 69 6e  k_g_ymin;.    in
2afd0 74 20 6f 6b 5f 67 5f 78 6d 61 78 3b 0a 20 20 20  t ok_g_xmax;.   
2afe0 20 69 6e 74 20 6f 6b 5f 67 5f 79 6d 61 78 3b 0a   int ok_g_ymax;.
2aff0 20 20 20 20 64 6f 75 62 6c 65 20 69 5f 78 6d 69      double i_xmi
2b000 6e 20 3d 20 44 42 4c 5f 4d 41 58 3b 0a 20 20 20  n = DBL_MAX;.   
2b010 20 64 6f 75 62 6c 65 20 69 5f 79 6d 69 6e 20 3d   double i_ymin =
2b020 20 44 42 4c 5f 4d 41 58 3b 0a 20 20 20 20 64 6f   DBL_MAX;.    do
2b030 75 62 6c 65 20 69 5f 78 6d 61 78 20 3d 20 30 2e  uble i_xmax = 0.
2b040 30 20 2d 20 44 42 4c 5f 4d 41 58 3b 0a 20 20 20  0 - DBL_MAX;.   
2b050 20 64 6f 75 62 6c 65 20 69 5f 79 6d 61 78 20 3d   double i_ymax =
2b060 20 30 2e 30 20 2d 20 44 42 4c 5f 4d 41 58 3b 0a   0.0 - DBL_MAX;.
2b070 20 20 20 20 69 6e 74 20 6f 6b 5f 69 5f 78 6d 69      int ok_i_xmi
2b080 6e 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 69 5f  n;.    int ok_i_
2b090 79 6d 69 6e 3b 0a 20 20 20 20 69 6e 74 20 6f 6b  ymin;.    int ok
2b0a0 5f 69 5f 78 6d 61 78 3b 0a 20 20 20 20 69 6e 74  _i_xmax;.    int
2b0b0 20 6f 6b 5f 69 5f 79 6d 61 78 3b 0a 20 20 20 20   ok_i_ymax;.    
2b0c0 69 6e 74 20 72 6f 77 69 64 5f 63 6f 6c 75 6d 6e  int rowid_column
2b0d0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 77 69   = 0;.    int wi
2b0e0 74 68 6f 75 74 5f 72 6f 77 69 64 20 3d 20 30 3b  thout_rowid = 0;
2b0f0 0a 0a 20 20 20 20 69 66 20 28 69 73 5f 77 69 74  ..    if (is_wit
2b100 68 6f 75 74 5f 72 6f 77 69 64 5f 74 61 62 6c 65  hout_rowid_table
2b110 20 28 73 71 6c 69 74 65 2c 20 28 63 68 61 72 20   (sqlite, (char 
2b120 2a 29 20 74 61 62 6c 65 29 29 0a 20 20 20 20 20  *) table)).     
2b130 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
2b140 5f 65 0a 09 20 20 20 20 20 20 28 22 63 68 65 63  _e..      ("chec
2b150 6b 5f 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 3a  k_spatial_index:
2b160 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73   table \"%s\" is
2b170 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5c 6e   WITHOUT ROWID\n
2b180 22 2c 20 74 61 62 6c 65 29 3b 0a 09 20 20 77 69  ", table);..  wi
2b190 74 68 6f 75 74 5f 72 6f 77 69 64 20 3d 20 31 3b  thout_rowid = 1;
2b1a0 0a 09 20 20 67 6f 74 6f 20 65 72 72 5f 6c 61 62  ..  goto err_lab
2b1b0 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  el;.      }../* 
2b1c0 63 68 65 63 6b 69 6e 67 20 69 66 20 74 68 65 20  checking if the 
2b1d0 52 2a 54 72 65 65 20 53 70 61 74 69 61 6c 20 49  R*Tree Spatial I
2b1e0 6e 64 65 78 20 69 73 20 64 65 66 69 6e 65 64 20  ndex is defined 
2b1f0 2a 2f 0a 20 20 20 20 73 71 6c 5f 73 74 61 74 65  */.    sql_state
2b200 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ment = sqlite3_m
2b210 70 72 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20  printf ("SELECT 
2b220 43 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 67 65  Count(*) FROM ge
2b230 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 22  ometry_columns "
2b240 0a 09 09 09 09 20 20 20 20 20 22 57 48 45 52 45  .....     "WHERE
2b250 20 55 70 70 65 72 28 66 5f 74 61 62 6c 65 5f 6e   Upper(f_table_n
2b260 61 6d 65 29 20 3d 20 55 70 70 65 72 28 25 51 29  ame) = Upper(%Q)
2b270 20 22 0a 09 09 09 09 20 20 20 20 20 22 41 4e 44   ".....     "AND
2b280 20 55 70 70 65 72 28 66 5f 67 65 6f 6d 65 74 72   Upper(f_geometr
2b290 79 5f 63 6f 6c 75 6d 6e 29 20 3d 20 55 70 70 65  y_column) = Uppe
2b2a0 72 28 25 51 29 20 41 4e 44 20 73 70 61 74 69 61  r(%Q) AND spatia
2b2b0 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65 64 20  l_index_enabled 
2b2c0 3d 20 31 22 2c 0a 09 09 09 09 20 20 20 20 20 74  = 1",.....     t
2b2d0 61 62 6c 65 2c 20 67 65 6f 6d 29 3b 0a 20 20 20  able, geom);.   
2b2e0 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 70   ret = sqlite3_p
2b2f0 72 65 70 61 72 65 5f 76 32 20 28 73 71 6c 69 74  repare_v2 (sqlit
2b300 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e, sql_statement
2b310 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 5f 73 74  , strlen (sql_st
2b320 61 74 65 6d 65 6e 74 29 2c 0a 09 09 09 20 20 20  atement),....   
2b330 20 20 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b     &stmt, NULL);
2b340 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b350 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e (sql_statement
2b360 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21  );.    if (ret !
2b370 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  = SQLITE_OK).   
2b380 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
2b390 74 65 5f 65 20 28 22 43 68 65 63 6b 53 70 61 74  te_e ("CheckSpat
2b3a0 69 61 6c 49 6e 64 65 78 20 53 51 4c 20 65 72 72  ialIndex SQL err
2b3b0 6f 72 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71  or: %s\n",....sq
2b3c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71  lite3_errmsg (sq
2b3d0 6c 69 74 65 29 29 3b 0a 09 20 20 67 6f 74 6f 20  lite));..  goto 
2b3e0 65 72 72 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20  err_label;.     
2b3f0 20 7d 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29   }.    while (1)
2b400 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65 74 20  .      {..  ret 
2b410 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28  = sqlite3_step (
2b420 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65  stmt);..  if (re
2b430 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  t == SQLITE_DONE
2b440 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  )..      break;.
2b450 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51  .  if (ret == SQ
2b460 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 20  LITE_ROW)..     
2b470 20 69 73 5f 64 65 66 69 6e 65 64 20 3d 20 73 71   is_defined = sq
2b480 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2b490 20 28 73 74 6d 74 2c 20 30 29 3b 0a 09 20 20 65   (stmt, 0);..  e
2b4a0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  lse..    {...spa
2b4b0 74 69 61 6c 69 74 65 5f 65 20 28 22 73 71 6c 69  tialite_e ("sqli
2b4c0 74 65 33 5f 73 74 65 70 28 29 20 65 72 72 6f 72  te3_step() error
2b4d0 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 20 20 20 20  : %s\n",....    
2b4e0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
2b4f0 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 09 73 71   (sqlite));...sq
2b500 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28  lite3_finalize (
2b510 73 74 6d 74 29 3b 0a 09 09 67 6f 74 6f 20 65 72  stmt);...goto er
2b520 72 5f 6c 61 62 65 6c 3b 0a 09 20 20 20 20 7d 0a  r_label;..    }.
2b530 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69        }.    sqli
2b540 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74  te3_finalize (st
2b550 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 21 69 73  mt);.    if (!is
2b560 5f 64 65 66 69 6e 65 64 29 0a 09 67 6f 74 6f 20  _defined)..goto 
2b570 65 72 72 5f 6c 61 62 65 6c 3b 0a 0a 20 20 20 20  err_label;..    
2b580 78 67 65 6f 6d 20 3d 20 67 61 69 61 44 6f 75 62  xgeom = gaiaDoub
2b590 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 28 63 68  leQuotedSql ((ch
2b5a0 61 72 20 2a 29 20 67 65 6f 6d 29 3b 0a 20 20 20  ar *) geom);.   
2b5b0 20 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44 6f   xtable = gaiaDo
2b5c0 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 28  ubleQuotedSql ((
2b5d0 63 68 61 72 20 2a 29 20 74 61 62 6c 65 29 3b 0a  char *) table);.
2b5e0 20 20 20 20 69 64 78 5f 6e 61 6d 65 20 3d 20 73      idx_name = s
2b5f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
2b600 22 69 64 78 5f 25 73 5f 25 73 22 2c 20 74 61 62  "idx_%s_%s", tab
2b610 6c 65 2c 20 67 65 6f 6d 29 3b 0a 20 20 20 20 78  le, geom);.    x
2b620 69 64 78 5f 6e 61 6d 65 20 3d 20 67 61 69 61 44  idx_name = gaiaD
2b630 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28  oubleQuotedSql (
2b640 69 64 78 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 73  idx_name);.    s
2b650 71 6c 69 74 65 33 5f 66 72 65 65 20 28 69 64 78  qlite3_free (idx
2b660 5f 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 69 66 20  _name);..    if 
2b670 28 21 76 61 6c 69 64 61 74 65 52 6f 77 69 64 20  (!validateRowid 
2b680 28 73 71 6c 69 74 65 2c 20 28 63 6f 6e 73 74 20  (sqlite, (const 
2b690 63 68 61 72 20 2a 29 20 74 61 62 6c 65 29 29 0a  char *) table)).
2b6a0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 61 20        {..  /* a 
2b6b0 70 68 79 73 69 63 61 6c 20 63 6f 6c 75 6d 6e 20  physical column 
2b6c0 6e 61 6d 65 64 20 22 72 6f 77 69 64 22 20 73 68  named "rowid" sh
2b6d0 61 64 6f 77 73 20 74 68 65 20 72 65 61 6c 20 52  adows the real R
2b6e0 4f 57 49 44 20 2a 2f 0a 09 20 20 72 6f 77 69 64  OWID */..  rowid
2b6f0 5f 63 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 09 20 20  _column = 1;..  
2b700 67 6f 74 6f 20 65 72 72 5f 6c 61 62 65 6c 3b 0a  goto err_label;.
2b710 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 6f 75 6e        }../* coun
2b720 74 69 6e 67 20 68 6f 77 20 6d 61 6e 79 20 47 65  ting how many Ge
2b730 6f 6d 65 74 72 69 65 73 20 61 72 65 20 73 65 74  ometries are set
2b740 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 2d 74   into the main-t
2b750 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 5f  able */.    sql_
2b760 73 74 61 74 65 6d 65 6e 74 20 3d 20 73 71 6c 69  statement = sqli
2b770 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 53 45  te3_mprintf ("SE
2b780 4c 45 43 54 20 43 6f 75 6e 74 28 2a 29 20 46 52  LECT Count(*) FR
2b790 4f 4d 20 5c 22 25 73 5c 22 20 22 0a 09 09 09 09  OM \"%s\" ".....
2b7a0 20 20 20 20 20 22 57 48 45 52 45 20 53 54 5f 47       "WHERE ST_G
2b7b0 65 6f 6d 65 74 72 79 54 79 70 65 28 5c 22 25 73  eometryType(\"%s
2b7c0 5c 22 29 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  \") IS NOT NULL"
2b7d0 2c 0a 09 09 09 09 20 20 20 20 20 78 74 61 62 6c  ,.....     xtabl
2b7e0 65 2c 20 78 67 65 6f 6d 29 3b 0a 20 20 20 20 72  e, xgeom);.    r
2b7f0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  et = sqlite3_pre
2b800 70 61 72 65 5f 76 32 20 28 73 71 6c 69 74 65 2c  pare_v2 (sqlite,
2b810 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20   sql_statement, 
2b820 73 74 72 6c 65 6e 20 28 73 71 6c 5f 73 74 61 74  strlen (sql_stat
2b830 65 6d 65 6e 74 29 2c 0a 09 09 09 20 20 20 20 20  ement),....     
2b840 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20   &stmt, NULL);. 
2b850 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20     sqlite3_free 
2b860 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b  (sql_statement);
2b870 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20  .    if (ret != 
2b880 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20  SQLITE_OK).     
2b890 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
2b8a0 5f 65 20 28 22 43 68 65 63 6b 53 70 61 74 69 61  _e ("CheckSpatia
2b8b0 6c 49 6e 64 65 78 20 53 51 4c 20 65 72 72 6f 72  lIndex SQL error
2b8c0 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69  : %s\n",....sqli
2b8d0 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69  te3_errmsg (sqli
2b8e0 74 65 29 29 3b 0a 09 20 20 67 6f 74 6f 20 65 72  te));..  goto er
2b8f0 72 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 7d  r_label;.      }
2b900 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20  .    while (1). 
2b910 20 20 20 20 20 7b 0a 09 20 20 72 65 74 20 3d 20       {..  ret = 
2b920 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74  sqlite3_step (st
2b930 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20  mt);..  if (ret 
2b940 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a  == SQLITE_DONE).
2b950 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20  .      break;.. 
2b960 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49   if (ret == SQLI
2b970 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 20 20 63  TE_ROW)..      c
2b980 6f 75 6e 74 5f 67 65 6f 6d 20 3d 20 73 71 6c 69  ount_geom = sqli
2b990 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
2b9a0 20 28 73 74 6d 74 2c 20 30 29 3b 0a 09 20 20 65   (stmt, 0);..  e
2b9b0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  lse..    {...spa
2b9c0 74 69 61 6c 69 74 65 5f 65 20 28 22 73 71 6c 69  tialite_e ("sqli
2b9d0 74 65 33 5f 73 74 65 70 28 29 20 65 72 72 6f 72  te3_step() error
2b9e0 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 20 20 20 20  : %s\n",....    
2b9f0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
2ba00 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 09 73 71   (sqlite));...sq
2ba10 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28  lite3_finalize (
2ba20 73 74 6d 74 29 3b 0a 09 09 67 6f 74 6f 20 65 72  stmt);...goto er
2ba30 72 5f 6c 61 62 65 6c 3b 0a 09 20 20 20 20 7d 0a  r_label;..    }.
2ba40 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69        }.    sqli
2ba50 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74  te3_finalize (st
2ba60 6d 74 29 3b 0a 0a 2f 2a 20 63 6f 75 6e 74 69 6e  mt);../* countin
2ba70 67 20 68 6f 77 20 6d 61 6e 79 20 52 2a 54 72 65  g how many R*Tre
2ba80 65 20 65 6e 74 72 69 65 73 20 61 72 65 20 64 65  e entries are de
2ba90 66 69 6e 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  fined */.    sql
2baa0 5f 73 74 61 74 65 6d 65 6e 74 20 3d 20 73 71 6c  _statement = sql
2bab0 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 53  ite3_mprintf ("S
2bac0 45 4c 45 43 54 20 43 6f 75 6e 74 28 2a 29 20 46  ELECT Count(*) F
2bad0 52 4f 4d 20 5c 22 25 73 5c 22 22 2c 20 78 69 64  ROM \"%s\"", xid
2bae0 78 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  x_name);.    ret
2baf0 20 3d 0a 09 73 71 6c 69 74 65 33 5f 70 72 65 70   =..sqlite3_prep
2bb00 61 72 65 5f 76 32 20 28 73 71 6c 69 74 65 2c 20  are_v2 (sqlite, 
2bb10 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 73  sql_statement, s
2bb20 74 72 6c 65 6e 20 28 73 71 6c 5f 73 74 61 74 65  trlen (sql_state
2bb30 6d 65 6e 74 29 2c 0a 09 09 09 20 20 20 20 26 73  ment),....    &s
2bb40 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tmt, NULL);.    
2bb50 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
2bb60 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  l_statement);.  
2bb70 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
2bb80 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a  ITE_OK).      {.
2bb90 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20  .  spatialite_e 
2bba0 28 22 43 68 65 63 6b 53 70 61 74 69 61 6c 49 6e  ("CheckSpatialIn
2bbb0 64 65 78 20 53 51 4c 20 65 72 72 6f 72 3a 20 25  dex SQL error: %
2bbc0 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 74 65 33  s\n",....sqlite3
2bbd0 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29  _errmsg (sqlite)
2bbe0 29 3b 0a 09 20 20 67 6f 74 6f 20 65 72 72 5f 6c  );..  goto err_l
2bbf0 61 62 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  abel;.      }.  
2bc00 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20    while (1).    
2bc10 20 20 7b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c    {..  ret = sql
2bc20 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29  ite3_step (stmt)
2bc30 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20  ;..  if (ret == 
2bc40 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a 09 20 20  SQLITE_DONE)..  
2bc50 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 69 66      break;..  if
2bc60 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f   (ret == SQLITE_
2bc70 52 4f 57 29 0a 09 20 20 20 20 20 20 63 6f 75 6e  ROW)..      coun
2bc80 74 5f 72 74 72 65 65 20 3d 20 73 71 6c 69 74 65  t_rtree = sqlite
2bc90 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28  3_column_int64 (
2bca0 73 74 6d 74 2c 20 30 29 3b 0a 09 20 20 65 6c 73  stmt, 0);..  els
2bcb0 65 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69  e..    {...spati
2bcc0 61 6c 69 74 65 5f 65 20 28 22 73 71 6c 69 74 65  alite_e ("sqlite
2bcd0 33 5f 73 74 65 70 28 29 20 65 72 72 6f 72 3a 20  3_step() error: 
2bce0 25 73 5c 6e 22 2c 0a 09 09 09 20 20 20 20 20 20  %s\n",....      
2bcf0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28  sqlite3_errmsg (
2bd00 73 71 6c 69 74 65 29 29 3b 0a 09 09 73 71 6c 69  sqlite));...sqli
2bd10 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74  te3_finalize (st
2bd20 6d 74 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 5f  mt);...goto err_
2bd30 6c 61 62 65 6c 3b 0a 09 20 20 20 20 7d 0a 20 20  label;..    }.  
2bd40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2bd50 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74  3_finalize (stmt
2bd60 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 75 6e 74  );.    if (count
2bd70 5f 67 65 6f 6d 20 21 3d 20 63 6f 75 6e 74 5f 72  _geom != count_r
2bd80 74 72 65 65 29 0a 20 20 20 20 20 20 7b 0a 09 20  tree).      {.. 
2bd90 20 2f 2a 20 75 6e 65 78 70 65 63 74 65 64 20 63   /* unexpected c
2bda0 6f 75 6e 74 20 64 69 66 66 65 72 65 6e 63 65 20  ount difference 
2bdb0 2a 2f 0a 09 20 20 67 6f 74 6f 20 6d 69 73 6d 61  */..  goto misma
2bdc0 74 63 68 69 6e 67 5f 7a 65 72 6f 3b 0a 20 20 20  tching_zero;.   
2bdd0 20 20 20 7d 0a 0a 2f 2a 20 6e 6f 77 20 77 65 27     }../* now we'
2bde0 6c 6c 20 63 68 65 63 6b 20 74 68 65 20 52 2a 54  ll check the R*T
2bdf0 72 65 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  ree against the 
2be00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 67 65  corresponding ge
2be10 6f 6d 65 74 72 79 2d 74 61 62 6c 65 20 2a 2f 0a  ometry-table */.
2be20 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e      sql_statemen
2be30 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72  t =..sqlite3_mpr
2be40 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20 4d 62  intf ("SELECT Mb
2be50 72 4d 69 6e 58 28 67 2e 5c 22 25 73 5c 22 29 2c  rMinX(g.\"%s\"),
2be60 20 4d 62 72 4d 69 6e 59 28 67 2e 5c 22 25 73 5c   MbrMinY(g.\"%s\
2be70 22 29 2c 20 22 0a 09 09 09 20 22 4d 62 72 4d 61  "), ".... "MbrMa
2be80 78 58 28 67 2e 5c 22 25 73 5c 22 29 2c 20 4d 62  xX(g.\"%s\"), Mb
2be90 72 4d 61 78 59 28 67 2e 5c 22 25 73 5c 22 29 2c  rMaxY(g.\"%s\"),
2bea0 20 69 2e 78 6d 69 6e 2c 20 69 2e 79 6d 69 6e 2c   i.xmin, i.ymin,
2beb0 20 69 2e 78 6d 61 78 2c 20 69 2e 79 6d 61 78 5c   i.xmax, i.ymax\
2bec0 6e 22 0a 09 09 09 20 22 46 52 4f 4d 20 5c 22 25  n".... "FROM \"%
2bed0 73 5c 22 20 41 53 20 69 5c 6e 4c 45 46 54 20 4a  s\" AS i\nLEFT J
2bee0 4f 49 4e 20 5c 22 25 73 5c 22 20 41 53 20 67 20  OIN \"%s\" AS g 
2bef0 4f 4e 20 28 67 2e 52 4f 57 49 44 20 3d 20 69 2e  ON (g.ROWID = i.
2bf00 70 6b 69 64 29 22 2c 0a 09 09 09 20 78 67 65 6f  pkid)",.... xgeo
2bf10 6d 2c 20 78 67 65 6f 6d 2c 20 78 67 65 6f 6d 2c  m, xgeom, xgeom,
2bf20 20 78 67 65 6f 6d 2c 20 78 69 64 78 5f 6e 61 6d   xgeom, xidx_nam
2bf30 65 2c 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20  e, xtable);.    
2bf40 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 70 72  ret = sqlite3_pr
2bf50 65 70 61 72 65 5f 76 32 20 28 73 71 6c 69 74 65  epare_v2 (sqlite
2bf60 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c  , sql_statement,
2bf70 20 73 74 72 6c 65 6e 20 28 73 71 6c 5f 73 74 61   strlen (sql_sta
2bf80 74 65 6d 65 6e 74 29 2c 0a 09 09 09 20 20 20 20  tement),....    
2bf90 20 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a    &stmt, NULL);.
2bfa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bfb0 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
2bfc0 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
2bfd0 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20   SQLITE_OK).    
2bfe0 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
2bff0 65 5f 65 20 28 22 43 68 65 63 6b 53 70 61 74 69  e_e ("CheckSpati
2c000 61 6c 49 6e 64 65 78 20 53 51 4c 20 65 72 72 6f  alIndex SQL erro
2c010 72 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71 6c  r: %s\n",....sql
2c020 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c  ite3_errmsg (sql
2c030 69 74 65 29 29 3b 0a 09 20 20 67 6f 74 6f 20 65  ite));..  goto e
2c040 72 72 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  rr_label;.      
2c050 7d 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a  }.    while (1).
2c060 20 20 20 20 20 20 7b 0a 09 20 20 72 65 74 20 3d        {..  ret =
2c070 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73   sqlite3_step (s
2c080 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74  tmt);..  if (ret
2c090 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29   == SQLITE_DONE)
2c0a0 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09  ..      break;..
2c0b0 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c    if (ret == SQL
2c0c0 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 7b 0a  ITE_ROW)..    {.
2c0d0 09 09 2f 2a 20 63 68 65 63 6b 69 6e 67 20 61 20  ../* checking a 
2c0e0 72 6f 77 20 2a 2f 0a 09 09 63 6f 75 6e 74 5f 72  row */...count_r
2c0f0 65 76 2b 2b 3b 0a 09 09 6f 6b 5f 67 5f 78 6d 69  ev++;...ok_g_xmi
2c100 6e 20 3d 20 31 3b 0a 09 09 6f 6b 5f 67 5f 79 6d  n = 1;...ok_g_ym
2c110 69 6e 20 3d 20 31 3b 0a 09 09 6f 6b 5f 67 5f 78  in = 1;...ok_g_x
2c120 6d 61 78 20 3d 20 31 3b 0a 09 09 6f 6b 5f 67 5f  max = 1;...ok_g_
2c130 79 6d 61 78 20 3d 20 31 3b 0a 09 09 6f 6b 5f 69  ymax = 1;...ok_i
2c140 5f 78 6d 69 6e 20 3d 20 31 3b 0a 09 09 6f 6b 5f  _xmin = 1;...ok_
2c150 69 5f 79 6d 69 6e 20 3d 20 31 3b 0a 09 09 6f 6b  i_ymin = 1;...ok
2c160 5f 69 5f 78 6d 61 78 20 3d 20 31 3b 0a 09 09 6f  _i_xmax = 1;...o
2c170 6b 5f 69 5f 79 6d 61 78 20 3d 20 31 3b 0a 09 09  k_i_ymax = 1;...
2c180 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c190 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 30  mn_type (stmt, 0
2c1a0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c1b0 29 0a 09 09 20 20 20 20 6f 6b 5f 67 5f 78 6d 69  )...    ok_g_xmi
2c1c0 6e 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  n = 0;...else...
2c1d0 20 20 20 20 67 5f 78 6d 69 6e 20 3d 20 73 71 6c      g_xmin = sql
2c1e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c1f0 6c 65 20 28 73 74 6d 74 2c 20 30 29 3b 0a 09 09  le (stmt, 0);...
2c200 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c210 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 31  mn_type (stmt, 1
2c220 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c230 29 0a 09 09 20 20 20 20 6f 6b 5f 67 5f 79 6d 69  )...    ok_g_ymi
2c240 6e 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  n = 0;...else...
2c250 20 20 20 20 67 5f 79 6d 69 6e 20 3d 20 73 71 6c      g_ymin = sql
2c260 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c270 6c 65 20 28 73 74 6d 74 2c 20 31 29 3b 0a 09 09  le (stmt, 1);...
2c280 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c290 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 32  mn_type (stmt, 2
2c2a0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c2b0 29 0a 09 09 20 20 20 20 6f 6b 5f 67 5f 78 6d 61  )...    ok_g_xma
2c2c0 78 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  x = 0;...else...
2c2d0 20 20 20 20 67 5f 78 6d 61 78 20 3d 20 73 71 6c      g_xmax = sql
2c2e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c2f0 6c 65 20 28 73 74 6d 74 2c 20 32 29 3b 0a 09 09  le (stmt, 2);...
2c300 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c310 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 33  mn_type (stmt, 3
2c320 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c330 29 0a 09 09 20 20 20 20 6f 6b 5f 67 5f 79 6d 61  )...    ok_g_yma
2c340 78 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  x = 0;...else...
2c350 20 20 20 20 67 5f 79 6d 61 78 20 3d 20 73 71 6c      g_ymax = sql
2c360 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c370 6c 65 20 28 73 74 6d 74 2c 20 33 29 3b 0a 09 09  le (stmt, 3);...
2c380 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c390 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 34  mn_type (stmt, 4
2c3a0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c3b0 29 0a 09 09 20 20 20 20 6f 6b 5f 69 5f 78 6d 69  )...    ok_i_xmi
2c3c0 6e 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  n = 0;...else...
2c3d0 20 20 20 20 69 5f 78 6d 69 6e 20 3d 20 73 71 6c      i_xmin = sql
2c3e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c3f0 6c 65 20 28 73 74 6d 74 2c 20 34 29 3b 0a 09 09  le (stmt, 4);...
2c400 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c410 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 35  mn_type (stmt, 5
2c420 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c430 29 0a 09 09 20 20 20 20 6f 6b 5f 69 5f 79 6d 69  )...    ok_i_ymi
2c440 6e 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  n = 0;...else...
2c450 20 20 20 20 69 5f 79 6d 69 6e 20 3d 20 73 71 6c      i_ymin = sql
2c460 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c470 6c 65 20 28 73 74 6d 74 2c 20 35 29 3b 0a 09 09  le (stmt, 5);...
2c480 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c490 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 36  mn_type (stmt, 6
2c4a0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c4b0 29 0a 09 09 20 20 20 20 6f 6b 5f 69 5f 78 6d 61  )...    ok_i_xma
2c4c0 78 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  x = 0;...else...
2c4d0 20 20 20 20 69 5f 78 6d 61 78 20 3d 20 73 71 6c      i_xmax = sql
2c4e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c4f0 6c 65 20 28 73 74 6d 74 2c 20 36 29 3b 0a 09 09  le (stmt, 6);...
2c500 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if (sqlite3_colu
2c510 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 37  mn_type (stmt, 7
2c520 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ) == SQLITE_NULL
2c530 29 0a 09 09 20 20 20 20 6f 6b 5f 69 5f 79 6d 61  )...    ok_i_yma
2c540 78 20 3d 20 30 3b 0a 09 09 65 6c 73 65 0a 09 09  x = 0;...else...
2c550 20 20 20 20 69 5f 79 6d 61 78 20 3d 20 73 71 6c      i_ymax = sql
2c560 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
2c570 6c 65 20 28 73 74 6d 74 2c 20 37 29 3b 0a 09 09  le (stmt, 7);...
2c580 69 66 20 28 65 76 61 6c 5f 72 74 72 65 65 5f 65  if (eval_rtree_e
2c590 6e 74 72 79 20 28 6f 6b 5f 67 5f 78 6d 69 6e 2c  ntry (ok_g_xmin,
2c5a0 20 67 5f 78 6d 69 6e 2c 20 6f 6b 5f 69 5f 78 6d   g_xmin, ok_i_xm
2c5b0 69 6e 2c 20 69 5f 78 6d 69 6e 29 0a 09 09 20 20  in, i_xmin)...  
2c5c0 20 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 67 6f    == 0)...    go
2c5d0 74 6f 20 6d 69 73 6d 61 74 63 68 69 6e 67 3b 0a  to mismatching;.
2c5e0 09 09 69 66 20 28 65 76 61 6c 5f 72 74 72 65 65  ..if (eval_rtree
2c5f0 5f 65 6e 74 72 79 20 28 6f 6b 5f 67 5f 79 6d 69  _entry (ok_g_ymi
2c600 6e 2c 20 67 5f 79 6d 69 6e 2c 20 6f 6b 5f 69 5f  n, g_ymin, ok_i_
2c610 79 6d 69 6e 2c 20 69 5f 79 6d 69 6e 29 0a 09 09  ymin, i_ymin)...
2c620 20 20 20 20 3d 3d 20 30 29 0a 09 09 20 20 20 20      == 0)...    
2c630 67 6f 74 6f 20 6d 69 73 6d 61 74 63 68 69 6e 67  goto mismatching
2c640 3b 0a 09 09 69 66 20 28 65 76 61 6c 5f 72 74 72  ;...if (eval_rtr
2c650 65 65 5f 65 6e 74 72 79 20 28 6f 6b 5f 67 5f 78  ee_entry (ok_g_x
2c660 6d 61 78 2c 20 67 5f 78 6d 61 78 2c 20 6f 6b 5f  max, g_xmax, ok_
2c670 69 5f 78 6d 61 78 2c 20 69 5f 78 6d 61 78 29 0a  i_xmax, i_xmax).
2c680 09 09 20 20 20 20 3d 3d 20 30 29 0a 09 09 20 20  ..    == 0)...  
2c690 20 20 67 6f 74 6f 20 6d 69 73 6d 61 74 63 68 69    goto mismatchi
2c6a0 6e 67 3b 0a 09 09 69 66 20 28 65 76 61 6c 5f 72  ng;...if (eval_r
2c6b0 74 72 65 65 5f 65 6e 74 72 79 20 28 6f 6b 5f 67  tree_entry (ok_g
2c6c0 5f 79 6d 61 78 2c 20 67 5f 79 6d 61 78 2c 20 6f  _ymax, g_ymax, o
2c6d0 6b 5f 69 5f 79 6d 61 78 2c 20 69 5f 79 6d 61 78  k_i_ymax, i_ymax
2c6e0 29 0a 09 09 20 20 20 20 3d 3d 20 30 29 0a 09 09  )...    == 0)...
2c6f0 20 20 20 20 67 6f 74 6f 20 6d 69 73 6d 61 74 63      goto mismatc
2c700 68 69 6e 67 3b 0a 09 20 20 20 20 7d 0a 09 20 20  hing;..    }..  
2c710 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 70  else..    {...sp
2c720 61 74 69 61 6c 69 74 65 5f 65 20 28 22 73 71 6c  atialite_e ("sql
2c730 69 74 65 33 5f 73 74 65 70 28 29 20 65 72 72 6f  ite3_step() erro
2c740 72 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 20 20 20  r: %s\n",....   
2c750 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
2c760 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 09 73  g (sqlite));...s
2c770 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
2c780 28 73 74 6d 74 29 3b 0a 09 09 67 6f 74 6f 20 65  (stmt);...goto e
2c790 72 72 5f 6c 61 62 65 6c 3b 0a 09 20 20 20 20 7d  rr_label;..    }
2c7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  .      }.    sql
2c7b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73  ite3_finalize (s
2c7c0 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  tmt);.    if (co
2c7d0 75 6e 74 5f 67 65 6f 6d 20 21 3d 20 63 6f 75 6e  unt_geom != coun
2c7e0 74 5f 72 65 76 29 0a 09 67 6f 74 6f 20 6d 69 73  t_rev)..goto mis
2c7f0 6d 61 74 63 68 69 6e 67 3b 0a 20 20 20 20 73 74  matching;.    st
2c800 72 63 70 79 20 28 73 71 6c 2c 20 22 43 68 65 63  rcpy (sql, "Chec
2c810 6b 20 53 70 61 74 69 61 6c 49 6e 64 65 78 3a 20  k SpatialIndex: 
2c820 69 73 20 76 61 6c 69 64 22 29 3b 0a 20 20 20 20  is valid");.    
2c830 75 70 64 61 74 65 53 70 61 74 69 61 4c 69 74 65  updateSpatiaLite
2c840 48 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c  History (sqlite,
2c850 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
2c860 74 61 62 6c 65 2c 0a 09 09 09 20 20 20 20 20 28  table,....     (
2c870 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 67 65  const char *) ge
2c880 6f 6d 2c 20 73 71 6c 29 3b 0a 20 20 20 20 66 72  om, sql);.    fr
2c890 65 65 20 28 78 67 65 6f 6d 29 3b 0a 20 20 20 20  ee (xgeom);.    
2c8a0 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b 0a 20  free (xtable);. 
2c8b0 20 20 20 66 72 65 65 20 28 78 69 64 78 5f 6e 61     free (xidx_na
2c8c0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2c8d0 31 3b 0a 20 20 6d 69 73 6d 61 74 63 68 69 6e 67  1;.  mismatching
2c8e0 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  :.    sqlite3_fi
2c8f0 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 20  nalize (stmt);. 
2c900 20 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20     strcpy (sql, 
2c910 22 43 68 65 63 6b 20 53 70 61 74 69 61 6c 49 6e  "Check SpatialIn
2c920 64 65 78 3a 20 49 4e 43 4f 4e 53 49 53 54 45 4e  dex: INCONSISTEN
2c930 43 49 45 53 20 64 65 74 65 63 74 65 64 22 29 3b  CIES detected");
2c940 0a 20 20 20 20 75 70 64 61 74 65 53 70 61 74 69  .    updateSpati
2c950 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73 71  aLiteHistory (sq
2c960 6c 69 74 65 2c 20 28 63 6f 6e 73 74 20 63 68 61  lite, (const cha
2c970 72 20 2a 29 20 74 61 62 6c 65 2c 0a 09 09 09 20  r *) table,.... 
2c980 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20      (const char 
2c990 2a 29 20 67 65 6f 6d 2c 20 73 71 6c 29 3b 0a 20  *) geom, sql);. 
2c9a0 20 6d 69 73 6d 61 74 63 68 69 6e 67 5f 7a 65 72   mismatching_zer
2c9b0 6f 3a 0a 20 20 20 20 69 66 20 28 78 67 65 6f 6d  o:.    if (xgeom
2c9c0 29 0a 09 66 72 65 65 20 28 78 67 65 6f 6d 29 3b  )..free (xgeom);
2c9d0 0a 20 20 20 20 69 66 20 28 78 74 61 62 6c 65 29  .    if (xtable)
2c9e0 0a 09 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b  ..free (xtable);
2c9f0 0a 20 20 20 20 69 66 20 28 78 69 64 78 5f 6e 61  .    if (xidx_na
2ca00 6d 65 29 0a 09 66 72 65 65 20 28 78 69 64 78 5f  me)..free (xidx_
2ca10 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
2ca20 6e 20 30 3b 0a 20 20 65 72 72 5f 6c 61 62 65 6c  n 0;.  err_label
2ca30 3a 0a 20 20 20 20 69 66 20 28 78 67 65 6f 6d 29  :.    if (xgeom)
2ca40 0a 09 66 72 65 65 20 28 78 67 65 6f 6d 29 3b 0a  ..free (xgeom);.
2ca50 20 20 20 20 69 66 20 28 78 74 61 62 6c 65 29 0a      if (xtable).
2ca60 09 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b 0a  .free (xtable);.
2ca70 20 20 20 20 69 66 20 28 78 69 64 78 5f 6e 61 6d      if (xidx_nam
2ca80 65 29 0a 09 66 72 65 65 20 28 78 69 64 78 5f 6e  e)..free (xidx_n
2ca90 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 72 6f  ame);.    if (ro
2caa0 77 69 64 5f 63 6f 6c 75 6d 6e 29 0a 09 72 65 74  wid_column)..ret
2cab0 75 72 6e 20 2d 32 3b 0a 20 20 20 20 69 66 20 28  urn -2;.    if (
2cac0 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 29 0a 09  without_rowid)..
2cad0 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 20 20 72  return -3;.    r
2cae0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
2caf0 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 5f 61 6e  tic int.check_an
2cb00 79 5f 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 20  y_spatial_index 
2cb10 28 73 71 6c 69 74 65 33 20 2a 20 73 71 6c 69 74  (sqlite3 * sqlit
2cb20 65 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69  e).{./* attempti
2cb30 6e 67 20 74 6f 20 63 68 65 63 6b 20 61 6e 79 20  ng to check any 
2cb40 64 65 66 69 6e 65 64 20 52 2a 54 72 65 65 20 66  defined R*Tree f
2cb50 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  or consistency *
2cb60 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
2cb70 67 6e 65 64 20 63 68 61 72 20 2a 74 61 62 6c 65  gned char *table
2cb80 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
2cb90 67 6e 65 64 20 63 68 61 72 20 2a 63 6f 6c 75 6d  gned char *colum
2cba0 6e 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75  n;.    int statu
2cbb0 73 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c 5b  s;.    char sql[
2cbc0 31 30 32 34 5d 3b 0a 20 20 20 20 69 6e 74 20 72  1024];.    int r
2cbd0 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 6e 76 61  et;.    int inva
2cbe0 6c 69 64 5f 72 74 72 65 65 20 3d 20 30 3b 0a 20  lid_rtree = 0;. 
2cbf0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2cc00 2a 73 74 6d 74 3b 0a 0a 2f 2a 20 72 65 74 72 69  *stmt;../* retri
2cc10 65 76 69 6e 67 20 61 6e 79 20 64 65 66 69 6e 65  eving any define
2cc20 64 20 52 2a 54 72 65 65 20 2a 2f 0a 20 20 20 20  d R*Tree */.    
2cc30 73 74 72 63 70 79 20 28 73 71 6c 2c 0a 09 20 20  strcpy (sql,..  
2cc40 20 20 22 53 45 4c 45 43 54 20 66 5f 74 61 62 6c    "SELECT f_tabl
2cc50 65 5f 6e 61 6d 65 2c 20 66 5f 67 65 6f 6d 65 74  e_name, f_geomet
2cc60 72 79 5f 63 6f 6c 75 6d 6e 20 46 52 4f 4d 20 67  ry_column FROM g
2cc70 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20  eometry_columns 
2cc80 22 29 3b 0a 20 20 20 20 73 74 72 63 61 74 20 28  ");.    strcat (
2cc90 73 71 6c 2c 20 22 57 48 45 52 45 20 73 70 61 74  sql, "WHERE spat
2cca0 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65  ial_index_enable
2ccb0 64 20 3d 20 31 22 29 3b 0a 20 20 20 20 72 65 74  d = 1");.    ret
2ccc0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2ccd0 72 65 5f 76 32 20 28 73 71 6c 69 74 65 2c 20 73  re_v2 (sqlite, s
2cce0 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29  ql, strlen (sql)
2ccf0 2c 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a  , &stmt, NULL);.
2cd00 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53      if (ret != S
2cd10 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20  QLITE_OK).      
2cd20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
2cd30 65 20 28 22 43 68 65 63 6b 53 70 61 74 69 61 6c  e ("CheckSpatial
2cd40 49 6e 64 65 78 20 53 51 4c 20 65 72 72 6f 72 3a  Index SQL error:
2cd50 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 74   %s\n",....sqlit
2cd60 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74  e3_errmsg (sqlit
2cd70 65 29 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 2d  e));..  return -
2cd80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77  1;.      }.    w
2cd90 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b  hile (1).      {
2cda0 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65  ..  ret = sqlite
2cdb0 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09  3_step (stmt);..
2cdc0 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c    if (ret == SQL
2cdd0 49 54 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20  ITE_DONE)..     
2cde0 20 62 72 65 61 6b 3b 0a 09 20 20 69 66 20 28 72   break;..  if (r
2cdf0 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  et == SQLITE_ROW
2ce00 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 68  )..    {.../* ch
2ce10 65 63 6b 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  ecking a single 
2ce20 52 2a 54 72 65 65 20 2a 2f 0a 09 09 74 61 62 6c  R*Tree */...tabl
2ce30 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
2ce40 6d 6e 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 30  mn_text (stmt, 0
2ce50 29 3b 0a 09 09 63 6f 6c 75 6d 6e 20 3d 20 73 71  );...column = sq
2ce60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ce70 74 20 28 73 74 6d 74 2c 20 31 29 3b 0a 09 09 73  t (stmt, 1);...s
2ce80 74 61 74 75 73 20 3d 20 63 68 65 63 6b 5f 73 70  tatus = check_sp
2ce90 61 74 69 61 6c 5f 69 6e 64 65 78 20 28 73 71 6c  atial_index (sql
2cea0 69 74 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75  ite, table, colu
2ceb0 6d 6e 29 3b 0a 09 09 69 66 20 28 73 74 61 74 75  mn);...if (statu
2cec0 73 20 3c 20 30 29 0a 09 09 20 20 7b 0a 09 09 20  s < 0)...  {... 
2ced0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
2cee0 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09 09  alize (stmt);...
2cef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 74 61        return sta
2cf00 74 75 73 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20  tus;...  }...if 
2cf10 28 73 74 61 74 75 73 20 3d 3d 20 30 29 0a 09 09  (status == 0)...
2cf20 20 20 20 20 69 6e 76 61 6c 69 64 5f 72 74 72 65      invalid_rtre
2cf30 65 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20  e = 1;..    }.. 
2cf40 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
2cf50 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 73 71  patialite_e ("sq
2cf60 6c 69 74 65 33 5f 73 74 65 70 28 29 20 65 72 72  lite3_step() err
2cf70 6f 72 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 20 20  or: %s\n",....  
2cf80 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
2cf90 73 67 20 28 73 71 6c 69 74 65 29 29 3b 0a 09 09  sg (sqlite));...
2cfa0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2cfb0 20 28 73 74 6d 74 29 3b 0a 09 09 72 65 74 75 72   (stmt);...retur
2cfc0 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 20 20 20  n -1;..    }.   
2cfd0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2cfe0 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29  _finalize (stmt)
2cff0 3b 0a 20 20 20 20 69 66 20 28 69 6e 76 61 6c 69  ;.    if (invali
2d000 64 5f 72 74 72 65 65 29 0a 09 72 65 74 75 72 6e  d_rtree)..return
2d010 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   0;.    return 1
2d020 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2d030 0a 66 6e 63 74 5f 43 68 65 63 6b 53 70 61 74 69  .fnct_CheckSpati
2d040 61 6c 49 6e 64 65 78 20 28 73 71 6c 69 74 65 33  alIndex (sqlite3
2d050 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
2d060 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
2d070 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
2d080 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
2d090 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 68 65   function:./ Che
2d0a0 63 6b 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29  ckSpatialIndex()
2d0b0 0a 2f 20 43 68 65 63 6b 53 70 61 74 69 61 6c 49  ./ CheckSpatialI
2d0c0 6e 64 65 78 28 74 61 62 6c 65 2c 20 63 6f 6c 75  ndex(table, colu
2d0d0 6d 6e 29 0a 2f 0a 2f 20 63 68 65 63 6b 73 20 61  mn)././ checks a
2d0e0 20 53 70 61 74 69 61 6c 49 6e 64 65 78 20 66 6f   SpatialIndex fo
2d0f0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 2c 20 72  r consistency, r
2d100 65 74 75 72 6e 69 6e 67 3a 0a 2f 20 31 20 2d 20  eturning:./ 1 - 
2d110 74 68 65 20 52 2a 54 72 65 65 20 69 73 20 66 75  the R*Tree is fu
2d120 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 0a 2f  lly consistent./
2d130 20 30 20 2d 20 74 68 65 20 52 2a 54 72 65 65 20   0 - the R*Tree 
2d140 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  is inconsistent.
2d150 2f 20 2d 31 20 69 66 20 61 6e 79 20 70 68 79 73  / -1 if any phys
2d160 69 63 61 6c 20 22 52 4f 57 49 44 22 20 63 6f 6c  ical "ROWID" col
2d170 75 6d 6e 20 65 78 69 73 74 20 73 68 61 64 6f 77  umn exist shadow
2d180 69 6e 67 20 74 68 65 20 72 65 61 6c 20 52 4f 57  ing the real ROW
2d190 49 44 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 66 61 69  ID./ NULL on fai
2d1a0 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73  lure.*/.    cons
2d1b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2d1c0 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  *table;.    cons
2d1d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2d1e0 2a 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  *column;.    int
2d1f0 20 73 74 61 74 75 73 3b 0a 20 20 20 20 73 71 6c   status;.    sql
2d200 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
2d210 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2d220 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
2d230 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
2d240 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
2d250 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
2d260 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 30 29    if (argc == 0)
2d270 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6e  .      {..  /* n
2d280 6f 20 61 72 67 75 6d 65 6e 74 73 3a 20 77 65 20  o arguments: we 
2d290 6d 75 73 74 20 63 68 65 63 6b 20 61 6e 79 20 64  must check any d
2d2a0 65 66 69 6e 65 64 20 52 2a 54 72 65 65 20 2a 2f  efined R*Tree */
2d2b0 0a 09 20 20 73 74 61 74 75 73 20 3d 20 63 68 65  ..  status = che
2d2c0 63 6b 5f 61 6e 79 5f 73 70 61 74 69 61 6c 5f 69  ck_any_spatial_i
2d2d0 6e 64 65 78 20 28 73 71 6c 69 74 65 29 3b 0a 09  ndex (sqlite);..
2d2e0 20 20 69 66 20 28 73 74 61 74 75 73 20 3c 20 30    if (status < 0
2d2f0 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 73  )..    {...if (s
2d300 74 61 74 75 73 20 3d 3d 20 2d 32 29 0a 09 09 20  tatus == -2)... 
2d310 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2d320 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
2d330 2d 31 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20  -1);...else...  
2d340 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2d350 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
2d360 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20  ..    }..  else 
2d370 69 66 20 28 73 74 61 74 75 73 20 3e 20 30 29 0a  if (status > 0).
2d380 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2d390 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
2d3a0 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 1);..  else.
2d3b0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2d3c0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
2d3d0 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
2d3e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  n;.      }..    
2d3f0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
2d400 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
2d410 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
2d420 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
2d430 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
2d440 28 22 43 68 65 63 6b 53 70 61 74 69 61 6c 49 6e  ("CheckSpatialIn
2d450 64 65 78 28 29 20 65 72 72 6f 72 3a 20 61 72 67  dex() error: arg
2d460 75 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e  ument 1 [table_n
2d470 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74  ame] is not of t
2d480 68 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e  he String type\n
2d490 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
2d4a0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
2d4b0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
2d4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62  .      }.    tab
2d4d0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
2d4e0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
2d4f0 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
2d500 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
2d510 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
2d520 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
2d530 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
2d540 09 20 20 20 20 20 20 28 22 43 68 65 63 6b 53 70  .      ("CheckSp
2d550 61 74 69 61 6c 49 6e 64 65 78 28 29 20 65 72 72  atialIndex() err
2d560 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 32 20 5b  or: argument 2 [
2d570 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20 69 73 20  column_name] is 
2d580 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e  not of the Strin
2d590 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73  g type\n");..  s
2d5a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
2d5b0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
2d5c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
2d5d0 0a 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 73 71  .    column = sq
2d5e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2d5f0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
2d600 73 74 61 74 75 73 20 3d 20 63 68 65 63 6b 5f 73  status = check_s
2d610 70 61 74 69 61 6c 5f 69 6e 64 65 78 20 28 73 71  patial_index (sq
2d620 6c 69 74 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c  lite, table, col
2d630 75 6d 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74  umn);.    if (st
2d640 61 74 75 73 20 3d 3d 20 2d 32 29 0a 09 73 71 6c  atus == -2)..sql
2d650 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
2d660 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 20  (context, -1);. 
2d670 20 20 20 65 6c 73 65 20 69 66 20 28 73 74 61 74     else if (stat
2d680 75 73 20 3d 3d 20 2d 33 29 0a 09 73 71 6c 69 74  us == -3)..sqlit
2d690 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
2d6a0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20  ontext, -1);.   
2d6b0 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 75 73   else if (status
2d6c0 20 3c 20 30 29 0a 09 73 71 6c 69 74 65 33 5f 72   < 0)..sqlite3_r
2d6d0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
2d6e0 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  ext);.    else i
2d6f0 66 20 28 73 74 61 74 75 73 20 3e 20 30 29 0a 09  f (status > 0)..
2d700 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2d710 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  nt (context, 1);
2d720 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
2d730 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
2d740 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 73  ontext, 0);.}..s
2d750 74 61 74 69 63 20 69 6e 74 0a 72 65 63 6f 76 65  tatic int.recove
2d760 72 5f 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 20  r_spatial_index 
2d770 28 73 71 6c 69 74 65 33 20 2a 20 73 71 6c 69 74  (sqlite3 * sqlit
2d780 65 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  e, const unsigne
2d790 64 20 63 68 61 72 20 2a 74 61 62 6c 65 2c 0a 09  d char *table,..
2d7a0 09 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  .       const un
2d7b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 67 65 6f  signed char *geo
2d7c0 6d 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69  m).{./* attempti
2d7d0 6e 67 20 74 6f 20 72 65 62 75 69 6c 64 20 61 6e  ng to rebuild an
2d7e0 20 52 2a 54 72 65 65 20 2a 2f 0a 20 20 20 20 63   R*Tree */.    c
2d7f0 68 61 72 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65  har *sql_stateme
2d800 6e 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72  nt;.    char *er
2d810 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  rMsg = NULL;.   
2d820 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 68   int ret;.    ch
2d830 61 72 20 2a 69 64 78 5f 6e 61 6d 65 3b 0a 20 20  ar *idx_name;.  
2d840 20 20 63 68 61 72 20 2a 78 69 64 78 5f 6e 61 6d    char *xidx_nam
2d850 65 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c 5b  e;.    char sql[
2d860 31 30 32 34 5d 3b 0a 20 20 20 20 69 6e 74 20 69  1024];.    int i
2d870 73 5f 64 65 66 69 6e 65 64 20 3d 20 30 3b 0a 20  s_defined = 0;. 
2d880 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2d890 2a 73 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 73  *stmt;.    int s
2d8a0 74 61 74 75 73 3b 0a 0a 2f 2a 20 63 68 65 63 6b  tatus;../* check
2d8b0 69 6e 67 20 69 66 20 74 68 65 20 52 2a 54 72 65  ing if the R*Tre
2d8c0 65 20 53 70 61 74 69 61 6c 20 49 6e 64 65 78 20  e Spatial Index 
2d8d0 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
2d8e0 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 20    sql_statement 
2d8f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2d900 66 20 28 22 53 45 4c 45 43 54 20 43 6f 75 6e 74  f ("SELECT Count
2d910 28 2a 29 20 46 52 4f 4d 20 67 65 6f 6d 65 74 72  (*) FROM geometr
2d920 79 5f 63 6f 6c 75 6d 6e 73 20 22 0a 09 09 09 09  y_columns ".....
2d930 20 20 20 20 20 22 57 48 45 52 45 20 55 70 70 65       "WHERE Uppe
2d940 72 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 29 20  r(f_table_name) 
2d950 3d 20 55 70 70 65 72 28 25 51 29 20 22 0a 09 09  = Upper(%Q) "...
2d960 09 09 20 20 20 20 20 22 41 4e 44 20 55 70 70 65  ..     "AND Uppe
2d970 72 28 66 5f 67 65 6f 6d 65 74 72 79 5f 63 6f 6c  r(f_geometry_col
2d980 75 6d 6e 29 20 3d 20 55 70 70 65 72 28 25 51 29  umn) = Upper(%Q)
2d990 20 41 4e 44 20 73 70 61 74 69 61 6c 5f 69 6e 64   AND spatial_ind
2d9a0 65 78 5f 65 6e 61 62 6c 65 64 20 3d 20 31 22 2c  ex_enabled = 1",
2d9b0 0a 09 09 09 09 20 20 20 20 20 74 61 62 6c 65 2c  .....     table,
2d9c0 20 67 65 6f 6d 29 3b 0a 20 20 20 20 72 65 74 20   geom);.    ret 
2d9d0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2d9e0 65 5f 76 32 20 28 73 71 6c 69 74 65 2c 20 73 71  e_v2 (sqlite, sq
2d9f0 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 73 74 72  l_statement, str
2da00 6c 65 6e 20 28 73 71 6c 5f 73 74 61 74 65 6d 65  len (sql_stateme
2da10 6e 74 29 2c 0a 09 09 09 20 20 20 20 20 20 26 73  nt),....      &s
2da20 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tmt, NULL);.    
2da30 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
2da40 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  l_statement);.  
2da50 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
2da60 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a  ITE_OK).      {.
2da70 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20  .  spatialite_e 
2da80 28 22 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c  ("RecoverSpatial
2da90 49 6e 64 65 78 20 53 51 4c 20 65 72 72 6f 72 3a  Index SQL error:
2daa0 20 25 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 74   %s\n",....sqlit
2dab0 65 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74  e3_errmsg (sqlit
2dac0 65 29 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 2d  e));..  return -
2dad0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77  1;.      }.    w
2dae0 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b  hile (1).      {
2daf0 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65  ..  ret = sqlite
2db00 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09  3_step (stmt);..
2db10 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c    if (ret == SQL
2db20 49 54 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20  ITE_DONE)..     
2db30 20 62 72 65 61 6b 3b 0a 09 20 20 69 66 20 28 72   break;..  if (r
2db40 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  et == SQLITE_ROW
2db50 29 0a 09 20 20 20 20 20 20 69 73 5f 64 65 66 69  )..      is_defi
2db60 6e 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ned = sqlite3_co
2db70 6c 75 6d 6e 5f 69 6e 74 20 28 73 74 6d 74 2c 20  lumn_int (stmt, 
2db80 30 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  0);..  else..   
2db90 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f   {...spatialite_
2dba0 65 20 28 22 73 71 6c 69 74 65 33 5f 73 74 65 70  e ("sqlite3_step
2dbb0 28 29 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  () error: %s\n",
2dbc0 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  ....      sqlite
2dbd0 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65  3_errmsg (sqlite
2dbe0 29 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 69  ));...sqlite3_fi
2dbf0 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09  nalize (stmt);..
2dc00 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20  .return -1;..   
2dc10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73   }.      }.    s
2dc20 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
2dc30 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28  (stmt);.    if (
2dc40 21 69 73 5f 64 65 66 69 6e 65 64 29 0a 09 72 65  !is_defined)..re
2dc50 74 75 72 6e 20 2d 31 3b 0a 0a 2f 2a 20 65 72 61  turn -1;../* era
2dc60 73 69 6e 67 20 74 68 65 20 52 2a 54 72 65 65 20  sing the R*Tree 
2dc70 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 64 78  table */.    idx
2dc80 5f 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  _name = sqlite3_
2dc90 6d 70 72 69 6e 74 66 20 28 22 69 64 78 5f 25 73  mprintf ("idx_%s
2dca0 5f 25 73 22 2c 20 74 61 62 6c 65 2c 20 67 65 6f  _%s", table, geo
2dcb0 6d 29 3b 0a 20 20 20 20 78 69 64 78 5f 6e 61 6d  m);.    xidx_nam
2dcc0 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75  e = gaiaDoubleQu
2dcd0 6f 74 65 64 53 71 6c 20 28 69 64 78 5f 6e 61 6d  otedSql (idx_nam
2dce0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2dcf0 66 72 65 65 20 28 69 64 78 5f 6e 61 6d 65 29 3b  free (idx_name);
2dd00 0a 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65  .    sql_stateme
2dd10 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  nt = sqlite3_mpr
2dd20 69 6e 74 66 20 28 22 44 45 4c 45 54 45 20 46 52  intf ("DELETE FR
2dd30 4f 4d 20 5c 22 25 73 5c 22 22 2c 20 78 69 64 78  OM \"%s\"", xidx
2dd40 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 66 72 65 65  _name);.    free
2dd50 20 28 78 69 64 78 5f 6e 61 6d 65 29 3b 0a 20 20   (xidx_name);.  
2dd60 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
2dd70 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71  exec (sqlite, sq
2dd80 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c  l_statement, NUL
2dd90 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67  L, NULL, &errMsg
2dda0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2ddb0 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d 65  ree (sql_stateme
2ddc0 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74  nt);.    if (ret
2ddd0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
2dde0 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 2f 2a 20 70  goto error;./* p
2ddf0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 52 2a  opulating the R*
2de00 54 72 65 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  Tree table from 
2de10 73 63 72 61 74 63 68 20 2a 2f 0a 20 20 20 20 73  scratch */.    s
2de20 74 61 74 75 73 20 3d 20 62 75 69 6c 64 53 70 61  tatus = buildSpa
2de30 74 69 61 6c 49 6e 64 65 78 45 78 20 28 73 71 6c  tialIndexEx (sql
2de40 69 74 65 2c 20 74 61 62 6c 65 2c 20 28 63 6f 6e  ite, table, (con
2de50 73 74 20 63 68 61 72 20 2a 29 20 67 65 6f 6d 29  st char *) geom)
2de60 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 75 73  ;.    if (status
2de70 20 3d 3d 20 30 29 0a 09 3b 0a 20 20 20 20 65 6c   == 0)..;.    el
2de80 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  se.      {..  if
2de90 20 28 73 74 61 74 75 73 20 3d 3d 20 2d 32 29 0a   (status == -2).
2dea0 09 20 20 20 20 7b 0a 09 09 73 74 72 63 70 79 20  .    {...strcpy 
2deb0 28 73 71 6c 2c 0a 09 09 09 22 53 70 61 74 69 61  (sql,...."Spatia
2dec0 6c 49 6e 64 65 78 3a 20 61 20 70 68 79 73 69 63  lIndex: a physic
2ded0 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  al column named 
2dee0 52 4f 57 49 44 20 73 68 61 64 6f 77 73 20 74 68  ROWID shadows th
2def0 65 20 72 65 61 6c 20 52 4f 57 49 44 22 29 3b 0a  e real ROWID");.
2df00 09 09 75 70 64 61 74 65 53 70 61 74 69 61 4c 69  ..updateSpatiaLi
2df10 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c 69 74  teHistory (sqlit
2df20 65 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  e, (const char *
2df30 29 20 74 61 62 6c 65 2c 0a 09 09 09 09 09 20 28  ) table,...... (
2df40 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 67 65  const char *) ge
2df50 6f 6d 2c 20 73 71 6c 29 3b 0a 09 20 20 20 20 7d  om, sql);..    }
2df60 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
2df70 09 09 73 74 72 63 70 79 20 28 73 71 6c 2c 20 22  ..strcpy (sql, "
2df80 53 70 61 74 69 61 6c 49 6e 64 65 78 3a 20 75 6e  SpatialIndex: un
2df90 61 62 6c 65 20 74 6f 20 72 65 62 75 69 6c 64 20  able to rebuild 
2dfa0 74 68 65 20 52 2a 54 72 65 65 22 29 3b 0a 09 09  the R*Tree");...
2dfb0 75 70 64 61 74 65 53 70 61 74 69 61 4c 69 74 65  updateSpatiaLite
2dfc0 48 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c  History (sqlite,
2dfd0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
2dfe0 74 61 62 6c 65 2c 0a 09 09 09 09 09 20 28 63 6f  table,...... (co
2dff0 6e 73 74 20 63 68 61 72 20 2a 29 20 67 65 6f 6d  nst char *) geom
2e000 2c 20 73 71 6c 29 3b 0a 09 20 20 20 20 7d 0a 09  , sql);..    }..
2e010 20 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b    return status;
2e020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 74 72  .      }.    str
2e030 63 70 79 20 28 73 71 6c 2c 20 22 53 70 61 74 69  cpy (sql, "Spati
2e040 61 6c 49 6e 64 65 78 3a 20 73 75 63 63 65 73 73  alIndex: success
2e050 66 75 6c 6c 79 20 72 65 63 6f 76 65 72 65 64 22  fully recovered"
2e060 29 3b 0a 20 20 20 20 75 70 64 61 74 65 53 70 61  );.    updateSpa
2e070 74 69 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28  tiaLiteHistory (
2e080 73 71 6c 69 74 65 2c 20 28 63 6f 6e 73 74 20 63  sqlite, (const c
2e090 68 61 72 20 2a 29 20 74 61 62 6c 65 2c 0a 09 09  har *) table,...
2e0a0 09 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61  .     (const cha
2e0b0 72 20 2a 29 20 67 65 6f 6d 2c 20 73 71 6c 29 3b  r *) geom, sql);
2e0c0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2e0d0 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 70 61 74   error:.    spat
2e0e0 69 61 6c 69 74 65 5f 65 20 28 22 52 65 63 6f 76  ialite_e ("Recov
2e0f0 65 72 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29  erSpatialIndex()
2e100 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 5c 6e   error: \"%s\"\n
2e110 22 2c 20 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  ", errMsg);.    
2e120 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72  sqlite3_free (er
2e130 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
2e140 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
2e150 6e 74 0a 72 65 63 6f 76 65 72 5f 61 6e 79 5f 73  nt.recover_any_s
2e160 70 61 74 69 61 6c 5f 69 6e 64 65 78 20 28 73 71  patial_index (sq
2e170 6c 69 74 65 33 20 2a 20 73 71 6c 69 74 65 2c 20  lite3 * sqlite, 
2e180 69 6e 74 20 6e 6f 5f 63 68 65 63 6b 29 0a 7b 0a  int no_check).{.
2e190 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  /* attempting to
2e1a0 20 72 65 62 75 69 6c 64 20 61 6e 79 20 64 65 66   rebuild any def
2e1b0 69 6e 65 64 20 52 2a 54 72 65 65 20 2a 2f 0a 20  ined R*Tree */. 
2e1c0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
2e1d0 64 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20  d char *table;. 
2e1e0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
2e1f0 64 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 3b 0a  d char *column;.
2e200 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 3b 0a      int status;.
2e210 20 20 20 20 63 68 61 72 20 73 71 6c 5b 31 30 32      char sql[102
2e220 34 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  4];.    int ret;
2e230 0a 20 20 20 20 69 6e 74 20 74 6f 5f 62 65 5f 66  .    int to_be_f
2e240 69 78 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 6f  ixed;.    int ro
2e250 77 69 64 5f 63 6f 6c 75 6d 6e 20 3d 20 30 3b 0a  wid_column = 0;.
2e260 20 20 20 20 69 6e 74 20 77 69 74 68 6f 75 74 5f      int without_
2e270 72 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 73  rowid = 0;.    s
2e280 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
2e290 74 3b 0a 0a 2f 2a 20 72 65 74 72 69 65 76 69 6e  t;../* retrievin
2e2a0 67 20 61 6e 79 20 64 65 66 69 6e 65 64 20 52 2a  g any defined R*
2e2b0 54 72 65 65 20 2a 2f 0a 20 20 20 20 73 74 72 63  Tree */.    strc
2e2c0 70 79 20 28 73 71 6c 2c 0a 09 20 20 20 20 22 53  py (sql,..    "S
2e2d0 45 4c 45 43 54 20 66 5f 74 61 62 6c 65 5f 6e 61  ELECT f_table_na
2e2e0 6d 65 2c 20 66 5f 67 65 6f 6d 65 74 72 79 5f 63  me, f_geometry_c
2e2f0 6f 6c 75 6d 6e 20 46 52 4f 4d 20 67 65 6f 6d 65  olumn FROM geome
2e300 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 22 29 3b 0a  try_columns ");.
2e310 20 20 20 20 73 74 72 63 61 74 20 28 73 71 6c 2c      strcat (sql,
2e320 20 22 57 48 45 52 45 20 73 70 61 74 69 61 6c 5f   "WHERE spatial_
2e330 69 6e 64 65 78 5f 65 6e 61 62 6c 65 64 20 3d 20  index_enabled = 
2e340 31 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  1");.    ret = s
2e350 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2e360 32 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20  2 (sqlite, sql, 
2e370 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73  strlen (sql), &s
2e380 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tmt, NULL);.    
2e390 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
2e3a0 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20  E_OK).      {.. 
2e3b0 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22   spatialite_e ("
2e3c0 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c 49 6e  RecoverSpatialIn
2e3d0 64 65 78 20 53 51 4c 20 65 72 72 6f 72 3a 20 25  dex SQL error: %
2e3e0 73 5c 6e 22 2c 0a 09 09 09 73 71 6c 69 74 65 33  s\n",....sqlite3
2e3f0 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29  _errmsg (sqlite)
2e400 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 2d 31 3b  );..  return -1;
2e410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77 68 69  .      }.    whi
2e420 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a 09  le (1).      {..
2e430 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
2e440 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20  step (stmt);..  
2e450 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54  if (ret == SQLIT
2e460 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20 20 62  E_DONE)..      b
2e470 72 65 61 6b 3b 0a 09 20 20 69 66 20 28 72 65 74  reak;..  if (ret
2e480 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a   == SQLITE_ROW).
2e490 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 68 65 63  .    {.../* chec
2e4a0 6b 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 52 2a  king a single R*
2e4b0 54 72 65 65 20 2a 2f 0a 09 09 74 61 62 6c 65 20  Tree */...table 
2e4c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2e4d0 5f 74 65 78 74 20 28 73 74 6d 74 2c 20 30 29 3b  _text (stmt, 0);
2e4e0 0a 09 09 63 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69  ...column = sqli
2e4f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
2e500 28 73 74 6d 74 2c 20 31 29 3b 0a 09 09 74 6f 5f  (stmt, 1);...to_
2e510 62 65 5f 66 69 78 65 64 20 3d 20 31 3b 0a 09 09  be_fixed = 1;...
2e520 69 66 20 28 21 6e 6f 5f 63 68 65 63 6b 29 0a 09  if (!no_check)..
2e530 09 20 20 7b 0a 09 09 20 20 20 20 20 20 73 74 61  .  {...      sta
2e540 74 75 73 20 3d 20 63 68 65 63 6b 5f 73 70 61 74  tus = check_spat
2e550 69 61 6c 5f 69 6e 64 65 78 20 28 73 71 6c 69 74  ial_index (sqlit
2e560 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e  e, table, column
2e570 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 73  );...      if (s
2e580 74 61 74 75 73 20 3c 20 30 29 0a 09 09 09 7b 0a  tatus < 0)....{.
2e590 09 09 09 20 20 20 20 2f 2a 20 73 6f 6d 65 20 75  ...    /* some u
2e5a0 6e 65 78 70 65 63 74 65 64 20 65 72 72 6f 72 20  nexpected error 
2e5b0 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 09 09 20  occurred */.... 
2e5c0 20 20 20 69 66 20 28 73 74 61 74 75 73 20 3d 3d     if (status ==
2e5d0 20 2d 32 29 0a 09 09 09 09 72 6f 77 69 64 5f 63   -2).....rowid_c
2e5e0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 09 09 09 20 20  olumn = 1;....  
2e5f0 20 20 69 66 20 28 73 74 61 74 75 73 20 3d 3d 20    if (status == 
2e600 2d 33 29 0a 09 09 09 09 77 69 74 68 6f 75 74 5f  -3).....without_
2e610 72 6f 77 69 64 20 3d 20 31 3b 0a 09 09 09 20 20  rowid = 1;....  
2e620 20 20 67 6f 74 6f 20 66 61 74 61 6c 5f 65 72 72    goto fatal_err
2e630 6f 72 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  or;....}...     
2e640 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 75 73   else if (status
2e650 20 3e 20 30 29 0a 09 09 09 7b 0a 09 09 09 20 20   > 0)....{....  
2e660 20 20 2f 2a 20 74 68 65 20 53 70 61 74 69 61 6c    /* the Spatial
2e670 20 49 6e 64 65 78 20 69 73 20 61 6c 72 65 61 64   Index is alread
2e680 79 20 76 61 6c 69 64 20 2a 2f 0a 09 09 09 20 20  y valid */....  
2e690 20 20 74 6f 5f 62 65 5f 66 69 78 65 64 20 3d 20    to_be_fixed = 
2e6a0 30 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09  0;....}...  }...
2e6b0 69 66 20 28 74 6f 5f 62 65 5f 66 69 78 65 64 29  if (to_be_fixed)
2e6c0 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f  ...  {...      /
2e6d0 2a 20 72 65 62 75 69 6c 64 69 6e 67 20 74 68 65  * rebuilding the
2e6e0 20 53 70 61 74 69 61 6c 20 49 6e 64 65 78 20 2a   Spatial Index *
2e6f0 2f 0a 09 09 20 20 20 20 20 20 73 74 61 74 75 73  /...      status
2e700 20 3d 20 72 65 63 6f 76 65 72 5f 73 70 61 74 69   = recover_spati
2e710 61 6c 5f 69 6e 64 65 78 20 28 73 71 6c 69 74 65  al_index (sqlite
2e720 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29  , table, column)
2e730 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 73 74  ;...      if (st
2e740 61 74 75 73 20 3c 20 30 29 0a 09 09 09 7b 0a 09  atus < 0)....{..
2e750 09 09 20 20 20 20 2f 2a 20 73 6f 6d 65 20 75 6e  ..    /* some un
2e760 65 78 70 65 63 74 65 64 20 65 72 72 6f 72 20 6f  expected error o
2e770 63 63 75 72 72 65 64 20 2a 2f 0a 09 09 09 20 20  ccurred */....  
2e780 20 20 69 66 20 28 73 74 61 74 75 73 20 3d 3d 20    if (status == 
2e790 2d 32 29 0a 09 09 09 09 72 6f 77 69 64 5f 63 6f  -2).....rowid_co
2e7a0 6c 75 6d 6e 20 3d 20 31 3b 0a 09 09 09 20 20 20  lumn = 1;....   
2e7b0 20 69 66 20 28 73 74 61 74 75 73 20 3d 3d 20 2d   if (status == -
2e7c0 33 29 0a 09 09 09 09 77 69 74 68 6f 75 74 5f 72  3).....without_r
2e7d0 6f 77 69 64 20 3d 20 31 3b 0a 09 09 09 20 20 20  owid = 1;....   
2e7e0 20 67 6f 74 6f 20 66 61 74 61 6c 5f 65 72 72 6f   goto fatal_erro
2e7f0 72 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20  r;....}...      
2e800 65 6c 73 65 20 69 66 20 28 73 74 61 74 75 73 20  else if (status 
2e810 3d 3d 20 30 29 0a 09 09 09 20 20 67 6f 74 6f 20  == 0)....  goto 
2e820 65 72 72 6f 72 3b 0a 09 09 20 20 7d 0a 09 20 20  error;...  }..  
2e830 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
2e840 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f   {...spatialite_
2e850 65 20 28 22 73 71 6c 69 74 65 33 5f 73 74 65 70  e ("sqlite3_step
2e860 28 29 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  () error: %s\n",
2e870 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  ....      sqlite
2e880 33 5f 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65  3_errmsg (sqlite
2e890 29 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 69  ));...sqlite3_fi
2e8a0 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a 09  nalize (stmt);..
2e8b0 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20  .return -1;..   
2e8c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73   }.      }.    s
2e8d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
2e8e0 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75  (stmt);.    retu
2e8f0 72 6e 20 31 3b 0a 20 20 65 72 72 6f 72 3a 0a 20  rn 1;.  error:. 
2e900 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2e910 69 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20  ize (stmt);.    
2e920 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 61 74 61  return 0;.  fata
2e930 6c 5f 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c  l_error:.    sql
2e940 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73  ite3_finalize (s
2e950 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 72 6f  tmt);.    if (ro
2e960 77 69 64 5f 63 6f 6c 75 6d 6e 29 0a 09 72 65 74  wid_column)..ret
2e970 75 72 6e 20 2d 32 3b 0a 20 20 20 20 69 66 20 28  urn -2;.    if (
2e980 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 29 0a 09  without_rowid)..
2e990 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 20 20 72  return -3;.    r
2e9a0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
2e9b0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65  tic void.fnct_Re
2e9c0 63 6f 76 65 72 53 70 61 74 69 61 6c 49 6e 64 65  coverSpatialInde
2e9d0 78 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  x (sqlite3_conte
2e9e0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
2e9f0 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c  t argc,....  sql
2ea00 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
2ea10 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
2ea20 63 74 69 6f 6e 3a 0a 2f 20 52 65 63 6f 76 65 72  ction:./ Recover
2ea30 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29 0a 2f  SpatialIndex()./
2ea40 20 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c 49   RecoverSpatialI
2ea50 6e 64 65 78 28 6e 6f 5f 63 68 65 63 6b 29 0a 2f  ndex(no_check)./
2ea60 20 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c 49   RecoverSpatialI
2ea70 6e 64 65 78 28 74 61 62 6c 65 2c 20 63 6f 6c 75  ndex(table, colu
2ea80 6d 6e 29 0a 2f 20 52 65 63 6f 76 65 72 53 70 61  mn)./ RecoverSpa
2ea90 74 69 61 6c 49 6e 64 65 78 28 74 61 62 6c 65 2c  tialIndex(table,
2eaa0 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 5f 63 68 65 63   column, no_chec
2eab0 6b 29 0a 2f 0a 2f 20 61 74 74 65 6d 70 74 73 20  k)././ attempts 
2eac0 74 6f 20 72 65 62 75 69 6c 64 20 61 20 53 70 61  to rebuild a Spa
2ead0 74 69 61 6c 49 6e 64 65 78 2c 20 72 65 74 75 72  tialIndex, retur
2eae0 6e 69 6e 67 3a 0a 2f 20 31 20 2d 20 6f 6e 20 73  ning:./ 1 - on s
2eaf0 75 63 63 65 73 73 0a 2f 20 30 20 2d 20 6f 6e 20  uccess./ 0 - on 
2eb00 66 61 69 6c 75 72 65 0a 2f 20 2d 31 20 69 66 20  failure./ -1 if 
2eb10 61 6e 79 20 70 68 79 73 69 63 61 6c 20 22 52 4f  any physical "RO
2eb20 57 49 44 22 20 63 6f 6c 75 6d 6e 20 65 78 69 73  WID" column exis
2eb30 74 20 73 68 61 64 6f 77 69 6e 67 20 74 68 65 20  t shadowing the 
2eb40 72 65 61 6c 20 52 4f 57 49 44 0a 2f 20 20 20 20  real ROWID./    
2eb50 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2eb60 77 61 73 20 63 72 65 61 74 65 64 20 57 49 54 48  was created WITH
2eb70 4f 55 54 20 52 4f 57 49 44 0a 2f 20 4e 55 4c 4c  OUT ROWID./ NULL
2eb80 20 69 66 20 61 6e 79 20 73 79 6e 74 61 78 20 65   if any syntax e
2eb90 72 72 6f 72 20 69 73 20 64 65 74 65 63 74 65 64  rror is detected
2eba0 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  .*/.    const un
2ebb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 61 62  signed char *tab
2ebc0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  le;.    const un
2ebd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 6f 6c  signed char *col
2ebe0 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 5f  umn;.    int no_
2ebf0 63 68 65 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69  check = 0;.    i
2ec00 6e 74 20 73 74 61 74 75 73 3b 0a 20 20 20 20 73  nt status;.    s
2ec10 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
2ec20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2ec30 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
2ec40 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
2ec50 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
2ec60 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
2ec70 20 20 20 20 69 66 20 28 61 72 67 63 20 3c 3d 20      if (argc <= 
2ec80 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  1).      {..  /*
2ec90 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 3a 20 77   no arguments: w
2eca0 65 20 6d 75 73 74 20 72 65 62 75 69 6c 64 20 61  e must rebuild a
2ecb0 6e 79 20 64 65 66 69 6e 65 64 20 52 2a 54 72 65  ny defined R*Tre
2ecc0 65 20 2a 2f 0a 09 20 20 69 66 20 28 61 72 67 63  e */..  if (argc
2ecd0 20 3d 3d 20 31 29 0a 09 20 20 20 20 7b 0a 09 09   == 1)..    {...
2ece0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
2ecf0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
2ed00 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
2ed10 45 52 29 0a 09 09 20 20 20 20 6e 6f 5f 63 68 65  ER)...    no_che
2ed20 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ck = sqlite3_val
2ed30 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
2ed40 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09  ;...else...  {..
2ed50 09 20 20 20 20 20 20 73 70 61 74 69 61 6c 69 74  .      spatialit
2ed60 65 5f 65 0a 09 09 09 20 20 28 22 52 65 63 6f 76  e_e....  ("Recov
2ed70 65 72 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29  erSpatialIndex()
2ed80 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74   error: argument
2ed90 20 31 20 5b 6e 6f 5f 63 68 65 63 6b 5d 20 69 73   1 [no_check] is
2eda0 20 6e 6f 74 20 6f 66 20 74 68 65 20 49 6e 74 65   not of the Inte
2edb0 67 65 72 20 74 79 70 65 5c 6e 22 29 3b 0a 09 09  ger type\n");...
2edc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2edd0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
2ede0 78 74 29 3b 0a 09 09 20 20 20 20 20 20 72 65 74  xt);...      ret
2edf0 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20  urn;...  }..    
2ee00 7d 0a 09 20 20 73 74 61 74 75 73 20 3d 20 72 65  }..  status = re
2ee10 63 6f 76 65 72 5f 61 6e 79 5f 73 70 61 74 69 61  cover_any_spatia
2ee20 6c 5f 69 6e 64 65 78 20 28 73 71 6c 69 74 65 2c  l_index (sqlite,
2ee30 20 6e 6f 5f 63 68 65 63 6b 29 3b 0a 09 20 20 69   no_check);..  i
2ee40 66 20 28 73 74 61 74 75 73 20 3c 20 30 29 0a 09  f (status < 0)..
2ee50 20 20 20 20 7b 0a 09 09 69 66 20 28 73 74 61 74      {...if (stat
2ee60 75 73 20 3d 3d 20 2d 32 29 0a 09 09 20 20 20 20  us == -2)...    
2ee70 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2ee80 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
2ee90 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 73 74 61  ;...else if (sta
2eea0 74 75 73 20 3d 3d 20 2d 33 29 0a 09 09 20 20 20  tus == -3)...   
2eeb0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2eec0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
2eed0 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  );...else...    
2eee0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
2eef0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
2ef00 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66      }..  else if
2ef10 20 28 73 74 61 74 75 73 20 3e 20 30 29 0a 09 20   (status > 0).. 
2ef20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2ef30 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
2ef40 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  , 1);..  else.. 
2ef50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2ef60 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
2ef70 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  , 0);..  return;
2ef80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .      }..    if
2ef90 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
2efa0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
2efb0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
2efc0 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
2efd0 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22  lite_e..      ("
2efe0 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c 49 6e  RecoverSpatialIn
2eff0 64 65 78 28 29 20 65 72 72 6f 72 3a 20 61 72 67  dex() error: arg
2f000 75 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e  ument 1 [table_n
2f010 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74  ame] is not of t
2f020 68 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e  he String type\n
2f030 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
2f040 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
2f050 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
2f060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62  .      }.    tab
2f070 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
2f080 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
2f090 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
2f0a0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
2f0b0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
2f0c0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
2f0d0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
2f0e0 09 20 20 20 20 20 20 28 22 52 65 63 6f 76 65 72  .      ("Recover
2f0f0 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29 20 65  SpatialIndex() e
2f100 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 32  rror: argument 2
2f110 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20 69   [column_name] i
2f120 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72  s not of the Str
2f130 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  ing type\n");.. 
2f140 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f150 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
2f160 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
2f170 20 7d 0a 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20   }.    column = 
2f180 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2f190 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  xt (argv[1]);.  
2f1a0 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29    if (argc == 3)
2f1b0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
2f1c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2f1d0 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
2f1e0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
2f1f0 09 20 20 20 20 20 20 6e 6f 5f 63 68 65 63 6b 20  .      no_check 
2f200 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2f210 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09  int (argv[2]);..
2f220 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
2f230 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20  spatialite_e... 
2f240 20 20 20 28 22 52 65 63 6f 76 65 72 53 70 61 74     ("RecoverSpat
2f250 69 61 6c 49 6e 64 65 78 28 29 20 65 72 72 6f 72  ialIndex() error
2f260 3a 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 6e 6f  : argument 2 [no
2f270 5f 63 68 65 63 6b 5d 20 69 73 20 6e 6f 74 20 6f  _check] is not o
2f280 66 20 74 68 65 20 49 6e 74 65 67 65 72 20 74 79  f the Integer ty
2f290 70 65 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65  pe\n");...sqlite
2f2a0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
2f2b0 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
2f2c0 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
2f2d0 7d 0a 20 20 20 20 69 66 20 28 21 6e 6f 5f 63 68  }.    if (!no_ch
2f2e0 65 63 6b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  eck).      {..  
2f2f0 2f 2a 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  /* checking the 
2f300 63 75 72 72 65 6e 74 20 53 70 61 74 69 61 6c 49  current SpatialI
2f310 6e 64 65 78 20 76 61 6c 69 64 69 74 79 20 2a 2f  ndex validity */
2f320 0a 09 20 20 73 74 61 74 75 73 20 3d 20 63 68 65  ..  status = che
2f330 63 6b 5f 73 70 61 74 69 61 6c 5f 69 6e 64 65 78  ck_spatial_index
2f340 20 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 2c   (sqlite, table,
2f350 20 63 6f 6c 75 6d 6e 29 3b 0a 09 20 20 69 66 20   column);..  if 
2f360 28 73 74 61 74 75 73 20 3c 20 30 29 0a 09 20 20  (status < 0)..  
2f370 20 20 7b 0a 09 09 2f 2a 20 73 6f 6d 65 20 75 6e    {.../* some un
2f380 65 78 70 65 63 74 65 64 20 65 72 72 6f 72 20 6f  expected error o
2f390 63 63 75 72 72 65 64 20 2a 2f 0a 09 09 69 66 20  ccurred */...if 
2f3a0 28 73 74 61 74 75 73 20 3d 3d 20 2d 32 20 7c 7c  (status == -2 ||
2f3b0 20 73 74 61 74 75 73 20 3d 3d 20 2d 33 29 0a 09   status == -3)..
2f3c0 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2f3d0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
2f3e0 2c 20 2d 31 29 3b 0a 09 09 65 6c 73 65 0a 09 09  , -1);...else...
2f3f0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f400 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
2f410 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
2f420 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28    }..  else if (
2f430 73 74 61 74 75 73 20 3e 20 30 29 0a 09 20 20 20  status > 0)..   
2f440 20 7b 0a 09 09 2f 2a 20 74 68 65 20 53 70 61 74   {.../* the Spat
2f450 69 61 6c 20 49 6e 64 65 78 20 69 73 20 61 6c 72  ial Index is alr
2f460 65 61 64 79 20 76 61 6c 69 64 20 2a 2f 0a 09 09  eady valid */...
2f470 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2f480 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  nt (context, 1);
2f490 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
2f4a0 7d 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 72 65 62  }.      }./* reb
2f4b0 75 69 6c 64 69 6e 67 20 74 68 65 20 53 70 61 74  uilding the Spat
2f4c0 69 61 6c 20 49 6e 64 65 78 20 2a 2f 0a 20 20 20  ial Index */.   
2f4d0 20 73 74 61 74 75 73 20 3d 20 72 65 63 6f 76 65   status = recove
2f4e0 72 5f 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 20  r_spatial_index 
2f4f0 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 2c 20  (sqlite, table, 
2f500 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 20  column);.    if 
2f510 28 73 74 61 74 75 73 20 3d 3d 20 2d 32 29 0a 09  (status == -2)..
2f520 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2f530 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
2f540 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
2f550 74 61 74 75 73 20 3c 20 30 29 0a 09 73 71 6c 69  tatus < 0)..sqli
2f560 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
2f570 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
2f580 6c 73 65 20 69 66 20 28 73 74 61 74 75 73 20 3e  lse if (status >
2f590 20 30 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73   0)..sqlite3_res
2f5a0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
2f5b0 2c 20 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  , 1);.    else..
2f5c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2f5d0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
2f5e0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
2f5f0 66 6e 63 74 5f 43 68 65 63 6b 53 68 61 64 6f 77  fnct_CheckShadow
2f600 65 64 52 6f 77 69 64 20 28 73 71 6c 69 74 65 33  edRowid (sqlite3
2f610 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
2f620 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
2f630 09 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  . sqlite3_value 
2f640 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
2f650 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 68  L function:./ Ch
2f660 65 63 6b 53 68 61 64 6f 77 65 64 52 6f 77 69 64  eckShadowedRowid
2f670 28 74 61 62 6c 65 29 0a 2f 0a 2f 20 63 68 65 63  (table)././ chec
2f680 6b 73 20 69 66 20 73 6f 6d 65 20 74 61 62 6c 65  ks if some table
2f690 20 68 61 73 20 61 20 22 72 6f 77 69 64 22 20 70   has a "rowid" p
2f6a0 68 79 73 69 63 61 6c 20 63 6f 6c 75 6d 6e 20 73  hysical column s
2f6b0 68 61 64 6f 77 69 6e 67 20 74 68 65 20 72 65 61  hadowing the rea
2f6c0 6c 20 52 4f 57 49 44 0a 2f 20 31 20 2d 20 79 65  l ROWID./ 1 - ye
2f6d0 73 2c 20 74 68 65 20 52 4f 57 49 44 20 69 73 20  s, the ROWID is 
2f6e0 73 68 61 64 6f 77 65 64 0a 2f 20 30 20 2d 20 6e  shadowed./ 0 - n
2f6f0 6f 2c 20 74 68 65 20 52 4f 57 49 44 20 69 73 6e  o, the ROWID isn
2f700 27 74 20 73 68 61 64 6f 77 65 64 0a 2f 20 4e 55  't shadowed./ NU
2f710 4c 4c 20 6f 6e 20 66 61 69 6c 75 72 65 20 28 65  LL on failure (e
2f720 2e 67 2e 20 6e 6f 74 20 65 78 69 73 74 69 6e 67  .g. not existing
2f730 20 74 61 62 6c 65 29 0a 2a 2f 0a 20 20 20 20 63   table).*/.    c
2f740 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2f750 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 69  ar *table;.    i
2f760 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 68 61 72  nt ret;.    char
2f770 20 73 71 6c 5b 31 32 38 5d 3b 0a 20 20 20 20 73   sql[128];.    s
2f780 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
2f790 74 3b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  t;.    int exist
2f7a0 73 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  s = 0;.    sqlit
2f7b0 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
2f7c0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2f7d0 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
2f7e0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
2f7f0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
2f800 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20 20  XCL_LINE */..   
2f810 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
2f820 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
2f830 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
2f840 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61  ).      {..  spa
2f850 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20  tialite_e..     
2f860 20 28 22 43 68 65 63 6b 53 68 61 64 6f 77 65 64   ("CheckShadowed
2f870 52 6f 77 69 64 28 29 20 65 72 72 6f 72 3a 20 61  Rowid() error: a
2f880 72 67 75 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65  rgument 1 [table
2f890 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66  _name] is not of
2f8a0 20 74 68 65 20 53 74 72 69 6e 67 20 74 79 70 65   the String type
2f8b0 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  \n");..  sqlite3
2f8c0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
2f8d0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
2f8e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74  n;.      }.    t
2f8f0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  able = sqlite3_v
2f900 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
2f910 30 5d 29 3b 0a 0a 2f 2a 20 63 68 65 63 6b 69 6e  0]);../* checkin
2f920 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 65  g if the table e
2f930 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 73 74 72  xists */.    str
2f940 63 70 79 20 28 73 71 6c 2c 0a 09 20 20 20 20 22  cpy (sql,..    "
2f950 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
2f960 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
2f970 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
2f980 6c 65 27 20 41 4e 44 20 4c 6f 77 65 72 28 6e 61  le' AND Lower(na
2f990 6d 65 29 20 3d 20 4c 6f 77 65 72 28 3f 29 22 29  me) = Lower(?)")
2f9a0 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69  ;.    ret = sqli
2f9b0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28  te3_prepare_v2 (
2f9c0 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 73 74 72  sqlite, sql, str
2f9d0 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d 74  len (sql), &stmt
2f9e0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
2f9f0 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f  (ret != SQLITE_O
2fa00 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70  K).      {..  sp
2fa10 61 74 69 61 6c 69 74 65 5f 65 20 28 22 43 68 65  atialite_e ("Che
2fa20 63 6b 53 68 61 64 6f 77 65 64 52 6f 77 69 64 3a  ckShadowedRowid:
2fa30 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 09 09 09 73   \"%s\"\n",....s
2fa40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28 73  qlite3_errmsg (s
2fa50 71 6c 69 74 65 29 29 3b 0a 09 20 20 73 71 6c 69  qlite));..  sqli
2fa60 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
2fa70 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
2fa80 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
2fa90 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20    sqlite3_reset 
2faa0 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  (stmt);.    sqli
2fab0 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
2fac0 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73  gs (stmt);.    s
2fad0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2fae0 20 28 73 74 6d 74 2c 20 31 2c 20 28 63 6f 6e 73   (stmt, 1, (cons
2faf0 74 20 63 68 61 72 20 2a 29 20 74 61 62 6c 65 2c  t char *) table,
2fb00 0a 09 09 20 20 20 20 20 20 20 73 74 72 6c 65 6e  ...       strlen
2fb10 20 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29   ((const char *)
2fb20 20 74 61 62 6c 65 29 2c 20 53 51 4c 49 54 45 5f   table), SQLITE_
2fb30 53 54 41 54 49 43 29 3b 0a 20 20 20 20 77 68 69  STATIC);.    whi
2fb40 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a 09  le (1).      {..
2fb50 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 74    /* scrolling t
2fb60 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 6f  he result set ro
2fb70 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73  ws */..  ret = s
2fb80 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d  qlite3_step (stm
2fb90 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d  t);..  if (ret =
2fba0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a 09  = SQLITE_DONE)..
2fbb0 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f 2a        break;../*
2fbc0 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 73   end of result s
2fbd0 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 74  et */..  if (ret
2fbe0 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a   == SQLITE_ROW).
2fbf0 09 20 20 20 20 20 20 65 78 69 73 74 73 20 3d 20  .      exists = 
2fc00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  1;.      }.    s
2fc10 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
2fc20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28  (stmt);.    if (
2fc30 21 65 78 69 73 74 73 29 0a 09 73 71 6c 69 74 65  !exists)..sqlite
2fc40 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
2fc50 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
2fc60 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  e.      {..  if 
2fc70 28 21 76 61 6c 69 64 61 74 65 52 6f 77 69 64 20  (!validateRowid 
2fc80 28 73 71 6c 69 74 65 2c 20 28 63 6f 6e 73 74 20  (sqlite, (const 
2fc90 63 68 61 72 20 2a 29 20 74 61 62 6c 65 29 29 0a  char *) table)).
2fca0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2fcb0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
2fcc0 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 1);..  else.
2fcd0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2fce0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
2fcf0 78 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  xt, 0);.      }.
2fd00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
2fd10 6e 63 74 5f 43 68 65 63 6b 57 69 74 68 6f 75 74  nct_CheckWithout
2fd20 52 6f 77 69 64 20 28 73 71 6c 69 74 65 33 5f 63  Rowid (sqlite3_c
2fd30 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
2fd40 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 73  , int argc,....s
2fd50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
2fd60 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
2fd70 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 68 65 63 6b  unction:./ Check
2fd80 57 69 74 68 6f 75 74 52 6f 77 69 64 28 74 61 62  WithoutRowid(tab
2fd90 6c 65 29 0a 2f 0a 2f 20 63 68 65 63 6b 73 20 69  le)././ checks i
2fda0 66 20 73 6f 6d 65 20 74 61 62 6c 65 20 68 61 73  f some table has
2fdb0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 57 49   been created WI
2fdc0 54 48 4f 55 54 20 52 4f 57 49 44 0a 2f 20 31 20  THOUT ROWID./ 1 
2fdd0 2d 20 79 65 73 2c 20 74 68 65 20 74 61 62 6c 65  - yes, the table
2fde0 20 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49   is WITHOUT ROWI
2fdf0 44 0a 2f 20 30 20 2d 20 6e 6f 2c 20 74 68 65 20  D./ 0 - no, the 
2fe00 52 4f 57 49 44 20 73 68 6f 75 6c 64 20 62 65 20  ROWID should be 
2fe10 73 75 70 70 6f 72 74 65 64 0a 2f 20 4e 55 4c 4c  supported./ NULL
2fe20 20 6f 6e 20 66 61 69 6c 75 72 65 20 28 65 2e 67   on failure (e.g
2fe30 2e 20 6e 6f 74 20 65 78 69 73 74 69 6e 67 20 74  . not existing t
2fe40 61 62 6c 65 29 0a 2a 2f 0a 20 20 20 20 63 6f 6e  able).*/.    con
2fe50 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2fe60 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74   *table;.    int
2fe70 20 72 65 74 3b 0a 20 20 20 20 63 68 61 72 20 73   ret;.    char s
2fe80 71 6c 5b 31 32 38 5d 3b 0a 20 20 20 20 73 71 6c  ql[128];.    sql
2fe90 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b  ite3_stmt *stmt;
2fea0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 20  .    int exists 
2feb0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2fec0 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
2fed0 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
2fee0 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
2fef0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
2ff00 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
2ff10 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20 20 20 69  L_LINE */..    i
2ff20 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
2ff30 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
2ff40 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
2ff50 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
2ff60 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28  alite_e..      (
2ff70 22 43 68 65 63 6b 57 69 74 68 6f 75 74 52 6f 77  "CheckWithoutRow
2ff80 69 64 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  id() error: argu
2ff90 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61  ment 1 [table_na
2ffa0 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  me] is not of th
2ffb0 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22  e String type\n"
2ffc0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
2ffd0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
2ffe0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
2fff0 20 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c        }.    tabl
30000 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
30010 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
30020 3b 0a 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69  ;../* checking i
30030 66 20 74 68 65 20 74 61 62 6c 65 20 65 78 69 73  f the table exis
30040 74 73 20 2a 2f 0a 20 20 20 20 73 74 72 63 70 79  ts */.    strcpy
30050 20 28 73 71 6c 2c 0a 09 20 20 20 20 22 53 45 4c   (sql,..    "SEL
30060 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
30070 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
30080 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27  E type = 'table'
30090 20 41 4e 44 20 4c 6f 77 65 72 28 6e 61 6d 65 29   AND Lower(name)
300a0 20 3d 20 4c 6f 77 65 72 28 3f 29 22 29 3b 0a 20   = Lower(?)");. 
300b0 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
300c0 5f 70 72 65 70 61 72 65 5f 76 32 20 28 73 71 6c  _prepare_v2 (sql
300d0 69 74 65 2c 20 73 71 6c 2c 20 73 74 72 6c 65 6e  ite, sql, strlen
300e0 20 28 73 71 6c 29 2c 20 26 73 74 6d 74 2c 20 4e   (sql), &stmt, N
300f0 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65  ULL);.    if (re
30100 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
30110 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
30120 61 6c 69 74 65 5f 65 20 28 22 43 68 65 63 6b 57  alite_e ("CheckW
30130 69 74 68 6f 75 74 52 6f 77 69 64 3a 20 5c 22 25  ithoutRowid: \"%
30140 73 5c 22 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  s\"\n", sqlite3_
30150 65 72 72 6d 73 67 20 28 73 71 6c 69 74 65 29 29  errmsg (sqlite))
30160 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
30170 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
30180 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
30190 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
301a0 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b  e3_reset (stmt);
301b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65  .    sqlite3_cle
301c0 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d  ar_bindings (stm
301d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
301e0 62 69 6e 64 5f 74 65 78 74 20 28 73 74 6d 74 2c  bind_text (stmt,
301f0 20 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20   1, (const char 
30200 2a 29 20 74 61 62 6c 65 2c 0a 09 09 20 20 20 20  *) table,...    
30210 20 20 20 73 74 72 6c 65 6e 20 28 28 63 6f 6e 73     strlen ((cons
30220 74 20 63 68 61 72 20 2a 29 20 74 61 62 6c 65 29  t char *) table)
30230 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
30240 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a  ;.    while (1).
30250 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 63        {..  /* sc
30260 72 6f 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 75  rolling the resu
30270 6c 74 20 73 65 74 20 72 6f 77 73 20 2a 2f 0a 09  lt set rows */..
30280 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
30290 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20  step (stmt);..  
302a0 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54  if (ret == SQLIT
302b0 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20 20 62  E_DONE)..      b
302c0 72 65 61 6b 3b 09 09 2f 2a 20 65 6e 64 20 6f 66  reak;../* end of
302d0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 09   result set */..
302e0 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c    if (ret == SQL
302f0 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 20 20  ITE_ROW)..      
30300 65 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  exists = 1;.    
30310 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
30320 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b  finalize (stmt);
30330 0a 20 20 20 20 69 66 20 28 21 65 78 69 73 74 73  .    if (!exists
30340 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
30350 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
30360 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
30370 20 7b 0a 09 20 20 69 66 20 28 69 73 5f 77 69 74   {..  if (is_wit
30380 68 6f 75 74 5f 72 6f 77 69 64 5f 74 61 62 6c 65  hout_rowid_table
30390 20 28 73 71 6c 69 74 65 2c 20 28 63 6f 6e 73 74   (sqlite, (const
303a0 20 63 68 61 72 20 2a 29 20 74 61 62 6c 65 29 29   char *) table))
303b0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
303c0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
303d0 65 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65  ext, 1);..  else
303e0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
303f0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
30400 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ext, 0);.      }
30410 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
30420 66 6e 63 74 5f 43 72 65 61 74 65 53 70 61 74 69  fnct_CreateSpati
30430 61 6c 49 6e 64 65 78 20 28 73 71 6c 69 74 65 33  alIndex (sqlite3
30440 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
30450 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
30460 09 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  . sqlite3_value 
30470 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
30480 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 72  L function:./ Cr
30490 65 61 74 65 53 70 61 74 69 61 6c 49 6e 64 65 78  eateSpatialIndex
304a0 28 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 20 29  (table, column )
304b0 0a 2f 0a 2f 20 63 72 65 61 74 65 73 20 61 20 53  ././ creates a S
304c0 70 61 74 69 61 6c 49 6e 64 65 78 20 62 61 73 65  patialIndex base
304d0 64 20 6f 6e 20 43 6f 6c 75 6d 6e 20 61 6e 64 20  d on Column and 
304e0 54 61 62 6c 65 0a 2f 20 72 65 74 75 72 6e 73 20  Table./ returns 
304f0 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30  1 on success./ 0
30500 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20   on failure.*/. 
30510 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74     const char *t
30520 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
30530 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 3b 0a 20 20  char *column;.  
30540 20 20 63 68 61 72 20 2a 73 71 6c 5f 73 74 61 74    char *sql_stat
30550 65 6d 65 6e 74 3b 0a 20 20 20 20 63 68 61 72 20  ement;.    char 
30560 73 71 6c 5b 31 30 32 34 5d 3b 0a 20 20 20 20 63  sql[1024];.    c
30570 68 61 72 20 2a 65 72 72 4d 73 67 20 3d 20 4e 55  har *errMsg = NU
30580 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  LL;.    int ret;
30590 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
305a0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
305b0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
305c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
305d0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
305e0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
305f0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
30600 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
30610 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
30620 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
30630 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65   {..  spatialite
30640 5f 65 0a 09 20 20 20 20 20 20 28 22 43 72 65 61  _e..      ("Crea
30650 74 65 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29  teSpatialIndex()
30660 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74   error: argument
30670 20 31 20 5b 74 61 62 6c 65 5f 6e 61 6d 65 5d 20   1 [table_name] 
30680 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
30690 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09  ring type\n");..
306a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
306b0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
306c0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
306d0 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 20      }.    table 
306e0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
306f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
30700 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
30710 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
30720 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
30730 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  1]) != SQLITE_TE
30740 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
30750 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
30760 20 20 20 28 22 43 72 65 61 74 65 53 70 61 74 69     ("CreateSpati
30770 61 6c 49 6e 64 65 78 28 29 20 65 72 72 6f 72 3a  alIndex() error:
30780 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 63 6f 6c   argument 2 [col
30790 75 6d 6e 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74  umn_name] is not
307a0 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74   of the String t
307b0 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69  ype\n");..  sqli
307c0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
307d0 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
307e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
307f0 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f      column = (co
30800 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
30810 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
30820 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
30830 20 28 69 73 5f 77 69 74 68 6f 75 74 5f 72 6f 77   (is_without_row
30840 69 64 5f 74 61 62 6c 65 20 28 73 71 6c 69 74 65  id_table (sqlite
30850 2c 20 74 61 62 6c 65 29 29 0a 20 20 20 20 20 20  , table)).      
30860 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
30870 65 0a 09 20 20 20 20 20 20 28 22 43 72 65 61 74  e..      ("Creat
30880 65 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29 20  eSpatialIndex() 
30890 65 72 72 6f 72 3a 20 74 61 62 6c 65 20 27 25 73  error: table '%s
308a0 27 20 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57  ' is WITHOUT ROW
308b0 49 44 5c 6e 22 2c 0a 09 20 20 20 20 20 20 20 74  ID\n",..       t
308c0 61 62 6c 65 29 3b 0a 09 20 20 73 71 6c 69 74 65  able);..  sqlite
308d0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
308e0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
308f0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
30900 20 20 20 69 66 20 28 21 76 61 6c 69 64 61 74 65     if (!validate
30910 52 6f 77 69 64 20 28 73 71 6c 69 74 65 2c 20 74  Rowid (sqlite, t
30920 61 62 6c 65 29 29 0a 20 20 20 20 20 20 7b 0a 09  able)).      {..
30930 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
30940 20 20 20 20 20 20 28 22 43 72 65 61 74 65 53 70        ("CreateSp
30950 61 74 69 61 6c 49 6e 64 65 78 28 29 20 65 72 72  atialIndex() err
30960 6f 72 3a 20 61 20 70 68 79 73 69 63 61 6c 20 63  or: a physical c
30970 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 52 4f 57 49  olumn named ROWI
30980 44 20 73 68 61 64 6f 77 73 20 74 68 65 20 72 65  D shadows the re
30990 61 6c 20 52 4f 57 49 44 5c 6e 22 29 3b 0a 09 20  al ROWID\n");.. 
309a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
309b0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
309c0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
309d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 5f 73 74      }.    sql_st
309e0 61 74 65 6d 65 6e 74 20 3d 0a 09 73 71 6c 69 74  atement =..sqlit
309f0 65 33 5f 6d 70 72 69 6e 74 66 0a 09 28 22 55 50  e3_mprintf..("UP
30a00 44 41 54 45 20 67 65 6f 6d 65 74 72 79 5f 63 6f  DATE geometry_co
30a10 6c 75 6d 6e 73 20 53 45 54 20 73 70 61 74 69 61  lumns SET spatia
30a20 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65 64 20  l_index_enabled 
30a30 3d 20 31 20 22 0a 09 20 22 57 48 45 52 45 20 55  = 1 ".. "WHERE U
30a40 70 70 65 72 28 66 5f 74 61 62 6c 65 5f 6e 61 6d  pper(f_table_nam
30a50 65 29 20 3d 20 55 70 70 65 72 28 25 51 29 20 41  e) = Upper(%Q) A
30a60 4e 44 20 22 0a 09 20 22 55 70 70 65 72 28 66 5f  ND ".. "Upper(f_
30a70 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 29  geometry_column)
30a80 20 3d 20 55 70 70 65 72 28 25 51 29 20 41 4e 44   = Upper(%Q) AND
30a90 20 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 5f 65   spatial_index_e
30aa0 6e 61 62 6c 65 64 20 3d 20 30 22 2c 0a 09 20 74  nabled = 0",.. t
30ab0 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a 20  able, column);. 
30ac0 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
30ad0 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73  _exec (sqlite, s
30ae0 71 6c 5f 73 74 61 74 65 6d 65 6e 74 2c 20 4e 55  ql_statement, NU
30af0 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73  LL, NULL, &errMs
30b00 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
30b10 66 72 65 65 20 28 73 71 6c 5f 73 74 61 74 65 6d  free (sql_statem
30b20 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 72 65  ent);.    if (re
30b30 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  t != SQLITE_OK).
30b40 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
30b50 20 69 66 20 28 73 71 6c 69 74 65 33 5f 63 68 61   if (sqlite3_cha
30b60 6e 67 65 73 20 28 73 71 6c 69 74 65 29 20 3d 3d  nges (sqlite) ==
30b70 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73   0).      {..  s
30b80 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
30b90 20 20 20 28 22 43 72 65 61 74 65 53 70 61 74 69     ("CreateSpati
30ba0 61 6c 49 6e 64 65 78 28 29 20 65 72 72 6f 72 3a  alIndex() error:
30bb0 20 65 69 74 68 65 72 20 5c 22 25 73 5c 22 2e 5c   either \"%s\".\
30bc0 22 25 73 5c 22 20 69 73 6e 27 74 20 61 20 47 65  "%s\" isn't a Ge
30bd0 6f 6d 65 74 72 79 20 63 6f 6c 75 6d 6e 20 6f 72  ometry column or
30be0 20 61 20 53 70 61 74 69 61 6c 49 6e 64 65 78 20   a SpatialIndex 
30bf0 69 73 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e  is already defin
30c00 65 64 5c 6e 22 2c 0a 09 20 20 20 20 20 20 20 74  ed\n",..       t
30c10 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a 09  able, column);..
30c20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
30c30 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
30c40 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
30c50 20 20 20 20 7d 0a 20 20 20 20 75 70 64 61 74 65      }.    update
30c60 47 65 6f 6d 65 74 72 79 54 72 69 67 67 65 72 73  GeometryTriggers
30c70 20 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 2c   (sqlite, table,
30c80 20 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71   column);.    sq
30c90 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
30ca0 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20   (context, 1);. 
30cb0 20 20 20 73 74 72 63 70 79 20 28 73 71 6c 2c 20     strcpy (sql, 
30cc0 22 52 2a 54 72 65 65 20 53 70 61 74 69 61 6c 20  "R*Tree Spatial 
30cd0 49 6e 64 65 78 20 73 75 63 63 65 73 73 66 75 6c  Index successful
30ce0 6c 79 20 63 72 65 61 74 65 64 22 29 3b 0a 20 20  ly created");.  
30cf0 20 20 75 70 64 61 74 65 53 70 61 74 69 61 4c 69    updateSpatiaLi
30d00 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c 69 74  teHistory (sqlit
30d10 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e  e, table, column
30d20 2c 20 73 71 6c 29 3b 0a 20 20 20 20 72 65 74 75  , sql);.    retu
30d30 72 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20  rn;.  error:.   
30d40 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22   spatialite_e ("
30d50 43 72 65 61 74 65 53 70 61 74 69 61 6c 49 6e 64  CreateSpatialInd
30d60 65 78 28 29 20 65 72 72 6f 72 3a 20 5c 22 25 73  ex() error: \"%s
30d70 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b 0a  \"\n", errMsg);.
30d80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30d90 20 28 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   (errMsg);.    s
30da0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
30db0 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
30dc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73      return;.}..s
30dd0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
30de0 43 72 65 61 74 65 4d 62 72 43 61 63 68 65 20 28  CreateMbrCache (
30df0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
30e00 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
30e10 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
30e20 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
30e30 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
30e40 20 43 72 65 61 74 65 4d 62 72 43 61 63 68 65 28   CreateMbrCache(
30e50 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 20 29 0a  table, column ).
30e60 2f 0a 2f 20 63 72 65 61 74 65 73 20 61 6e 20 4d  /./ creates an M
30e70 42 52 20 43 61 63 68 65 20 62 61 73 65 64 20 6f  BR Cache based o
30e80 6e 20 43 6f 6c 75 6d 6e 20 61 6e 64 20 54 61 62  n Column and Tab
30e90 6c 65 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f  le./ returns 1 o
30ea0 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e  n success./ 0 on
30eb0 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20   failure.*/.    
30ec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c  const char *tabl
30ed0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
30ee0 72 20 2a 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63  r *column;.    c
30ef0 68 61 72 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65  har *sql_stateme
30f00 6e 74 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c  nt;.    char sql
30f10 5b 31 30 32 34 5d 3b 0a 20 20 20 20 63 68 61 72  [1024];.    char
30f20 20 2a 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b   *errMsg = NULL;
30f30 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
30f40 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
30f50 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
30f60 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
30f70 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
30f80 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
30f90 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
30fa0 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
30fb0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
30fc0 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
30fd0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
30fe0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
30ff0 09 20 20 20 20 20 20 28 22 43 72 65 61 74 65 4d  .      ("CreateM
31000 62 72 43 61 63 68 65 28 29 20 65 72 72 6f 72 3a  brCache() error:
31010 20 61 72 67 75 6d 65 6e 74 20 31 20 5b 74 61 62   argument 1 [tab
31020 6c 65 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74 20  le_name] is not 
31030 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 74 79  of the String ty
31040 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74  pe\n");..  sqlit
31050 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
31060 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72  ontext, 0);..  r
31070 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
31080 20 20 20 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73     table = (cons
31090 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
310a0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
310b0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
310c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
310d0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
310e0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
310f0 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
31100 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43 72  te_e..      ("Cr
31110 65 61 74 65 4d 62 72 43 61 63 68 65 28 29 20 65  eateMbrCache() e
31120 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 32  rror: argument 2
31130 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20 69   [column_name] i
31140 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72  s not of the Str
31150 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  ing type\n");.. 
31160 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
31170 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
31180 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
31190 20 20 20 7d 0a 20 20 20 20 63 6f 6c 75 6d 6e 20     }.    column 
311a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
311b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
311c0 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ext (argv[1]);. 
311d0 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74     sql_statement
311e0 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 69   =..sqlite3_mpri
311f0 6e 74 66 0a 09 28 22 55 50 44 41 54 45 20 67 65  ntf..("UPDATE ge
31200 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73 20 53  ometry_columns S
31210 45 54 20 73 70 61 74 69 61 6c 5f 69 6e 64 65 78  ET spatial_index
31220 5f 65 6e 61 62 6c 65 64 20 3d 20 32 20 22 0a 09  _enabled = 2 "..
31230 20 22 57 48 45 52 45 20 55 70 70 65 72 28 66 5f   "WHERE Upper(f_
31240 74 61 62 6c 65 5f 6e 61 6d 65 29 20 3d 20 55 70  table_name) = Up
31250 70 65 72 28 25 51 29 20 22 0a 09 20 22 41 4e 44  per(%Q) ".. "AND
31260 20 55 70 70 65 72 28 66 5f 67 65 6f 6d 65 74 72   Upper(f_geometr
31270 79 5f 63 6f 6c 75 6d 6e 29 20 3d 20 55 70 70 65  y_column) = Uppe
31280 72 28 25 51 29 20 41 4e 44 20 73 70 61 74 69 61  r(%Q) AND spatia
31290 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65 64 20  l_index_enabled 
312a0 3d 20 30 22 2c 0a 09 20 74 61 62 6c 65 2c 20 63  = 0",.. table, c
312b0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 74 20  olumn);.    ret 
312c0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28  = sqlite3_exec (
312d0 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73 74 61 74  sqlite, sql_stat
312e0 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  ement, NULL, NUL
312f0 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20  L, &errMsg);.   
31300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73   sqlite3_free (s
31310 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ql_statement);. 
31320 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51     if (ret != SQ
31330 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65  LITE_OK)..goto e
31340 72 72 6f 72 3b 0a 20 20 20 20 69 66 20 28 73 71  rror;.    if (sq
31350 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 28 73  lite3_changes (s
31360 71 6c 69 74 65 29 20 3d 3d 20 30 29 0a 20 20 20  qlite) == 0).   
31370 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69     {..  spatiali
31380 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 43 72  te_e..      ("Cr
31390 65 61 74 65 4d 62 72 43 61 63 68 65 28 29 20 65  eateMbrCache() e
313a0 72 72 6f 72 3a 20 65 69 74 68 65 72 20 5c 22 25  rror: either \"%
313b0 73 5c 22 2e 5c 22 25 73 5c 22 20 69 73 6e 27 74  s\".\"%s\" isn't
313c0 20 61 20 47 65 6f 6d 65 74 72 79 20 63 6f 6c 75   a Geometry colu
313d0 6d 6e 20 6f 72 20 61 20 53 70 61 74 69 61 6c 49  mn or a SpatialI
313e0 6e 64 65 78 20 69 73 20 61 6c 72 65 61 64 79 20  ndex is already 
313f0 64 65 66 69 6e 65 64 5c 6e 22 2c 0a 09 20 20 20  defined\n",..   
31400 20 20 20 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d      table, colum
31410 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  n);..  sqlite3_r
31420 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
31430 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
31440 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75  n;.      }.    u
31450 70 64 61 74 65 47 65 6f 6d 65 74 72 79 54 72 69  pdateGeometryTri
31460 67 67 65 72 73 20 28 73 71 6c 69 74 65 2c 20 74  ggers (sqlite, t
31470 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a 20  able, column);. 
31480 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31490 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
314a0 31 29 3b 0a 20 20 20 20 73 74 72 63 70 79 20 28  1);.    strcpy (
314b0 73 71 6c 2c 20 22 4d 62 72 43 61 63 68 65 20 73  sql, "MbrCache s
314c0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72 65 61  uccessfully crea
314d0 74 65 64 22 29 3b 0a 20 20 20 20 75 70 64 61 74  ted");.    updat
314e0 65 53 70 61 74 69 61 4c 69 74 65 48 69 73 74 6f  eSpatiaLiteHisto
314f0 72 79 20 28 73 71 6c 69 74 65 2c 20 74 61 62 6c  ry (sqlite, tabl
31500 65 2c 20 63 6f 6c 75 6d 6e 2c 20 73 71 6c 29 3b  e, column, sql);
31510 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 65  .    return;.  e
31520 72 72 6f 72 3a 0a 20 20 20 20 73 70 61 74 69 61  rror:.    spatia
31530 6c 69 74 65 5f 65 20 28 22 43 72 65 61 74 65 4d  lite_e ("CreateM
31540 62 72 43 61 63 68 65 28 29 20 65 72 72 6f 72 3a  brCache() error:
31550 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 65 72 72 4d   \"%s\"\n", errM
31560 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
31570 5f 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b 0a  _free (errMsg);.
31580 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31590 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
315a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
315b0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
315c0 66 6e 63 74 5f 44 69 73 61 62 6c 65 53 70 61 74  fnct_DisableSpat
315d0 69 61 6c 49 6e 64 65 78 20 28 73 71 6c 69 74 65  ialIndex (sqlite
315e0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
315f0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
31600 09 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
31610 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
31620 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
31630 44 69 73 61 62 6c 65 53 70 61 74 69 61 6c 49 6e  DisableSpatialIn
31640 64 65 78 28 74 61 62 6c 65 2c 20 63 6f 6c 75 6d  dex(table, colum
31650 6e 20 29 0a 2f 0a 2f 20 64 69 73 61 62 6c 65 73  n )././ disables
31660 20 61 20 53 70 61 74 69 61 6c 49 6e 64 65 78 20   a SpatialIndex 
31670 62 61 73 65 64 20 6f 6e 20 43 6f 6c 75 6d 6e 20  based on Column 
31680 61 6e 64 20 54 61 62 6c 65 0a 2f 20 72 65 74 75  and Table./ retu
31690 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
316a0 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a  ./ 0 on failure.
316b0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
316c0 72 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 6f  r *table;.    co
316d0 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
316e0 3b 0a 20 20 20 20 63 68 61 72 20 73 71 6c 5b 31  ;.    char sql[1
316f0 30 32 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  024];.    char *
31700 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 3b 0a 20  sql_statement;. 
31710 20 20 20 63 68 61 72 20 2a 65 72 72 4d 73 67 20     char *errMsg 
31720 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
31730 72 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ret;.    sqlite3
31740 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
31750 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
31760 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
31770 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
31780 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
31790 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
317a0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
317b0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
317c0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
317d0 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
317e0 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22  lite_e..      ("
317f0 44 69 73 61 62 6c 65 53 70 61 74 69 61 6c 49 6e  DisableSpatialIn
31800 64 65 78 28 29 20 65 72 72 6f 72 3a 20 61 72 67  dex() error: arg
31810 75 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e  ument 1 [table_n
31820 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74  ame] is not of t
31830 68 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e  he String type\n
31840 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
31850 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
31860 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
31870 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74  n;.      }.    t
31880 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  able = (const ch
31890 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
318a0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
318b0 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ]);.    if (sqli
318c0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
318d0 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
318e0 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
318f0 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65  ..  spatialite_e
31900 0a 09 20 20 20 20 20 20 28 22 44 69 73 61 62 6c  ..      ("Disabl
31910 65 53 70 61 74 69 61 6c 49 6e 64 65 78 28 29 20  eSpatialIndex() 
31920 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20  error: argument 
31930 32 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20  2 [column_name] 
31940 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
31950 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09  ring type\n");..
31960 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31970 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
31980 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
31990 20 20 20 20 7d 0a 20 20 20 20 63 6f 6c 75 6d 6e      }.    column
319a0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
319b0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
319c0 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
319d0 0a 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65  .    sql_stateme
319e0 6e 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70  nt =..sqlite3_mp
319f0 72 69 6e 74 66 0a 09 28 22 55 50 44 41 54 45 20  rintf..("UPDATE 
31a00 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73  geometry_columns
31a10 20 53 45 54 20 73 70 61 74 69 61 6c 5f 69 6e 64   SET spatial_ind
31a20 65 78 5f 65 6e 61 62 6c 65 64 20 3d 20 30 20 22  ex_enabled = 0 "
31a30 0a 09 20 22 57 48 45 52 45 20 55 70 70 65 72 28  .. "WHERE Upper(
31a40 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 29 20 3d 20  f_table_name) = 
31a50 55 70 70 65 72 28 25 51 29 20 41 4e 44 20 22 0a  Upper(%Q) AND ".
31a60 09 20 22 55 70 70 65 72 28 66 5f 67 65 6f 6d 65  . "Upper(f_geome
31a70 74 72 79 5f 63 6f 6c 75 6d 6e 29 20 3d 20 55 70  try_column) = Up
31a80 70 65 72 28 25 51 29 20 41 4e 44 20 73 70 61 74  per(%Q) AND spat
31a90 69 61 6c 5f 69 6e 64 65 78 5f 65 6e 61 62 6c 65  ial_index_enable
31aa0 64 20 3c 3e 20 30 22 2c 0a 09 20 74 61 62 6c 65  d <> 0",.. table
31ab0 2c 20 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72  , column);.    r
31ac0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
31ad0 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c 5f 73  c (sqlite, sql_s
31ae0 74 61 74 65 6d 65 6e 74 2c 20 4e 55 4c 4c 2c 20  tatement, NULL, 
31af0 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a  NULL, &errMsg);.
31b00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
31b10 20 28 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 29   (sql_statement)
31b20 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d  ;.    if (ret !=
31b30 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 67 6f 74   SQLITE_OK)..got
31b40 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 20  o error;.    if 
31b50 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  (sqlite3_changes
31b60 20 28 73 71 6c 69 74 65 29 20 3d 3d 20 30 29 0a   (sqlite) == 0).
31b70 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
31b80 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28  alite_e..      (
31b90 22 44 69 73 61 62 6c 65 53 70 61 74 69 61 6c 49  "DisableSpatialI
31ba0 6e 64 65 78 28 29 20 65 72 72 6f 72 3a 20 65 69  ndex() error: ei
31bb0 74 68 65 72 20 5c 22 25 73 5c 22 2e 5c 22 25 73  ther \"%s\".\"%s
31bc0 5c 22 20 69 73 6e 27 74 20 61 20 47 65 6f 6d 65  \" isn't a Geome
31bd0 74 72 79 20 63 6f 6c 75 6d 6e 20 6f 72 20 6e 6f  try column or no
31be0 20 53 70 61 74 69 61 6c 49 6e 64 65 78 20 69 73   SpatialIndex is
31bf0 20 64 65 66 69 6e 65 64 5c 6e 22 2c 0a 09 20 20   defined\n",..  
31c00 20 20 20 20 20 74 61 62 6c 65 2c 20 63 6f 6c 75       table, colu
31c10 6d 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  mn);..  sqlite3_
31c20 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
31c30 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75  ext, 0);..  retu
31c40 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
31c50 75 70 64 61 74 65 47 65 6f 6d 65 74 72 79 54 72  updateGeometryTr
31c60 69 67 67 65 72 73 20 28 73 71 6c 69 74 65 2c 20  iggers (sqlite, 
31c70 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a  table, column);.
31c80 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31c90 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
31ca0 20 31 29 3b 0a 20 20 20 20 73 74 72 63 70 79 20   1);.    strcpy 
31cb0 28 73 71 6c 2c 20 22 53 70 61 74 69 61 6c 49 6e  (sql, "SpatialIn
31cc0 64 65 78 20 73 75 63 63 65 73 73 66 75 6c 6c 79  dex successfully
31cd0 20 64 69 73 61 62 6c 65 64 22 29 3b 0a 20 20 20   disabled");.   
31ce0 20 75 70 64 61 74 65 53 70 61 74 69 61 4c 69 74   updateSpatiaLit
31cf0 65 48 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65  eHistory (sqlite
31d00 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c  , table, column,
31d10 20 73 71 6c 29 3b 0a 20 20 20 20 72 65 74 75 72   sql);.    retur
31d20 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20  n;.  error:.    
31d30 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 44  spatialite_e ("D
31d40 69 73 61 62 6c 65 53 70 61 74 69 61 6c 49 6e 64  isableSpatialInd
31d50 65 78 28 29 20 65 72 72 6f 72 3a 20 5c 22 25 73  ex() error: \"%s
31d60 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29 3b 0a  \"\n", errMsg);.
31d70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
31d80 20 28 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   (errMsg);.    s
31d90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
31da0 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
31db0 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73      return;.}..s
31dc0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
31dd0 52 65 62 75 69 6c 64 47 65 6f 6d 65 74 72 79 54  RebuildGeometryT
31de0 72 69 67 67 65 72 73 20 28 73 71 6c 69 74 65 33  riggers (sqlite3
31df0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
31e00 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
31e10 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
31e20 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
31e30 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
31e40 0a 2f 20 52 65 62 75 69 6c 64 47 65 6f 6d 65 74  ./ RebuildGeomet
31e50 72 79 54 72 69 67 67 65 72 73 28 74 61 62 6c 65  ryTriggers(table
31e60 2c 20 63 6f 6c 75 6d 6e 20 29 0a 2f 0a 2f 20 72  , column )././ r
31e70 65 62 75 69 6c 64 73 20 47 65 6f 6d 65 74 72 79  ebuilds Geometry
31e80 20 54 72 69 67 67 65 72 73 20 28 63 6f 6e 73 74   Triggers (const
31e90 72 61 69 6e 74 73 29 20 20 62 61 73 65 64 20 6f  raints)  based o
31ea0 6e 20 43 6f 6c 75 6d 6e 20 61 6e 64 20 54 61 62  n Column and Tab
31eb0 6c 65 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f  le./ returns 1 o
31ec0 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e  n success./ 0 on
31ed0 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20   failure.*/.    
31ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c  const char *tabl
31ef0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
31f00 72 20 2a 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63  r *column;.    c
31f10 68 61 72 20 2a 73 71 6c 5f 73 74 61 74 65 6d 65  har *sql_stateme
31f20 6e 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72  nt;.    char *er
31f30 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  rMsg = NULL;.   
31f40 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 68   int ret;.    ch
31f50 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a 20 20  ar **results;.  
31f60 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 20 20    int rows;.    
31f70 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20 20 20  int columns;.   
31f80 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
31f90 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
31fa0 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
31fb0 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
31fc0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
31fd0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
31fe0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
31ff0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
32000 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
32010 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
32020 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
32030 20 20 20 20 20 20 28 22 52 65 62 75 69 6c 64 47        ("RebuildG
32040 65 6f 6d 65 74 72 79 54 72 69 67 67 65 72 73 28  eometryTriggers(
32050 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
32060 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61 6d 65 5d  t 1 [table_name]
32070 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53   is not of the S
32080 74 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a  tring type\n");.
32090 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
320a0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
320b0 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  0);..  return;. 
320c0 20 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65       }.    table
320d0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
320e0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
320f0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
32100 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
32110 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
32120 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [1]) != SQLITE_T
32130 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
32140 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20  spatialite_e..  
32150 20 20 20 20 28 22 52 65 62 75 69 6c 64 47 65 6f      ("RebuildGeo
32160 6d 65 74 72 79 54 72 69 67 67 65 72 73 28 29 20  metryTriggers() 
32170 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20  error: argument 
32180 32 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20  2 [column_name] 
32190 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74  is not of the St
321a0 72 69 6e 67 20 74 79 70 65 5c 6e 22 29 3b 0a 09  ring type\n");..
321b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
321c0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
321d0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
321e0 20 20 20 20 7d 0a 20 20 20 20 63 6f 6c 75 6d 6e      }.    column
321f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
32200 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
32210 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
32220 20 20 20 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e      sql_statemen
32230 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72  t =..sqlite3_mpr
32240 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20 66 5f  intf ("SELECT f_
32250 74 61 62 6c 65 5f 6e 61 6d 65 20 46 52 4f 4d 20  table_name FROM 
32260 67 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 73  geometry_columns
32270 20 22 0a 09 09 09 20 22 57 48 45 52 45 20 55 70   ".... "WHERE Up
32280 70 65 72 28 66 5f 74 61 62 6c 65 5f 6e 61 6d 65  per(f_table_name
32290 29 20 3d 20 55 70 70 65 72 28 25 51 29 20 41 4e  ) = Upper(%Q) AN
322a0 44 20 55 70 70 65 72 28 66 5f 67 65 6f 6d 65 74  D Upper(f_geomet
322b0 72 79 5f 63 6f 6c 75 6d 6e 29 20 3d 20 55 70 70  ry_column) = Upp
322c0 65 72 20 28 25 51 29 22 2c 0a 09 09 09 20 74 61  er (%Q)",.... ta
322d0 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a 20 20  ble, column);.  
322e0 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
322f0 67 65 74 5f 74 61 62 6c 65 20 28 73 71 6c 69 74  get_table (sqlit
32300 65 2c 20 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74  e, sql_statement
32310 2c 20 26 72 65 73 75 6c 74 73 2c 20 26 72 6f 77  , &results, &row
32320 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c 0a 09 09 09  s, &columns,....
32330 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20       NULL);.    
32340 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71  sqlite3_free (sq
32350 6c 5f 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  l_statement);.  
32360 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c    if (ret != SQL
32370 49 54 45 5f 4f 4b 29 0a 09 67 6f 74 6f 20 65 72  ITE_OK)..goto er
32380 72 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ror;.    sqlite3
32390 5f 66 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73  _free_table (res
323a0 75 6c 74 73 29 3b 0a 20 20 20 20 69 66 20 28 72  ults);.    if (r
323b0 6f 77 73 20 3c 3d 20 30 29 0a 20 20 20 20 20 20  ows <= 0).      
323c0 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
323d0 65 0a 09 20 20 20 20 20 20 28 22 52 65 62 75 69  e..      ("Rebui
323e0 6c 64 47 65 6f 6d 65 74 72 79 54 72 69 67 67 65  ldGeometryTrigge
323f0 72 73 28 29 20 65 72 72 6f 72 3a 20 5c 22 25 73  rs() error: \"%s
32400 5c 22 2e 5c 22 25 73 5c 22 20 69 73 6e 27 74 20  \".\"%s\" isn't 
32410 61 20 47 65 6f 6d 65 74 72 79 20 63 6f 6c 75 6d  a Geometry colum
32420 6e 5c 6e 22 2c 0a 09 20 20 20 20 20 20 20 74 61  n\n",..       ta
32430 62 6c 65 2c 20 63 6f 6c 75 6d 6e 29 3b 0a 09 20  ble, column);.. 
32440 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
32450 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
32460 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
32470 20 20 20 7d 0a 20 20 20 20 75 70 64 61 74 65 47     }.    updateG
32480 65 6f 6d 65 74 72 79 54 72 69 67 67 65 72 73 20  eometryTriggers 
32490 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 2c 20  (sqlite, table, 
324a0 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  column);.    sql
324b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
324c0 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
324d0 20 20 75 70 64 61 74 65 53 70 61 74 69 61 4c 69    updateSpatiaLi
324e0 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c 69 74  teHistory (sqlit
324f0 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e  e, table, column
32500 2c 0a 09 09 09 20 20 20 20 20 22 47 65 6f 6d 65  ,....     "Geome
32510 74 72 79 20 54 72 69 67 67 65 72 73 20 73 75 63  try Triggers suc
32520 63 65 73 73 66 75 6c 6c 79 20 72 65 62 75 69 6c  cessfully rebuil
32530 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t");.    return;
32540 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 70  .  error:.    sp
32550 61 74 69 61 6c 69 74 65 5f 65 20 28 22 52 65 62  atialite_e ("Reb
32560 75 69 6c 64 47 65 6f 6d 65 74 72 79 54 72 69 67  uildGeometryTrig
32570 67 65 72 73 28 29 20 65 72 72 6f 72 3a 20 5c 22  gers() error: \"
32580 25 73 5c 22 5c 6e 22 2c 20 65 72 72 4d 73 67 29  %s\"\n", errMsg)
32590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
325a0 65 65 20 28 65 72 72 4d 73 67 29 3b 0a 20 20 20  ee (errMsg);.   
325b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
325c0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
325d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ;.    return;.}.
325e0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
325f0 74 5f 55 70 64 61 74 65 4c 61 79 65 72 53 74 61  t_UpdateLayerSta
32600 74 69 73 74 69 63 73 20 28 73 71 6c 69 74 65 33  tistics (sqlite3
32610 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
32620 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
32630 09 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
32640 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
32650 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
32660 20 55 70 64 61 74 65 4c 61 79 65 72 53 74 61 74   UpdateLayerStat
32670 69 73 74 69 63 73 28 74 61 62 6c 65 2c 20 63 6f  istics(table, co
32680 6c 75 6d 6e 20 29 0a 2f 0a 2f 20 55 70 64 61 74  lumn )././ Updat
32690 65 73 20 4c 41 59 45 52 5f 53 54 41 54 49 53 54  es LAYER_STATIST
326a0 49 43 53 20 5b 62 61 73 65 64 20 6f 6e 20 43 6f  ICS [based on Co
326b0 6c 75 6d 6e 20 61 6e 64 20 54 61 62 6c 65 5d 0a  lumn and Table].
326c0 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
326d0 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
326e0 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e  ilure.*/.    con
326f0 73 74 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20  st char *sql;.  
32700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61    const char *ta
32710 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ble = NULL;.    
32720 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
32730 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73  mn = NULL;.    s
32740 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
32750 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
32760 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
32770 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
32780 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
32790 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
327a0 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20      if (argc >= 
327b0 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  1).      {..  if
327c0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
327d0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
327e0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
327f0 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69      {...spatiali
32800 74 65 5f 65 0a 09 09 20 20 20 20 28 22 55 70 64  te_e...    ("Upd
32810 61 74 65 4c 61 79 65 72 53 74 61 74 69 73 74 69  ateLayerStatisti
32820 63 73 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  cs() error: argu
32830 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61  ment 1 [table_na
32840 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  me] is not of th
32850 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22  e String type\n"
32860 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
32870 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
32880 2c 20 30 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  , 0);...return;.
32890 09 20 20 20 20 7d 0a 09 20 20 74 61 62 6c 65 20  .    }..  table 
328a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
328b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
328c0 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
328d0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
328e0 72 67 63 20 3e 3d 20 32 29 0a 20 20 20 20 20 20  rgc >= 2).      
328f0 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
32900 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
32910 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
32920 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
32930 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20  patialite_e...  
32940 20 20 28 22 55 70 64 61 74 65 4c 61 79 65 72 53    ("UpdateLayerS
32950 74 61 74 69 73 74 69 63 73 28 29 20 65 72 72 6f  tatistics() erro
32960 72 3a 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 63  r: argument 2 [c
32970 6f 6c 75 6d 6e 5f 6e 61 6d 65 5d 20 69 73 20 6e  olumn_name] is n
32980 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67  ot of the String
32990 20 74 79 70 65 5c 6e 22 29 3b 0a 09 09 73 71 6c   type\n");...sql
329a0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
329b0 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 09  (context, 0);...
329c0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
329d0 20 20 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f 6e 73    column = (cons
329e0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
329f0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
32a00 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[1]);.      }.
32a10 20 20 20 20 69 66 20 28 21 75 70 64 61 74 65 5f      if (!update_
32a20 6c 61 79 65 72 5f 73 74 61 74 69 73 74 69 63 73  layer_statistics
32a30 20 28 73 71 6c 69 74 65 2c 20 74 61 62 6c 65 2c   (sqlite, table,
32a40 20 63 6f 6c 75 6d 6e 29 29 0a 09 67 6f 74 6f 20   column))..goto 
32a50 65 72 72 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  error;.    sqlit
32a60 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
32a70 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  ontext, 1);.    
32a80 73 71 6c 20 3d 20 22 55 70 64 61 74 65 4c 61 79  sql = "UpdateLay
32a90 65 72 53 74 61 74 69 73 74 69 63 73 22 3b 0a 20  erStatistics";. 
32aa0 20 20 20 69 66 20 28 74 61 62 6c 65 20 3d 3d 20     if (table == 
32ab0 4e 55 4c 4c 29 0a 09 74 61 62 6c 65 20 3d 20 22  NULL)..table = "
32ac0 41 4c 4c 2d 54 41 42 4c 45 53 22 3b 0a 20 20 20  ALL-TABLES";.   
32ad0 20 69 66 20 28 63 6f 6c 75 6d 6e 20 3d 3d 20 4e   if (column == N
32ae0 55 4c 4c 29 0a 09 63 6f 6c 75 6d 6e 20 3d 20 22  ULL)..column = "
32af0 41 4c 4c 2d 47 45 4f 4d 45 54 52 59 2d 43 4f 4c  ALL-GEOMETRY-COL
32b00 55 4d 4e 53 22 3b 0a 20 20 20 20 75 70 64 61 74  UMNS";.    updat
32b10 65 53 70 61 74 69 61 4c 69 74 65 48 69 73 74 6f  eSpatiaLiteHisto
32b20 72 79 20 28 73 71 6c 69 74 65 2c 20 28 63 6f 6e  ry (sqlite, (con
32b30 73 74 20 63 68 61 72 20 2a 29 20 74 61 62 6c 65  st char *) table
32b40 2c 0a 09 09 09 20 20 20 20 20 28 63 6f 6e 73 74  ,....     (const
32b50 20 63 68 61 72 20 2a 29 20 63 6f 6c 75 6d 6e 2c   char *) column,
32b60 20 73 71 6c 29 3b 0a 20 20 20 20 72 65 74 75 72   sql);.    retur
32b70 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20  n;.  error:.    
32b80 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
32b90 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
32ba0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
32bb0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
32bc0 5f 55 70 67 72 61 64 65 47 65 6f 6d 65 74 72 79  _UpgradeGeometry
32bd0 54 72 69 67 67 65 72 73 20 28 73 71 6c 69 74 65  Triggers (sqlite
32be0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
32bf0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
32c00 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
32c10 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
32c20 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
32c30 3a 0a 2f 20 55 70 67 72 61 64 65 47 65 6f 6d 65  :./ UpgradeGeome
32c40 74 72 79 54 72 69 67 67 65 72 73 28 74 72 61 6e  tryTriggers(tran
32c50 73 61 63 74 69 6f 6e 20 54 52 55 45 7c 46 41 4c  saction TRUE|FAL
32c60 53 45 29 0a 2f 0a 2f 20 55 70 67 72 61 64 65 73  SE)././ Upgrades
32c70 20 28 72 65 69 6e 73 74 61 6c 6c 73 29 20 61 6c   (reinstalls) al
32c80 6c 20 47 65 6f 6d 65 74 72 79 20 54 72 69 67 67  l Geometry Trigg
32c90 65 72 73 20 2d 20 72 65 71 75 69 72 65 73 20 61  ers - requires a
32ca0 20 44 42 20 3e 20 34 2e 30 2e 30 0a 2f 20 72 65   DB > 4.0.0./ re
32cb0 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
32cc0 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
32cd0 65 20 28 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c  e (NULL on inval
32ce0 69 64 20 61 72 67 73 29 0a 2a 2f 0a 20 20 20 20  id args).*/.    
32cf0 63 68 61 72 20 2a 65 72 72 4d 73 67 20 3d 20 4e  char *errMsg = N
32d00 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
32d10 3b 0a 20 20 20 20 69 6e 74 20 74 72 61 6e 73 61  ;.    int transa
32d20 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 73  ction = 0;.    s
32d30 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
32d40 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
32d50 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
32d60 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
32d70 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
32d80 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
32d90 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
32da0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
32db0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
32dc0 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
32dd0 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65  ..  spatialite_e
32de0 0a 09 20 20 20 20 20 20 28 22 55 70 67 72 61 64  ..      ("Upgrad
32df0 65 47 65 6f 6d 65 74 72 79 54 72 69 67 67 65 72  eGeometryTrigger
32e00 73 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d  s() error: argum
32e10 65 6e 74 20 31 20 5b 54 52 41 4e 53 41 43 54 49  ent 1 [TRANSACTI
32e20 4f 4e 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  ON] is not of th
32e30 65 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c 6e  e Integer type\n
32e40 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
32e50 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
32e60 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
32e70 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
32e80 66 20 28 63 68 65 63 6b 53 70 61 74 69 61 6c 4d  f (checkSpatialM
32e90 65 74 61 44 61 74 61 20 28 73 71 6c 69 74 65 29  etaData (sqlite)
32ea0 20 3c 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20   < 3).      {.. 
32eb0 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
32ec0 20 20 20 20 20 28 22 55 70 67 72 61 64 65 47 65       ("UpgradeGe
32ed0 6f 6d 65 74 72 79 54 72 69 67 67 65 72 73 28 29  ometryTriggers()
32ee0 20 65 72 72 6f 72 3a 20 69 6e 76 61 6c 69 64 20   error: invalid 
32ef0 44 42 20 4c 61 79 6f 75 74 20 28 3c 20 76 2e 34  DB Layout (< v.4
32f00 2e 30 2e 30 29 5c 6e 22 29 3b 0a 09 20 20 73 71  .0.0)\n");..  sq
32f10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
32f20 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09   (context, 0);..
32f30 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
32f40 7d 0a 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f  }.    transactio
32f50 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
32f60 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
32f70 0a 20 20 20 20 69 66 20 28 74 72 61 6e 73 61 63  .    if (transac
32f80 74 69 6f 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20  tion).      {.. 
32f90 20 2f 2a 20 73 74 61 72 74 69 6e 67 20 61 20 54   /* starting a T
32fa0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 20  ransaction */.. 
32fb0 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65   ret = sqlite3_e
32fc0 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 42 45  xec (sqlite, "BE
32fd0 47 49 4e 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  GIN", NULL, NULL
32fe0 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20 69  , &errMsg);..  i
32ff0 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
33000 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74 6f  _OK)..      goto
33010 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a   error;.      }.
33020 20 20 20 20 69 66 20 28 21 75 70 67 72 61 64 65      if (!upgrade
33030 47 65 6f 6d 65 74 72 79 54 72 69 67 67 65 72 73  GeometryTriggers
33040 20 28 73 71 6c 69 74 65 29 29 0a 09 67 6f 74 6f   (sqlite))..goto
33050 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 20 28   error;.    if (
33060 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 20 20 20  transaction).   
33070 20 20 20 7b 0a 09 20 20 2f 2a 20 63 6f 6d 6d 69     {..  /* commi
33080 74 74 69 6e 67 20 74 68 65 20 73 74 69 6c 6c 20  tting the still 
33090 70 65 6e 64 69 6e 67 20 54 72 61 6e 73 61 63 74  pending Transact
330a0 69 6f 6e 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20  ion */..  ret = 
330b0 73 71 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71  sqlite3_exec (sq
330c0 6c 69 74 65 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  lite, "COMMIT", 
330d0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
330e0 4d 73 67 29 3b 0a 09 20 20 69 66 20 28 72 65 74  Msg);..  if (ret
330f0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
33100 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
33110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75 70  ;.      }.    up
33120 64 61 74 65 53 70 61 74 69 61 4c 69 74 65 48 69  dateSpatiaLiteHi
33130 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c 20 22  story (sqlite, "
33140 41 4c 4c 2d 54 41 42 4c 45 53 22 2c 20 4e 55 4c  ALL-TABLES", NUL
33150 4c 2c 0a 09 09 09 20 20 20 20 20 22 55 70 67 72  L,....     "Upgr
33160 61 64 65 64 20 47 65 6f 6d 65 74 72 79 20 54 72  aded Geometry Tr
33170 69 67 67 65 72 73 22 29 3b 0a 20 20 20 20 73 71  iggers");.    sq
33180 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
33190 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20   (context, 1);. 
331a0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 65 72     return;..  er
331b0 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 74 72 61  ror:.    if (tra
331c0 6e 73 61 63 74 69 6f 6e 29 0a 20 20 20 20 20 20  nsaction).      
331d0 7b 0a 09 20 20 2f 2a 20 70 65 72 66 6f 72 6d 69  {..  /* performi
331e0 6e 67 20 61 20 52 6f 6c 6c 62 61 63 6b 20 2a 2f  ng a Rollback */
331f0 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65  ..  ret = sqlite
33200 33 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20  3_exec (sqlite, 
33210 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 4e 55 4c 4c  "ROLLBACK", NULL
33220 2c 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29  , NULL, &errMsg)
33230 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20  ;..  if (ret != 
33240 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20  SQLITE_OK)..    
33250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
33260 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  errMsg);.      }
33270 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
33280 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
33290 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
332a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
332b0 0a 66 6e 63 74 5f 47 65 74 4c 61 79 65 72 45 78  .fnct_GetLayerEx
332c0 74 65 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f  tent (sqlite3_co
332d0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
332e0 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
332f0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
33300 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
33310 69 6f 6e 3a 0a 2f 20 47 65 74 4c 61 79 65 72 45  ion:./ GetLayerE
33320 78 74 65 6e 74 28 74 61 62 6c 65 29 0a 2f 20 47  xtent(table)./ G
33330 65 74 4c 61 79 65 72 45 78 74 65 6e 74 28 74 61  etLayerExtent(ta
33340 62 6c 65 2c 20 63 6f 6c 75 6d 6e 20 29 0a 2f 20  ble, column )./ 
33350 47 65 74 4c 61 79 65 72 45 78 74 65 6e 74 28 74  GetLayerExtent(t
33360 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 70 65  able, column, pe
33370 73 73 69 6d 69 73 74 69 63 20 29 0a 2f 0a 2f 20  ssimistic )././ 
33380 52 65 74 75 72 6e 20 61 20 47 65 6f 6d 65 74 72  Return a Geometr
33390 79 20 28 45 6e 76 65 6c 6f 70 65 29 20 63 6f 72  y (Envelope) cor
333a0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
333b0 65 20 66 75 6c 6c 20 6c 61 79 65 72 0a 2f 20 65  e full layer./ e
333c0 78 74 65 6e 74 20 5b 65 76 65 6e 74 75 61 6c 6c  xtent [eventuall
333d0 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 73  y updating the s
333e0 75 70 70 6f 72 74 69 6e 67 20 73 74 61 74 69 73  upporting statis
333f0 74 69 63 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 66  tics./ NULL on f
33400 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 6f  ailure.*/.    co
33410 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65 20  nst char *table 
33420 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73  = NULL;.    cons
33430 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 20 3d  t char *column =
33440 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 70   NULL;.    int p
33450 65 73 73 69 6d 69 73 74 69 63 20 3d 20 30 3b 0a  essimistic = 0;.
33460 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
33470 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33480 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
33490 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
334a0 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20 73  lPtr geom;.    s
334b0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
334c0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
334d0 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
334e0 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67 70  ext);.    int gp
334f0 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
33500 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
33510 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
33520 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
33530 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
33540 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
33550 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
33560 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
33570 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
33580 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
33590 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
335a0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64     {..  gpkg_mod
335b0 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
335c0 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
335d0 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
335e0 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
335f0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
33600 72 67 63 20 3e 3d 20 31 29 0a 20 20 20 20 20 20  rgc >= 1).      
33610 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
33620 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
33630 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
33640 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
33650 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20  patialite_e...  
33660 20 20 28 22 47 65 74 4c 61 79 65 72 45 78 74 65    ("GetLayerExte
33670 6e 74 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  nt() error: argu
33680 6d 65 6e 74 20 31 20 5b 74 61 62 6c 65 5f 6e 61  ment 1 [table_na
33690 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  me] is not of th
336a0 65 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22  e String type\n"
336b0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
336c0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
336d0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
336e0 20 20 20 7d 0a 09 20 20 74 61 62 6c 65 20 3d 20     }..  table = 
336f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
33700 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
33710 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
33720 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
33730 63 20 3e 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a  c >= 2).      {.
33740 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
33750 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
33760 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  1]) != SQLITE_TE
33770 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61  XT)..    {...spa
33780 74 69 61 6c 69 74 65 5f 65 0a 09 09 20 20 20 20  tialite_e...    
33790 28 22 47 65 74 4c 61 79 65 72 45 78 74 65 6e 74  ("GetLayerExtent
337a0 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65  () error: argume
337b0 6e 74 20 32 20 5b 63 6f 6c 75 6d 6e 5f 6e 61 6d  nt 2 [column_nam
337c0 65 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65  e] is not of the
337d0 20 53 74 72 69 6e 67 20 74 79 70 65 5c 6e 22 29   String type\n")
337e0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
337f0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
33800 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
33810 20 20 7d 0a 09 20 20 63 6f 6c 75 6d 6e 20 3d 20    }..  column = 
33820 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
33830 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
33840 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  t (argv[1]);.   
33850 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
33860 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a  c >= 3).      {.
33870 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
33880 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
33890 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) != SQLITE_IN
338a0 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
338b0 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20  spatialite_e... 
338c0 20 20 20 28 22 47 65 74 4c 61 79 65 72 45 78 74     ("GetLayerExt
338d0 65 6e 74 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ent() error: arg
338e0 75 6d 65 6e 74 20 33 20 5b 4f 50 54 49 4d 49 53  ument 3 [OPTIMIS
338f0 54 49 43 2f 50 45 53 53 49 4d 49 53 54 49 43 5d  TIC/PESSIMISTIC]
33900 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 49   is not of the I
33910 6e 74 65 67 65 72 20 74 79 70 65 5c 6e 22 29 3b  nteger type\n");
33920 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
33930 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
33940 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
33950 20 7d 0a 09 20 20 70 65 73 73 69 6d 69 73 74 69   }..  pessimisti
33960 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  c = sqlite3_valu
33970 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b  e_int (argv[2]);
33980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f  .      }.    geo
33990 6d 20 3d 20 67 61 69 61 47 65 74 4c 61 79 65 72  m = gaiaGetLayer
339a0 45 78 74 65 6e 74 20 28 73 71 6c 69 74 65 2c 20  Extent (sqlite, 
339b0 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 70  table, column, p
339c0 65 73 73 69 6d 69 73 74 69 63 29 3b 0a 20 20 20  essimistic);.   
339d0 20 69 66 20 28 21 67 65 6f 6d 29 0a 09 67 6f 74   if (!geom)..got
339e0 6f 20 65 72 72 6f 72 3b 0a 2f 2a 20 62 75 69 6c  o error;./* buil
339f0 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d  ds the BLOB geom
33a00 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72  etry to be retur
33a10 6e 65 64 20 2a 2f 0a 20 20 20 20 67 61 69 61 54  ned */.    gaiaT
33a20 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
33a30 6b 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 70 5f  kbEx2 (geom, &p_
33a40 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70  result, &len, gp
33a50 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f  kg_mode, tiny_po
33a60 69 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  int);.    sqlite
33a70 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
33a80 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
33a90 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20  , len, free);.  
33aa0 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
33ab0 6c 6c 20 28 67 65 6f 6d 29 3b 0a 20 20 20 20 72  ll (geom);.    r
33ac0 65 74 75 72 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a  eturn;.  error:.
33ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
33ae0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
33af0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d  );.    return;.}
33b00 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
33b10 63 74 5f 49 6e 76 61 6c 69 64 61 74 65 4c 61 79  ct_InvalidateLay
33b20 65 72 53 74 61 74 69 73 74 69 63 73 20 28 73 71  erStatistics (sq
33b30 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
33b40 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
33b50 63 2c 0a 09 09 09 09 73 71 6c 69 74 65 33 5f 76  c,.....sqlite3_v
33b60 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
33b70 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
33b80 0a 2f 20 49 6e 76 61 6c 69 64 61 74 65 4c 61 79  ./ InvalidateLay
33b90 65 72 53 74 61 74 69 73 74 69 63 73 28 76 6f 69  erStatistics(voi
33ba0 64 29 0a 2f 20 49 6e 76 61 6c 69 64 61 74 65 4c  d)./ InvalidateL
33bb0 61 79 65 72 53 74 61 74 69 73 74 69 63 73 28 74  ayerStatistics(t
33bc0 61 62 6c 65 29 0a 2f 20 49 6e 76 61 6c 69 64 61  able)./ Invalida
33bd0 74 65 4c 61 79 65 72 53 74 61 74 69 73 74 69 63  teLayerStatistic
33be0 73 28 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 20  s(table, column 
33bf0 29 0a 2f 0a 2f 20 49 6d 6d 65 64 69 61 74 65 6c  )././ Immediatel
33c00 79 20 61 6e 64 20 75 6e 63 6f 6e 64 69 74 69 6f  y and unconditio
33c10 6e 61 6c 6c 79 20 69 6e 76 61 6c 69 64 61 74 65  nally invalidate
33c20 73 20 4c 61 79 65 72 20 53 74 61 74 69 73 74 69  s Layer Statisti
33c30 63 73 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f  cs./ returns 1 o
33c40 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e  n success./ 0 on
33c50 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20   failure.*/.    
33c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 3b  const char *sql;
33c70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33c80 2a 74 61 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20  *table = NULL;. 
33c90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63     const char *c
33ca0 6f 6c 75 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20  olumn = NULL;.  
33cb0 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
33cc0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
33cd0 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
33ce0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
33cf0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
33d00 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
33d10 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  */.    if (argc 
33d20 3e 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09 20  >= 1).      {.. 
33d30 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
33d40 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
33d50 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
33d60 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 61 74 69  )..    {...spati
33d70 61 6c 69 74 65 5f 65 0a 09 09 20 20 20 20 28 22  alite_e...    ("
33d80 49 6e 76 61 6c 69 64 61 74 65 4c 61 79 65 72 53  InvalidateLayerS
33d90 74 61 74 69 73 74 69 63 73 28 29 20 65 72 72 6f  tatistics() erro
33da0 72 3a 20 61 72 67 75 6d 65 6e 74 20 31 20 5b 74  r: argument 1 [t
33db0 61 62 6c 65 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f  able_name] is no
33dc0 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20  t of the String 
33dd0 74 79 70 65 5c 6e 22 29 3b 0a 09 09 73 71 6c 69  type\n");...sqli
33de0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
33df0 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 09 72  context, 0);...r
33e00 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
33e10 20 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20   table = (const 
33e20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
33e30 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
33e40 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [0]);.      }.  
33e50 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29    if (argc >= 2)
33e60 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
33e70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
33e80 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
33e90 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20  SQLITE_TEXT)..  
33ea0 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65    {...spatialite
33eb0 5f 65 0a 09 09 20 20 20 20 28 22 49 6e 76 61 6c  _e...    ("Inval
33ec0 69 64 61 74 65 4c 61 79 65 72 53 74 61 74 69 73  idateLayerStatis
33ed0 74 69 63 73 28 29 20 65 72 72 6f 72 3a 20 61 72  tics() error: ar
33ee0 67 75 6d 65 6e 74 20 32 20 5b 63 6f 6c 75 6d 6e  gument 2 [column
33ef0 5f 6e 61 6d 65 5d 20 69 73 20 6e 6f 74 20 6f 66  _name] is not of
33f00 20 74 68 65 20 53 74 72 69 6e 67 20 74 79 70 65   the String type
33f10 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  \n");...sqlite3_
33f20 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
33f30 65 78 74 2c 20 30 29 3b 0a 09 09 72 65 74 75 72  ext, 0);...retur
33f40 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 63 6f 6c  n;..    }..  col
33f50 75 6d 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  umn = (const cha
33f60 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
33f70 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
33f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  );.      }.    i
33f90 66 20 28 21 67 61 69 61 53 74 61 74 69 73 74 69  f (!gaiaStatisti
33fa0 63 73 49 6e 76 61 6c 69 64 61 74 65 20 28 73 71  csInvalidate (sq
33fb0 6c 69 74 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c  lite, table, col
33fc0 75 6d 6e 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f  umn))..goto erro
33fd0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  r;.    sqlite3_r
33fe0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
33ff0 78 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 20  xt, 1);.    sql 
34000 3d 20 22 49 6e 76 61 6c 69 64 61 74 65 4c 61 79  = "InvalidateLay
34010 65 72 53 74 61 74 69 73 74 69 63 73 22 3b 0a 20  erStatistics";. 
34020 20 20 20 69 66 20 28 74 61 62 6c 65 20 3d 3d 20     if (table == 
34030 4e 55 4c 4c 29 0a 09 74 61 62 6c 65 20 3d 20 22  NULL)..table = "
34040 41 4c 4c 2d 54 41 42 4c 45 53 22 3b 0a 20 20 20  ALL-TABLES";.   
34050 20 69 66 20 28 63 6f 6c 75 6d 6e 20 3d 3d 20 4e   if (column == N
34060 55 4c 4c 29 0a 09 63 6f 6c 75 6d 6e 20 3d 20 22  ULL)..column = "
34070 41 4c 4c 2d 47 45 4f 4d 45 54 52 59 2d 43 4f 4c  ALL-GEOMETRY-COL
34080 55 4d 4e 53 22 3b 0a 20 20 20 20 75 70 64 61 74  UMNS";.    updat
34090 65 53 70 61 74 69 61 4c 69 74 65 48 69 73 74 6f  eSpatiaLiteHisto
340a0 72 79 20 28 73 71 6c 69 74 65 2c 20 28 63 6f 6e  ry (sqlite, (con
340b0 73 74 20 63 68 61 72 20 2a 29 20 74 61 62 6c 65  st char *) table
340c0 2c 0a 09 09 09 20 20 20 20 20 28 63 6f 6e 73 74  ,....     (const
340d0 20 63 68 61 72 20 2a 29 20 63 6f 6c 75 6d 6e 2c   char *) column,
340e0 20 73 71 6c 29 3b 0a 20 20 20 20 72 65 74 75 72   sql);.    retur
340f0 6e 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20  n;.  error:.    
34100 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
34110 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
34120 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
34130 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
34140 5f 43 72 65 61 74 65 52 61 73 74 65 72 43 6f 76  _CreateRasterCov
34150 65 72 61 67 65 73 54 61 62 6c 65 20 28 73 71 6c  eragesTable (sql
34160 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
34170 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
34180 2c 0a 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76  ,..... sqlite3_v
34190 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
341a0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
341b0 0a 2f 20 43 72 65 61 74 65 52 61 73 74 65 72 43  ./ CreateRasterC
341c0 6f 76 65 72 61 67 65 73 54 61 62 6c 65 28 29 0a  overagesTable().
341d0 2f 0a 2f 20 63 72 65 61 74 65 73 20 74 68 65 20  /./ creates the 
341e0 6d 61 69 6e 20 52 61 73 74 65 72 43 6f 76 65 72  main RasterCover
341f0 61 67 65 73 20 74 61 62 6c 65 20 0a 2f 20 72 65  ages table ./ re
34200 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
34210 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
34220 65 0a 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e.*/.    sqlite3
34230 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
34240 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
34250 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
34260 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
34270 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
34280 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20 20 20 69  L_LINE */..    i
34290 66 20 28 21 63 72 65 61 74 65 52 61 73 74 65 72  f (!createRaster
342a0 43 6f 76 65 72 61 67 65 73 54 61 62 6c 65 20 28  CoveragesTable (
342b0 73 71 6c 69 74 65 29 29 0a 09 67 6f 74 6f 20 65  sqlite))..goto e
342c0 72 72 6f 72 3b 0a 20 20 20 20 75 70 64 61 74 65  rror;.    update
342d0 53 70 61 74 69 61 4c 69 74 65 48 69 73 74 6f 72  SpatiaLiteHistor
342e0 79 20 28 73 71 6c 69 74 65 2c 20 22 2a 2a 2a 20  y (sqlite, "*** 
342f0 52 61 73 74 65 72 20 43 6f 76 65 72 61 67 65 73  Raster Coverages
34300 20 2a 2a 2a 22 2c 20 4e 55 4c 4c 2c 0a 09 09 09   ***", NULL,....
34310 20 20 20 20 20 22 4d 61 69 6e 20 74 61 62 6c 65       "Main table
34320 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72   successfully cr
34330 65 61 74 65 64 22 29 3b 0a 20 20 20 20 73 71 6c  eated");.    sql
34340 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
34350 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
34360 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 65 72 72    return;..  err
34370 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  or:.    sqlite3_
34380 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
34390 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ext, 0);.    ret
343a0 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  urn;.}..static v
343b0 6f 69 64 0a 66 6e 63 74 5f 43 72 65 61 74 65 56  oid.fnct_CreateV
343c0 65 63 74 6f 72 43 6f 76 65 72 61 67 65 73 54 61  ectorCoveragesTa
343d0 62 6c 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f  bles (sqlite3_co
343e0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
343f0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20   int argc,..... 
34400 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
34410 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
34420 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 72 65   function:./ Cre
34430 61 74 65 56 65 63 74 6f 72 43 6f 76 65 72 61 67  ateVectorCoverag
34440 65 73 54 61 62 6c 65 73 28 29 0a 2f 0a 2f 20 63  esTables()././ c
34450 72 65 61 74 65 73 20 74 68 65 20 6d 61 69 6e 20  reates the main 
34460 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 73 20  VectorCoverages 
34470 74 61 62 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73  table ./ returns
34480 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
34490 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a  0 on failure.*/.
344a0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
344b0 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
344c0 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
344d0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
344e0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
344f0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
34500 45 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 63  E */..    if (!c
34510 72 65 61 74 65 56 65 63 74 6f 72 43 6f 76 65 72  reateVectorCover
34520 61 67 65 73 54 61 62 6c 65 20 28 73 71 6c 69 74  agesTable (sqlit
34530 65 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  e))..goto error;
34540 0a 20 20 20 20 75 70 64 61 74 65 53 70 61 74 69  .    updateSpati
34550 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73 71  aLiteHistory (sq
34560 6c 69 74 65 2c 20 22 2a 2a 2a 20 56 65 63 74 6f  lite, "*** Vecto
34570 72 20 43 6f 76 65 72 61 67 65 73 20 2a 2a 2a 22  r Coverages ***"
34580 2c 20 4e 55 4c 4c 2c 0a 09 09 09 20 20 20 20 20  , NULL,....     
34590 22 4d 61 69 6e 20 74 61 62 6c 65 20 73 75 63 63  "Main table succ
345a0 65 73 73 66 75 6c 6c 79 20 63 72 65 61 74 65 64  essfully created
345b0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
345c0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
345d0 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 72 65 74  ext, 1);.    ret
345e0 75 72 6e 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20  urn;..  error:. 
345f0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
34600 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
34610 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
34620 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
34630 6e 63 74 5f 43 72 65 61 74 65 57 4d 53 54 61 62  nct_CreateWMSTab
34640 6c 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  les (sqlite3_con
34650 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
34660 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20  int argc,...    
34670 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
34680 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
34690 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57 4d  L function:./ WM
346a0 53 5f 43 72 65 61 74 65 54 61 62 6c 65 73 28 29  S_CreateTables()
346b0 0a 2f 0a 2f 20 63 72 65 61 74 65 73 20 74 68 65  ././ creates the
346c0 20 57 4d 53 20 73 75 70 70 6f 72 74 20 74 61 62   WMS support tab
346d0 6c 65 73 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  les./ returns 1 
346e0 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
346f0 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20  n failure.*/.   
34700 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
34710 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
34720 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
34730 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
34740 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
34750 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
34760 2f 0a 0a 20 20 20 20 69 66 20 28 21 63 72 65 61  /..    if (!crea
34770 74 65 57 4d 53 54 61 62 6c 65 73 20 28 73 71 6c  teWMSTables (sql
34780 69 74 65 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f  ite))..goto erro
34790 72 3b 0a 20 20 20 20 75 70 64 61 74 65 53 70 61  r;.    updateSpa
347a0 74 69 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28  tiaLiteHistory (
347b0 73 71 6c 69 74 65 2c 20 22 2a 2a 2a 20 57 4d 53  sqlite, "*** WMS
347c0 20 2a 2a 2a 22 2c 20 4e 55 4c 4c 2c 0a 09 09 09   ***", NULL,....
347d0 20 20 20 20 20 22 53 75 70 70 6f 72 74 20 74 61       "Support ta
347e0 62 6c 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  bles successfull
347f0 79 20 63 72 65 61 74 65 64 22 29 3b 0a 20 20 20  y created");.   
34800 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
34810 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29  int (context, 1)
34820 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20  ;.    return;.. 
34830 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69   error:.    sqli
34840 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
34850 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  context, 0);.   
34860 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74   return;.}..stat
34870 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67  ic void.fnct_Reg
34880 69 73 74 65 72 57 4d 53 47 65 74 43 61 70 61 62  isterWMSGetCapab
34890 69 6c 69 74 69 65 73 20 28 73 71 6c 69 74 65 33  ilities (sqlite3
348a0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
348b0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
348c0 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .. sqlite3_value
348d0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
348e0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57  QL function:./ W
348f0 4d 53 5f 52 65 67 69 73 74 65 72 47 65 74 43 61  MS_RegisterGetCa
34900 70 61 62 69 6c 69 74 69 65 73 28 54 65 78 74 20  pabilities(Text 
34910 75 72 6c 29 0a 2f 20 20 20 6f 72 0a 2f 20 57 4d  url)./   or./ WM
34920 53 5f 52 65 67 69 73 74 65 72 47 65 74 43 61 70  S_RegisterGetCap
34930 61 62 69 6c 69 74 69 65 73 28 54 65 78 74 20 75  abilities(Text u
34940 72 6c 2c 20 54 65 78 74 20 74 69 74 6c 65 2c 0a  rl, Text title,.
34950 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
34960 20 20 20 20 20 20 20 20 20 54 65 78 74 20 61 62           Text ab
34970 73 74 72 61 63 74 29 0a 2f 0a 2f 20 69 6e 73 65  stract)././ inse
34980 72 74 73 20 61 20 57 4d 53 20 47 65 74 43 61 70  rts a WMS GetCap
34990 61 62 69 6c 69 74 69 65 73 0a 2f 20 72 65 74 75  abilities./ retu
349a0 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
349b0 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c  ./ 0 on failure,
349c0 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61   -1 on invalid a
349d0 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
349e0 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e  int ret;.    con
349f0 73 74 20 63 68 61 72 20 2a 75 72 6c 3b 0a 20 20  st char *url;.  
34a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69    const char *ti
34a10 74 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tle = NULL;.    
34a20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 62 73 74  const char *abst
34a30 72 61 63 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ract = NULL;.   
34a40 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
34a50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
34a60 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
34a70 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
34a80 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
34a90 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
34aa0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
34ab0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
34ac0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
34ad0 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
34ae0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
34af0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
34b00 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
34b10 20 20 20 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d       }.    url =
34b20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
34b30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
34b40 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
34b50 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 33 29    if (argc >= 3)
34b60 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
34b70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
34b80 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
34b90 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 20 20 20  SQLITE_TEXT..   
34ba0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61     || sqlite3_va
34bb0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
34bc0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
34bd0 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  T)..    {...sqli
34be0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
34bf0 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09  context, -1);...
34c00 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
34c10 20 20 74 69 74 6c 65 20 3d 20 28 63 6f 6e 73 74    title = (const
34c20 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
34c30 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
34c40 76 5b 31 5d 29 3b 0a 09 20 20 61 62 73 74 72 61  v[1]);..  abstra
34c50 63 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ct = (const char
34c60 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
34c70 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29  e_text (argv[2])
34c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65  ;.      }.    re
34c90 74 20 3d 20 72 65 67 69 73 74 65 72 5f 77 6d 73  t = register_wms
34ca0 5f 67 65 74 63 61 70 61 62 69 6c 69 74 69 65 73  _getcapabilities
34cb0 20 28 73 71 6c 69 74 65 2c 20 75 72 6c 2c 20 74   (sqlite, url, t
34cc0 69 74 6c 65 2c 20 61 62 73 74 72 61 63 74 29 3b  itle, abstract);
34cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
34ce0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
34cf0 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  , ret);.}..stati
34d00 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e 72 65  c void.fnct_Unre
34d10 67 69 73 74 65 72 57 4d 53 47 65 74 43 61 70 61  gisterWMSGetCapa
34d20 62 69 6c 69 74 69 65 73 20 28 73 71 6c 69 74 65  bilities (sqlite
34d30 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
34d40 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
34d50 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ...   sqlite3_va
34d60 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
34d70 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
34d80 2f 20 57 4d 53 5f 55 6e 52 65 67 69 73 74 65 72  / WMS_UnRegister
34d90 47 65 74 43 61 70 61 62 69 6c 69 74 69 65 73 28  GetCapabilities(
34da0 54 65 78 74 20 75 72 6c 29 0a 2f 0a 2f 20 64 65  Text url)././ de
34db0 6c 65 74 65 73 20 61 20 57 4d 53 20 47 65 74 43  letes a WMS GetC
34dc0 61 70 61 62 69 6c 69 74 69 65 73 20 28 61 6e 64  apabilities (and
34dd0 20 61 6c 6c 20 72 65 6c 61 74 65 64 20 63 68 69   all related chi
34de0 6c 64 72 65 6e 29 0a 2f 20 72 65 74 75 72 6e 73  ldren)./ returns
34df0 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
34e00 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31  0 on failure, -1
34e10 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
34e20 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74  ments.*/.    int
34e30 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20   ret;.    const 
34e40 63 68 61 72 20 2a 75 72 6c 3b 0a 20 20 20 20 73  char *url;.    s
34e50 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
34e60 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
34e70 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
34e80 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
34e90 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
34ea0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
34eb0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
34ec0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
34ed0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [0]) != SQLITE_T
34ee0 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
34ef0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
34f00 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
34f10 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
34f20 20 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d 20 28     }.    url = (
34f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
34f40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
34f50 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
34f60 72 65 74 20 3d 20 75 6e 72 65 67 69 73 74 65 72  ret = unregister
34f70 5f 77 6d 73 5f 67 65 74 63 61 70 61 62 69 6c 69  _wms_getcapabili
34f80 74 69 65 73 20 28 73 71 6c 69 74 65 2c 20 75 72  ties (sqlite, ur
34f90 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
34fa0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
34fb0 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74  ext, ret);.}..st
34fc0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53  atic void.fnct_S
34fd0 65 74 57 4d 53 47 65 74 43 61 70 61 62 69 6c 69  etWMSGetCapabili
34fe0 74 69 65 73 49 6e 66 6f 73 20 28 73 71 6c 69 74  tiesInfos (sqlit
34ff0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
35000 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
35010 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c  .... sqlite3_val
35020 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
35030 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
35040 20 57 4d 53 5f 53 65 74 47 65 74 43 61 70 61 62   WMS_SetGetCapab
35050 69 6c 69 74 69 65 73 49 6e 66 6f 73 28 54 65 78  ilitiesInfos(Tex
35060 74 20 75 72 6c 2c 20 54 65 78 74 20 74 69 74 6c  t url, Text titl
35070 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e,./            
35080 20 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74              Text
35090 20 61 62 73 74 72 61 63 74 29 0a 2f 0a 2f 20 75   abstract)././ u
350a0 70 64 61 74 65 73 20 74 68 65 20 64 65 73 63 72  pdates the descr
350b0 69 70 74 69 76 65 20 69 6e 66 6f 73 20 73 75 70  iptive infos sup
350c0 70 6f 72 74 69 6e 67 20 61 20 57 4d 53 20 47 65  porting a WMS Ge
350d0 74 43 61 70 61 62 69 6c 69 74 69 65 73 0a 2f 20  tCapabilities./ 
350e0 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
350f0 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
35100 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c  ure, -1 on inval
35110 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
35120 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
35130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 72 6c   const char *url
35140 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
35150 20 2a 74 69 74 6c 65 20 3d 20 4e 55 4c 4c 3b 0a   *title = NULL;.
35160 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35170 61 62 73 74 72 61 63 74 20 3d 20 4e 55 4c 4c 3b  abstract = NULL;
35180 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
35190 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
351a0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
351b0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
351c0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
351d0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
351e0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
351f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
35200 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
35210 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
35220 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
35230 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
35240 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
35250 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
35260 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51   (argv[2]) != SQ
35270 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
35280 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
35290 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
352a0 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
352b0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75  n;.      }.    u
352c0 72 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rl = (const char
352d0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
352e0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
352f0 3b 0a 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63  ;.    title = (c
35300 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
35310 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
35320 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 61  (argv[1]);.    a
35330 62 73 74 72 61 63 74 20 3d 20 28 63 6f 6e 73 74  bstract = (const
35340 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
35350 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
35360 76 5b 32 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d  v[2]);.    ret =
35370 20 73 65 74 5f 77 6d 73 5f 67 65 74 63 61 70 61   set_wms_getcapa
35380 62 69 6c 69 74 69 65 73 5f 69 6e 66 6f 73 20 28  bilities_infos (
35390 73 71 6c 69 74 65 2c 20 75 72 6c 2c 20 74 69 74  sqlite, url, tit
353a0 6c 65 2c 20 61 62 73 74 72 61 63 74 29 3b 0a 20  le, abstract);. 
353b0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
353c0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
353d0 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
353e0 69 6e 74 0a 76 61 6c 69 64 61 74 65 5f 77 6d 73  int.validate_wms
353f0 5f 62 67 63 6f 6c 6f 72 20 28 63 6f 6e 73 74 20  _bgcolor (const 
35400 63 68 61 72 20 2a 62 67 63 6f 6c 6f 72 29 0a 7b  char *bgcolor).{
35410 0a 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20  ./* testing for 
35420 61 20 76 61 6c 69 64 20 48 65 78 52 47 42 20 63  a valid HexRGB c
35430 6f 6c 6f 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20  olor value */.  
35440 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20    const char *p 
35450 3d 20 62 67 63 6f 6c 6f 72 3b 0a 20 20 20 20 69  = bgcolor;.    i
35460 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20  nt len = strlen 
35470 28 62 67 63 6f 6c 6f 72 29 3b 0a 20 20 20 20 69  (bgcolor);.    i
35480 66 20 28 6c 65 6e 20 21 3d 20 36 29 0a 09 72 65  f (len != 6)..re
35490 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
354a0 65 20 28 2a 70 20 21 3d 20 27 5c 30 27 29 0a 20  e (*p != '\0'). 
354b0 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20 6f 6b       {..  int ok
354c0 20 3d 20 30 3b 0a 09 20 20 69 66 20 28 2a 70 20   = 0;..  if (*p 
354d0 3e 3d 20 27 61 27 20 26 26 20 2a 70 20 3c 3d 20  >= 'a' && *p <= 
354e0 27 66 27 29 0a 09 20 20 20 20 20 20 6f 6b 20 3d  'f')..      ok =
354f0 20 31 3b 0a 09 20 20 69 66 20 28 2a 70 20 3e 3d   1;..  if (*p >=
35500 20 27 41 27 20 26 26 20 2a 70 20 3c 3d 20 27 46   'A' && *p <= 'F
35510 27 29 0a 09 20 20 20 20 20 20 6f 6b 20 3d 20 31  ')..      ok = 1
35520 3b 0a 09 20 20 69 66 20 28 2a 70 20 3e 3d 20 27  ;..  if (*p >= '
35530 30 27 20 26 26 20 2a 70 20 3c 3d 20 27 39 27 29  0' && *p <= '9')
35540 0a 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a  ..      ok = 1;.
35550 09 20 20 69 66 20 28 21 6f 6b 29 0a 09 20 20 20  .  if (!ok)..   
35560 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 20 20     return 0;..  
35570 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
35580 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74   return 1;.}..st
35590 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52  atic void.fnct_R
355a0 65 67 69 73 74 65 72 57 4d 53 47 65 74 4d 61 70  egisterWMSGetMap
355b0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
355c0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
355d0 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65   argc,....sqlite
355e0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
355f0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
35600 6f 6e 3a 0a 2f 20 57 4d 53 5f 52 65 67 69 73 74  on:./ WMS_Regist
35610 65 72 47 65 74 4d 61 70 28 54 65 78 74 20 67 65  erGetMap(Text ge
35620 74 63 61 70 61 62 69 6c 69 74 69 74 65 73 5f 75  tcapabilitites_u
35630 72 6c 2c 20 54 65 78 74 20 67 65 74 6d 61 70 5f  rl, Text getmap_
35640 75 72 6c 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  url,./          
35650 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20 6c            Text l
35660 61 79 65 72 5f 6e 61 6d 65 2c 20 54 65 78 74 20  ayer_name, Text 
35670 76 65 72 73 69 6f 6e 2c 20 54 65 78 74 20 72 65  version, Text re
35680 66 5f 73 79 73 2c 0a 2f 20 20 20 20 20 20 20 20  f_sys,./        
35690 20 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74              Text
356a0 20 69 6d 61 67 65 5f 66 6f 72 6d 61 74 2c 20 54   image_format, T
356b0 65 78 74 20 73 74 79 6c 65 2c 20 49 6e 74 20 74  ext style, Int t
356c0 72 61 6e 73 70 61 72 65 6e 74 2c 0a 2f 20 20 20  ransparent,./   
356d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356e0 20 49 6e 74 20 66 6c 69 70 5f 61 78 65 73 29 0a   Int flip_axes).
356f0 2f 20 20 20 6f 72 0a 2f 20 57 4d 53 5f 52 65 67  /   or./ WMS_Reg
35700 69 73 74 65 72 47 65 74 4d 61 70 28 54 65 78 74  isterGetMap(Text
35710 20 67 65 74 63 61 70 61 62 69 6c 69 74 69 74 65   getcapabilitite
35720 73 5f 75 72 6c 2c 20 54 65 78 74 20 67 65 74 6d  s_url, Text getm
35730 61 70 5f 75 72 6c 2c 0a 2f 20 20 20 20 20 20 20  ap_url,./       
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 54 65 78               Tex
35750 74 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 54 65  t layer_name, Te
35760 78 74 20 76 65 72 73 69 6f 6e 2c 20 54 65 78 74  xt version, Text
35770 20 72 65 66 5f 73 79 73 2c 0a 2f 20 20 20 20 20   ref_sys,./     
35780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
35790 65 78 74 20 69 6d 61 67 65 5f 66 6f 72 6d 61 74  ext image_format
357a0 2c 20 54 65 78 74 20 73 74 79 6c 65 2c 20 49 6e  , Text style, In
357b0 74 20 74 72 61 6e 73 70 61 72 65 6e 74 2c 0a 2f  t transparent,./
357c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357d0 20 20 20 20 49 6e 74 20 66 6c 69 70 5f 61 78 65      Int flip_axe
357e0 73 2c 20 20 49 6e 74 20 74 69 6c 65 64 2c 20 49  s,  Int tiled, I
357f0 6e 74 20 63 61 63 68 65 64 2c 20 0a 2f 20 20 20  nt cached, ./   
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35810 20 49 6e 74 20 74 69 6c 65 5f 77 69 64 74 68 2c   Int tile_width,
35820 20 49 6e 74 20 74 69 6c 65 5f 68 65 69 67 68 74   Int tile_height
35830 29 0a 2f 20 20 20 6f 72 0a 2f 20 57 4d 53 5f 52  )./   or./ WMS_R
35840 65 67 69 73 74 65 72 47 65 74 4d 61 70 28 54 65  egisterGetMap(Te
35850 78 74 20 67 65 74 63 61 70 61 62 69 6c 69 74 69  xt getcapabiliti
35860 74 65 73 5f 75 72 6c 2c 20 54 65 78 74 20 67 65  tes_url, Text ge
35870 74 6d 61 70 5f 75 72 6c 2c 0a 2f 20 20 20 20 20  tmap_url,./     
35880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
35890 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20  ext layer_name, 
358a0 54 65 78 74 20 74 69 74 6c 65 2c 20 54 65 78 74  Text title, Text
358b0 20 61 62 73 74 72 61 63 74 2c 0a 2f 20 20 20 20   abstract,./    
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358d0 54 65 78 74 20 76 65 72 73 69 6f 6e 2c 20 54 65  Text version, Te
358e0 78 74 20 72 65 66 5f 73 79 73 2c 20 54 65 78 74  xt ref_sys, Text
358f0 20 69 6d 61 67 65 5f 66 6f 72 6d 61 74 2c 0a 2f   image_format,./
35900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35910 20 20 20 20 54 65 78 74 20 73 74 79 6c 65 2c 20      Text style, 
35920 49 6e 74 20 74 72 61 6e 73 70 61 72 65 6e 74 2c  Int transparent,
35930 20 49 6e 74 20 66 6c 69 70 5f 61 78 65 73 2c 0a   Int flip_axes,.
35940 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35950 20 20 20 20 20 49 6e 74 20 74 69 6c 65 64 2c 20       Int tiled, 
35960 49 6e 74 20 63 61 63 68 65 64 2c 20 49 6e 74 20  Int cached, Int 
35970 74 69 6c 65 5f 77 69 64 74 68 2c 20 0a 2f 20 20  tile_width, ./  
35980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35990 20 20 49 6e 74 20 74 69 6c 65 5f 68 65 69 67 68    Int tile_heigh
359a0 74 2c 20 54 65 78 74 20 62 67 63 6f 6c 6f 72 2c  t, Text bgcolor,
359b0 20 49 6e 74 20 69 73 5f 71 75 65 72 79 61 62 6c   Int is_queryabl
359c0 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e,./            
359d0 20 20 20 20 20 20 20 20 54 65 78 74 20 67 65 74          Text get
359e0 66 65 61 74 75 72 65 69 6e 66 6f 5f 75 72 6c 29  featureinfo_url)
359f0 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61 20 57  ././ inserts a W
35a00 4d 53 20 47 65 74 4d 61 70 0a 2f 20 72 65 74 75  MS GetMap./ retu
35a10 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
35a20 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c  ./ 0 on failure,
35a30 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61   -1 on invalid a
35a40 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
35a50 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e  int ret;.    con
35a60 73 74 20 63 68 61 72 20 2a 67 65 74 63 61 70 61  st char *getcapa
35a70 62 69 6c 69 74 69 65 73 5f 75 72 6c 3b 0a 20 20  bilities_url;.  
35a80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 67 65    const char *ge
35a90 74 6d 61 70 5f 75 72 6c 3b 0a 20 20 20 20 63 6f  tmap_url;.    co
35aa0 6e 73 74 20 63 68 61 72 20 2a 6c 61 79 65 72 5f  nst char *layer_
35ab0 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  name;.    const 
35ac0 63 68 61 72 20 2a 74 69 74 6c 65 20 3d 20 4e 55  char *title = NU
35ad0 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  LL;.    const ch
35ae0 61 72 20 2a 61 62 73 74 72 61 63 74 20 3d 20 4e  ar *abstract = N
35af0 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ULL;.    const c
35b00 68 61 72 20 2a 76 65 72 73 69 6f 6e 3b 0a 20 20  har *version;.  
35b10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65    const char *re
35b20 66 5f 73 79 73 3b 0a 20 20 20 20 63 6f 6e 73 74  f_sys;.    const
35b30 20 63 68 61 72 20 2a 69 6d 61 67 65 5f 66 6f 72   char *image_for
35b40 6d 61 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  mat;.    const c
35b50 68 61 72 20 2a 73 74 79 6c 65 3b 0a 20 20 20 20  har *style;.    
35b60 69 6e 74 20 74 72 61 6e 73 70 61 72 65 6e 74 3b  int transparent;
35b70 0a 20 20 20 20 69 6e 74 20 66 6c 69 70 5f 61 78  .    int flip_ax
35b80 65 73 3b 0a 20 20 20 20 69 6e 74 20 74 69 6c 65  es;.    int tile
35b90 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 63  d = 0;.    int c
35ba0 61 63 68 65 64 20 3d 20 30 3b 0a 20 20 20 20 69  ached = 0;.    i
35bb0 6e 74 20 74 69 6c 65 5f 77 69 64 74 68 20 3d 20  nt tile_width = 
35bc0 35 31 32 3b 0a 20 20 20 20 69 6e 74 20 74 69 6c  512;.    int til
35bd0 65 5f 68 65 69 67 68 74 20 3d 20 35 31 32 3b 0a  e_height = 512;.
35be0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35bf0 62 67 63 6f 6c 6f 72 20 3d 20 4e 55 4c 4c 3b 0a  bgcolor = NULL;.
35c00 20 20 20 20 69 6e 74 20 69 73 5f 71 75 65 72 79      int is_query
35c10 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f  able = 0;.    co
35c20 6e 73 74 20 63 68 61 72 20 2a 67 65 74 66 65 61  nst char *getfea
35c30 74 75 72 65 69 6e 66 6f 5f 75 72 6c 20 3d 20 4e  tureinfo_url = N
35c40 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ULL;.    sqlite3
35c50 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
35c60 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
35c70 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
35c80 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
35c90 28 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ();.    if (sqli
35ca0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
35cb0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
35cc0 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69  TE_TEXT..|| sqli
35cd0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
35ce0 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
35cf0 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69  TE_TEXT..|| sqli
35d00 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
35d10 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49  argv[2]) != SQLI
35d20 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
35d30 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
35d40 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
35d50 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
35d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 74  .      }.    get
35d70 63 61 70 61 62 69 6c 69 74 69 65 73 5f 75 72 6c  capabilities_url
35d80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
35d90 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
35da0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
35db0 20 20 20 20 67 65 74 6d 61 70 5f 75 72 6c 20 3d      getmap_url =
35dc0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
35dd0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
35de0 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  xt (argv[1]);.  
35df0 20 20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d 20 28    layer_name = (
35e00 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
35e10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
35e20 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20   (argv[2]);.    
35e30 69 66 20 28 61 72 67 63 20 3d 3d 20 39 20 7c 7c  if (argc == 9 ||
35e40 20 61 72 67 63 20 3d 3d 20 31 33 29 0a 20 20 20   argc == 13).   
35e50 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
35e60 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
35e70 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49  argv[3]) != SQLI
35e80 54 45 5f 54 45 58 54 20 7c 7c 0a 09 20 20 20 20  TE_TEXT ||..    
35e90 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
35ea0 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21  type (argv[4]) !
35eb0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  = SQLITE_TEXT ||
35ec0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
35ed0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
35ee0 5b 35 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [5]) != SQLITE_T
35ef0 45 58 54 20 7c 7c 0a 09 20 20 20 20 20 20 73 71  EXT ||..      sq
35f00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
35f10 20 28 61 72 67 76 5b 36 5d 29 20 21 3d 20 53 51   (argv[6]) != SQ
35f20 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20  LITE_TEXT)..    
35f30 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
35f40 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
35f50 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a   -1);...return;.
35f60 09 20 20 20 20 7d 0a 09 20 20 76 65 72 73 69 6f  .    }..  versio
35f70 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  n = (const char 
35f80 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
35f90 5f 74 65 78 74 20 28 61 72 67 76 5b 33 5d 29 3b  _text (argv[3]);
35fa0 0a 09 20 20 72 65 66 5f 73 79 73 20 3d 20 28 63  ..  ref_sys = (c
35fb0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
35fc0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
35fd0 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20 20 69 6d  (argv[4]);..  im
35fe0 61 67 65 5f 66 6f 72 6d 61 74 20 3d 20 28 63 6f  age_format = (co
35ff0 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
36000 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
36010 61 72 67 76 5b 35 5d 29 3b 0a 09 20 20 73 74 79  argv[5]);..  sty
36020 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
36030 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
36040 65 5f 74 65 78 74 20 28 61 72 67 76 5b 36 5d 29  e_text (argv[6])
36050 3b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  ;..  if (sqlite3
36060 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
36070 76 5b 37 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[7]) != SQLITE_
36080 49 4e 54 45 47 45 52 20 7c 7c 0a 09 20 20 20 20  INTEGER ||..    
36090 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
360a0 74 79 70 65 20 28 61 72 67 76 5b 38 5d 29 20 21  type (argv[8]) !
360b0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
360c0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
360d0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
360e0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72  ontext, -1);...r
360f0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
36100 20 74 72 61 6e 73 70 61 72 65 6e 74 20 3d 20 73   transparent = s
36110 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
36120 20 28 61 72 67 76 5b 37 5d 29 3b 0a 09 20 20 66   (argv[7]);..  f
36130 6c 69 70 5f 61 78 65 73 20 3d 20 73 71 6c 69 74  lip_axes = sqlit
36140 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
36150 67 76 5b 38 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[8]);.      }.
36160 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
36170 31 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  13).      {..  i
36180 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
36190 5f 74 79 70 65 20 28 61 72 67 76 5b 39 5d 29 20  _type (argv[9]) 
361a0 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
361b0 52 20 7c 7c 0a 09 20 20 20 20 20 20 73 71 6c 69  R ||..      sqli
361c0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
361d0 61 72 67 76 5b 31 30 5d 29 20 21 3d 20 53 51 4c  argv[10]) != SQL
361e0 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 0a 09  ITE_INTEGER ||..
361f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
36200 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
36210 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  1]) != SQLITE_IN
36220 54 45 47 45 52 20 7c 7c 0a 09 20 20 20 20 20 20  TEGER ||..      
36230 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
36240 70 65 20 28 61 72 67 76 5b 31 32 5d 29 20 21 3d  pe (argv[12]) !=
36250 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
36260 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
36270 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
36280 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65  ntext, -1);...re
36290 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
362a0 74 69 6c 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  tiled = sqlite3_
362b0 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
362c0 39 5d 29 3b 0a 09 20 20 63 61 63 68 65 64 20 3d  9]);..  cached =
362d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
362e0 6e 74 20 28 61 72 67 76 5b 31 30 5d 29 3b 0a 09  nt (argv[10]);..
362f0 20 20 74 69 6c 65 5f 77 69 64 74 68 20 3d 20 73    tile_width = s
36300 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
36310 20 28 61 72 67 76 5b 31 31 5d 29 3b 0a 09 20 20   (argv[11]);..  
36320 74 69 6c 65 5f 68 65 69 67 68 74 20 3d 20 73 71  tile_height = sq
36330 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
36340 28 61 72 67 76 5b 31 32 5d 29 3b 0a 20 20 20 20  (argv[12]);.    
36350 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
36360 20 3d 3d 20 31 38 29 0a 20 20 20 20 20 20 7b 0a   == 18).      {.
36370 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
36380 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
36390 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  0]) != SQLITE_TE
363a0 58 54 0a 09 20 20 20 20 20 20 7c 7c 20 73 71 6c  XT..      || sql
363b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
363c0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
363d0 49 54 45 5f 54 45 58 54 0a 09 20 20 20 20 20 20  ITE_TEXT..      
363e0 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
363f0 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
36400 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 0a 09  != SQLITE_TEXT..
36410 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
36420 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
36430 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[3]) != SQLITE_
36440 54 45 58 54 0a 09 20 20 20 20 20 20 7c 7c 20 73  TEXT..      || s
36450 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
36460 65 20 28 61 72 67 76 5b 34 5d 29 20 21 3d 20 53  e (argv[4]) != S
36470 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 0a 09 20  QLITE_TEXT ||.. 
36480 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
36490 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d  ue_type (argv[5]
364a0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
364b0 20 7c 7c 0a 09 20 20 20 20 20 20 73 71 6c 69 74   ||..      sqlit
364c0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
364d0 72 67 76 5b 36 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[6]) != SQLIT
364e0 45 5f 54 45 58 54 20 7c 7c 0a 09 20 20 20 20 20  E_TEXT ||..     
364f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
36500 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20 21 3d  ype (argv[7]) !=
36510 20 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 0a   SQLITE_TEXT ||.
36520 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
36530 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
36540 38 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  8]) != SQLITE_TE
36550 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  XT)..    {...sql
36560 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
36570 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
36580 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
36590 09 20 20 67 65 74 63 61 70 61 62 69 6c 69 74 69  .  getcapabiliti
365a0 65 73 5f 75 72 6c 20 3d 20 28 63 6f 6e 73 74 20  es_url = (const 
365b0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
365c0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
365d0 5b 30 5d 29 3b 0a 09 20 20 67 65 74 6d 61 70 5f  [0]);..  getmap_
365e0 75 72 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  url = (const cha
365f0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
36600 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
36610 29 3b 0a 09 20 20 6c 61 79 65 72 5f 6e 61 6d 65  );..  layer_name
36620 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
36630 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
36640 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  text (argv[2]);.
36650 09 20 20 74 69 74 6c 65 20 3d 20 28 63 6f 6e 73  .  title = (cons
36660 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
36670 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
36680 67 76 5b 33 5d 29 3b 0a 09 20 20 61 62 73 74 72  gv[3]);..  abstr
36690 61 63 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  act = (const cha
366a0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
366b0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 34 5d  ue_text (argv[4]
366c0 29 3b 0a 09 20 20 76 65 72 73 69 6f 6e 20 3d 20  );..  version = 
366d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
366e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
366f0 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 09 20 20  t (argv[5]);..  
36700 72 65 66 5f 73 79 73 20 3d 20 28 63 6f 6e 73 74  ref_sys = (const
36710 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
36720 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
36730 76 5b 36 5d 29 3b 0a 09 20 20 69 6d 61 67 65 5f  v[6]);..  image_
36740 66 6f 72 6d 61 74 20 3d 20 28 63 6f 6e 73 74 20  format = (const 
36750 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
36760 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
36770 5b 37 5d 29 3b 0a 09 20 20 73 74 79 6c 65 20 3d  [7]);..  style =
36780 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
36790 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
367a0 78 74 20 28 61 72 67 76 5b 38 5d 29 3b 0a 09 20  xt (argv[8]);.. 
367b0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
367c0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 39 5d  ue_type (argv[9]
367d0 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) != SQLITE_INTE
367e0 47 45 52 20 7c 7c 0a 09 20 20 20 20 20 20 73 71  GER ||..      sq
367f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
36800 20 28 61 72 67 76 5b 31 30 5d 29 20 21 3d 20 53   (argv[10]) != S
36810 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c  QLITE_INTEGER ||
36820 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
36830 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
36840 5b 31 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  [11]) != SQLITE_
36850 49 4e 54 45 47 45 52 20 7c 7c 0a 09 20 20 20 20  INTEGER ||..    
36860 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
36870 74 79 70 65 20 28 61 72 67 76 5b 31 32 5d 29 20  type (argv[12]) 
36880 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
36890 52 20 7c 7c 0a 09 20 20 20 20 20 20 73 71 6c 69  R ||..      sqli
368a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
368b0 61 72 67 76 5b 31 33 5d 29 20 21 3d 20 53 51 4c  argv[13]) != SQL
368c0 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 0a 09  ITE_INTEGER ||..
368d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
368e0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
368f0 34 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  4]) != SQLITE_IN
36900 54 45 47 45 52 20 7c 7c 0a 09 20 20 20 20 20 20  TEGER ||..      
36910 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
36920 70 65 20 28 61 72 67 76 5b 31 36 5d 29 20 21 3d  pe (argv[16]) !=
36930 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
36940 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
36950 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
36960 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65  ntext, -1);...re
36970 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
36980 74 72 61 6e 73 70 61 72 65 6e 74 20 3d 20 73 71  transparent = sq
36990 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
369a0 28 61 72 67 76 5b 39 5d 29 3b 0a 09 20 20 66 6c  (argv[9]);..  fl
369b0 69 70 5f 61 78 65 73 20 3d 20 73 71 6c 69 74 65  ip_axes = sqlite
369c0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
369d0 76 5b 31 30 5d 29 3b 0a 09 20 20 74 69 6c 65 64  v[10]);..  tiled
369e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
369f0 5f 69 6e 74 20 28 61 72 67 76 5b 31 31 5d 29 3b  _int (argv[11]);
36a00 0a 09 20 20 63 61 63 68 65 64 20 3d 20 73 71 6c  ..  cached = sql
36a10 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
36a20 61 72 67 76 5b 31 32 5d 29 3b 0a 09 20 20 74 69  argv[12]);..  ti
36a30 6c 65 5f 77 69 64 74 68 20 3d 20 73 71 6c 69 74  le_width = sqlit
36a40 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
36a50 67 76 5b 31 33 5d 29 3b 0a 09 20 20 74 69 6c 65  gv[13]);..  tile
36a60 5f 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65  _height = sqlite
36a70 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
36a80 76 5b 31 34 5d 29 3b 0a 09 20 20 69 73 5f 71 75  v[14]);..  is_qu
36a90 65 72 79 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  eryable = sqlite
36aa0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
36ab0 76 5b 31 36 5d 29 3b 0a 09 20 20 69 66 20 28 73  v[16]);..  if (s
36ac0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
36ad0 65 20 28 61 72 67 76 5b 31 35 5d 29 20 3d 3d 20  e (argv[15]) == 
36ae0 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 20 20  SQLITE_NULL)..  
36af0 20 20 20 20 62 67 63 6f 6c 6f 72 20 3d 20 4e 55      bgcolor = NU
36b00 4c 4c 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  LL;..  else if (
36b10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
36b20 70 65 20 28 61 72 67 76 5b 31 35 5d 29 20 3d 3d  pe (argv[15]) ==
36b30 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20   SQLITE_TEXT).. 
36b40 20 20 20 7b 0a 09 09 62 67 63 6f 6c 6f 72 20 3d     {...bgcolor =
36b50 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
36b60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
36b70 78 74 20 28 61 72 67 76 5b 31 35 5d 29 3b 0a 09  xt (argv[15]);..
36b80 09 69 66 20 28 21 76 61 6c 69 64 61 74 65 5f 77  .if (!validate_w
36b90 6d 73 5f 62 67 63 6f 6c 6f 72 20 28 62 67 63 6f  ms_bgcolor (bgco
36ba0 6c 6f 72 29 29 0a 09 09 20 20 7b 0a 09 09 20 20  lor))...  {...  
36bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
36bc0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
36bd0 20 2d 31 29 3b 0a 09 09 20 20 20 20 20 20 72 65   -1);...      re
36be0 74 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 20 20 20  turn;...  }..   
36bf0 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
36c00 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
36c10 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
36c20 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a   -1);...return;.
36c30 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71  .    }..  if (sq
36c40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
36c50 20 28 61 72 67 76 5b 31 37 5d 29 20 3d 3d 20 53   (argv[17]) == S
36c60 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 20 20 20  QLITE_NULL)..   
36c70 20 20 20 67 65 74 66 65 61 74 75 72 65 69 6e 66     getfeatureinf
36c80 6f 5f 75 72 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 20  o_url = NULL;.. 
36c90 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
36ca0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
36cb0 67 76 5b 31 37 5d 29 20 3d 3d 20 53 51 4c 49 54  gv[17]) == SQLIT
36cc0 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20 67  E_TEXT)..      g
36cd0 65 74 66 65 61 74 75 72 65 69 6e 66 6f 5f 75 72  etfeatureinfo_ur
36ce0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
36cf0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
36d00 5f 74 65 78 74 20 28 61 72 67 76 5b 31 37 5d 29  _text (argv[17])
36d10 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
36d20 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
36d30 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
36d40 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  -1);...return;..
36d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36d60 20 20 72 65 74 20 3d 0a 09 72 65 67 69 73 74 65    ret =..registe
36d70 72 5f 77 6d 73 5f 67 65 74 6d 61 70 20 28 73 71  r_wms_getmap (sq
36d80 6c 69 74 65 2c 20 67 65 74 63 61 70 61 62 69 6c  lite, getcapabil
36d90 69 74 69 65 73 5f 75 72 6c 2c 20 67 65 74 6d 61  ities_url, getma
36da0 70 5f 75 72 6c 2c 0a 09 09 09 20 20 20 20 20 6c  p_url,....     l
36db0 61 79 65 72 5f 6e 61 6d 65 2c 20 74 69 74 6c 65  ayer_name, title
36dc0 2c 20 61 62 73 74 72 61 63 74 2c 20 76 65 72 73  , abstract, vers
36dd0 69 6f 6e 2c 20 72 65 66 5f 73 79 73 2c 0a 09 09  ion, ref_sys,...
36de0 09 20 20 20 20 20 69 6d 61 67 65 5f 66 6f 72 6d  .     image_form
36df0 61 74 2c 20 73 74 79 6c 65 2c 20 74 72 61 6e 73  at, style, trans
36e00 70 61 72 65 6e 74 2c 20 66 6c 69 70 5f 61 78 65  parent, flip_axe
36e10 73 2c 0a 09 09 09 20 20 20 20 20 74 69 6c 65 64  s,....     tiled
36e20 2c 20 63 61 63 68 65 64 2c 20 74 69 6c 65 5f 77  , cached, tile_w
36e30 69 64 74 68 2c 20 74 69 6c 65 5f 68 65 69 67 68  idth, tile_heigh
36e40 74 2c 20 62 67 63 6f 6c 6f 72 2c 0a 09 09 09 20  t, bgcolor,.... 
36e50 20 20 20 20 69 73 5f 71 75 65 72 79 61 62 6c 65      is_queryable
36e60 2c 20 67 65 74 66 65 61 74 75 72 65 69 6e 66 6f  , getfeatureinfo
36e70 5f 75 72 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  _url);.    sqlit
36e80 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
36e90 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a  ontext, ret);.}.
36ea0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
36eb0 74 5f 55 6e 72 65 67 69 73 74 65 72 57 4d 53 47  t_UnregisterWMSG
36ec0 65 74 4d 61 70 20 28 73 71 6c 69 74 65 33 5f 63  etMap (sqlite3_c
36ed0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
36ee0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
36ef0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
36f00 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
36f10 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57 4d 53   function:./ WMS
36f20 5f 55 6e 52 65 67 69 73 74 65 72 47 65 74 4d 61  _UnRegisterGetMa
36f30 70 28 54 65 78 74 20 75 72 6c 2c 20 54 65 78 74  p(Text url, Text
36f40 20 6c 61 79 65 72 5f 6e 61 6d 65 29 0a 2f 0a 2f   layer_name)././
36f50 20 64 65 6c 65 74 65 73 20 61 20 57 4d 53 20 47   deletes a WMS G
36f60 65 74 4d 61 70 20 28 61 6e 64 20 61 6c 6c 20 72  etMap (and all r
36f70 65 6c 61 74 65 64 20 63 68 69 6c 64 72 65 6e 29  elated children)
36f80 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20  ./ returns 1 on 
36f90 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66  success./ 0 on f
36fa0 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e  ailure, -1 on in
36fb0 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
36fc0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
36fd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36fe0 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  url;.    const c
36ff0 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d 65 3b  har *layer_name;
37000 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
37010 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
37020 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
37030 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
37040 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
37050 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
37060 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
37070 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
37080 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
37090 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
370a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
370b0 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
370c0 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
370d0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
370e0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
370f0 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
37100 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75  n;.      }.    u
37110 72 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rl = (const char
37120 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
37130 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
37140 3b 0a 20 20 20 20 6c 61 79 65 72 5f 6e 61 6d 65  ;.    layer_name
37150 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
37160 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
37170 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
37180 20 20 20 20 72 65 74 20 3d 20 75 6e 72 65 67 69      ret = unregi
37190 73 74 65 72 5f 77 6d 73 5f 67 65 74 6d 61 70 20  ster_wms_getmap 
371a0 28 73 71 6c 69 74 65 2c 20 75 72 6c 2c 20 6c 61  (sqlite, url, la
371b0 79 65 72 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 73  yer_name);.    s
371c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
371d0 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
371e0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
371f0 0a 66 6e 63 74 5f 53 65 74 57 4d 53 47 65 74 4d  .fnct_SetWMSGetM
37200 61 70 49 6e 66 6f 73 20 28 73 71 6c 69 74 65 33  apInfos (sqlite3
37210 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
37220 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
37230 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
37240 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
37250 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57 4d 53   function:./ WMS
37260 5f 53 65 74 47 65 74 4d 61 70 49 6e 66 6f 73 28  _SetGetMapInfos(
37270 54 65 78 74 20 75 72 6c 2c 20 54 65 78 74 20 6c  Text url, Text l
37280 61 79 65 72 5f 6e 61 6d 65 2c 20 54 65 78 74 20  ayer_name, Text 
37290 74 69 74 6c 65 2c 20 54 65 78 74 20 61 62 73 74  title, Text abst
372a0 72 61 63 74 29 0a 2f 0a 2f 20 75 70 64 61 74 65  ract)././ update
372b0 73 20 74 68 65 20 64 65 73 63 72 69 70 74 69 76  s the descriptiv
372c0 65 20 69 6e 66 6f 73 20 73 75 70 70 6f 72 74 69  e infos supporti
372d0 6e 67 20 61 20 57 4d 53 20 47 65 74 4d 61 70 0a  ng a WMS GetMap.
372e0 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
372f0 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
37300 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76  ilure, -1 on inv
37310 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
37320 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
37330 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75     const char *u
37340 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  rl;.    const ch
37350 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d 65 3b 0a  ar *layer_name;.
37360 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
37370 74 69 74 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  title;.    const
37380 20 63 68 61 72 20 2a 61 62 73 74 72 61 63 74 3b   char *abstract;
37390 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
373a0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
373b0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
373c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
373d0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
373e0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
373f0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
37400 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
37410 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
37420 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
37430 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
37440 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
37450 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
37460 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
37470 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51   (argv[2]) != SQ
37480 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
37490 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
374a0 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51   (argv[3]) != SQ
374b0 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
374c0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
374d0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
374e0 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
374f0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75  n;.      }.    u
37500 72 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rl = (const char
37510 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
37520 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
37530 3b 0a 20 20 20 20 6c 61 79 65 72 5f 6e 61 6d 65  ;.    layer_name
37540 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
37550 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
37560 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
37570 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63 6f 6e      title = (con
37580 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
37590 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
375a0 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 61 62 73  rgv[2]);.    abs
375b0 74 72 61 63 74 20 3d 20 28 63 6f 6e 73 74 20 63  tract = (const c
375c0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
375d0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
375e0 33 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  3]);.    ret = s
375f0 65 74 5f 77 6d 73 5f 67 65 74 6d 61 70 5f 69 6e  et_wms_getmap_in
37600 66 6f 73 20 28 73 71 6c 69 74 65 2c 20 75 72 6c  fos (sqlite, url
37610 2c 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 74 69  , layer_name, ti
37620 74 6c 65 2c 20 61 62 73 74 72 61 63 74 29 3b 0a  tle, abstract);.
37630 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
37640 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
37650 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63   ret);.}..static
37660 20 76 6f 69 64 0a 66 6e 63 74 5f 53 65 74 57 4d   void.fnct_SetWM
37670 53 47 65 74 4d 61 70 43 6f 70 79 72 69 67 68 74  SGetMapCopyright
37680 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
37690 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
376a0 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 73 71   argc,....    sq
376b0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
376c0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
376d0 6e 63 74 69 6f 6e 3a 0a 2f 20 57 4d 53 5f 53 65  nction:./ WMS_Se
376e0 74 47 65 74 4d 61 70 43 6f 70 79 72 69 67 68 74  tGetMapCopyright
376f0 28 54 65 78 74 20 75 72 6c 2c 20 54 65 78 74 20  (Text url, Text 
37700 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 54 65 78 74  layer_name, Text
37710 20 63 6f 70 79 72 69 67 68 74 29 0a 2f 20 20 20   copyright)./   
37720 20 6f 72 0a 2f 20 57 4d 53 5f 53 65 74 47 65 74   or./ WMS_SetGet
37730 4d 61 70 43 6f 70 79 72 69 67 68 74 28 54 65 78  MapCopyright(Tex
37740 74 20 75 72 6c 2c 20 54 65 78 74 20 6c 61 79 65  t url, Text laye
37750 72 5f 6e 61 6d 65 2c 20 54 65 78 74 20 63 6f 70  r_name, Text cop
37760 79 72 69 67 68 74 2c 0a 2f 20 20 20 20 20 20 20  yright,./       
37770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37780 20 54 65 78 74 20 6c 69 63 65 6e 73 65 29 0a 2f   Text license)./
37790 0a 2f 20 75 70 64 61 74 65 73 20 63 6f 70 79 72  ./ updates copyr
377a0 69 67 68 74 20 69 6e 66 6f 73 20 73 75 70 70 6f  ight infos suppo
377b0 72 74 69 6e 67 20 61 20 57 4d 53 20 47 65 74 4d  rting a WMS GetM
377c0 61 70 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f  ap./ returns 1 o
377d0 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e  n success./ 0 on
377e0 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20   failure, -1 on 
377f0 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
37800 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74  s.*/.    int ret
37810 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
37820 20 2a 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *url;.    const
37830 20 63 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d   char *layer_nam
37840 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
37850 72 20 2a 63 6f 70 79 72 69 67 68 74 20 3d 20 4e  r *copyright = N
37860 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ULL;.    const c
37870 68 61 72 20 2a 6c 69 63 65 6e 73 65 20 3d 20 4e  har *license = N
37880 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ULL;.    sqlite3
37890 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
378a0 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
378b0 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
378c0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
378d0 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
378e0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
378f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
37900 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
37910 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 7c  = SQLITE_TEXT..|
37920 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  | sqlite3_value_
37930 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
37940 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
37950 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
37960 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
37970 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
37980 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
37990 20 20 20 75 72 6c 20 3d 20 28 63 6f 6e 73 74 20     url = (const 
379a0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
379b0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
379c0 5b 30 5d 29 3b 0a 20 20 20 20 6c 61 79 65 72 5f  [0]);.    layer_
379d0 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
379e0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
379f0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
37a00 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ]);.    if (sqli
37a10 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
37a20 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
37a30 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20  TE_NULL)..;.    
37a40 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
37a50 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
37a60 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
37a70 54 45 58 54 29 0a 09 63 6f 70 79 72 69 67 68 74  TEXT)..copyright
37a80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
37a90 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
37aa0 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  text (argv[2]);.
37ab0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
37ac0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
37ad0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
37ae0 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
37af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
37b00 28 61 72 67 63 20 3e 3d 20 34 29 0a 20 20 20 20  (argc >= 4).    
37b10 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
37b20 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
37b30 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
37b40 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20 6c  E_TEXT)..      l
37b50 69 63 65 6e 73 65 20 3d 20 28 63 6f 6e 73 74 20  icense = (const 
37b60 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
37b70 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
37b80 5b 33 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  [3]);..  else.. 
37b90 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
37ba0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
37bb0 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72  xt, -1);...retur
37bc0 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
37bd0 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 65 74  }.    ret =..set
37be0 5f 77 6d 73 5f 67 65 74 6d 61 70 5f 63 6f 70 79  _wms_getmap_copy
37bf0 72 69 67 68 74 20 28 73 71 6c 69 74 65 2c 20 75  right (sqlite, u
37c00 72 6c 2c 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20  rl, layer_name, 
37c10 63 6f 70 79 72 69 67 68 74 2c 20 6c 69 63 65 6e  copyright, licen
37c20 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
37c30 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
37c40 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73  text, ret);.}..s
37c50 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
37c60 53 65 74 57 4d 53 47 65 74 4d 61 70 4f 70 74 69  SetWMSGetMapOpti
37c70 6f 6e 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ons (sqlite3_con
37c80 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
37c90 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73  int argc,....  s
37ca0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
37cb0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
37cc0 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57 4d 53 5f 53  unction:./ WMS_S
37cd0 65 74 47 65 74 4d 61 70 4f 70 74 69 6f 6e 73 28  etGetMapOptions(
37ce0 54 65 78 74 20 75 72 6c 2c 20 54 65 78 74 20 6c  Text url, Text l
37cf0 61 79 65 72 5f 6e 61 6d 65 2c 20 49 6e 74 20 74  ayer_name, Int t
37d00 72 61 6e 73 70 61 72 65 6e 74 2c 0a 2f 20 20 20  ransparent,./   
37d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d20 20 20 20 49 6e 74 20 66 6c 69 70 5f 61 78 65 73     Int flip_axes
37d30 29 0a 2f 20 20 20 6f 72 0a 2f 20 57 4d 53 5f 53  )./   or./ WMS_S
37d40 65 74 47 65 74 4d 61 70 4f 70 74 69 6f 6e 73 28  etGetMapOptions(
37d50 54 65 78 74 20 75 72 6c 2c 20 54 65 78 74 20 6c  Text url, Text l
37d60 61 79 65 72 5f 6e 61 6d 65 2c 20 49 6e 74 20 74  ayer_name, Int t
37d70 69 6c 65 64 2c 20 49 6e 74 20 63 61 63 68 65 64  iled, Int cached
37d80 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  ,./             
37d90 20 20 20 20 20 20 20 20 20 49 6e 74 20 74 69 6c           Int til
37da0 65 5f 77 69 64 74 68 2c 20 49 6e 74 20 74 69 6c  e_width, Int til
37db0 65 5f 68 65 69 67 68 74 29 0a 2f 20 20 20 6f 72  e_height)./   or
37dc0 0a 2f 20 57 4d 53 5f 53 65 74 47 65 74 4d 61 70  ./ WMS_SetGetMap
37dd0 4f 70 74 69 6f 6e 73 28 54 65 78 74 20 75 72 6c  Options(Text url
37de0 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d  , Text layer_nam
37df0 65 2c 20 49 6e 74 20 69 73 5f 71 75 65 72 79 61  e, Int is_querya
37e00 62 6c 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  ble,./          
37e10 20 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74              Text
37e20 20 67 65 74 66 65 61 74 75 72 65 69 6e 66 6f 5f   getfeatureinfo_
37e30 75 72 6c 29 0a 2f 20 20 20 6f 72 0a 2f 20 57 4d  url)./   or./ WM
37e40 53 5f 53 65 74 47 65 74 4d 61 70 4f 70 74 69 6f  S_SetGetMapOptio
37e50 6e 73 28 54 65 78 74 20 75 72 6c 2c 20 54 65 78  ns(Text url, Tex
37e60 74 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 54 65  t layer_name, Te
37e70 78 74 20 62 67 63 6f 6c 6f 72 29 0a 2f 0a 2f 20  xt bgcolor)././ 
37e80 75 70 64 61 74 65 73 20 74 68 65 20 6f 70 74 69  updates the opti
37e90 6f 6e 73 20 73 75 70 70 6f 72 74 69 6e 67 20 61  ons supporting a
37ea0 20 57 4d 53 20 47 65 74 4d 61 70 0a 2f 20 72 65   WMS GetMap./ re
37eb0 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
37ec0 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
37ed0 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
37ee0 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
37ef0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
37f00 6f 6e 73 74 20 63 68 61 72 20 2a 75 72 6c 3b 0a  onst char *url;.
37f10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
37f20 6c 61 79 65 72 5f 6e 61 6d 65 3b 0a 20 20 20 20  layer_name;.    
37f30 69 6e 74 20 74 72 61 6e 73 70 61 72 65 6e 74 3b  int transparent;
37f40 0a 20 20 20 20 69 6e 74 20 66 6c 69 70 5f 61 78  .    int flip_ax
37f50 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 71  es;.    int is_q
37f60 75 65 72 79 61 62 6c 65 3b 0a 20 20 20 20 69 6e  ueryable;.    in
37f70 74 20 74 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74  t tiled;.    int
37f80 20 63 61 63 68 65 64 3b 0a 20 20 20 20 69 6e 74   cached;.    int
37f90 20 74 69 6c 65 5f 77 69 64 74 68 20 3d 20 35 31   tile_width = 51
37fa0 32 3b 0a 20 20 20 20 69 6e 74 20 74 69 6c 65 5f  2;.    int tile_
37fb0 68 65 69 67 68 74 20 3d 20 35 31 32 3b 0a 20 20  height = 512;.  
37fc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 67 65    const char *ge
37fd0 74 66 65 61 74 75 72 65 69 6e 66 6f 5f 75 72 6c  tfeatureinfo_url
37fe0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
37ff0 73 74 20 63 68 61 72 20 2a 62 67 63 6f 6c 6f 72  st char *bgcolor
38000 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
38010 72 20 6d 6f 64 65 20 3d 20 27 5c 30 27 3b 0a 20  r mode = '\0';. 
38020 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
38030 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
38040 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
38050 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
38060 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
38070 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
38080 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
38090 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
380a0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
380b0 54 45 5f 54 45 58 54 20 7c 7c 0a 09 73 71 6c 69  TE_TEXT ||..sqli
380c0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
380d0 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
380e0 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
380f0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
38100 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
38110 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
38120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75 72 6c  .      }.    url
38130 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
38140 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
38150 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
38160 20 20 20 20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d      layer_name =
38170 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
38180 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
38190 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  xt (argv[1]);.  
381a0 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29    if (argc == 3)
381b0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
381c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
381d0 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
381e0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20  SQLITE_TEXT)..  
381f0 20 20 7b 0a 09 09 6d 6f 64 65 20 3d 20 27 42 27    {...mode = 'B'
38200 3b 0a 09 09 62 67 63 6f 6c 6f 72 20 3d 20 28 63  ;...bgcolor = (c
38210 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
38220 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
38230 28 61 72 67 76 5b 32 5d 29 3b 0a 09 09 69 66 20  (argv[2]);...if 
38240 28 21 76 61 6c 69 64 61 74 65 5f 77 6d 73 5f 62  (!validate_wms_b
38250 67 63 6f 6c 6f 72 20 28 62 67 63 6f 6c 6f 72 29  gcolor (bgcolor)
38260 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
38270 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
38280 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
38290 3b 0a 09 09 20 20 20 20 20 20 72 65 74 75 72 6e  ;...      return
382a0 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09  ;...  }..    }..
382b0 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
382c0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
382d0 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
382e0 45 5f 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09  E_NULL)..    {..
382f0 09 6d 6f 64 65 20 3d 20 27 42 27 3b 0a 09 09 62  .mode = 'B';...b
38300 67 63 6f 6c 6f 72 20 3d 20 4e 55 4c 4c 3b 0a 09  gcolor = NULL;..
38310 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
38320 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
38330 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
38340 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72  xt, -1);...retur
38350 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
38360 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
38370 3d 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 4).      {..  
38380 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
38390 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
383a0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
383b0 45 52 0a 09 20 20 20 20 20 20 26 26 20 73 71 6c  ER..      && sql
383c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
383d0 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
383e0 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
383f0 20 20 7b 0a 09 09 6d 6f 64 65 20 3d 20 27 46 27    {...mode = 'F'
38400 3b 0a 09 09 74 72 61 6e 73 70 61 72 65 6e 74 20  ;...transparent 
38410 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
38420 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09  int (argv[2]);..
38430 09 66 6c 69 70 5f 61 78 65 73 20 3d 20 73 71 6c  .flip_axes = sql
38440 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
38450 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 20 20 7d  argv[3]);..    }
38460 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c  ..  else if (sql
38470 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
38480 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c  (argv[2]) == SQL
38490 49 54 45 5f 49 4e 54 45 47 45 52 0a 09 09 20 20  ITE_INTEGER...  
384a0 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
384b0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29  e_type (argv[3])
384c0 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
384d0 0a 09 20 20 20 20 7b 0a 09 09 6d 6f 64 65 20 3d  ..    {...mode =
384e0 20 27 51 27 3b 0a 09 09 69 73 5f 71 75 65 72 79   'Q';...is_query
384f0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  able = sqlite3_v
38500 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32  alue_int (argv[2
38510 5d 29 3b 0a 09 09 67 65 74 66 65 61 74 75 72 65  ]);...getfeature
38520 69 6e 66 6f 5f 75 72 6c 20 3d 0a 09 09 20 20 20  info_url =...   
38530 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
38540 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
38550 78 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20  xt (argv[3]);.. 
38560 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20     }..  else if 
38570 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
38580 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d  ype (argv[2]) ==
38590 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 0a   SQLITE_INTEGER.
385a0 09 09 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f  ..   && sqlite3_
385b0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
385c0 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e  [3]) == SQLITE_N
385d0 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 6d 6f  ULL)..    {...mo
385e0 64 65 20 3d 20 27 51 27 3b 0a 09 09 69 73 5f 71  de = 'Q';...is_q
385f0 75 65 72 79 61 62 6c 65 20 3d 20 73 71 6c 69 74  ueryable = sqlit
38600 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
38610 67 76 5b 32 5d 29 3b 0a 09 09 67 65 74 66 65 61  gv[2]);...getfea
38620 74 75 72 65 69 6e 66 6f 5f 75 72 6c 20 3d 20 4e  tureinfo_url = N
38630 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ULL;..    }..  e
38640 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
38650 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
38660 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
38670 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
38680 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
38690 61 72 67 63 20 3d 3d 20 36 29 0a 20 20 20 20 20  argc == 6).     
386a0 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
386b0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
386c0 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[2]) != SQLITE
386d0 5f 49 4e 54 45 47 45 52 20 7c 7c 0a 09 20 20 20  _INTEGER ||..   
386e0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
386f0 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20  _type (argv[3]) 
38700 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
38710 52 20 7c 7c 0a 09 20 20 20 20 20 20 73 71 6c 69  R ||..      sqli
38720 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
38730 61 72 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49  argv[4]) != SQLI
38740 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 0a 09 20  TE_INTEGER ||.. 
38750 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
38760 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d  ue_type (argv[5]
38770 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) != SQLITE_INTE
38780 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  GER)..    {...sq
38790 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
387a0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
387b0 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
387c0 0a 09 20 20 6d 6f 64 65 20 3d 20 27 54 27 3b 0a  ..  mode = 'T';.
387d0 09 20 20 74 69 6c 65 64 20 3d 20 73 71 6c 69 74  .  tiled = sqlit
387e0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
387f0 67 76 5b 32 5d 29 3b 0a 09 20 20 63 61 63 68 65  gv[2]);..  cache
38800 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
38810 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b  e_int (argv[3]);
38820 0a 09 20 20 74 69 6c 65 5f 77 69 64 74 68 20 3d  ..  tile_width =
38830 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
38840 6e 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20  nt (argv[4]);.. 
38850 20 74 69 6c 65 5f 68 65 69 67 68 74 20 3d 20 73   tile_height = s
38860 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
38870 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20   (argv[5]);.    
38880 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
38890 6d 6f 64 65 29 0a 20 20 20 20 20 20 7b 0a 20 20  mode).      {.  
388a0 20 20 20 20 63 61 73 65 20 27 42 27 3a 0a 09 20      case 'B':.. 
388b0 20 72 65 74 20 3d 20 73 65 74 5f 77 6d 73 5f 67   ret = set_wms_g
388c0 65 74 6d 61 70 5f 62 67 63 6f 6c 6f 72 20 28 73  etmap_bgcolor (s
388d0 71 6c 69 74 65 2c 20 75 72 6c 2c 20 6c 61 79 65  qlite, url, laye
388e0 72 5f 6e 61 6d 65 2c 20 62 67 63 6f 6c 6f 72 29  r_name, bgcolor)
388f0 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
38900 20 20 63 61 73 65 20 27 46 27 3a 0a 09 20 20 72    case 'F':..  r
38910 65 74 20 3d 0a 09 20 20 20 20 20 20 73 65 74 5f  et =..      set_
38920 77 6d 73 5f 67 65 74 6d 61 70 5f 6f 70 74 69 6f  wms_getmap_optio
38930 6e 73 20 28 73 71 6c 69 74 65 2c 20 75 72 6c 2c  ns (sqlite, url,
38940 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 74 72 61   layer_name, tra
38950 6e 73 70 61 72 65 6e 74 2c 0a 09 09 09 09 20 20  nsparent,.....  
38960 20 20 20 20 66 6c 69 70 5f 61 78 65 73 29 3b 0a      flip_axes);.
38970 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
38980 63 61 73 65 20 27 51 27 3a 0a 09 20 20 72 65 74  case 'Q':..  ret
38990 20 3d 0a 09 20 20 20 20 20 20 73 65 74 5f 77 6d   =..      set_wm
389a0 73 5f 67 65 74 6d 61 70 5f 71 75 65 72 79 61 62  s_getmap_queryab
389b0 6c 65 20 28 73 71 6c 69 74 65 2c 20 75 72 6c 2c  le (sqlite, url,
389c0 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 69 73 5f   layer_name, is_
389d0 71 75 65 72 79 61 62 6c 65 2c 0a 09 09 09 09 09  queryable,......
389e0 67 65 74 66 65 61 74 75 72 65 69 6e 66 6f 5f 75  getfeatureinfo_u
389f0 72 6c 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  rl);..  break;. 
38a00 20 20 20 20 20 63 61 73 65 20 27 54 27 3a 0a 09       case 'T':..
38a10 20 20 72 65 74 20 3d 0a 09 20 20 20 20 20 20 73    ret =..      s
38a20 65 74 5f 77 6d 73 5f 67 65 74 6d 61 70 5f 74 69  et_wms_getmap_ti
38a30 6c 65 64 20 28 73 71 6c 69 74 65 2c 20 75 72 6c  led (sqlite, url
38a40 2c 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 74 69  , layer_name, ti
38a50 6c 65 64 2c 20 63 61 63 68 65 64 2c 0a 09 09 09  led, cached,....
38a60 09 20 20 20 20 74 69 6c 65 5f 77 69 64 74 68 2c  .    tile_width,
38a70 20 74 69 6c 65 5f 68 65 69 67 68 74 29 3b 0a 09   tile_height);..
38a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
38a90 65 66 61 75 6c 74 3a 0a 09 20 20 72 65 74 20 3d  efault:..  ret =
38aa0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20   -1;.      };.  
38ab0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
38ac0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
38ad0 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
38ae0 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74 65  oid.fnct_Registe
38af0 72 57 4d 53 53 65 74 74 69 6e 67 20 28 73 71 6c  rWMSSetting (sql
38b00 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
38b10 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
38b20 2c 0a 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61  ,.... sqlite3_va
38b30 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
38b40 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
38b50 2f 20 57 4d 53 5f 52 65 67 69 73 74 65 72 53 65  / WMS_RegisterSe
38b60 74 74 69 6e 67 28 54 65 78 74 20 75 72 6c 2c 20  tting(Text url, 
38b70 54 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d 65 2c  Text layer_name,
38b80 20 54 65 78 74 20 6b 65 79 2c 20 54 65 78 74 20   Text key, Text 
38b90 76 61 6c 75 65 29 0a 2f 20 20 20 6f 72 0a 2f 20  value)./   or./ 
38ba0 57 4d 53 5f 52 65 67 69 73 74 65 72 53 65 74 74  WMS_RegisterSett
38bb0 69 6e 67 28 54 65 78 74 20 75 72 6c 2c 20 54 65  ing(Text url, Te
38bc0 78 74 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 54  xt layer_name, T
38bd0 65 78 74 20 6b 65 79 2c 20 54 65 78 74 20 76 61  ext key, Text va
38be0 6c 75 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  lue,./          
38bf0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 20 64             Int d
38c00 65 66 61 75 6c 74 29 0a 2f 0a 2f 20 69 6e 73 65  efault)././ inse
38c10 72 74 73 20 61 20 57 4d 53 20 47 65 74 4d 61 70  rts a WMS GetMap
38c20 20 53 65 74 74 69 6e 67 0a 2f 20 72 65 74 75 72   Setting./ retur
38c30 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a  ns 1 on success.
38c40 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20  / 0 on failure, 
38c50 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  -1 on invalid ar
38c60 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69  guments.*/.    i
38c70 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73  nt ret;.    cons
38c80 74 20 63 68 61 72 20 2a 75 72 6c 3b 0a 20 20 20  t char *url;.   
38c90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 79   const char *lay
38ca0 65 72 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  er_name;.    con
38cb0 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 20  st char *key;.  
38cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61    const char *va
38cd0 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f  lue;.    int is_
38ce0 64 65 66 61 75 6c 74 20 3d 20 30 3b 0a 20 20 20  default = 0;.   
38cf0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
38d00 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
38d10 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
38d20 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
38d30 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
38d40 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
38d50 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
38d60 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
38d70 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
38d80 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
38d90 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
38da0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
38db0 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
38dc0 20 20 20 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d       }.    url =
38dd0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
38de0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
38df0 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
38e00 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
38e10 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
38e20 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
38e30 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
38e40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
38e50 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
38e60 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
38e70 20 7d 0a 20 20 20 20 6c 61 79 65 72 5f 6e 61 6d   }.    layer_nam
38e80 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
38e90 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
38ea0 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
38eb0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
38ec0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
38ed0 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[2]) != SQLITE_
38ee0 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
38ef0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
38f00 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
38f10 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
38f20 20 20 20 20 7d 0a 20 20 20 20 6b 65 79 20 3d 20      }.    key = 
38f30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
38f40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
38f50 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  t (argv[2]);.   
38f60 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
38f70 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
38f80 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
38f90 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
38fa0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
38fb0 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
38fc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
38fd0 7d 0a 20 20 20 20 76 61 6c 75 65 20 3d 20 28 63  }.    value = (c
38fe0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
38ff0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
39000 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69  (argv[3]);.    i
39010 66 20 28 61 72 67 63 20 3e 3d 20 35 29 0a 20 20  f (argc >= 5).  
39020 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
39030 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
39040 28 61 72 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c  (argv[4]) != SQL
39050 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
39060 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
39070 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
39080 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e  t, -1);...return
39090 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 73 5f 64  ;..    }..  is_d
390a0 65 66 61 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  efault = sqlite3
390b0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
390c0 5b 34 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [4]);.      }.  
390d0 20 20 72 65 74 20 3d 0a 09 72 65 67 69 73 74 65    ret =..registe
390e0 72 5f 77 6d 73 5f 73 65 74 74 69 6e 67 20 28 73  r_wms_setting (s
390f0 71 6c 69 74 65 2c 20 75 72 6c 2c 20 6c 61 79 65  qlite, url, laye
39100 72 5f 6e 61 6d 65 2c 20 6b 65 79 2c 20 76 61 6c  r_name, key, val
39110 75 65 2c 20 69 73 5f 64 65 66 61 75 6c 74 29 3b  ue, is_default);
39120 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
39130 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
39140 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  , ret);.}..stati
39150 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e 72 65  c void.fnct_Unre
39160 67 69 73 74 65 72 57 4d 53 53 65 74 74 69 6e 67  gisterWMSSetting
39170 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
39180 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
39190 20 61 72 67 63 2c 0a 09 09 09 20 20 20 73 71 6c   argc,....   sql
391a0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
391b0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
391c0 63 74 69 6f 6e 3a 0a 2f 20 57 4d 53 5f 55 6e 52  ction:./ WMS_UnR
391d0 65 67 69 73 74 65 72 53 65 74 74 69 6e 67 28 54  egisterSetting(T
391e0 65 78 74 20 75 72 6c 2c 20 54 65 78 74 20 6c 61  ext url, Text la
391f0 79 65 72 5f 6e 61 6d 65 2c 20 54 65 78 74 20 6b  yer_name, Text k
39200 65 79 2c 20 54 65 78 74 20 76 61 6c 75 65 29 0a  ey, Text value).
39210 2f 0a 2f 20 64 65 6c 65 74 65 73 20 61 20 57 4d  /./ deletes a WM
39220 53 20 47 65 74 4d 61 70 20 53 65 74 74 69 6e 67  S GetMap Setting
39230 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20  ./ returns 1 on 
39240 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66  success./ 0 on f
39250 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e  ailure, -1 on in
39260 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
39270 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
39280 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
39290 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  url;.    const c
392a0 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d 65 3b  har *layer_name;
392b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
392c0 2a 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *key;.    const 
392d0 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 20  char *value;.   
392e0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
392f0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
39300 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
39310 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
39320 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
39330 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
39340 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
39350 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
39360 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
39370 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
39380 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
39390 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
393a0 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
393b0 20 20 20 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d       }.    url =
393c0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
393d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
393e0 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
393f0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
39400 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
39410 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
39420 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
39430 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
39440 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
39450 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
39460 20 7d 0a 20 20 20 20 6c 61 79 65 72 5f 6e 61 6d   }.    layer_nam
39470 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
39480 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
39490 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
394a0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
394b0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
394c0 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[2]) != SQLITE_
394d0 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
394e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
394f0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
39500 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
39510 20 20 20 20 7d 0a 20 20 20 20 6b 65 79 20 3d 20      }.    key = 
39520 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
39530 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
39540 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  t (argv[2]);.   
39550 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
39560 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
39570 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
39580 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
39590 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
395a0 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
395b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
395c0 7d 0a 20 20 20 20 76 61 6c 75 65 20 3d 20 28 63  }.    value = (c
395d0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
395e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
395f0 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 72  (argv[3]);.    r
39600 65 74 20 3d 20 75 6e 72 65 67 69 73 74 65 72 5f  et = unregister_
39610 77 6d 73 5f 73 65 74 74 69 6e 67 20 28 73 71 6c  wms_setting (sql
39620 69 74 65 2c 20 75 72 6c 2c 20 6c 61 79 65 72 5f  ite, url, layer_
39630 6e 61 6d 65 2c 20 6b 65 79 2c 20 76 61 6c 75 65  name, key, value
39640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
39650 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
39660 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
39670 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 44 65  tic void.fnct_De
39680 66 61 75 6c 74 57 4d 53 53 65 74 74 69 6e 67 20  faultWMSSetting 
39690 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
396a0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
396b0 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65 33  argc,....sqlite3
396c0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
396d0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
396e0 6e 3a 0a 2f 20 57 4d 53 5f 44 65 66 61 75 6c 74  n:./ WMS_Default
396f0 53 65 74 74 69 6e 67 28 54 65 78 74 20 75 72 6c  Setting(Text url
39700 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d  , Text layer_nam
39710 65 2c 20 54 65 78 74 20 6b 65 79 2c 20 54 65 78  e, Text key, Tex
39720 74 20 76 61 6c 75 65 29 0a 2f 0a 2f 20 75 70 64  t value)././ upd
39730 61 74 65 73 20 73 6f 6d 65 20 47 65 74 4d 61 70  ates some GetMap
39740 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
39750 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20  ./ returns 1 on 
39760 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66  success./ 0 on f
39770 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e  ailure, -1 on in
39780 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
39790 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
397a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
397b0 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  url;.    const c
397c0 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d 65 3b  har *layer_name;
397d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
397e0 2a 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *key;.    const 
397f0 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 20  char *value;.   
39800 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
39810 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
39820 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
39830 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
39840 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
39850 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
39860 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
39870 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
39880 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
39890 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
398a0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
398b0 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
398c0 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
398d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
398e0 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[2]) != SQLITE
398f0 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
39900 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
39910 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[3]) != SQLITE
39920 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
39930 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
39940 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
39950 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
39960 20 20 20 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d       }.    url =
39970 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
39980 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
39990 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
399a0 20 20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d 20 28    layer_name = (
399b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
399c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
399d0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
399e0 6b 65 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  key = (const cha
399f0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
39a00 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d  ue_text (argv[2]
39a10 29 3b 0a 20 20 20 20 76 61 6c 75 65 20 3d 20 28  );.    value = (
39a20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
39a30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
39a40 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20   (argv[3]);.    
39a50 72 65 74 20 3d 20 73 65 74 5f 77 6d 73 5f 64 65  ret = set_wms_de
39a60 66 61 75 6c 74 5f 73 65 74 74 69 6e 67 20 28 73  fault_setting (s
39a70 71 6c 69 74 65 2c 20 75 72 6c 2c 20 6c 61 79 65  qlite, url, laye
39a80 72 5f 6e 61 6d 65 2c 20 6b 65 79 2c 20 76 61 6c  r_name, key, val
39a90 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
39aa0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
39ab0 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73  text, ret);.}..s
39ac0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
39ad0 52 65 67 69 73 74 65 72 57 4d 53 52 65 66 53 79  RegisterWMSRefSy
39ae0 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  s (sqlite3_conte
39af0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
39b00 74 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74  t argc,....sqlit
39b10 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
39b20 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
39b30 69 6f 6e 3a 0a 2f 20 57 4d 53 5f 52 65 67 69 73  ion:./ WMS_Regis
39b40 74 65 72 52 65 66 53 79 73 28 54 65 78 74 20 75  terRefSys(Text u
39b50 72 6c 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e  rl, Text layer_n
39b60 61 6d 65 2c 20 54 65 78 74 20 72 65 66 5f 73 79  ame, Text ref_sy
39b70 73 2c 20 44 6f 75 62 6c 65 20 6d 69 6e 78 2c 0a  s, Double minx,.
39b80 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
39b90 20 20 20 20 20 44 6f 75 62 6c 65 20 6d 69 6e 79       Double miny
39ba0 2c 20 44 6f 75 62 6c 65 20 6d 61 78 78 2c 20 44  , Double maxx, D
39bb0 6f 75 62 6c 65 20 6d 61 78 79 29 0a 2f 20 20 20  ouble maxy)./   
39bc0 6f 72 0a 2f 20 57 4d 53 5f 52 65 67 69 73 74 65  or./ WMS_Registe
39bd0 72 52 65 66 53 79 73 28 54 65 78 74 20 75 72 6c  rRefSys(Text url
39be0 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d  , Text layer_nam
39bf0 65 2c 20 54 65 78 74 20 72 65 66 5f 73 79 73 2c  e, Text ref_sys,
39c00 20 44 6f 75 62 6c 65 20 6d 69 6e 78 2c 0a 2f 20   Double minx,./ 
39c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c20 20 20 20 44 6f 75 62 6c 65 20 6d 69 6e 79 2c 20     Double miny, 
39c30 44 6f 75 62 6c 65 20 6d 61 78 78 2c 20 44 6f 75  Double maxx, Dou
39c40 62 6c 65 20 6d 61 78 79 2c 20 49 6e 74 20 64 65  ble maxy, Int de
39c50 66 61 75 6c 74 29 0a 2f 0a 2f 20 69 6e 73 65 72  fault)././ inser
39c60 74 73 20 61 20 57 4d 53 20 47 65 74 4d 61 70 20  ts a WMS GetMap 
39c70 53 52 53 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  SRS./ returns 1 
39c80 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
39c90 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
39ca0 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
39cb0 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
39cc0 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
39cd0 72 20 2a 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73  r *url;.    cons
39ce0 74 20 63 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61  t char *layer_na
39cf0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
39d00 61 72 20 2a 72 65 66 5f 73 79 73 3b 0a 20 20 20  ar *ref_sys;.   
39d10 20 64 6f 75 62 6c 65 20 6d 69 6e 78 3b 0a 20 20   double minx;.  
39d20 20 20 64 6f 75 62 6c 65 20 6d 69 6e 79 3b 0a 20    double miny;. 
39d30 20 20 20 64 6f 75 62 6c 65 20 6d 61 78 78 3b 0a     double maxx;.
39d40 20 20 20 20 64 6f 75 62 6c 65 20 6d 61 78 79 3b      double maxy;
39d50 0a 20 20 20 20 69 6e 74 20 69 73 5f 64 65 66 61  .    int is_defa
39d60 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ult = 0;.    sql
39d70 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
39d80 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
39d90 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
39da0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
39db0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
39dc0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
39dd0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
39de0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
39df0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
39e00 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
39e10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
39e20 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
39e30 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
39e40 20 7d 0a 20 20 20 20 75 72 6c 20 3d 20 28 63 6f   }.    url = (co
39e50 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
39e60 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
39e70 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
39e80 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
39e90 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
39ea0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
39eb0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
39ec0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
39ed0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
39ee0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
39ef0 20 20 20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d 20     layer_name = 
39f00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
39f10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
39f20 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  t (argv[1]);.   
39f30 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
39f40 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
39f50 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
39f60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
39f70 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
39f80 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
39f90 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
39fa0 7d 0a 20 20 20 20 72 65 66 5f 73 79 73 20 3d 20  }.    ref_sys = 
39fb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
39fc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
39fd0 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  t (argv[2]);.   
39fe0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
39ff0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
3a000 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
3a010 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
3a020 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c 69 74 65  int val = sqlite
3a030 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
3a040 76 5b 33 5d 29 3b 0a 09 20 20 6d 69 6e 78 20 3d  v[3]);..  minx =
3a050 20 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20   val;.      }.  
3a060 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
3a070 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
3a080 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
3a090 45 5f 46 4c 4f 41 54 29 0a 09 6d 69 6e 78 20 3d  E_FLOAT)..minx =
3a0a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
3a0b0 6f 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b  ouble (argv[3]);
3a0c0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
3a0d0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
3a0e0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
3a0f0 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
3a100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
3a110 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
3a120 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d  type (argv[4]) =
3a130 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
3a140 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
3a150 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76   val = sqlite3_v
3a160 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 34  alue_int (argv[4
3a170 5d 29 3b 0a 09 20 20 6d 69 6e 79 20 3d 20 76 61  ]);..  miny = va
3a180 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  l;.      }.    e
3a190 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
3a1a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
3a1b0 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [4]) == SQLITE_F
3a1c0 4c 4f 41 54 29 0a 09 6d 69 6e 79 20 3d 20 73 71  LOAT)..miny = sq
3a1d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
3a1e0 6c 65 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20  le (argv[4]);.  
3a1f0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
3a200 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3a210 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
3a220 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
3a230 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
3a240 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3a250 65 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53  e (argv[5]) == S
3a260 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
3a270 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20 76 61       {..  int va
3a280 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
3a290 65 5f 69 6e 74 20 28 61 72 67 76 5b 35 5d 29 3b  e_int (argv[5]);
3a2a0 0a 09 20 20 6d 61 78 78 20 3d 20 76 61 6c 3b 0a  ..  maxx = val;.
3a2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
3a2c0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
3a2d0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d  ue_type (argv[5]
3a2e0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
3a2f0 54 29 0a 09 6d 61 78 78 20 3d 20 73 71 6c 69 74  T)..maxx = sqlit
3a300 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
3a310 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20 65  (argv[5]);.    e
3a320 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
3a330 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3a340 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
3a350 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
3a360 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
3a370 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
3a380 61 72 67 76 5b 36 5d 29 20 3d 3d 20 53 51 4c 49  argv[6]) == SQLI
3a390 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
3a3a0 20 20 7b 0a 09 20 20 69 6e 74 20 76 61 6c 20 3d    {..  int val =
3a3b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
3a3c0 6e 74 20 28 61 72 67 76 5b 36 5d 29 3b 0a 09 20  nt (argv[6]);.. 
3a3d0 20 6d 61 78 79 20 3d 20 76 61 6c 3b 0a 20 20 20   maxy = val;.   
3a3e0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
3a3f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
3a400 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29 20 3d  type (argv[6]) =
3a410 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
3a420 09 6d 61 78 79 20 3d 20 73 71 6c 69 74 65 33 5f  .maxy = sqlite3_
3a430 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
3a440 67 76 5b 36 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[6]);.    else
3a450 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
3a460 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
3a470 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
3a480 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
3a490 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d  .    if (argc >=
3a4a0 20 38 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   8).      {..  i
3a4b0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3a4c0 5f 74 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20  _type (argv[7]) 
3a4d0 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
3a4e0 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  R)..    {...sqli
3a4f0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
3a500 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09  context, -1);...
3a510 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
3a520 20 20 69 73 5f 64 65 66 61 75 6c 74 20 3d 20 73    is_default = s
3a530 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3a540 20 28 61 72 67 76 5b 37 5d 29 3b 0a 20 20 20 20   (argv[7]);.    
3a550 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 72    }.    ret =..r
3a560 65 67 69 73 74 65 72 5f 77 6d 73 5f 73 72 73 20  egister_wms_srs 
3a570 28 73 71 6c 69 74 65 2c 20 75 72 6c 2c 20 6c 61  (sqlite, url, la
3a580 79 65 72 5f 6e 61 6d 65 2c 20 72 65 66 5f 73 79  yer_name, ref_sy
3a590 73 2c 20 6d 69 6e 78 2c 20 6d 69 6e 79 2c 20 6d  s, minx, miny, m
3a5a0 61 78 78 2c 0a 09 09 09 20 20 6d 61 78 79 2c 20  axx,....  maxy, 
3a5b0 69 73 5f 64 65 66 61 75 6c 74 29 3b 0a 20 20 20  is_default);.   
3a5c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3a5d0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
3a5e0 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
3a5f0 69 64 0a 66 6e 63 74 5f 55 6e 72 65 67 69 73 74  id.fnct_Unregist
3a600 65 72 57 4d 53 52 65 66 53 79 73 20 28 73 71 6c  erWMSRefSys (sql
3a610 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
3a620 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3a630 2c 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f 76  ,....  sqlite3_v
3a640 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
3a650 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
3a660 0a 2f 20 57 4d 53 5f 55 6e 52 65 67 69 73 74 65  ./ WMS_UnRegiste
3a670 72 52 65 66 53 79 73 28 54 65 78 74 20 75 72 6c  rRefSys(Text url
3a680 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d  , Text layer_nam
3a690 65 2c 20 54 65 78 74 20 72 65 66 5f 73 79 73 29  e, Text ref_sys)
3a6a0 0a 2f 0a 2f 20 64 65 6c 65 74 65 73 20 61 20 57  ././ deletes a W
3a6b0 4d 53 20 47 65 74 4d 61 70 20 53 52 53 0a 2f 20  MS GetMap SRS./ 
3a6c0 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
3a6d0 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
3a6e0 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c  ure, -1 on inval
3a6f0 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
3a700 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
3a710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 72 6c   const char *url
3a720 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
3a730 20 2a 6c 61 79 65 72 5f 6e 61 6d 65 3b 0a 20 20   *layer_name;.  
3a740 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65    const char *re
3a750 66 5f 73 79 73 3b 0a 20 20 20 20 73 71 6c 69 74  f_sys;.    sqlit
3a760 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
3a770 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3a780 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
3a790 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
3a7a0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
3a7b0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
3a7c0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
3a7d0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
3a7e0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
3a7f0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
3a800 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
3a810 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
3a820 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
3a830 0a 20 20 20 20 75 72 6c 20 3d 20 28 63 6f 6e 73  .    url = (cons
3a840 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
3a850 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
3a860 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
3a870 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3a880 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
3a890 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
3a8a0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
3a8b0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
3a8c0 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
3a8d0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3a8e0 20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d 20 28 63   layer_name = (c
3a8f0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
3a900 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
3a910 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
3a920 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3a930 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
3a940 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
3a950 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
3a960 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
3a970 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
3a980 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
3a990 20 20 20 20 72 65 66 5f 73 79 73 20 3d 20 28 63      ref_sys = (c
3a9a0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
3a9b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
3a9c0 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 72  (argv[2]);.    r
3a9d0 65 74 20 3d 20 75 6e 72 65 67 69 73 74 65 72 5f  et = unregister_
3a9e0 77 6d 73 5f 73 72 73 20 28 73 71 6c 69 74 65 2c  wms_srs (sqlite,
3a9f0 20 75 72 6c 2c 20 6c 61 79 65 72 5f 6e 61 6d 65   url, layer_name
3aa00 2c 20 72 65 66 5f 73 79 73 29 3b 0a 20 20 20 20  , ref_sys);.    
3aa10 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3aa20 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
3aa30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
3aa40 64 0a 66 6e 63 74 5f 44 65 66 61 75 6c 74 57 4d  d.fnct_DefaultWM
3aa50 53 52 65 66 53 79 73 20 28 73 71 6c 69 74 65 33  SRefSys (sqlite3
3aa60 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
3aa70 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
3aa80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
3aa90 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
3aaa0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
3aab0 0a 2f 20 57 4d 53 5f 44 65 66 61 75 6c 74 52 65  ./ WMS_DefaultRe
3aac0 66 53 79 73 28 54 65 78 74 20 75 72 6c 2c 20 54  fSys(Text url, T
3aad0 65 78 74 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20  ext layer_name, 
3aae0 54 65 78 74 20 72 65 66 5f 73 79 73 29 0a 2f 0a  Text ref_sys)./.
3aaf0 2f 20 75 70 64 61 74 65 73 20 73 6f 6d 65 20 47  / updates some G
3ab00 65 74 4d 61 70 20 64 65 66 61 75 6c 74 20 53 52  etMap default SR
3ab10 53 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e  S./ returns 1 on
3ab20 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20   success./ 0 on 
3ab30 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69  failure, -1 on i
3ab40 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
3ab50 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  .*/.    int ret;
3ab60 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
3ab70 2a 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *url;.    const 
3ab80 63 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d 65  char *layer_name
3ab90 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
3aba0 20 2a 72 65 66 5f 73 79 73 3b 0a 20 20 20 20 73   *ref_sys;.    s
3abb0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
3abc0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3abd0 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
3abe0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
3abf0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
3ac00 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
3ac10 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
3ac20 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
3ac30 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [0]) != SQLITE_T
3ac40 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f  EXT..|| sqlite3_
3ac50 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
3ac60 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [1]) != SQLITE_T
3ac70 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f  EXT..|| sqlite3_
3ac80 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
3ac90 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [2]) != SQLITE_T
3aca0 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
3acb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3acc0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
3acd0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
3ace0 20 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d 20 28     }.    url = (
3acf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
3ad00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3ad10 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
3ad20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d 20 28 63 6f  layer_name = (co
3ad30 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
3ad40 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
3ad50 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65  argv[1]);.    re
3ad60 66 5f 73 79 73 20 3d 20 28 63 6f 6e 73 74 20 63  f_sys = (const c
3ad70 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
3ad80 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
3ad90 32 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  2]);.    ret = s
3ada0 65 74 5f 77 6d 73 5f 64 65 66 61 75 6c 74 5f 73  et_wms_default_s
3adb0 72 73 20 28 73 71 6c 69 74 65 2c 20 75 72 6c 2c  rs (sqlite, url,
3adc0 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 72 65 66   layer_name, ref
3add0 5f 73 79 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  _sys);.    sqlit
3ade0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
3adf0 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a  ontext, ret);.}.
3ae00 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
3ae10 74 5f 57 4d 53 47 65 74 4d 61 70 52 65 71 75 65  t_WMSGetMapReque
3ae20 73 74 55 52 4c 20 28 73 71 6c 69 74 65 33 5f 63  stURL (sqlite3_c
3ae30 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
3ae40 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
3ae50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3ae60 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
3ae70 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57 4d 53   function:./ WMS
3ae80 5f 47 65 74 4d 61 70 52 65 71 75 65 73 74 55 52  _GetMapRequestUR
3ae90 4c 28 54 65 78 74 20 67 65 74 6d 61 70 5f 75 72  L(Text getmap_ur
3aea0 6c 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e 61  l, Text layer_na
3aeb0 6d 65 2c 20 49 6e 74 20 77 69 64 74 68 2c 0a 2f  me, Int width,./
3aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aed0 20 20 20 20 20 20 49 6e 74 20 68 65 69 67 68 74        Int height
3aee0 2c 20 44 6f 75 62 6c 65 20 6d 69 6e 78 2c 20 44  , Double minx, D
3aef0 6f 75 62 6c 65 20 6d 69 6e 79 2c 0a 2f 20 20 20  ouble miny,./   
3af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3af10 20 20 20 44 6f 75 62 6c 65 20 6d 61 78 78 2c 20     Double maxx, 
3af20 44 6f 75 62 6c 65 20 6d 61 78 79 29 0a 2f 0a 2f  Double maxy)././
3af30 20 72 65 74 75 72 6e 73 20 61 20 57 4d 53 20 47   returns a WMS G
3af40 65 74 4d 61 70 20 72 65 71 75 65 73 74 20 55 52  etMap request UR
3af50 4c 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 4e  L on success./ N
3af60 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ULL on invalid a
3af70 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
3af80 63 68 61 72 20 2a 75 72 6c 3b 0a 20 20 20 20 63  char *url;.    c
3af90 6f 6e 73 74 20 63 68 61 72 20 2a 67 65 74 6d 61  onst char *getma
3afa0 70 5f 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74  p_url;.    const
3afb0 20 63 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d   char *layer_nam
3afc0 65 3b 0a 20 20 20 20 69 6e 74 20 77 69 64 74 68  e;.    int width
3afd0 3b 0a 20 20 20 20 69 6e 74 20 68 65 69 67 68 74  ;.    int height
3afe0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e  ;.    double min
3aff0 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69  x;.    double mi
3b000 6e 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  ny;.    double m
3b010 61 78 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  axx;.    double 
3b020 6d 61 78 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  maxy;.    sqlite
3b030 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69  3 *sqlite = sqli
3b040 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
3b050 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b  andle (context);
3b060 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
3b070 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
3b080 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
3b090 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3b0a0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
3b0b0 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
3b0c0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
3b0d0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
3b0e0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
3b0f0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3b100 20 67 65 74 6d 61 70 5f 75 72 6c 20 3d 20 28 63   getmap_url = (c
3b110 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
3b120 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
3b130 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
3b140 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3b150 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
3b160 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
3b170 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
3b180 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
3b190 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
3b1a0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3b1b0 20 6c 61 79 65 72 5f 6e 61 6d 65 20 3d 20 28 63   layer_name = (c
3b1c0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
3b1d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
3b1e0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
3b1f0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3b200 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
3b210 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
3b220 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  R).      {..  sq
3b230 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
3b240 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
3b250 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
3b260 20 20 20 20 77 69 64 74 68 20 3d 20 73 71 6c 69      width = sqli
3b270 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
3b280 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[2]);.    if 
3b290 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
3b2a0 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 21 3d  ype (argv[3]) !=
3b2b0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
3b2c0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
3b2d0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
3b2e0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
3b2f0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
3b300 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74    height = sqlit
3b310 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
3b320 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[3]);.    if (
3b330 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3b340 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d 3d 20  pe (argv[4]) == 
3b350 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 6d  SQLITE_FLOAT)..m
3b360 69 6e 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  inx = sqlite3_va
3b370 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
3b380 5b 34 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  [4]);.    else i
3b390 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3b3a0 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20  _type (argv[4]) 
3b3b0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
3b3c0 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e  R).      {..  in
3b3d0 74 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  t val = sqlite3_
3b3e0 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
3b3f0 34 5d 29 3b 0a 09 20 20 6d 69 6e 78 20 3d 20 76  4]);..  minx = v
3b400 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
3b410 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
3b420 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
3b430 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
3b440 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
3b450 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
3b460 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
3b470 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[5]) == SQLITE
3b480 5f 46 4c 4f 41 54 29 0a 09 6d 69 6e 79 20 3d 20  _FLOAT)..miny = 
3b490 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
3b4a0 75 62 6c 65 20 28 61 72 67 76 5b 35 5d 29 3b 0a  uble (argv[5]);.
3b4b0 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
3b4c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
3b4d0 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c  (argv[5]) == SQL
3b4e0 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
3b4f0 20 20 20 7b 0a 09 20 20 69 6e 74 20 76 61 6c 20     {..  int val 
3b500 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3b510 69 6e 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 09  int (argv[5]);..
3b520 20 20 6d 69 6e 79 20 3d 20 76 61 6c 3b 0a 20 20    miny = val;.  
3b530 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
3b540 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
3b550 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
3b560 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
3b570 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3b580 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
3b590 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29  e_type (argv[6])
3b5a0 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
3b5b0 29 0a 09 6d 61 78 78 20 3d 20 73 71 6c 69 74 65  )..maxx = sqlite
3b5c0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
3b5d0 61 72 67 76 5b 36 5d 29 3b 0a 20 20 20 20 65 6c  argv[6]);.    el
3b5e0 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
3b5f0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
3b600 36 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  6]) == SQLITE_IN
3b610 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
3b620 20 20 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c 69    int val = sqli
3b630 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
3b640 72 67 76 5b 36 5d 29 3b 0a 09 20 20 6d 61 78 78  rgv[6]);..  maxx
3b650 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a   = val;.      }.
3b660 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
3b670 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
3b680 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
3b690 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
3b6a0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
3b6b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3b6c0 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51   (argv[7]) == SQ
3b6d0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 6d 61 78  LITE_FLOAT)..max
3b6e0 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  y = sqlite3_valu
3b6f0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 37  e_double (argv[7
3b700 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
3b710 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
3b720 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d  ype (argv[7]) ==
3b730 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
3b740 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20  .      {..  int 
3b750 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
3b760 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 37 5d  lue_int (argv[7]
3b770 29 3b 0a 09 20 20 6d 61 78 79 20 3d 20 76 61 6c  );..  maxy = val
3b780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
3b790 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
3b7a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
3b7b0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
3b7c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
3b7d0 20 20 20 20 75 72 6c 20 3d 0a 09 77 6d 73 5f 67      url =..wms_g
3b7e0 65 74 6d 61 70 5f 72 65 71 75 65 73 74 5f 75 72  etmap_request_ur
3b7f0 6c 20 28 73 71 6c 69 74 65 2c 20 67 65 74 6d 61  l (sqlite, getma
3b800 70 5f 75 72 6c 2c 20 6c 61 79 65 72 5f 6e 61 6d  p_url, layer_nam
3b810 65 2c 20 77 69 64 74 68 2c 20 68 65 69 67 68 74  e, width, height
3b820 2c 0a 09 09 09 09 6d 69 6e 78 2c 20 6d 69 6e 79  ,.....minx, miny
3b830 2c 20 6d 61 78 78 2c 20 6d 61 78 79 29 3b 0a 20  , maxx, maxy);. 
3b840 20 20 20 69 66 20 28 75 72 6c 20 3d 3d 20 4e 55     if (url == NU
3b850 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
3b860 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
3b870 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
3b880 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
3b890 74 20 28 63 6f 6e 74 65 78 74 2c 20 75 72 6c 2c  t (context, url,
3b8a0 20 73 74 72 6c 65 6e 20 28 75 72 6c 29 2c 20 73   strlen (url), s
3b8b0 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
3b8c0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
3b8d0 74 5f 57 4d 53 47 65 74 46 65 61 74 75 72 65 49  t_WMSGetFeatureI
3b8e0 6e 66 6f 52 65 71 75 65 73 74 55 52 4c 20 28 73  nfoRequestURL (s
3b8f0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3b900 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
3b910 67 63 2c 0a 09 09 09 09 20 20 73 71 6c 69 74 65  gc,.....  sqlite
3b920 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
3b930 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
3b940 6f 6e 3a 0a 2f 20 57 4d 53 5f 47 65 74 46 65 61  on:./ WMS_GetFea
3b950 74 75 72 65 49 6e 66 6f 52 65 71 75 65 73 74 55  tureInfoRequestU
3b960 52 4c 28 54 65 78 74 20 67 65 74 6d 61 70 5f 75  RL(Text getmap_u
3b970 72 6c 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e  rl, Text layer_n
3b980 61 6d 65 2c 20 49 6e 74 20 77 69 64 74 68 2c 0a  ame, Int width,.
3b990 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
3b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
3b9b0 6e 74 20 68 65 69 67 68 74 2c 20 69 6e 74 20 78  nt height, int x
3b9c0 2c 20 69 6e 74 20 79 2c 20 44 6f 75 62 6c 65 20  , int y, Double 
3b9d0 6d 69 6e 78 2c 0a 2f 20 20 20 20 20 20 20 20 20  minx,./         
3b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b9f0 20 20 20 20 20 44 6f 75 62 6c 65 20 6d 69 6e 79       Double miny
3ba00 2c 20 44 6f 75 62 6c 65 20 6d 61 78 78 2c 20 44  , Double maxx, D
3ba10 6f 75 62 6c 65 20 6d 61 78 79 29 0a 2f 20 20 20  ouble maxy)./   
3ba20 6f 72 0a 2f 20 57 4d 53 5f 47 65 74 46 65 61 74  or./ WMS_GetFeat
3ba30 75 72 65 49 6e 66 6f 52 65 71 75 65 73 74 55 52  ureInfoRequestUR
3ba40 4c 28 54 65 78 74 20 67 65 74 6d 61 70 5f 75 72  L(Text getmap_ur
3ba50 6c 2c 20 54 65 78 74 20 6c 61 79 65 72 5f 6e 61  l, Text layer_na
3ba60 6d 65 2c 20 49 6e 74 20 77 69 64 74 68 2c 0a 2f  me, Int width,./
3ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
3ba90 74 20 68 65 69 67 68 74 2c 20 69 6e 74 20 78 2c  t height, int x,
3baa0 20 69 6e 74 20 79 2c 20 44 6f 75 62 6c 65 20 6d   int y, Double m
3bab0 69 6e 78 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  inx,./          
3bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bad0 20 20 20 20 44 6f 75 62 6c 65 20 6d 69 6e 79 2c      Double miny,
3bae0 20 44 6f 75 62 6c 65 20 6d 61 78 78 2c 20 44 6f   Double maxx, Do
3baf0 75 62 6c 65 20 6d 61 78 79 2c 0a 2f 20 20 20 20  uble maxy,./    
3bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb10 20 20 20 20 20 20 20 20 20 20 49 6e 74 20 66 65            Int fe
3bb20 61 74 75 72 65 5f 63 6f 75 6e 74 20 29 0a 2f 0a  ature_count )./.
3bb30 2f 20 72 65 74 75 72 6e 73 20 61 20 57 4d 53 20  / returns a WMS 
3bb40 47 65 74 46 65 61 74 75 72 65 49 6e 66 6f 20 72  GetFeatureInfo r
3bb50 65 71 75 65 73 74 20 55 52 4c 20 6f 6e 20 73 75  equest URL on su
3bb60 63 63 65 73 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20  ccess./ NULL on 
3bb70 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
3bb80 73 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 75  s.*/.    char *u
3bb90 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  rl;.    const ch
3bba0 61 72 20 2a 67 65 74 6d 61 70 5f 75 72 6c 3b 0a  ar *getmap_url;.
3bbb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3bbc0 6c 61 79 65 72 5f 6e 61 6d 65 3b 0a 20 20 20 20  layer_name;.    
3bbd0 69 6e 74 20 77 69 64 74 68 3b 0a 20 20 20 20 69  int width;.    i
3bbe0 6e 74 20 68 65 69 67 68 74 3b 0a 20 20 20 20 69  nt height;.    i
3bbf0 6e 74 20 78 3b 0a 20 20 20 20 69 6e 74 20 79 3b  nt x;.    int y;
3bc00 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e 78  .    double minx
3bc10 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e  ;.    double min
3bc20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 61  y;.    double ma
3bc30 78 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  xx;.    double m
3bc40 61 78 79 3b 0a 20 20 20 20 69 6e 74 20 66 65 61  axy;.    int fea
3bc50 74 75 72 65 5f 63 6f 75 6e 74 20 3d 20 31 3b 0a  ture_count = 1;.
3bc60 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
3bc70 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
3bc80 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
3bc90 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
3bca0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
3bcb0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
3bcc0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
3bcd0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
3bce0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
3bcf0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
3bd00 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
3bd10 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
3bd20 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
3bd30 20 20 20 20 20 7d 0a 20 20 20 20 67 65 74 6d 61       }.    getma
3bd40 70 5f 75 72 6c 20 3d 20 28 63 6f 6e 73 74 20 63  p_url = (const c
3bd50 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
3bd60 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
3bd70 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  0]);.    if (sql
3bd80 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
3bd90 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
3bda0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
3bdb0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
3bdc0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
3bdd0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
3bde0 20 20 20 20 20 7d 0a 20 20 20 20 6c 61 79 65 72       }.    layer
3bdf0 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  _name = (const c
3be00 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
3be10 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
3be20 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  1]);.    if (sql
3be30 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
3be40 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c  (argv[2]) != SQL
3be50 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
3be60 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
3be70 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
3be80 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
3be90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77 69  ;.      }.    wi
3bea0 64 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  dth = sqlite3_va
3beb0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
3bec0 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
3bed0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
3bee0 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[3]) != SQLIT
3bef0 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
3bf00 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
3bf10 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
3bf20 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
3bf30 20 20 20 20 20 20 7d 0a 20 20 20 20 68 65 69 67        }.    heig
3bf40 68 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ht = sqlite3_val
3bf50 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29  ue_int (argv[3])
3bf60 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
3bf70 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
3bf80 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[4]) != SQLITE
3bf90 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
3bfa0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
3bfb0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
3bfc0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
3bfd0 20 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 73       }.    x = s
3bfe0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3bff0 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20   (argv[4]);.    
3c000 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
3c010 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29  e_type (argv[5])
3c020 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
3c030 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  ER).      {..  s
3c040 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
3c050 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
3c060 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
3c070 0a 20 20 20 20 79 20 3d 20 73 71 6c 69 74 65 33  .    y = sqlite3
3c080 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
3c090 5b 35 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71  [5]);.    if (sq
3c0a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3c0b0 20 28 61 72 67 76 5b 36 5d 29 20 3d 3d 20 53 51   (argv[6]) == SQ
3c0c0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 6d 69 6e  LITE_FLOAT)..min
3c0d0 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
3c0e0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 36  e_double (argv[6
3c0f0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
3c100 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
3c110 79 70 65 20 28 61 72 67 76 5b 36 5d 29 20 3d 3d  ype (argv[6]) ==
3c120 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
3c130 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20  .      {..  int 
3c140 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
3c150 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 36 5d  lue_int (argv[6]
3c160 29 3b 0a 09 20 20 6d 69 6e 78 20 3d 20 76 61 6c  );..  minx = val
3c170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
3c180 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
3c190 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
3c1a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
3c1b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
3c1c0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
3c1d0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
3c1e0 5b 37 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [7]) == SQLITE_F
3c1f0 4c 4f 41 54 29 0a 09 6d 69 6e 79 20 3d 20 73 71  LOAT)..miny = sq
3c200 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
3c210 6c 65 20 28 61 72 67 76 5b 37 5d 29 3b 0a 20 20  le (argv[7]);.  
3c220 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
3c230 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
3c240 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[7]) == SQLIT
3c250 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
3c260 20 7b 0a 09 20 20 69 6e 74 20 76 61 6c 20 3d 20   {..  int val = 
3c270 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
3c280 74 20 28 61 72 67 76 5b 37 5d 29 3b 0a 09 20 20  t (argv[7]);..  
3c290 6d 69 6e 79 20 3d 20 76 61 6c 3b 0a 20 20 20 20  miny = val;.    
3c2a0 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
3c2b0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
3c2c0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
3c2d0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
3c2e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
3c2f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
3c300 74 79 70 65 20 28 61 72 67 76 5b 38 5d 29 20 3d  type (argv[8]) =
3c310 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
3c320 09 6d 61 78 78 20 3d 20 73 71 6c 69 74 65 33 5f  .maxx = sqlite3_
3c330 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
3c340 67 76 5b 38 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[8]);.    else
3c350 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
3c360 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 38 5d  ue_type (argv[8]
3c370 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
3c380 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
3c390 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c 69 74 65  int val = sqlite
3c3a0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
3c3b0 76 5b 38 5d 29 3b 0a 09 20 20 6d 61 78 78 20 3d  v[8]);..  maxx =
3c3c0 20 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20   val;.      }.  
3c3d0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
3c3e0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3c3f0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
3c400 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
3c410 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
3c420 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
3c430 61 72 67 76 5b 39 5d 29 20 3d 3d 20 53 51 4c 49  argv[9]) == SQLI
3c440 54 45 5f 46 4c 4f 41 54 29 0a 09 6d 61 78 79 20  TE_FLOAT)..maxy 
3c450 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3c460 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 39 5d 29  double (argv[9])
3c470 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
3c480 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3c490 65 20 28 61 72 67 76 5b 39 5d 29 20 3d 3d 20 53  e (argv[9]) == S
3c4a0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
3c4b0 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20 76 61       {..  int va
3c4c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
3c4d0 65 5f 69 6e 74 20 28 61 72 67 76 5b 39 5d 29 3b  e_int (argv[9]);
3c4e0 0a 09 20 20 6d 61 78 79 20 3d 20 76 61 6c 3b 0a  ..  maxy = val;.
3c4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
3c500 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
3c510 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
3c520 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
3c530 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
3c540 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 31 31    if (argc >= 11
3c550 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
3c560 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
3c570 79 70 65 20 28 61 72 67 76 5b 31 30 5d 29 20 21  ype (argv[10]) !
3c580 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
3c590 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
3c5a0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
3c5b0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
3c5c0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 66 65  rn;..    }..  fe
3c5d0 61 74 75 72 65 5f 63 6f 75 6e 74 20 3d 20 73 71  ature_count = sq
3c5e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
3c5f0 28 61 72 67 76 5b 31 30 5d 29 3b 0a 20 20 20 20  (argv[10]);.    
3c600 20 20 7d 0a 20 20 20 20 75 72 6c 20 3d 0a 09 77    }.    url =..w
3c610 6d 73 5f 67 65 74 66 65 61 74 75 72 65 69 6e 66  ms_getfeatureinf
3c620 6f 5f 72 65 71 75 65 73 74 5f 75 72 6c 20 28 73  o_request_url (s
3c630 71 6c 69 74 65 2c 20 67 65 74 6d 61 70 5f 75 72  qlite, getmap_ur
3c640 6c 2c 20 6c 61 79 65 72 5f 6e 61 6d 65 2c 20 77  l, layer_name, w
3c650 69 64 74 68 2c 0a 09 09 09 09 09 68 65 69 67 68  idth,......heigh
3c660 74 2c 20 78 2c 20 79 2c 20 6d 69 6e 78 2c 20 6d  t, x, y, minx, m
3c670 69 6e 79 2c 20 6d 61 78 78 2c 20 6d 61 78 79 2c  iny, maxx, maxy,
3c680 0a 09 09 09 09 09 66 65 61 74 75 72 65 5f 63 6f  ......feature_co
3c690 75 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 75 72  unt);.    if (ur
3c6a0 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69  l == NULL)..sqli
3c6b0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
3c6c0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
3c6d0 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  lse..sqlite3_res
3c6e0 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
3c6f0 74 2c 20 75 72 6c 2c 20 73 74 72 6c 65 6e 20 28  t, url, strlen (
3c700 75 72 6c 29 2c 20 73 71 6c 69 74 65 33 5f 66 72  url), sqlite3_fr
3c710 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ee);.}..static v
3c720 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74 65  oid.fnct_Registe
3c730 72 44 61 74 61 4c 69 63 65 6e 73 65 20 28 73 71  rDataLicense (sq
3c740 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
3c750 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
3c760 63 2c 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f  c,....  sqlite3_
3c770 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
3c780 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
3c790 3a 0a 2f 20 52 65 67 69 73 74 65 72 44 61 74 61  :./ RegisterData
3c7a0 4c 69 63 65 6e 73 65 28 54 65 78 74 20 6c 69 63  License(Text lic
3c7b0 65 6e 73 65 5f 6e 61 6d 65 29 0a 2f 20 20 20 20  ense_name)./    
3c7c0 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 44 61 74  or./ RegisterDat
3c7d0 61 4c 69 63 65 6e 73 65 28 54 65 78 74 20 6c 69  aLicense(Text li
3c7e0 63 65 6e 73 65 5f 6e 61 6d 65 2c 20 54 65 78 74  cense_name, Text
3c7f0 20 6c 69 63 65 6e 73 65 5f 75 72 6c 29 0a 2f 0a   license_url)./.
3c800 2f 20 69 6e 73 65 72 74 73 20 61 20 44 61 74 61  / inserts a Data
3c810 20 4c 69 63 65 6e 73 65 0a 2f 20 72 65 74 75 72   License./ retur
3c820 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a  ns 1 on success.
3c830 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20  / 0 on failure, 
3c840 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  -1 on invalid ar
3c850 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69  guments.*/.    i
3c860 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73  nt ret;.    cons
3c870 74 20 63 68 61 72 20 2a 6c 69 63 65 6e 73 65 5f  t char *license_
3c880 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  name;.    const 
3c890 63 68 61 72 20 2a 75 72 6c 20 3d 20 4e 55 4c 4c  char *url = NULL
3c8a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
3c8b0 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
3c8c0 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
3c8d0 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
3c8e0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
3c8f0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
3c900 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
3c910 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3c920 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
3c930 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20  QLITE_TEXT).    
3c940 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
3c950 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
3c960 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
3c970 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3c980 6c 69 63 65 6e 73 65 5f 6e 61 6d 65 20 3d 20 28  license_name = (
3c990 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
3c9a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3c9b0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
3c9c0 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20  if (argc >= 2). 
3c9d0 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
3c9e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3c9f0 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
3ca00 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20  LITE_TEXT)..    
3ca10 20 20 75 72 6c 20 3d 20 28 63 6f 6e 73 74 20 63    url = (const c
3ca20 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
3ca30 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
3ca40 31 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  1]);..  else..  
3ca50 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
3ca60 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
3ca70 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e  t, -1);...return
3ca80 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
3ca90 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67 69 73  .    ret = regis
3caa0 74 65 72 5f 64 61 74 61 5f 6c 69 63 65 6e 73 65  ter_data_license
3cab0 20 28 73 71 6c 69 74 65 2c 20 6c 69 63 65 6e 73   (sqlite, licens
3cac0 65 5f 6e 61 6d 65 2c 20 75 72 6c 29 3b 0a 20 20  e_name, url);.  
3cad0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3cae0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
3caf0 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
3cb00 6f 69 64 0a 66 6e 63 74 5f 55 6e 52 65 67 69 73  oid.fnct_UnRegis
3cb10 74 65 72 44 61 74 61 4c 69 63 65 6e 73 65 20 28  terDataLicense (
3cb20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3cb30 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
3cb40 72 67 63 2c 0a 09 09 09 20 20 20 20 73 71 6c 69  rgc,....    sqli
3cb50 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
3cb60 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
3cb70 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69 73 74  tion:./ UnRegist
3cb80 65 72 44 61 74 61 4c 69 63 65 6e 73 65 28 54 65  erDataLicense(Te
3cb90 78 74 20 6c 69 63 65 6e 73 65 5f 6e 61 6d 65 29  xt license_name)
3cba0 0a 2f 0a 2f 20 64 65 6c 65 74 65 73 20 61 20 44  ././ deletes a D
3cbb0 61 74 61 20 4c 69 63 65 6e 73 65 0a 2f 20 72 65  ata License./ re
3cbc0 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
3cbd0 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
3cbe0 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
3cbf0 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
3cc00 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
3cc10 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 63 65 6e  onst char *licen
3cc20 73 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  se_name;.    sql
3cc30 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
3cc40 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3cc50 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
3cc60 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
3cc70 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
3cc80 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
3cc90 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
3cca0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
3ccb0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
3ccc0 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
3ccd0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
3cce0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
3ccf0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
3cd00 20 7d 0a 20 20 20 20 6c 69 63 65 6e 73 65 5f 6e   }.    license_n
3cd10 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
3cd20 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
3cd30 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
3cd40 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 75 6e 72  );.    ret = unr
3cd50 65 67 69 73 74 65 72 5f 64 61 74 61 5f 6c 69 63  egister_data_lic
3cd60 65 6e 73 65 20 28 73 71 6c 69 74 65 2c 20 6c 69  ense (sqlite, li
3cd70 63 65 6e 73 65 5f 6e 61 6d 65 29 3b 0a 20 20 20  cense_name);.   
3cd80 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3cd90 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
3cda0 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
3cdb0 69 64 0a 66 6e 63 74 5f 52 65 6e 61 6d 65 44 61  id.fnct_RenameDa
3cdc0 74 61 4c 69 63 65 6e 73 65 20 28 73 71 6c 69 74  taLicense (sqlit
3cdd0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
3cde0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
3cdf0 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ...sqlite3_value
3ce00 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
3ce10 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52  QL function:./ R
3ce20 65 6e 61 6d 65 44 61 74 61 4c 69 63 65 6e 73 65  enameDataLicense
3ce30 28 54 65 78 74 20 6f 6c 64 5f 6e 61 6d 65 2c 20  (Text old_name, 
3ce40 54 65 78 74 20 6e 65 77 5f 6e 61 6d 65 29 0a 2f  Text new_name)./
3ce50 0a 2f 20 72 65 6e 61 6d 65 73 20 61 6e 20 65 78  ./ renames an ex
3ce60 69 73 74 69 6e 67 20 44 61 74 61 20 4c 69 63 65  isting Data Lice
3ce70 6e 73 65 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  nse./ returns 1 
3ce80 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
3ce90 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
3cea0 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
3ceb0 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
3cec0 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
3ced0 72 20 2a 6f 6c 64 5f 6e 61 6d 65 3b 0a 20 20 20  r *old_name;.   
3cee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 65 77   const char *new
3cef0 5f 6e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  _name;.    sqlit
3cf00 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
3cf10 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3cf20 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
3cf30 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
3cf40 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
3cf50 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
3cf60 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
3cf70 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
3cf80 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 20   != SQLITE_TEXT 
3cf90 7c 7c 0a 09 73 71 6c 69 74 65 33 5f 76 61 6c 75  ||..sqlite3_valu
3cfa0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
3cfb0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
3cfc0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
3cfd0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
3cfe0 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
3cff0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
3d000 0a 20 20 20 20 6f 6c 64 5f 6e 61 6d 65 20 3d 20  .    old_name = 
3d010 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
3d020 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3d030 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
3d040 20 6e 65 77 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e   new_name = (con
3d050 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
3d060 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
3d070 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[1]);.    ret
3d080 20 3d 20 72 65 6e 61 6d 65 5f 64 61 74 61 5f 6c   = rename_data_l
3d090 69 63 65 6e 73 65 20 28 73 71 6c 69 74 65 2c 20  icense (sqlite, 
3d0a0 6f 6c 64 5f 6e 61 6d 65 2c 20 6e 65 77 5f 6e 61  old_name, new_na
3d0b0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
3d0c0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
3d0d0 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73  text, ret);.}..s
3d0e0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
3d0f0 53 65 74 44 61 74 61 4c 69 63 65 6e 73 65 55 72  SetDataLicenseUr
3d100 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l (sqlite3_conte
3d110 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
3d120 74 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74  t argc,....sqlit
3d130 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
3d140 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
3d150 69 6f 6e 3a 0a 2f 20 53 65 74 44 61 74 61 4c 69  ion:./ SetDataLi
3d160 63 65 6e 73 65 55 72 6c 28 54 65 78 74 20 6c 69  censeUrl(Text li
3d170 63 65 6e 73 65 5f 6e 61 6d 65 2c 20 54 65 78 74  cense_name, Text
3d180 20 6c 69 63 65 6e 73 65 5f 75 72 6c 29 0a 2f 0a   license_url)./.
3d190 2f 20 75 70 64 61 74 65 73 20 61 20 44 61 74 61  / updates a Data
3d1a0 20 4c 69 63 65 6e 73 65 20 55 52 4c 0a 2f 20 72   License URL./ r
3d1b0 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63  eturns 1 on succ
3d1c0 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75  ess./ 0 on failu
3d1d0 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69  re, -1 on invali
3d1e0 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
3d1f0 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
3d200 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 63 65  const char *lice
3d210 6e 73 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  nse_name;.    co
3d220 6e 73 74 20 63 68 61 72 20 2a 75 72 6c 3b 0a 20  nst char *url;. 
3d230 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
3d240 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
3d250 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
3d260 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
3d270 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
3d280 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
3d290 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
3d2a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
3d2b0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
3d2c0 54 45 5f 54 45 58 54 20 7c 7c 0a 09 73 71 6c 69  TE_TEXT ||..sqli
3d2d0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
3d2e0 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
3d2f0 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
3d300 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
3d310 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
3d320 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
3d330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 69 63  .      }.    lic
3d340 65 6e 73 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e  ense_name = (con
3d350 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
3d360 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
3d370 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 75 72 6c  rgv[0]);.    url
3d380 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
3d390 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
3d3a0 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
3d3b0 20 20 20 20 72 65 74 20 3d 20 73 65 74 5f 64 61      ret = set_da
3d3c0 74 61 5f 6c 69 63 65 6e 73 65 5f 75 72 6c 20 28  ta_license_url (
3d3d0 73 71 6c 69 74 65 2c 20 6c 69 63 65 6e 73 65 5f  sqlite, license_
3d3e0 6e 61 6d 65 2c 20 75 72 6c 29 3b 0a 20 20 20 20  name, url);.    
3d3f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3d400 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
3d410 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
3d420 64 0a 66 6e 63 74 5f 43 72 65 61 74 65 4d 65 74  d.fnct_CreateMet
3d430 61 43 61 74 61 6c 6f 67 54 61 62 6c 65 73 20 28  aCatalogTables (
3d440 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3d450 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
3d460 72 67 63 2c 0a 09 09 09 20 20 20 20 20 20 73 71  rgc,....      sq
3d470 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
3d480 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
3d490 6e 63 74 69 6f 6e 3a 0a 2f 20 43 72 65 61 74 65  nction:./ Create
3d4a0 4d 65 74 61 43 61 74 61 6c 6f 67 54 61 62 6c 65  MetaCatalogTable
3d4b0 73 28 74 72 61 6e 73 61 63 74 69 6f 6e 20 54 52  s(transaction TR
3d4c0 55 45 7c 46 41 4c 53 45 29 0a 2f 0a 2f 20 63 72  UE|FALSE)././ cr
3d4d0 65 61 74 65 73 20 28 6f 72 20 72 65 2d 63 72 65  eates (or re-cre
3d4e0 61 74 65 73 29 20 62 6f 74 68 20 22 73 70 6c 69  ates) both "spli
3d4f0 74 65 5f 6d 65 74 61 63 61 74 61 6c 6f 67 22 0a  te_metacatalog".
3d500 2f 20 61 6e 64 20 22 73 70 6c 69 74 65 5f 6d 65  / and "splite_me
3d510 74 61 63 61 74 61 6c 6f 67 5f 73 74 61 74 69 73  tacatalog_statis
3d520 74 69 63 73 22 20 74 61 62 6c 65 73 0a 2f 20 72  tics" tables./ r
3d530 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63  eturns 1 on succ
3d540 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75  ess./ 0 on failu
3d550 72 65 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  re.*/.    char *
3d560 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  errMsg = NULL;. 
3d570 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
3d580 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
3d590 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
3d5a0 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
3d5b0 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
3d5c0 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
3d5d0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
3d5e0 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
3d5f0 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20 20 20 69  L_LINE */..    i
3d600 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
3d610 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
3d620 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
3d630 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70  R).      {..  sp
3d640 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20  atialite_e..    
3d650 20 20 28 22 43 72 65 61 74 65 4d 65 74 61 43 61    ("CreateMetaCa
3d660 74 61 6c 6f 67 54 61 62 6c 65 73 28 29 20 65 72  talogTables() er
3d670 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 31 20  ror: argument 1 
3d680 5b 54 52 41 4e 53 41 43 54 49 4f 4e 5d 20 69 73  [TRANSACTION] is
3d690 20 6e 6f 74 20 6f 66 20 74 68 65 20 49 6e 74 65   not of the Inte
3d6a0 67 65 72 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20  ger type\n");.. 
3d6b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3d6c0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
3d6d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
3d6e0 20 7d 0a 20 20 20 20 74 72 61 6e 73 61 63 74 69   }.    transacti
3d6f0 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  on = sqlite3_val
3d700 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
3d710 3b 0a 20 20 20 20 69 66 20 28 74 72 61 6e 73 61  ;.    if (transa
3d720 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 7b 0a 09  ction).      {..
3d730 20 20 2f 2a 20 73 74 61 72 74 69 6e 67 20 61 20    /* starting a 
3d740 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
3d750 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
3d760 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 42  exec (sqlite, "B
3d770 45 47 49 4e 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  EGIN", NULL, NUL
3d780 4c 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20  L, &errMsg);..  
3d790 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54  if (ret != SQLIT
3d7a0 45 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74  E_OK)..      got
3d7b0 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o error;.      }
3d7c0 0a 20 20 20 20 69 66 20 28 21 67 61 69 61 43 72  .    if (!gaiaCr
3d7d0 65 61 74 65 4d 65 74 61 43 61 74 61 6c 6f 67 54  eateMetaCatalogT
3d7e0 61 62 6c 65 73 20 28 73 71 6c 69 74 65 29 29 0a  ables (sqlite)).
3d7f0 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
3d800 20 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e   if (transaction
3d810 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
3d820 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 73  committing the s
3d830 74 69 6c 6c 20 70 65 6e 64 69 6e 67 20 54 72 61  till pending Tra
3d840 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 20 20 72  nsaction */..  r
3d850 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  et = sqlite3_exe
3d860 63 20 28 73 71 6c 69 74 65 2c 20 22 43 4f 4d 4d  c (sqlite, "COMM
3d870 49 54 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  IT", NULL, NULL,
3d880 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20 69 66   &errMsg);..  if
3d890 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f   (ret != SQLITE_
3d8a0 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20  OK)..      goto 
3d8b0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
3d8c0 20 20 20 75 70 64 61 74 65 53 70 61 74 69 61 4c     updateSpatiaL
3d8d0 69 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c 69  iteHistory (sqli
3d8e0 74 65 2c 20 22 2a 2a 2a 20 4d 65 74 61 43 61 74  te, "*** MetaCat
3d8f0 61 6c 6f 67 20 2a 2a 2a 22 2c 20 4e 55 4c 4c 2c  alog ***", NULL,
3d900 0a 09 09 09 20 20 20 20 20 22 54 61 62 6c 65 73  ....     "Tables
3d910 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72   successfully cr
3d920 65 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61  eated and initia
3d930 6c 69 7a 65 64 22 29 3b 0a 20 20 20 20 73 71 6c  lized");.    sql
3d940 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
3d950 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
3d960 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 65 72 72    return;..  err
3d970 6f 72 3a 0a 20 20 20 20 69 66 20 28 74 72 61 6e  or:.    if (tran
3d980 73 61 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 7b  saction).      {
3d990 0a 09 20 20 2f 2a 20 70 65 72 66 6f 72 6d 69 6e  ..  /* performin
3d9a0 67 20 61 20 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  g a Rollback */.
3d9b0 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
3d9c0 5f 65 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22  _exec (sqlite, "
3d9d0 52 4f 4c 4c 42 41 43 4b 22 2c 20 4e 55 4c 4c 2c  ROLLBACK", NULL,
3d9e0 20 4e 55 4c 4c 2c 20 26 65 72 72 4d 73 67 29 3b   NULL, &errMsg);
3d9f0 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 53  ..  if (ret != S
3da00 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 20  QLITE_OK)..     
3da10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65   sqlite3_free (e
3da20 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a  rrMsg);.      }.
3da30 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3da40 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
3da50 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
3da60 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
3da70 66 6e 63 74 5f 55 70 64 61 74 65 4d 65 74 61 43  fnct_UpdateMetaC
3da80 61 74 61 6c 6f 67 53 74 61 74 69 73 74 69 63 73  atalogStatistics
3da90 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
3daa0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
3dab0 20 61 72 67 63 2c 0a 09 09 09 09 20 20 73 71 6c   argc,.....  sql
3dac0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
3dad0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
3dae0 63 74 69 6f 6e 3a 0a 2f 20 55 70 64 61 74 65 4d  ction:./ UpdateM
3daf0 65 74 61 43 61 74 61 6c 6f 67 53 74 61 74 69 73  etaCatalogStatis
3db00 74 69 63 73 28 74 72 61 6e 73 61 63 74 69 6f 6e  tics(transaction
3db10 20 54 52 55 45 7c 46 41 4c 53 45 2c 20 74 61 62   TRUE|FALSE, tab
3db20 6c 65 2c 20 63 6f 6c 75 6d 6e 29 0a 2f 20 55 70  le, column)./ Up
3db30 64 61 74 65 4d 65 74 61 43 61 74 61 6c 6f 67 53  dateMetaCatalogS
3db40 74 61 74 69 73 74 69 63 73 28 74 72 61 6e 73 61  tatistics(transa
3db50 63 74 69 6f 6e 20 54 52 55 45 7c 46 41 4c 53 45  ction TRUE|FALSE
3db60 2c 20 6d 61 73 74 65 72 5f 74 61 62 6c 65 2c 20  , master_table, 
3db70 74 61 62 6c 65 5f 6e 61 6d 65 2c 20 63 6f 6c 75  table_name, colu
3db80 6d 6e 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 75 70 64  mn_name)././ upd
3db90 61 74 65 73 20 74 68 65 20 4d 65 74 61 43 61 74  ates the MetaCat
3dba0 61 6c 6f 67 20 73 74 61 74 69 73 74 69 63 73 0a  alog statistics.
3dbb0 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
3dbc0 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
3dbd0 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63 68 61  ilure.*/.    cha
3dbe0 72 20 2a 65 72 72 4d 73 67 20 3d 20 4e 55 4c 4c  r *errMsg = NULL
3dbf0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
3dc00 20 20 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69     int transacti
3dc10 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  on = 0;.    cons
3dc20 74 20 63 68 61 72 20 2a 6d 61 73 74 65 72 5f 74  t char *master_t
3dc30 61 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  able = NULL;.   
3dc40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62   const char *tab
3dc50 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  le = NULL;.    c
3dc60 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
3dc70 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71  n = NULL;.    sq
3dc80 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20  lite3 *sqlite = 
3dc90 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
3dca0 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65  db_handle (conte
3dcb0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
3dcc0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
3dcd0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a  V_EXCL_LINE */..
3dce0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
3dcf0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
3dd00 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49  [0]) != SQLITE_I
3dd10 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
3dd20 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
3dd30 09 20 20 20 20 20 20 28 22 55 70 64 61 74 65 4d  .      ("UpdateM
3dd40 65 74 61 43 61 74 61 6c 6f 67 53 74 61 74 69 73  etaCatalogStatis
3dd50 74 69 63 73 28 29 20 65 72 72 6f 72 3a 20 61 72  tics() error: ar
3dd60 67 75 6d 65 6e 74 20 31 20 5b 54 52 41 4e 53 41  gument 1 [TRANSA
3dd70 43 54 49 4f 4e 5d 20 69 73 20 6e 6f 74 20 6f 66  CTION] is not of
3dd80 20 74 68 65 20 49 6e 74 65 67 65 72 20 74 79 70   the Integer typ
3dd90 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65  e\n");..  sqlite
3dda0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
3ddb0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
3ddc0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3ddd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 73 71  transaction = sq
3dde0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
3ddf0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
3de00 66 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20  f (argc == 3).  
3de10 20 20 20 20 7b 0a 09 20 20 2f 2a 20 74 61 62 6c      {..  /* tabl
3de20 65 20 26 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 20  e & column mode 
3de30 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65  */..  if (sqlite
3de40 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
3de50 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
3de60 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20 74 61  _TEXT)..      ta
3de70 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ble = (const cha
3de80 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
3de90 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
3dea0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
3deb0 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f 65  {...spatialite_e
3dec0 0a 09 09 20 20 20 20 28 22 55 70 64 61 74 65 4d  ...    ("UpdateM
3ded0 65 74 61 43 61 74 61 6c 6f 67 53 74 61 74 69 73  etaCatalogStatis
3dee0 74 69 63 73 28 29 20 65 72 72 6f 72 3a 20 61 72  tics() error: ar
3def0 67 75 6d 65 6e 74 20 32 20 5b 54 41 42 4c 45 5f  gument 2 [TABLE_
3df00 4e 41 4d 45 5d 20 69 73 20 6e 6f 74 20 6f 66 20  NAME] is not of 
3df10 74 68 65 20 54 65 78 74 20 74 79 70 65 5c 6e 22  the Text type\n"
3df20 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
3df30 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
3df40 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
3df50 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
3df60 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
3df70 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
3df80 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20  TE_TEXT)..      
3df90 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f 6e 73 74 20  column = (const 
3dfa0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
3dfb0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
3dfc0 5b 32 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  [2]);..  else.. 
3dfd0 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74     {...spatialit
3dfe0 65 5f 65 0a 09 09 20 20 20 20 28 22 55 70 64 61  e_e...    ("Upda
3dff0 74 65 4d 65 74 61 43 61 74 61 6c 6f 67 53 74 61  teMetaCatalogSta
3e000 74 69 73 74 69 63 73 28 29 20 65 72 72 6f 72 3a  tistics() error:
3e010 20 61 72 67 75 6d 65 6e 74 20 32 20 5b 43 4f 4c   argument 2 [COL
3e020 55 4d 4e 5f 4e 41 4d 45 5d 20 69 73 20 6e 6f 74  UMN_NAME] is not
3e030 20 6f 66 20 74 68 65 20 54 65 78 74 20 74 79 70   of the Text typ
3e040 65 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65 33  e\n");...sqlite3
3e050 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
3e060 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
3e070 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
3e080 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
3e090 7b 0a 09 20 20 2f 2a 20 6d 61 73 74 65 72 2d 74  {..  /* master-t
3e0a0 61 62 6c 65 20 26 20 74 61 62 6c 65 5f 6e 61 6d  able & table_nam
3e0b0 65 20 26 20 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  e & column_name 
3e0c0 6d 6f 64 65 20 2a 2f 0a 09 20 20 69 66 20 28 73  mode */..  if (s
3e0d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3e0e0 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
3e0f0 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
3e100 20 20 20 6d 61 73 74 65 72 5f 74 61 62 6c 65 20     master_table 
3e110 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
3e120 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
3e130 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  ext (argv[1]);..
3e140 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
3e150 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 09 20  spatialite_e... 
3e160 20 20 20 28 22 55 70 64 61 74 65 4d 65 74 61 43     ("UpdateMetaC
3e170 61 74 61 6c 6f 67 53 74 61 74 69 73 74 69 63 73  atalogStatistics
3e180 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65  () error: argume
3e190 6e 74 20 32 20 5b 4d 41 53 54 45 52 5f 54 41 42  nt 2 [MASTER_TAB
3e1a0 4c 45 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74 68  LE] is not of th
3e1b0 65 20 54 65 78 74 20 74 79 70 65 5c 6e 22 29 3b  e Text type\n");
3e1c0 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
3e1d0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
3e1e0 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
3e1f0 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   }..  if (sqlite
3e200 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
3e210 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
3e220 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20 74 61  _TEXT)..      ta
3e230 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ble = (const cha
3e240 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
3e250 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d  ue_text (argv[2]
3e260 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
3e270 7b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f 65  {...spatialite_e
3e280 0a 09 09 20 20 20 20 28 22 55 70 64 61 74 65 4d  ...    ("UpdateM
3e290 65 74 61 43 61 74 61 6c 6f 67 53 74 61 74 69 73  etaCatalogStatis
3e2a0 74 69 63 73 28 29 20 65 72 72 6f 72 3a 20 61 72  tics() error: ar
3e2b0 67 75 6d 65 6e 74 20 33 20 5b 54 41 42 4c 45 5f  gument 3 [TABLE_
3e2c0 4e 41 4d 45 5d 20 69 73 20 6e 6f 74 20 6f 66 20  NAME] is not of 
3e2d0 74 68 65 20 54 65 78 74 20 74 79 70 65 5c 6e 22  the Text type\n"
3e2e0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
3e2f0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
3e300 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
3e310 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
3e320 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
3e330 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49  argv[3]) == SQLI
3e340 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20  TE_TEXT)..      
3e350 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f 6e 73 74 20  column = (const 
3e360 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
3e370 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
3e380 5b 33 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  [3]);..  else.. 
3e390 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69 74     {...spatialit
3e3a0 65 5f 65 0a 09 09 20 20 20 20 28 22 55 70 64 61  e_e...    ("Upda
3e3b0 74 65 4d 65 74 61 43 61 74 61 6c 6f 67 53 74 61  teMetaCatalogSta
3e3c0 74 69 73 74 69 63 73 28 29 20 65 72 72 6f 72 3a  tistics() error:
3e3d0 20 61 72 67 75 6d 65 6e 74 20 33 20 5b 43 4f 4c   argument 3 [COL
3e3e0 55 4d 4e 5f 4e 41 4d 45 5d 20 69 73 20 6e 6f 74  UMN_NAME] is not
3e3f0 20 6f 66 20 74 68 65 20 54 65 78 74 20 74 79 70   of the Text typ
3e400 65 5c 6e 22 29 3b 0a 09 09 73 71 6c 69 74 65 33  e\n");...sqlite3
3e410 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
3e420 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
3e430 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
3e440 0a 20 20 20 20 69 66 20 28 74 72 61 6e 73 61 63  .    if (transac
3e450 74 69 6f 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20  tion).      {.. 
3e460 20 2f 2a 20 73 74 61 72 74 69 6e 67 20 61 20 54   /* starting a T
3e470 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 20  ransaction */.. 
3e480 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65   ret = sqlite3_e
3e490 78 65 63 20 28 73 71 6c 69 74 65 2c 20 22 42 45  xec (sqlite, "BE
3e4a0 47 49 4e 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  GIN", NULL, NULL
3e4b0 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20 69  , &errMsg);..  i
3e4c0 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
3e4d0 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74 6f  _OK)..      goto
3e4e0 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a   error;.      }.
3e4f0 20 20 20 20 69 66 20 28 6d 61 73 74 65 72 5f 74      if (master_t
3e500 61 62 6c 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  able != NULL).  
3e510 20 20 20 20 7b 0a 09 20 20 69 66 20 28 21 67 61      {..  if (!ga
3e520 69 61 55 70 64 61 74 65 4d 65 74 61 43 61 74 61  iaUpdateMetaCata
3e530 6c 6f 67 53 74 61 74 69 73 74 69 63 73 46 72 6f  logStatisticsFro
3e540 6d 4d 61 73 74 65 72 0a 09 20 20 20 20 20 20 28  mMaster..      (
3e550 73 71 6c 69 74 65 2c 20 6d 61 73 74 65 72 5f 74  sqlite, master_t
3e560 61 62 6c 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c  able, table, col
3e570 75 6d 6e 29 29 0a 09 20 20 20 20 20 20 67 6f 74  umn))..      got
3e580 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o error;.      }
3e590 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
3e5a0 7b 0a 09 20 20 69 66 20 28 21 67 61 69 61 55 70  {..  if (!gaiaUp
3e5b0 64 61 74 65 4d 65 74 61 43 61 74 61 6c 6f 67 53  dateMetaCatalogS
3e5c0 74 61 74 69 73 74 69 63 73 20 28 73 71 6c 69 74  tatistics (sqlit
3e5d0 65 2c 20 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e  e, table, column
3e5e0 29 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 65  ))..      goto e
3e5f0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
3e600 20 20 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f    if (transactio
3e610 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  n).      {..  /*
3e620 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20   committing the 
3e630 73 74 69 6c 6c 20 70 65 6e 64 69 6e 67 20 54 72  still pending Tr
3e640 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 20 20  ansaction */..  
3e650 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  ret = sqlite3_ex
3e660 65 63 20 28 73 71 6c 69 74 65 2c 20 22 43 4f 4d  ec (sqlite, "COM
3e670 4d 49 54 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  MIT", NULL, NULL
3e680 2c 20 26 65 72 72 4d 73 67 29 3b 0a 09 20 20 69  , &errMsg);..  i
3e690 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
3e6a0 5f 4f 4b 29 0a 09 20 20 20 20 20 20 67 6f 74 6f  _OK)..      goto
3e6b0 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a   error;.      }.
3e6c0 20 20 20 20 75 70 64 61 74 65 53 70 61 74 69 61      updateSpatia
3e6d0 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73 71 6c  LiteHistory (sql
3e6e0 69 74 65 2c 20 22 2a 2a 2a 20 4d 65 74 61 43 61  ite, "*** MetaCa
3e6f0 74 61 6c 6f 67 20 2a 2a 2a 22 2c 20 4e 55 4c 4c  talog ***", NULL
3e700 2c 0a 09 09 09 20 20 20 20 20 22 53 74 61 74 69  ,....     "Stati
3e710 73 74 69 63 73 20 73 75 63 63 65 73 73 66 75 6c  stics successful
3e720 6c 79 20 75 70 64 61 74 65 64 22 29 3b 0a 20 20  ly updated");.  
3e730 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3e740 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31  _int (context, 1
3e750 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  );.    return;..
3e760 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 69 66 20    error:.    if 
3e770 28 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 20 20  (transaction).  
3e780 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 65 72 66      {..  /* perf
3e790 6f 72 6d 69 6e 67 20 61 20 52 6f 6c 6c 62 61 63  orming a Rollbac
3e7a0 6b 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 71  k */..  ret = sq
3e7b0 6c 69 74 65 33 5f 65 78 65 63 20 28 73 71 6c 69  lite3_exec (sqli
3e7c0 74 65 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  te, "ROLLBACK", 
3e7d0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 65 72 72  NULL, NULL, &err
3e7e0 4d 73 67 29 3b 0a 09 20 20 69 66 20 28 72 65 74  Msg);..  if (ret
3e7f0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
3e800 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3e810 65 65 20 28 65 72 72 4d 73 67 29 3b 0a 20 20 20  ee (errMsg);.   
3e820 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3e830 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
3e840 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  text, 0);.    re
3e850 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  turn;.}..static 
3e860 67 61 69 61 50 6f 69 6e 74 50 74 72 0a 73 69 6d  gaiaPointPtr.sim
3e870 70 6c 65 50 6f 69 6e 74 20 28 67 61 69 61 47 65  plePoint (gaiaGe
3e880 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b  omCollPtr geo).{
3e890 0a 2f 2a 20 68 65 6c 70 65 72 20 66 75 6e 63 74  ./* helper funct
3e8a0 69 6f 6e 0a 2f 20 69 66 20 74 68 69 73 20 47 45  ion./ if this GE
3e8b0 4f 4d 45 54 52 59 20 63 6f 6e 74 61 69 6e 73 20  OMETRY contains 
3e8c0 6f 6e 6c 79 20 6f 6e 65 20 50 4f 49 4e 54 2c 20  only one POINT, 
3e8d0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 65 6c 65  and no other ele
3e8e0 6d 65 6e 74 61 72 79 20 67 65 6f 6d 65 74 72 79  mentary geometry
3e8f0 0a 2f 20 74 68 65 20 50 4f 49 4e 54 20 61 64 64  ./ the POINT add
3e900 72 65 73 73 20 77 69 6c 6c 20 62 65 20 72 65 74  ress will be ret
3e910 75 72 6e 65 64 0a 2f 20 6f 74 68 65 72 77 69 73  urned./ otherwis
3e920 65 20 4e 55 4c 4c 20 77 69 6c 6c 20 62 65 20 72  e NULL will be r
3e930 65 74 75 72 6e 65 64 0a 2a 2f 0a 20 20 20 20 69  eturned.*/.    i
3e940 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
3e950 67 61 69 61 50 6f 69 6e 74 50 74 72 20 70 6f 69  gaiaPointPtr poi
3e960 6e 74 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e  nt;.    gaiaPoin
3e970 74 50 74 72 20 74 68 69 73 5f 70 6f 69 6e 74 20  tPtr this_point 
3e980 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
3e990 21 67 65 6f 29 0a 09 72 65 74 75 72 6e 20 4e 55  !geo)..return NU
3e9a0 4c 4c 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d  LL;.    if (geo-
3e9b0 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67  >FirstLinestring
3e9c0 20 7c 7c 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f   || geo->FirstPo
3e9d0 6c 79 67 6f 6e 29 0a 09 72 65 74 75 72 6e 20 4e  lygon)..return N
3e9e0 55 4c 4c 3b 0a 20 20 20 20 70 6f 69 6e 74 20 3d  ULL;.    point =
3e9f0 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 69 6e 74   geo->FirstPoint
3ea00 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 6f 69  ;.    while (poi
3ea10 6e 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  nt).      {..  /
3ea20 2a 20 63 6f 75 6e 74 69 6e 67 20 68 6f 77 20 6d  * counting how m
3ea30 61 6e 79 20 50 4f 49 4e 54 73 20 61 72 65 20 74  any POINTs are t
3ea40 68 65 72 65 20 2a 2f 0a 09 20 20 63 6e 74 2b 2b  here */..  cnt++
3ea50 3b 0a 09 20 20 74 68 69 73 5f 70 6f 69 6e 74 20  ;..  this_point 
3ea60 3d 20 70 6f 69 6e 74 3b 0a 09 20 20 70 6f 69 6e  = point;..  poin
3ea70 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b  t = point->Next;
3ea80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
3ea90 28 63 6e 74 20 3d 3d 20 31 20 26 26 20 74 68 69  (cnt == 1 && thi
3eaa0 73 5f 70 6f 69 6e 74 29 0a 09 72 65 74 75 72 6e  s_point)..return
3eab0 20 74 68 69 73 5f 70 6f 69 6e 74 3b 0a 20 20 20   this_point;.   
3eac0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a   return NULL;.}.
3ead0 0a 73 74 61 74 69 63 20 67 61 69 61 4c 69 6e 65  .static gaiaLine
3eae0 73 74 72 69 6e 67 50 74 72 0a 73 69 6d 70 6c 65  stringPtr.simple
3eaf0 4c 69 6e 65 73 74 72 69 6e 67 20 28 67 61 69 61  Linestring (gaia
3eb00 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29  GeomCollPtr geo)
3eb10 0a 7b 0a 2f 2a 20 68 65 6c 70 65 72 20 66 75 6e  .{./* helper fun
3eb20 63 74 69 6f 6e 0a 2f 20 69 66 20 74 68 69 73 20  ction./ if this 
3eb30 47 45 4f 4d 45 54 52 59 20 63 6f 6e 74 61 69 6e  GEOMETRY contain
3eb40 73 20 6f 6e 6c 79 20 6f 6e 65 20 4c 49 4e 45 53  s only one LINES
3eb50 54 52 49 4e 47 2c 20 61 6e 64 20 6e 6f 20 6f 74  TRING, and no ot
3eb60 68 65 72 20 65 6c 65 6d 65 6e 74 61 72 79 20 67  her elementary g
3eb70 65 6f 6d 65 74 72 79 0a 2f 20 74 68 65 20 4c 49  eometry./ the LI
3eb80 4e 45 53 54 52 49 4e 47 20 61 64 64 72 65 73 73  NESTRING address
3eb90 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
3eba0 64 0a 2f 20 6f 74 68 65 72 77 69 73 65 20 4e 55  d./ otherwise NU
3ebb0 4c 4c 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  LL will be retur
3ebc0 6e 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 63  ned.*/.    int c
3ebd0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 67 61 69 61  nt = 0;.    gaia
3ebe0 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 69  LinestringPtr li
3ebf0 6e 65 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65  ne;.    gaiaLine
3ec00 73 74 72 69 6e 67 50 74 72 20 74 68 69 73 5f 6c  stringPtr this_l
3ec10 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ine = NULL;.    
3ec20 69 66 20 28 21 67 65 6f 29 0a 09 72 65 74 75 72  if (!geo)..retur
3ec30 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  n NULL;.    if (
3ec40 67 65 6f 2d 3e 46 69 72 73 74 50 6f 69 6e 74 20  geo->FirstPoint 
3ec50 7c 7c 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 6c  || geo->FirstPol
3ec60 79 67 6f 6e 29 0a 09 72 65 74 75 72 6e 20 4e 55  ygon)..return NU
3ec70 4c 4c 3b 0a 20 20 20 20 6c 69 6e 65 20 3d 20 67  LL;.    line = g
3ec80 65 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72  eo->FirstLinestr
3ec90 69 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  ing;.    while (
3eca0 6c 69 6e 65 29 0a 20 20 20 20 20 20 7b 0a 09 20  line).      {.. 
3ecb0 20 2f 2a 20 63 6f 75 6e 74 69 6e 67 20 68 6f 77   /* counting how
3ecc0 20 6d 61 6e 79 20 4c 49 4e 45 53 54 52 49 4e 47   many LINESTRING
3ecd0 73 20 61 72 65 20 74 68 65 72 65 20 2a 2f 0a 09  s are there */..
3ece0 20 20 63 6e 74 2b 2b 3b 0a 09 20 20 74 68 69 73    cnt++;..  this
3ecf0 5f 6c 69 6e 65 20 3d 20 6c 69 6e 65 3b 0a 09 20  _line = line;.. 
3ed00 20 6c 69 6e 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65   line = line->Ne
3ed10 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3ed20 69 66 20 28 63 6e 74 20 3d 3d 20 31 20 26 26 20  if (cnt == 1 && 
3ed30 74 68 69 73 5f 6c 69 6e 65 29 0a 09 72 65 74 75  this_line)..retu
3ed40 72 6e 20 74 68 69 73 5f 6c 69 6e 65 3b 0a 20 20  rn this_line;.  
3ed50 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d    return NULL;.}
3ed60 0a 0a 73 74 61 74 69 63 20 67 61 69 61 50 6f 6c  ..static gaiaPol
3ed70 79 67 6f 6e 50 74 72 0a 73 69 6d 70 6c 65 50 6f  ygonPtr.simplePo
3ed80 6c 79 67 6f 6e 20 28 67 61 69 61 47 65 6f 6d 43  lygon (gaiaGeomC
3ed90 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a  ollPtr geo).{./*
3eda0 20 68 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   helper function
3edb0 0a 2f 20 69 66 20 74 68 69 73 20 47 45 4f 4d 45  ./ if this GEOME
3edc0 54 52 59 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  TRY contains onl
3edd0 79 20 6f 6e 65 20 50 4f 4c 59 47 4f 4e 2c 20 61  y one POLYGON, a
3ede0 6e 64 20 6e 6f 20 6f 74 68 65 72 20 65 6c 65 6d  nd no other elem
3edf0 65 6e 74 61 72 79 20 67 65 6f 6d 65 74 72 79 0a  entary geometry.
3ee00 2f 20 74 68 65 20 50 4f 4c 59 47 4f 4e 20 61 64  / the POLYGON ad
3ee10 64 72 65 73 73 20 77 69 6c 6c 20 62 65 20 72 65  dress will be re
3ee20 74 75 72 6e 65 64 0a 2f 20 6f 74 68 65 72 77 69  turned./ otherwi
3ee30 73 65 20 4e 55 4c 4c 20 77 69 6c 6c 20 62 65 20  se NULL will be 
3ee40 72 65 74 75 72 6e 65 64 0a 2a 2f 0a 20 20 20 20  returned.*/.    
3ee50 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
3ee60 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
3ee70 70 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69 61 50  polyg;.    gaiaP
3ee80 6f 6c 79 67 6f 6e 50 74 72 20 74 68 69 73 5f 70  olygonPtr this_p
3ee90 6f 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  olyg = NULL;.   
3eea0 20 69 66 20 28 21 67 65 6f 29 0a 09 72 65 74 75   if (!geo)..retu
3eeb0 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20  rn NULL;.    if 
3eec0 28 67 65 6f 2d 3e 46 69 72 73 74 50 6f 69 6e 74  (geo->FirstPoint
3eed0 20 7c 7c 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69   || geo->FirstLi
3eee0 6e 65 73 74 72 69 6e 67 29 0a 09 72 65 74 75 72  nestring)..retur
3eef0 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 6f 6c 79  n NULL;.    poly
3ef00 67 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f  g = geo->FirstPo
3ef10 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69 6c 65  lygon;.    while
3ef20 20 28 70 6f 6c 79 67 29 0a 20 20 20 20 20 20 7b   (polyg).      {
3ef30 0a 09 20 20 2f 2a 20 63 6f 75 6e 74 69 6e 67 20  ..  /* counting 
3ef40 68 6f 77 20 6d 61 6e 79 20 50 4f 4c 59 47 4f 4e  how many POLYGON
3ef50 73 20 61 72 65 20 74 68 65 72 65 20 2a 2f 0a 09  s are there */..
3ef60 20 20 63 6e 74 2b 2b 3b 0a 09 20 20 74 68 69 73    cnt++;..  this
3ef70 5f 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67 3b 0a  _polyg = polyg;.
3ef80 09 20 20 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67  .  polyg = polyg
3ef90 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ->Next;.      }.
3efa0 20 20 20 20 69 66 20 28 63 6e 74 20 3d 3d 20 31      if (cnt == 1
3efb0 20 26 26 20 74 68 69 73 5f 70 6f 6c 79 67 29 0a   && this_polyg).
3efc0 09 72 65 74 75 72 6e 20 74 68 69 73 5f 70 6f 6c  .return this_pol
3efd0 79 67 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e  yg;.    return N
3efe0 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ULL;.}..static v
3eff0 6f 69 64 0a 66 6e 63 74 5f 41 73 54 65 78 74 20  oid.fnct_AsText 
3f000 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3f010 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
3f020 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
3f030 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
3f040 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
3f050 2f 20 41 73 54 65 78 74 28 42 4c 4f 42 20 65 6e  / AsText(BLOB en
3f060 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
3f070 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20  /./ returns the 
3f080 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 4b  corresponding WK
3f090 54 20 65 6e 63 6f 64 65 64 20 76 61 6c 75 65 0a  T encoded value.
3f0a0 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
3f0b0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
3f0c0 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
3f0d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
3f0e0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
3f0f0 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  tes;.    int len
3f100 3b 0a 20 20 20 20 67 61 69 61 4f 75 74 42 75 66  ;.    gaiaOutBuf
3f110 66 65 72 20 6f 75 74 5f 62 75 66 3b 0a 20 20 20  fer out_buf;.   
3f120 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
3f130 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20   geo = NULL;.   
3f140 20 69 6e 74 20 64 65 63 69 6d 61 6c 5f 70 72 65   int decimal_pre
3f150 63 69 73 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  cision = -1;.   
3f160 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
3f170 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
3f180 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
3f190 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
3f1a0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
3f1b0 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
3f1c0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
3f1d0 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
3f1e0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
3f1f0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
3f200 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
3f210 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
3f220 0a 09 20 20 64 65 63 69 6d 61 6c 5f 70 72 65 63  ..  decimal_prec
3f230 69 73 69 6f 6e 20 3d 20 63 61 63 68 65 2d 3e 64  ision = cache->d
3f240 65 63 69 6d 61 6c 5f 70 72 65 63 69 73 69 6f 6e  ecimal_precision
3f250 3b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  ;..  gpkg_amphib
3f260 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
3f270 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
3f280 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
3f290 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
3f2a0 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
3f2b0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
3f2c0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
3f2d0 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
3f2e0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
3f2f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
3f300 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
3f310 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
3f320 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
3f330 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
3f340 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3f350 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
3f360 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
3f370 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
3f380 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 61 69  rgv[0]);.    gai
3f390 61 4f 75 74 42 75 66 66 65 72 49 6e 69 74 69 61  aOutBufferInitia
3f3a0 6c 69 7a 65 20 28 26 6f 75 74 5f 62 75 66 29 3b  lize (&out_buf);
3f3b0 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
3f3c0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
3f3d0 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
3f3e0 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
3f3f0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
3f400 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
3f410 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
3f420 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
3f430 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
3f440 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
3f450 20 20 69 66 20 28 64 65 63 69 6d 61 6c 5f 70 72    if (decimal_pr
3f460 65 63 69 73 69 6f 6e 20 3e 3d 20 30 29 0a 09 20  ecision >= 0).. 
3f470 20 20 20 20 20 67 61 69 61 4f 75 74 57 6b 74 45       gaiaOutWktE
3f480 78 20 28 26 6f 75 74 5f 62 75 66 2c 20 67 65 6f  x (&out_buf, geo
3f490 2c 20 64 65 63 69 6d 61 6c 5f 70 72 65 63 69 73  , decimal_precis
3f4a0 69 6f 6e 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ion);..  else.. 
3f4b0 20 20 20 20 20 67 61 69 61 4f 75 74 57 6b 74 20       gaiaOutWkt 
3f4c0 28 26 6f 75 74 5f 62 75 66 2c 20 67 65 6f 29 3b  (&out_buf, geo);
3f4d0 0a 09 20 20 69 66 20 28 6f 75 74 5f 62 75 66 2e  ..  if (out_buf.
3f4e0 45 72 72 6f 72 20 7c 7c 20 6f 75 74 5f 62 75 66  Error || out_buf
3f4f0 2e 42 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29  .Buffer == NULL)
3f500 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
3f510 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
3f520 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
3f530 20 20 20 20 7b 0a 09 09 6c 65 6e 20 3d 20 6f 75      {...len = ou
3f540 74 5f 62 75 66 2e 57 72 69 74 65 4f 66 66 73 65  t_buf.WriteOffse
3f550 74 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  t;...sqlite3_res
3f560 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
3f570 74 2c 20 6f 75 74 5f 62 75 66 2e 42 75 66 66 65  t, out_buf.Buffe
3f580 72 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  r, len, free);..
3f590 09 6f 75 74 5f 62 75 66 2e 42 75 66 66 65 72 20  .out_buf.Buffer 
3f5a0 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20  = NULL;..    }. 
3f5b0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
3f5c0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
3f5d0 29 3b 0a 20 20 20 20 67 61 69 61 4f 75 74 42 75  );.    gaiaOutBu
3f5e0 66 66 65 72 52 65 73 65 74 20 28 26 6f 75 74 5f  fferReset (&out_
3f5f0 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  buf);.}..static 
3f600 76 6f 69 64 0a 66 6e 63 74 5f 41 73 57 6b 74 20  void.fnct_AsWkt 
3f610 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3f620 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
3f630 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
3f640 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
3f650 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
3f660 2f 20 41 73 57 6b 74 28 42 4c 4f 42 20 65 6e 63  / AsWkt(BLOB enc
3f670 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 20 5b 2c  oded geometry [,
3f680 20 49 6e 74 65 67 65 72 20 70 72 65 63 69 73 69   Integer precisi
3f690 6f 6e 5d 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  on])././ returns
3f6a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
3f6b0 6e 67 20 57 4b 54 20 65 6e 63 6f 64 65 64 20 76  ng WKT encoded v
3f6c0 61 6c 75 65 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  alue./ or NULL i
3f6d0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
3f6e0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
3f6f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3f700 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
3f710 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
3f720 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 70  t len;.    int p
3f730 72 65 63 69 73 69 6f 6e 20 3d 20 31 35 3b 0a 20  recision = 15;. 
3f740 20 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72     gaiaOutBuffer
3f750 20 6f 75 74 5f 62 75 66 3b 0a 20 20 20 20 67 61   out_buf;.    ga
3f760 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
3f770 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
3f780 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
3f790 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
3f7a0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
3f7b0 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
3f7c0 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
3f7d0 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
3f7e0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
3f7f0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
3f800 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
3f810 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
3f820 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
3f830 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
3f840 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
3f850 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
3f860 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
3f870 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
3f880 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
3f890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
3f8a0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
3f8b0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
3f8c0 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
3f8d0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
3f8e0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
3f8f0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
3f900 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
3f910 66 20 28 61 72 67 63 20 3d 3d 20 32 29 0a 20 20  f (argc == 2).  
3f920 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
3f930 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
3f940 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
3f950 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
3f960 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
3f970 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
3f980 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
3f990 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
3f9a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
3f9b0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
3f9c0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
3f9d0 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
3f9e0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3f9f0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
3fa00 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
3fa10 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
3fa20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
3fa30 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
3fa40 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46      geo =..gaiaF
3fa50 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
3fa60 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
3fa70 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
3fa80 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
3fa90 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
3faa0 20 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72     gaiaOutBuffer
3fab0 49 6e 69 74 69 61 6c 69 7a 65 20 28 26 6f 75 74  Initialize (&out
3fac0 5f 62 75 66 29 3b 0a 20 20 20 20 69 66 20 28 21  _buf);.    if (!
3fad0 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  geo)..sqlite3_re
3fae0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
3faf0 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
3fb00 20 20 20 20 7b 0a 09 20 20 67 61 69 61 4f 75 74      {..  gaiaOut
3fb10 57 6b 74 53 74 72 69 63 74 20 28 26 6f 75 74 5f  WktStrict (&out_
3fb20 62 75 66 2c 20 67 65 6f 2c 20 70 72 65 63 69 73  buf, geo, precis
3fb30 69 6f 6e 29 3b 0a 09 20 20 69 66 20 28 6f 75 74  ion);..  if (out
3fb40 5f 62 75 66 2e 45 72 72 6f 72 20 7c 7c 20 6f 75  _buf.Error || ou
3fb50 74 5f 62 75 66 2e 42 75 66 66 65 72 20 3d 3d 20  t_buf.Buffer == 
3fb60 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 73 71 6c  NULL)..      sql
3fb70 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
3fb80 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65   (context);..  e
3fb90 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e  lse..    {...len
3fba0 20 3d 20 6f 75 74 5f 62 75 66 2e 57 72 69 74 65   = out_buf.Write
3fbb0 4f 66 66 73 65 74 3b 0a 09 09 73 71 6c 69 74 65  Offset;...sqlite
3fbc0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63  3_result_text (c
3fbd0 6f 6e 74 65 78 74 2c 20 6f 75 74 5f 62 75 66 2e  ontext, out_buf.
3fbe0 42 75 66 66 65 72 2c 20 6c 65 6e 2c 20 66 72 65  Buffer, len, fre
3fbf0 65 29 3b 0a 09 09 6f 75 74 5f 62 75 66 2e 42 75  e);...out_buf.Bu
3fc00 66 66 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ffer = NULL;..  
3fc10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3fc20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
3fc30 20 28 67 65 6f 29 3b 0a 20 20 20 20 67 61 69 61   (geo);.    gaia
3fc40 4f 75 74 42 75 66 66 65 72 52 65 73 65 74 20 28  OutBufferReset (
3fc50 26 6f 75 74 5f 62 75 66 29 3b 0a 7d 0a 0a 2f 2a  &out_buf);.}../*
3fc60 0a 2f 0a 2f 20 41 73 53 76 67 28 67 65 6f 6d 65  ././ AsSvg(geome
3fc70 74 72 79 2c 5b 72 65 6c 61 74 69 76 65 5d 2c 20  try,[relative], 
3fc80 5b 70 72 65 63 69 73 69 6f 6e 5d 29 20 69 6d 70  [precision]) imp
3fc90 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2f 0a 2f 2f  lementation././/
3fca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3fcb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3fcc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3fcd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 0a 2f 20 41  //////////././ A
3fce0 75 74 68 6f 72 3a 20 4b 6c 61 75 73 20 46 6f 65  uthor: Klaus Foe
3fcf0 72 73 74 65 72 20 6b 6c 61 75 73 2e 66 6f 65 72  rster klaus.foer
3fd00 73 74 65 72 40 73 76 67 2e 63 63 0a 2f 20 76 65  ster@svg.cc./ ve
3fd10 72 73 69 6f 6e 20 30 2e 39 2e 20 32 30 30 38 20  rsion 0.9. 2008 
3fd20 53 65 70 74 65 6d 62 65 72 20 32 31 0a 20 2f 0a  September 21. /.
3fd30 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3fd40 0a 66 6e 63 74 5f 41 73 53 76 67 20 28 73 71 6c  .fnct_AsSvg (sql
3fd50 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
3fd60 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3fd70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3fd80 2a 2a 20 61 72 67 76 2c 0a 09 20 20 20 20 69 6e  ** argv,..    in
3fd90 74 20 72 65 6c 61 74 69 76 65 2c 20 69 6e 74 20  t relative, int 
3fda0 70 72 65 63 69 73 69 6f 6e 29 0a 7b 0a 2f 2a 20  precision).{./* 
3fdb0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20  SQL function:.  
3fdc0 20 41 73 53 76 67 28 42 4c 4f 42 20 65 6e 63 6f   AsSvg(BLOB enco
3fdd0 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20 5b 69  ded geometry, [i
3fde0 6e 74 20 72 65 6c 61 74 69 76 65 5d 2c 20 5b 69  nt relative], [i
3fdf0 6e 74 20 70 72 65 63 69 73 69 6f 6e 5d 29 0a 20  nt precision]). 
3fe00 20 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f    returns the co
3fe10 72 72 65 73 70 6f 6e 64 69 6e 67 20 53 56 47 20  rresponding SVG 
3fe20 65 6e 63 6f 64 65 64 20 76 61 6c 75 65 20 6f 72  encoded value or
3fe30 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
3fe40 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
3fe50 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
3fe60 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
3fe70 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
3fe80 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
3fe90 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72 20    gaiaOutBuffer 
3fea0 6f 75 74 5f 62 75 66 3b 0a 20 20 20 20 67 61 69  out_buf;.    gai
3feb0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
3fec0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
3fed0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
3fee0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
3fef0 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
3ff00 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
3ff10 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
3ff20 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
3ff30 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
3ff40 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
3ff50 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
3ff60 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
3ff70 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
3ff80 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
3ff90 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
3ffa0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
3ffb0 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
3ffc0 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
3ffd0 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
3ffe0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
3fff0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
40000 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
40010 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
40020 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
40030 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
40040 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
40050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
40060 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
40070 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
40080 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
40090 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
400a0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
400b0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
400c0 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
400d0 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
400e0 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
400f0 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
40100 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
40110 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
40120 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
40130 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
40140 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
40150 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
40160 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
40170 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
40180 20 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 72    /* make sure r
40190 65 6c 61 74 69 76 65 20 69 73 20 30 20 6f 72 20  elative is 0 or 
401a0 31 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 6c 61  1 */..  if (rela
401b0 74 69 76 65 20 3e 20 30 29 0a 09 20 20 20 20 20  tive > 0)..     
401c0 20 72 65 6c 61 74 69 76 65 20 3d 20 31 3b 0a 09   relative = 1;..
401d0 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65    else..      re
401e0 6c 61 74 69 76 65 20 3d 20 30 3b 0a 09 20 20 2f  lative = 0;..  /
401f0 2a 20 6d 61 6b 65 20 73 75 72 65 20 70 72 65 63  * make sure prec
40200 69 73 69 6f 6e 20 69 73 20 62 65 74 77 65 65 6e  ision is between
40210 20 30 20 61 6e 64 20 31 35 20 2d 20 64 65 66 61   0 and 15 - defa
40220 75 6c 74 20 74 6f 20 36 20 69 66 20 61 62 73 65  ult to 6 if abse
40230 6e 74 20 2a 2f 0a 09 20 20 69 66 20 28 70 72 65  nt */..  if (pre
40240 63 69 73 69 6f 6e 20 3e 20 47 41 49 41 5f 53 56  cision > GAIA_SV
40250 47 5f 44 45 46 41 55 4c 54 5f 4d 41 58 5f 50 52  G_DEFAULT_MAX_PR
40260 45 43 49 53 49 4f 4e 29 0a 09 20 20 20 20 20 20  ECISION)..      
40270 70 72 65 63 69 73 69 6f 6e 20 3d 20 47 41 49 41  precision = GAIA
40280 5f 53 56 47 5f 44 45 46 41 55 4c 54 5f 4d 41 58  _SVG_DEFAULT_MAX
40290 5f 50 52 45 43 49 53 49 4f 4e 3b 0a 09 20 20 69  _PRECISION;..  i
402a0 66 20 28 70 72 65 63 69 73 69 6f 6e 20 3c 20 30  f (precision < 0
402b0 29 0a 09 20 20 20 20 20 20 70 72 65 63 69 73 69  )..      precisi
402c0 6f 6e 20 3d 20 30 3b 0a 09 20 20 2f 2a 20 70 72  on = 0;..  /* pr
402d0 6f 64 75 63 65 20 53 56 47 2d 6e 6f 74 61 74 69  oduce SVG-notati
402e0 6f 6e 20 2d 20 61 63 74 75 61 6c 20 77 6f 72 6b  on - actual work
402f0 20 69 73 20 64 6f 6e 65 20 69 6e 20 67 61 69 61   is done in gaia
40300 67 65 6f 2f 67 67 5f 77 6b 74 2e 63 20 2a 2f 0a  geo/gg_wkt.c */.
40310 09 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72  .  gaiaOutBuffer
40320 49 6e 69 74 69 61 6c 69 7a 65 20 28 26 6f 75 74  Initialize (&out
40330 5f 62 75 66 29 3b 0a 09 20 20 67 61 69 61 4f 75  _buf);..  gaiaOu
40340 74 53 76 67 20 28 26 6f 75 74 5f 62 75 66 2c 20  tSvg (&out_buf, 
40350 67 65 6f 2c 20 72 65 6c 61 74 69 76 65 2c 20 70  geo, relative, p
40360 72 65 63 69 73 69 6f 6e 29 3b 0a 09 20 20 69 66  recision);..  if
40370 20 28 6f 75 74 5f 62 75 66 2e 45 72 72 6f 72 20   (out_buf.Error 
40380 7c 7c 20 6f 75 74 5f 62 75 66 2e 42 75 66 66 65  || out_buf.Buffe
40390 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  r == NULL)..    
403a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
403b0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
403c0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
403d0 09 09 6c 65 6e 20 3d 20 6f 75 74 5f 62 75 66 2e  ..len = out_buf.
403e0 57 72 69 74 65 4f 66 66 73 65 74 3b 0a 09 09 73  WriteOffset;...s
403f0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
40400 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 6f 75 74  xt (context, out
40410 5f 62 75 66 2e 42 75 66 66 65 72 2c 20 6c 65 6e  _buf.Buffer, len
40420 2c 20 66 72 65 65 29 3b 0a 09 09 6f 75 74 5f 62  , free);...out_b
40430 75 66 2e 42 75 66 66 65 72 20 3d 20 4e 55 4c 4c  uf.Buffer = NULL
40440 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
40450 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
40460 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20  mColl (geo);.   
40470 20 67 61 69 61 4f 75 74 42 75 66 66 65 72 52 65   gaiaOutBufferRe
40480 73 65 74 20 28 26 6f 75 74 5f 62 75 66 29 3b 0a  set (&out_buf);.
40490 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
404a0 6e 63 74 5f 41 73 53 76 67 31 20 28 73 71 6c 69  nct_AsSvg1 (sqli
404b0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
404c0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
404d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
404e0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 63 61 6c  * argv).{./* cal
404f0 6c 65 64 20 77 69 74 68 6f 75 74 20 61 64 64 69  led without addi
40500 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73  tional arguments
40510 20 2a 2f 0a 20 20 20 20 66 6e 63 74 5f 41 73 53   */.    fnct_AsS
40520 76 67 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  vg (context, arg
40530 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 53 56  c, argv, GAIA_SV
40540 47 5f 44 45 46 41 55 4c 54 5f 52 45 4c 41 54 49  G_DEFAULT_RELATI
40550 56 45 2c 0a 09 09 47 41 49 41 5f 53 56 47 5f 44  VE,...GAIA_SVG_D
40560 45 46 41 55 4c 54 5f 50 52 45 43 49 53 49 4f 4e  EFAULT_PRECISION
40570 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
40580 64 0a 66 6e 63 74 5f 41 73 53 76 67 32 20 28 73  d.fnct_AsSvg2 (s
40590 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
405a0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
405b0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
405c0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
405d0 63 61 6c 6c 65 64 20 77 69 74 68 20 72 65 6c 61  called with rela
405e0 74 69 76 65 2d 73 77 69 74 63 68 20 2a 2f 0a 20  tive-switch */. 
405f0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
40600 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
40610 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  1]) == SQLITE_IN
40620 54 45 47 45 52 29 0a 09 66 6e 63 74 5f 41 73 53  TEGER)..fnct_AsS
40630 76 67 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  vg (context, arg
40640 63 2c 20 61 72 67 76 2c 20 73 71 6c 69 74 65 33  c, argv, sqlite3
40650 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
40660 5b 31 5d 29 2c 0a 09 09 20 20 20 20 47 41 49 41  [1]),...    GAIA
40670 5f 53 56 47 5f 44 45 46 41 55 4c 54 5f 50 52 45  _SVG_DEFAULT_PRE
40680 43 49 53 49 4f 4e 29 3b 0a 20 20 20 20 65 6c 73  CISION);.    els
40690 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
406a0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
406b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
406c0 0a 66 6e 63 74 5f 41 73 53 76 67 33 20 28 73 71  .fnct_AsSvg3 (sq
406d0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
406e0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
406f0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
40700 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 63   ** argv).{./* c
40710 61 6c 6c 65 64 20 77 69 74 68 20 72 65 6c 61 74  alled with relat
40720 69 76 65 2d 73 77 69 74 63 68 20 61 6e 64 20 70  ive-switch and p
40730 72 65 63 69 73 69 6f 6e 2d 61 72 67 75 6d 65 6e  recision-argumen
40740 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  t */.    if (sql
40750 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
40760 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
40770 49 54 45 5f 49 4e 54 45 47 45 52 0a 09 26 26 20  ITE_INTEGER..&& 
40780 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
40790 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
407a0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
407b0 09 66 6e 63 74 5f 41 73 53 76 67 20 28 63 6f 6e  .fnct_AsSvg (con
407c0 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
407d0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
407e0 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 2c 0a 09  int (argv[1]),..
407f0 09 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
40800 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
40810 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
40820 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
40830 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 2f   (context);.}../
40840 2a 20 45 4e 44 20 6f 66 20 4b 6c 61 75 73 20 46  * END of Klaus F
40850 6f 65 72 73 74 65 72 20 41 73 53 76 67 28 29 20  oerster AsSvg() 
40860 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
40870 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54  /...#ifndef OMIT
40880 5f 50 52 4f 4a 09 09 2f 2a 20 50 52 4f 4a 2e 34  _PROJ../* PROJ.4
40890 20 69 73 20 73 74 72 69 63 74 6c 79 20 72 65 71   is strictly req
408a0 75 69 72 65 64 20 74 6f 20 73 75 70 70 6f 72 74  uired to support
408b0 20 4b 4d 4c 20 2a 2f 0a 73 74 61 74 69 63 20 76   KML */.static v
408c0 6f 69 64 0a 66 6e 63 74 5f 41 73 4b 6d 6c 31 20  oid.fnct_AsKml1 
408d0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
408e0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
408f0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
40900 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
40910 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
40920 2f 20 41 73 4b 6d 6c 28 42 4c 4f 42 20 65 6e 63  / AsKml(BLOB enc
40930 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 20 5b 2c  oded geometry [,
40940 20 49 6e 74 65 67 65 72 20 70 72 65 63 69 73 69   Integer precisi
40950 6f 6e 5d 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  on])././ returns
40960 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
40970 6e 67 20 27 62 61 72 65 20 67 65 6f 6d 27 20 4b  ng 'bare geom' K
40980 4d 4c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ML representatio
40990 6e 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  n ./ or NULL if 
409a0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
409b0 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
409c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
409d0 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
409e0 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
409f0 6c 65 6e 3b 0a 20 20 20 20 67 61 69 61 4f 75 74  len;.    gaiaOut
40a00 42 75 66 66 65 72 20 6f 75 74 5f 62 75 66 3b 0a  Buffer out_buf;.
40a10 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
40a20 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a  Ptr geo = NULL;.
40a30 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
40a40 50 74 72 20 67 65 6f 5f 77 67 73 38 34 3b 0a 20  Ptr geo_wgs84;. 
40a50 20 20 20 63 68 61 72 20 2a 70 72 6f 6a 5f 66 72     char *proj_fr
40a60 6f 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 72  om;.    char *pr
40a70 6f 6a 5f 74 6f 3b 0a 20 20 20 20 69 6e 74 20 70  oj_to;.    int p
40a80 72 65 63 69 73 69 6f 6e 20 3d 20 31 35 3b 0a 20  recision = 15;. 
40a90 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20     void *data = 
40aa0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
40ab0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
40ac0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
40ad0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
40ae0 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
40af0 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20  ntext);.    int 
40b00 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
40b10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
40b20 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
40b30 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
40b40 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
40b50 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
40b60 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
40b70 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
40b80 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
40b90 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
40ba0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
40bb0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
40bc0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
40bd0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
40be0 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
40bf0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
40c00 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20  he->gpkg_mode;. 
40c10 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
40c20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
40c30 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
40c40 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
40c50 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
40c60 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
40c70 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
40c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
40c90 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
40ca0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
40cb0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
40cc0 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
40cd0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
40ce0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
40cf0 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  );.    if (argc 
40d00 3d 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 2).      {.. 
40d10 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
40d20 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
40d30 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
40d40 47 45 52 29 0a 09 20 20 20 20 20 20 70 72 65 63  GER)..      prec
40d50 69 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ision = sqlite3_
40d60 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
40d70 31 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  1]);..  else..  
40d80 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
40d90 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
40da0 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
40db0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
40dc0 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72 49    gaiaOutBufferI
40dd0 6e 69 74 69 61 6c 69 7a 65 20 28 26 6f 75 74 5f  nitialize (&out_
40de0 62 75 66 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  buf);.    geo =.
40df0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
40e00 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
40e10 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
40e20 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
40e30 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
40e40 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
40e50 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
40e60 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
40e70 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
40e80 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e    {..  if (geo->
40e90 53 72 69 64 20 3d 3d 20 34 33 32 36 29 0a 09 20  Srid == 4326).. 
40ea0 20 20 20 20 20 3b 09 09 09 2f 2a 20 61 6c 72 65       ;.../* alre
40eb0 61 64 79 20 57 47 53 38 34 20 2a 2f 0a 09 20 20  ady WGS84 */..  
40ec0 65 6c 73 65 20 69 66 20 28 67 65 6f 2d 3e 53 72  else if (geo->Sr
40ed0 69 64 20 3c 3d 20 30 29 0a 09 20 20 20 20 7b 0a  id <= 0)..    {.
40ee0 09 09 2f 2a 20 75 6e 6b 6e 6f 77 6e 20 53 52 49  ../* unknown SRI
40ef0 44 3a 20 67 69 76 69 6e 67 20 75 70 20 2a 2f 0a  D: giving up */.
40f00 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
40f10 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
40f20 0a 09 09 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 20  ...goto stop;.. 
40f30 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
40f40 20 20 7b 0a 09 09 2f 2a 20 61 74 74 65 6d 70 74    {.../* attempt
40f50 69 6e 67 20 74 6f 20 72 65 70 72 6f 6a 65 63 74  ing to reproject
40f60 20 69 6e 74 6f 20 57 47 53 38 34 20 2a 2f 0a 09   into WGS84 */..
40f70 09 67 65 74 50 72 6f 6a 50 61 72 61 6d 73 20 28  .getProjParams (
40f80 73 71 6c 69 74 65 2c 20 67 65 6f 2d 3e 53 72 69  sqlite, geo->Sri
40f90 64 2c 20 26 70 72 6f 6a 5f 66 72 6f 6d 29 3b 0a  d, &proj_from);.
40fa0 09 09 67 65 74 50 72 6f 6a 50 61 72 61 6d 73 20  ..getProjParams 
40fb0 28 73 71 6c 69 74 65 2c 20 34 33 32 36 2c 20 26  (sqlite, 4326, &
40fc0 70 72 6f 6a 5f 74 6f 29 3b 0a 09 09 69 66 20 28  proj_to);...if (
40fd0 70 72 6f 6a 5f 74 6f 20 3d 3d 20 4e 55 4c 4c 20  proj_to == NULL 
40fe0 7c 7c 20 70 72 6f 6a 5f 66 72 6f 6d 20 3d 3d 20  || proj_from == 
40ff0 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20  NULL)...  {...  
41000 20 20 20 20 69 66 20 28 70 72 6f 6a 5f 66 72 6f      if (proj_fro
41010 6d 29 0a 09 09 09 20 20 66 72 65 65 20 28 70 72  m)....  free (pr
41020 6f 6a 5f 66 72 6f 6d 29 3b 0a 09 09 20 20 20 20  oj_from);...    
41030 20 20 69 66 20 28 70 72 6f 6a 5f 74 6f 29 0a 09    if (proj_to)..
41040 09 09 20 20 66 72 65 65 20 28 70 72 6f 6a 5f 74  ..  free (proj_t
41050 6f 29 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69  o);...      sqli
41060 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
41070 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 20 20 20  (context);...   
41080 20 20 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 09     goto stop;...
41090 20 20 7d 0a 09 09 69 66 20 28 64 61 74 61 20 21    }...if (data !
410a0 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 20 20 67 65  = NULL)...    ge
410b0 6f 5f 77 67 73 38 34 20 3d 20 67 61 69 61 54 72  o_wgs84 = gaiaTr
410c0 61 6e 73 66 6f 72 6d 5f 72 20 28 64 61 74 61 2c  ansform_r (data,
410d0 20 67 65 6f 2c 20 70 72 6f 6a 5f 66 72 6f 6d 2c   geo, proj_from,
410e0 20 70 72 6f 6a 5f 74 6f 29 3b 0a 09 09 65 6c 73   proj_to);...els
410f0 65 0a 09 09 20 20 20 20 67 65 6f 5f 77 67 73 38  e...    geo_wgs8
41100 34 20 3d 20 67 61 69 61 54 72 61 6e 73 66 6f 72  4 = gaiaTransfor
41110 6d 20 28 67 65 6f 2c 20 70 72 6f 6a 5f 66 72 6f  m (geo, proj_fro
41120 6d 2c 20 70 72 6f 6a 5f 74 6f 29 3b 0a 09 09 66  m, proj_to);...f
41130 72 65 65 20 28 70 72 6f 6a 5f 66 72 6f 6d 29 3b  ree (proj_from);
41140 0a 09 09 66 72 65 65 20 28 70 72 6f 6a 5f 74 6f  ...free (proj_to
41150 29 3b 0a 09 09 69 66 20 28 21 67 65 6f 5f 77 67  );...if (!geo_wg
41160 73 38 34 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  s84)...  {...   
41170 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
41180 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
41190 3b 0a 09 09 20 20 20 20 20 20 67 6f 74 6f 20 73  ;...      goto s
411a0 74 6f 70 3b 0a 09 09 20 20 7d 0a 09 09 2f 2a 20  top;...  }.../* 
411b0 6f 6b 2c 20 72 65 70 72 6f 6a 65 63 74 69 6f 6e  ok, reprojection
411c0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
411d0 2a 2f 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f  */...gaiaFreeGeo
411e0 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 09 67  mColl (geo);...g
411f0 65 6f 20 3d 20 67 65 6f 5f 77 67 73 38 34 3b 0a  eo = geo_wgs84;.
41200 09 20 20 20 20 7d 0a 09 20 20 2f 2a 20 70 72 6f  .    }..  /* pro
41210 64 75 63 65 20 4b 4d 4c 2d 6e 6f 74 61 74 69 6f  duce KML-notatio
41220 6e 20 2d 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  n - actual work 
41230 69 73 20 64 6f 6e 65 20 69 6e 20 67 61 69 61 67  is done in gaiag
41240 65 6f 2f 67 67 5f 77 6b 74 2e 63 20 2a 2f 0a 09  eo/gg_wkt.c */..
41250 20 20 67 61 69 61 4f 75 74 42 61 72 65 4b 6d 6c    gaiaOutBareKml
41260 20 28 26 6f 75 74 5f 62 75 66 2c 20 67 65 6f 2c   (&out_buf, geo,
41270 20 70 72 65 63 69 73 69 6f 6e 29 3b 0a 09 20 20   precision);..  
41280 69 66 20 28 6f 75 74 5f 62 75 66 2e 45 72 72 6f  if (out_buf.Erro
41290 72 20 7c 7c 20 6f 75 74 5f 62 75 66 2e 42 75 66  r || out_buf.Buf
412a0 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  fer == NULL)..  
412b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
412c0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
412d0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
412e0 7b 0a 09 09 6c 65 6e 20 3d 20 6f 75 74 5f 62 75  {...len = out_bu
412f0 66 2e 57 72 69 74 65 4f 66 66 73 65 74 3b 0a 09  f.WriteOffset;..
41300 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
41310 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 6f  text (context, o
41320 75 74 5f 62 75 66 2e 42 75 66 66 65 72 2c 20 6c  ut_buf.Buffer, l
41330 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 6f 75 74  en, free);...out
41340 5f 62 75 66 2e 42 75 66 66 65 72 20 3d 20 4e 55  _buf.Buffer = NU
41350 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  LL;..    }.     
41360 20 7d 0a 20 20 73 74 6f 70 3a 0a 20 20 20 20 67   }.  stop:.    g
41370 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
41380 28 67 65 6f 29 3b 0a 20 20 20 20 67 61 69 61 4f  (geo);.    gaiaO
41390 75 74 42 75 66 66 65 72 52 65 73 65 74 20 28 26  utBufferReset (&
413a0 6f 75 74 5f 62 75 66 29 3b 0a 7d 0a 0a 73 74 61  out_buf);.}..sta
413b0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 41 73  tic void.fnct_As
413c0 4b 6d 6c 33 20 28 73 71 6c 69 74 65 33 5f 63 6f  Kml3 (sqlite3_co
413d0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
413e0 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
413f0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
41400 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
41410 69 6f 6e 3a 0a 2f 20 41 73 4b 6d 6c 28 41 6e 79  ion:./ AsKml(Any
41420 74 68 69 6e 67 20 6e 61 6d 65 2c 20 41 6e 79 74  thing name, Anyt
41430 68 69 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e  hing description
41440 2c 20 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67  , BLOB encoded g
41450 65 6f 6d 65 74 72 79 20 5b 2c 20 49 6e 74 65 67  eometry [, Integ
41460 65 72 20 70 72 65 63 69 73 69 6f 6e 5d 29 0a 2f  er precision])./
41470 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ./ returns the c
41480 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 27 66 75  orresponding 'fu
41490 6c 6c 27 20 4b 4d 4c 20 72 65 70 72 65 73 65 6e  ll' KML represen
414a0 74 61 74 69 6f 6e 20 0a 2f 20 6f 72 20 4e 55 4c  tation ./ or NUL
414b0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
414c0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
414d0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
414e0 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
414f0 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
41500 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 67 61   int len;.    ga
41510 69 61 4f 75 74 42 75 66 66 65 72 20 6f 75 74 5f  iaOutBuffer out_
41520 62 75 66 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  buf;.    gaiaGeo
41530 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
41540 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
41550 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 5f 77 67 73  mCollPtr geo_wgs
41560 38 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  84;.    sqlite3_
41570 69 6e 74 36 34 20 69 6e 74 5f 76 61 6c 75 65 3b  int64 int_value;
41580 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 62 6c 5f  .    double dbl_
41590 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
415a0 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20   char *name;.   
415b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65 73   const char *des
415c0 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d  c;.    char *nam
415d0 65 5f 6d 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b  e_malloc = NULL;
415e0 0a 20 20 20 20 63 68 61 72 20 2a 64 65 73 63 5f  .    char *desc_
415f0 6d 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 20  malloc = NULL;. 
41600 20 20 20 63 68 61 72 20 64 75 6d 6d 79 5b 31 32     char dummy[12
41610 38 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 78 64  8];.    char *xd
41620 75 6d 6d 79 3b 0a 20 20 20 20 63 68 61 72 20 2a  ummy;.    char *
41630 70 72 6f 6a 5f 66 72 6f 6d 3b 0a 20 20 20 20 63  proj_from;.    c
41640 68 61 72 20 2a 70 72 6f 6a 5f 74 6f 3b 0a 20 20  har *proj_to;.  
41650 20 20 69 6e 74 20 70 72 65 63 69 73 69 6f 6e 20    int precision 
41660 3d 20 31 35 3b 0a 20 20 20 20 76 6f 69 64 20 2a  = 15;.    void *
41670 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 75  data = sqlite3_u
41680 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
41690 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  t);.    sqlite3 
416a0 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
416b0 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
416c0 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
416d0 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
416e0 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
416f0 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
41700 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
41710 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
41720 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
41730 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
41740 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
41750 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
41760 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
41770 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
41780 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
41790 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
417a0 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
417b0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
417c0 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
417d0 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
417e0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
417f0 20 20 73 77 69 74 63 68 20 28 73 71 6c 69 74 65    switch (sqlite
41800 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
41810 67 76 5b 30 5d 29 29 0a 20 20 20 20 20 20 7b 0a  gv[0])).      {.
41820 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
41830 45 5f 54 45 58 54 3a 0a 09 20 20 6e 61 6d 65 20  E_TEXT:..  name 
41840 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
41850 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
41860 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  ext (argv[0]);..
41870 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28    len = strlen (
41880 6e 61 6d 65 29 3b 0a 09 20 20 6e 61 6d 65 5f 6d  name);..  name_m
41890 61 6c 6c 6f 63 20 3d 20 6d 61 6c 6c 6f 63 20 28  alloc = malloc (
418a0 6c 65 6e 20 2b 20 31 29 3b 0a 09 20 20 73 74 72  len + 1);..  str
418b0 63 70 79 20 28 6e 61 6d 65 5f 6d 61 6c 6c 6f 63  cpy (name_malloc
418c0 2c 20 6e 61 6d 65 29 3b 0a 09 20 20 6e 61 6d 65  , name);..  name
418d0 20 3d 20 6e 61 6d 65 5f 6d 61 6c 6c 6f 63 3b 0a   = name_malloc;.
418e0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
418f0 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
41900 47 45 52 3a 0a 09 20 20 69 6e 74 5f 76 61 6c 75  GER:..  int_valu
41910 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
41920 65 5f 69 6e 74 36 34 20 28 61 72 67 76 5b 30 5d  e_int64 (argv[0]
41930 29 3b 0a 09 20 20 73 70 72 69 6e 74 66 20 28 64  );..  sprintf (d
41940 75 6d 6d 79 2c 20 46 52 4d 54 36 34 2c 20 69 6e  ummy, FRMT64, in
41950 74 5f 76 61 6c 75 65 29 3b 0a 09 20 20 6c 65 6e  t_value);..  len
41960 20 3d 20 73 74 72 6c 65 6e 20 28 64 75 6d 6d 79   = strlen (dummy
41970 29 3b 0a 09 20 20 6e 61 6d 65 5f 6d 61 6c 6c 6f  );..  name_mallo
41980 63 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20  c = malloc (len 
41990 2b 20 31 29 3b 0a 09 20 20 73 74 72 63 70 79 20  + 1);..  strcpy 
419a0 28 6e 61 6d 65 5f 6d 61 6c 6c 6f 63 2c 20 64 75  (name_malloc, du
419b0 6d 6d 79 29 3b 0a 09 20 20 6e 61 6d 65 20 3d 20  mmy);..  name = 
419c0 6e 61 6d 65 5f 6d 61 6c 6c 6f 63 3b 0a 09 20 20  name_malloc;..  
419d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
419e0 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a  e SQLITE_FLOAT:.
419f0 09 20 20 64 62 6c 5f 76 61 6c 75 65 20 3d 20 73  .  dbl_value = s
41a00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
41a10 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  ble (argv[0]);..
41a20 20 20 78 64 75 6d 6d 79 20 3d 20 73 71 6c 69 74    xdummy = sqlit
41a30 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 31 2e  e3_mprintf ("%1.
41a40 36 66 22 2c 20 64 62 6c 5f 76 61 6c 75 65 29 3b  6f", dbl_value);
41a50 0a 09 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
41a60 20 28 78 64 75 6d 6d 79 29 3b 0a 09 20 20 6e 61   (xdummy);..  na
41a70 6d 65 5f 6d 61 6c 6c 6f 63 20 3d 20 6d 61 6c 6c  me_malloc = mall
41a80 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 09 20  oc (len + 1);.. 
41a90 20 73 74 72 63 70 79 20 28 6e 61 6d 65 5f 6d 61   strcpy (name_ma
41aa0 6c 6c 6f 63 2c 20 78 64 75 6d 6d 79 29 3b 0a 09  lloc, xdummy);..
41ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
41ac0 78 64 75 6d 6d 79 29 3b 0a 09 20 20 6e 61 6d 65  xdummy);..  name
41ad0 20 3d 20 6e 61 6d 65 5f 6d 61 6c 6c 6f 63 3b 0a   = name_malloc;.
41ae0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
41af0 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
41b00 3a 0a 09 20 20 6e 61 6d 65 20 3d 20 22 42 4c 4f  :..  name = "BLO
41b10 42 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  B";..  break;.  
41b20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20      default:..  
41b30 6e 61 6d 65 20 3d 20 22 4e 55 4c 4c 22 3b 0a 09  name = "NULL";..
41b40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
41b50 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 73 71  ;.    switch (sq
41b60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
41b70 20 28 61 72 67 76 5b 31 5d 29 29 0a 20 20 20 20   (argv[1])).    
41b80 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53    {.      case S
41b90 51 4c 49 54 45 5f 54 45 58 54 3a 0a 09 20 20 64  QLITE_TEXT:..  d
41ba0 65 73 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  esc = (const cha
41bb0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
41bc0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
41bd0 29 3b 0a 09 20 20 6c 65 6e 20 3d 20 73 74 72 6c  );..  len = strl
41be0 65 6e 20 28 64 65 73 63 29 3b 0a 09 20 20 64 65  en (desc);..  de
41bf0 73 63 5f 6d 61 6c 6c 6f 63 20 3d 20 6d 61 6c 6c  sc_malloc = mall
41c00 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 09 20  oc (len + 1);.. 
41c10 20 73 74 72 63 70 79 20 28 64 65 73 63 5f 6d 61   strcpy (desc_ma
41c20 6c 6c 6f 63 2c 20 64 65 73 63 29 3b 0a 09 20 20  lloc, desc);..  
41c30 64 65 73 63 20 3d 20 64 65 73 63 5f 6d 61 6c 6c  desc = desc_mall
41c40 6f 63 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  oc;..  break;.  
41c50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
41c60 49 4e 54 45 47 45 52 3a 0a 09 20 20 69 6e 74 5f  INTEGER:..  int_
41c70 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
41c80 76 61 6c 75 65 5f 69 6e 74 36 34 20 28 61 72 67  value_int64 (arg
41c90 76 5b 31 5d 29 3b 0a 09 20 20 73 70 72 69 6e 74  v[1]);..  sprint
41ca0 66 20 28 64 75 6d 6d 79 2c 20 46 52 4d 54 36 34  f (dummy, FRMT64
41cb0 2c 20 69 6e 74 5f 76 61 6c 75 65 29 3b 0a 09 20  , int_value);.. 
41cc0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 64   len = strlen (d
41cd0 75 6d 6d 79 29 3b 0a 09 20 20 64 65 73 63 5f 6d  ummy);..  desc_m
41ce0 61 6c 6c 6f 63 20 3d 20 6d 61 6c 6c 6f 63 20 28  alloc = malloc (
41cf0 6c 65 6e 20 2b 20 31 29 3b 0a 09 20 20 73 74 72  len + 1);..  str
41d00 63 70 79 20 28 64 65 73 63 5f 6d 61 6c 6c 6f 63  cpy (desc_malloc
41d10 2c 20 64 75 6d 6d 79 29 3b 0a 09 20 20 64 65 73  , dummy);..  des
41d20 63 20 3d 20 64 65 73 63 5f 6d 61 6c 6c 6f 63 3b  c = desc_malloc;
41d30 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
41d40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
41d50 41 54 3a 0a 09 20 20 64 62 6c 5f 76 61 6c 75 65  AT:..  dbl_value
41d60 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
41d70 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d  _double (argv[1]
41d80 29 3b 0a 09 20 20 78 64 75 6d 6d 79 20 3d 20 73  );..  xdummy = s
41d90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
41da0 22 25 31 2e 36 66 22 2c 20 64 62 6c 5f 76 61 6c  "%1.6f", dbl_val
41db0 75 65 29 3b 0a 09 20 20 6c 65 6e 20 3d 20 73 74  ue);..  len = st
41dc0 72 6c 65 6e 20 28 78 64 75 6d 6d 79 29 3b 0a 09  rlen (xdummy);..
41dd0 20 20 64 65 73 63 5f 6d 61 6c 6c 6f 63 20 3d 20    desc_malloc = 
41de0 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29  malloc (len + 1)
41df0 3b 0a 09 20 20 73 74 72 63 70 79 20 28 64 65 73  ;..  strcpy (des
41e00 63 5f 6d 61 6c 6c 6f 63 2c 20 78 64 75 6d 6d 79  c_malloc, xdummy
41e10 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
41e20 65 65 20 28 78 64 75 6d 6d 79 29 3b 0a 09 20 20  ee (xdummy);..  
41e30 64 65 73 63 20 3d 20 64 65 73 63 5f 6d 61 6c 6c  desc = desc_mall
41e40 6f 63 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  oc;..  break;.  
41e50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
41e60 42 4c 4f 42 3a 0a 09 20 20 64 65 73 63 20 3d 20  BLOB:..  desc = 
41e70 22 42 4c 4f 42 22 3b 0a 09 20 20 62 72 65 61 6b  "BLOB";..  break
41e80 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
41e90 0a 09 20 20 64 65 73 63 20 3d 20 22 4e 55 4c 4c  ..  desc = "NULL
41ea0 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";..  break;.   
41eb0 20 20 20 7d 3b 0a 20 20 20 20 67 61 69 61 4f 75     };.    gaiaOu
41ec0 74 42 75 66 66 65 72 49 6e 69 74 69 61 6c 69 7a  tBufferInitializ
41ed0 65 20 28 26 6f 75 74 5f 62 75 66 29 3b 0a 20 20  e (&out_buf);.  
41ee0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
41ef0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
41f00 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
41f10 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
41f20 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
41f30 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
41f40 67 6f 74 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20  goto stop;.     
41f50 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
41f60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
41f70 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
41f80 62 6c 6f 62 20 28 61 72 67 76 5b 32 5d 29 3b 0a  blob (argv[2]);.
41f90 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
41fa0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
41fb0 73 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  s (argv[2]);.   
41fc0 20 69 66 20 28 61 72 67 63 20 3d 3d 20 34 29 0a   if (argc == 4).
41fd0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
41fe0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
41ff0 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53  e (argv[3]) == S
42000 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
42010 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
42020 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
42030 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09  int (argv[3]);..
42040 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
42050 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
42060 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
42070 09 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 20 20 20  .goto stop;..   
42080 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
42090 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  eo =..gaiaFromSp
420a0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
420b0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
420c0 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
420d0 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
420e0 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
420f0 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33   (!geo)..sqlite3
42100 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
42110 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
42120 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
42130 67 65 6f 2d 3e 53 72 69 64 20 3d 3d 20 34 33 32  geo->Srid == 432
42140 36 29 0a 09 20 20 20 20 20 20 3b 09 09 09 2f 2a  6)..      ;.../*
42150 20 61 6c 72 65 61 64 79 20 57 47 53 38 34 20 2a   already WGS84 *
42160 2f 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67 65  /..  else if (ge
42170 6f 2d 3e 53 72 69 64 20 3d 3d 20 30 29 0a 09 20  o->Srid == 0).. 
42180 20 20 20 7b 0a 09 09 2f 2a 20 75 6e 6b 6e 6f 77     {.../* unknow
42190 6e 20 53 52 49 44 3a 20 67 69 76 69 6e 67 20 75  n SRID: giving u
421a0 70 20 2a 2f 0a 09 09 73 71 6c 69 74 65 33 5f 72  p */...sqlite3_r
421b0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
421c0 65 78 74 29 3b 0a 09 09 67 6f 74 6f 20 73 74 6f  ext);...goto sto
421d0 70 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  p;..    }..  els
421e0 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 61 74  e..    {.../* at
421f0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 70 72  tempting to repr
42200 6f 6a 65 63 74 20 69 6e 74 6f 20 57 47 53 38 34  oject into WGS84
42210 20 2a 2f 0a 09 09 67 65 74 50 72 6f 6a 50 61 72   */...getProjPar
42220 61 6d 73 20 28 73 71 6c 69 74 65 2c 20 67 65 6f  ams (sqlite, geo
42230 2d 3e 53 72 69 64 2c 20 26 70 72 6f 6a 5f 66 72  ->Srid, &proj_fr
42240 6f 6d 29 3b 0a 09 09 67 65 74 50 72 6f 6a 50 61  om);...getProjPa
42250 72 61 6d 73 20 28 73 71 6c 69 74 65 2c 20 34 33  rams (sqlite, 43
42260 32 36 2c 20 26 70 72 6f 6a 5f 74 6f 29 3b 0a 09  26, &proj_to);..
42270 09 69 66 20 28 70 72 6f 6a 5f 74 6f 20 3d 3d 20  .if (proj_to == 
42280 4e 55 4c 4c 20 7c 7c 20 70 72 6f 6a 5f 66 72 6f  NULL || proj_fro
42290 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 7b  m == NULL)...  {
422a0 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 72 6f  ...      if (pro
422b0 6a 5f 66 72 6f 6d 20 21 3d 20 4e 55 4c 4c 29 0a  j_from != NULL).
422c0 09 09 09 20 20 66 72 65 65 20 28 70 72 6f 6a 5f  ...  free (proj_
422d0 66 72 6f 6d 29 3b 0a 09 09 20 20 20 20 20 20 69  from);...      i
422e0 66 20 28 70 72 6f 6a 5f 74 6f 20 21 3d 20 4e 55  f (proj_to != NU
422f0 4c 4c 29 0a 09 09 09 20 20 66 72 65 65 20 28 70  LL)....  free (p
42300 72 6f 6a 5f 74 6f 29 3b 0a 09 09 20 20 20 20 20  roj_to);...     
42310 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
42320 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
42330 09 09 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6f  ..      goto sto
42340 70 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 64  p;...  }...if (d
42350 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20  ata != NULL)... 
42360 20 20 20 67 65 6f 5f 77 67 73 38 34 20 3d 20 67     geo_wgs84 = g
42370 61 69 61 54 72 61 6e 73 66 6f 72 6d 5f 72 20 28  aiaTransform_r (
42380 64 61 74 61 2c 20 67 65 6f 2c 20 70 72 6f 6a 5f  data, geo, proj_
42390 66 72 6f 6d 2c 20 70 72 6f 6a 5f 74 6f 29 3b 0a  from, proj_to);.
423a0 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67 65 6f  ..else...    geo
423b0 5f 77 67 73 38 34 20 3d 20 67 61 69 61 54 72 61  _wgs84 = gaiaTra
423c0 6e 73 66 6f 72 6d 20 28 67 65 6f 2c 20 70 72 6f  nsform (geo, pro
423d0 6a 5f 66 72 6f 6d 2c 20 70 72 6f 6a 5f 74 6f 29  j_from, proj_to)
423e0 3b 0a 09 09 66 72 65 65 20 28 70 72 6f 6a 5f 66  ;...free (proj_f
423f0 72 6f 6d 29 3b 0a 09 09 66 72 65 65 20 28 70 72  rom);...free (pr
42400 6f 6a 5f 74 6f 29 3b 0a 09 09 69 66 20 28 21 67  oj_to);...if (!g
42410 65 6f 5f 77 67 73 38 34 29 0a 09 09 20 20 7b 0a  eo_wgs84)...  {.
42420 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
42430 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
42440 74 65 78 74 29 3b 0a 09 09 20 20 20 20 20 20 67  text);...      g
42450 6f 74 6f 20 73 74 6f 70 3b 0a 09 09 20 20 7d 0a  oto stop;...  }.
42460 09 09 2f 2a 20 6f 6b 2c 20 72 65 70 72 6f 6a 65  ../* ok, reproje
42470 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
42480 73 66 75 6c 20 2a 2f 0a 09 09 67 61 69 61 46 72  sful */...gaiaFr
42490 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
424a0 3b 0a 09 09 67 65 6f 20 3d 20 67 65 6f 5f 77 67  ;...geo = geo_wg
424b0 73 38 34 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2f  s84;..    }..  /
424c0 2a 20 70 72 6f 64 75 63 65 20 4b 4d 4c 2d 6e 6f  * produce KML-no
424d0 74 61 74 69 6f 6e 20 2d 20 61 63 74 75 61 6c 20  tation - actual 
424e0 77 6f 72 6b 20 69 73 20 64 6f 6e 65 20 69 6e 20  work is done in 
424f0 67 61 69 61 67 65 6f 2f 67 67 5f 77 6b 74 2e 63  gaiageo/gg_wkt.c
42500 20 2a 2f 0a 09 20 20 67 61 69 61 4f 75 74 46 75   */..  gaiaOutFu
42510 6c 6c 4b 6d 6c 20 28 26 6f 75 74 5f 62 75 66 2c  llKml (&out_buf,
42520 20 6e 61 6d 65 2c 20 64 65 73 63 2c 20 67 65 6f   name, desc, geo
42530 2c 20 70 72 65 63 69 73 69 6f 6e 29 3b 0a 09 20  , precision);.. 
42540 20 69 66 20 28 6f 75 74 5f 62 75 66 2e 45 72 72   if (out_buf.Err
42550 6f 72 20 7c 7c 20 6f 75 74 5f 62 75 66 2e 42 75  or || out_buf.Bu
42560 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20  ffer == NULL).. 
42570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
42580 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
42590 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  t);..  else..   
425a0 20 7b 0a 09 09 6c 65 6e 20 3d 20 6f 75 74 5f 62   {...len = out_b
425b0 75 66 2e 57 72 69 74 65 4f 66 66 73 65 74 3b 0a  uf.WriteOffset;.
425c0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
425d0 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
425e0 6f 75 74 5f 62 75 66 2e 42 75 66 66 65 72 2c 20  out_buf.Buffer, 
425f0 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 6f 75  len, free);...ou
42600 74 5f 62 75 66 2e 42 75 66 66 65 72 20 3d 20 4e  t_buf.Buffer = N
42610 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  ULL;..    }.    
42620 20 20 7d 0a 20 20 73 74 6f 70 3a 0a 20 20 20 20    }.  stop:.    
42630 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
42640 20 28 67 65 6f 29 3b 0a 20 20 20 20 69 66 20 28   (geo);.    if (
42650 6e 61 6d 65 5f 6d 61 6c 6c 6f 63 29 0a 09 66 72  name_malloc)..fr
42660 65 65 20 28 6e 61 6d 65 5f 6d 61 6c 6c 6f 63 29  ee (name_malloc)
42670 3b 0a 20 20 20 20 69 66 20 28 64 65 73 63 5f 6d  ;.    if (desc_m
42680 61 6c 6c 6f 63 29 0a 09 66 72 65 65 20 28 64 65  alloc)..free (de
42690 73 63 5f 6d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  sc_malloc);.    
426a0 67 61 69 61 4f 75 74 42 75 66 66 65 72 52 65 73  gaiaOutBufferRes
426b0 65 74 20 28 26 6f 75 74 5f 62 75 66 29 3b 0a 7d  et (&out_buf);.}
426c0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
426d0 63 74 5f 41 73 4b 6d 6c 20 28 73 71 6c 69 74 65  ct_AsKml (sqlite
426e0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
426f0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
42700 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
42710 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
42720 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41 73 4b 6d 6c  unction:./ AsKml
42730 28 41 6e 79 74 68 69 6e 67 20 6e 61 6d 65 2c 20  (Anything name, 
42740 41 6e 79 74 68 69 6e 67 20 64 65 73 63 72 69 70  Anything descrip
42750 74 69 6f 6e 2c 20 42 4c 4f 42 20 65 6e 63 6f 64  tion, BLOB encod
42760 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 20 20  ed geometry)./  
42770 20 20 20 6f 72 0a 2f 20 41 73 4b 6d 6c 28 42 4c     or./ AsKml(BL
42780 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  OB encoded geome
42790 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  try)././ returns
427a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
427b0 6e 67 20 4b 4d 4c 20 72 65 70 72 65 73 65 6e 74  ng KML represent
427c0 61 74 69 6f 6e 20 0a 2f 20 6f 72 20 4e 55 4c 4c  ation ./ or NULL
427d0 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
427e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
427f0 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
42800 33 20 7c 7c 20 61 72 67 63 20 3d 3d 20 34 29 0a  3 || argc == 4).
42810 09 66 6e 63 74 5f 41 73 4b 6d 6c 33 20 28 63 6f  .fnct_AsKml3 (co
42820 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
42830 76 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 66 6e  v);.    else..fn
42840 63 74 5f 41 73 4b 6d 6c 31 20 28 63 6f 6e 74 65  ct_AsKml1 (conte
42850 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
42860 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64  .}.#endif /* end
42870 20 69 6e 63 6c 75 64 69 6e 67 20 50 52 4f 4a 2e   including PROJ.
42880 34 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  4 */..static voi
42890 64 0a 66 6e 63 74 5f 41 73 47 6d 6c 20 28 73 71  d.fnct_AsGml (sq
428a0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
428b0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
428c0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
428d0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
428e0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41  QL function:./ A
428f0 73 47 6d 6c 28 42 4c 4f 42 20 65 6e 63 6f 64 65  sGml(BLOB encode
42900 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 20 20 20  d geometry)./   
42910 20 6f 72 0a 2f 20 41 73 47 6d 6c 28 69 6e 74 65   or./ AsGml(inte
42920 67 65 72 20 76 65 72 73 69 6f 6e 2c 20 42 4c 4f  ger version, BLO
42930 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  B encoded geomet
42940 72 79 29 0a 2f 20 20 20 20 6f 72 0a 2f 20 41 73  ry)./    or./ As
42950 47 6d 6c 28 69 6e 74 65 67 65 72 20 76 65 72 73  Gml(integer vers
42960 69 6f 6e 2c 20 42 4c 4f 42 20 65 6e 63 6f 64 65  ion, BLOB encode
42970 64 20 67 65 6f 6d 65 74 72 79 2c 20 69 6e 74 65  d geometry, inte
42980 67 65 72 20 70 72 65 63 69 73 69 6f 6e 29 0a 2f  ger precision)./
42990 0a 2f 20 2a 76 65 72 73 69 6f 6e 2a 20 6d 61 79  ./ *version* may
429a0 20 62 65 20 32 20 28 47 4d 4c 20 32 2e 31 2e 32   be 2 (GML 2.1.2
429b0 29 20 6f 72 20 33 20 28 47 4d 4c 20 33 2e 31 2e  ) or 3 (GML 3.1.
429c0 31 29 0a 2f 20 64 65 66 61 75 6c 74 20 2a 76 65  1)./ default *ve
429d0 72 73 69 6f 6e 2a 3a 20 32 0a 2f 0a 2f 20 2a 70  rsion*: 2././ *p
429e0 72 65 63 69 73 69 6f 6e 2a 20 69 73 20 74 68 65  recision* is the
429f0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
42a00 74 20 64 65 63 69 6d 61 6c 20 64 69 67 69 74 73  t decimal digits
42a10 0a 2f 20 64 65 66 61 75 6c 74 20 2a 70 72 65 63  ./ default *prec
42a20 69 73 69 6f 6e 2a 3a 20 31 35 0a 2f 0a 2f 20 72  ision*: 15././ r
42a30 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65  eturns the corre
42a40 73 70 6f 6e 64 69 6e 67 20 47 4d 4c 20 72 65 70  sponding GML rep
42a50 72 65 73 65 6e 74 61 74 69 6f 6e 20 0a 2f 20 6f  resentation ./ o
42a60 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
42a70 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
42a80 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ed.*/.    unsign
42a90 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
42aa0 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
42ab0 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
42ac0 20 20 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d     int version =
42ad0 20 32 3b 0a 20 20 20 20 69 6e 74 20 70 72 65 63   2;.    int prec
42ae0 69 73 69 6f 6e 20 3d 20 31 35 3b 0a 20 20 20 20  ision = 15;.    
42af0 67 61 69 61 4f 75 74 42 75 66 66 65 72 20 6f 75  gaiaOutBuffer ou
42b00 74 5f 62 75 66 3b 0a 20 20 20 20 67 61 69 61 47  t_buf;.    gaiaG
42b10 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
42b20 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67   NULL;.    int g
42b30 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
42b40 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
42b50 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
42b60 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
42b70 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
42b80 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
42b90 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
42ba0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
42bb0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
42bc0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
42bd0 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
42be0 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
42bf0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
42c00 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
42c10 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
42c20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
42c30 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
42c40 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
42c50 67 63 20 3d 3d 20 33 29 0a 20 20 20 20 20 20 7b  gc == 3).      {
42c60 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
42c70 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
42c80 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [0]) == SQLITE_I
42c90 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 76  NTEGER)..      v
42ca0 65 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  ersion = sqlite3
42cb0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
42cc0 5b 30 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  [0]);..  else.. 
42cd0 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
42ce0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
42cf0 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
42d00 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71  .    }..  if (sq
42d10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
42d20 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
42d30 4c 49 54 45 5f 42 4c 4f 42 29 0a 09 20 20 20 20  LITE_BLOB)..    
42d40 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
42d50 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
42d60 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
42d70 20 20 7d 0a 09 20 20 70 5f 62 6c 6f 62 20 3d 20    }..  p_blob = 
42d80 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
42d90 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
42da0 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a  blob (argv[1]);.
42db0 09 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c  .  n_bytes = sql
42dc0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
42dd0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 69   (argv[1]);..  i
42de0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
42df0 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
42e00 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
42e10 52 29 0a 09 20 20 20 20 20 20 70 72 65 63 69 73  R)..      precis
42e20 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ion = sqlite3_va
42e30 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
42e40 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
42e50 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
42e60 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
42e70 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
42e80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
42e90 65 6c 73 65 20 69 66 20 28 61 72 67 63 20 3d 3d  else if (argc ==
42ea0 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   2).      {..  i
42eb0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
42ec0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
42ed0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
42ee0 52 0a 09 20 20 20 20 20 20 26 26 20 73 71 6c 69  R..      && sqli
42ef0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
42f00 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
42f10 54 45 5f 42 4c 4f 42 29 0a 09 20 20 20 20 7b 0a  TE_BLOB)..    {.
42f20 09 09 76 65 72 73 69 6f 6e 20 3d 20 73 71 6c 69  ..version = sqli
42f30 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
42f40 72 67 76 5b 30 5d 29 3b 0a 09 09 70 5f 62 6c 6f  rgv[0]);...p_blo
42f50 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
42f60 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
42f70 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31  lue_blob (argv[1
42f80 5d 29 3b 0a 09 09 6e 5f 62 79 74 65 73 20 3d 20  ]);...n_bytes = 
42f90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
42fa0 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  tes (argv[1]);..
42fb0 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66      }..  else if
42fc0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
42fd0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
42fe0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 09 09  = SQLITE_BLOB...
42ff0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61     && sqlite3_va
43000 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
43010 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
43020 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 70  EGER)..    {...p
43030 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
43040 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
43050 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
43060 67 76 5b 30 5d 29 3b 0a 09 09 6e 5f 62 79 74 65  gv[0]);...n_byte
43070 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
43080 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
43090 29 3b 0a 09 09 70 72 65 63 69 73 69 6f 6e 20 3d  );...precision =
430a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
430b0 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
430c0 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
430d0 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
430e0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
430f0 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
43100 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
43110 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
43120 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
43130 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
43140 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
43150 42 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  B)..    {...sqli
43160 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
43170 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
43180 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70  urn;..    }..  p
43190 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
431a0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
431b0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
431c0 67 76 5b 30 5d 29 3b 0a 09 20 20 6e 5f 62 79 74  gv[0]);..  n_byt
431d0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
431e0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
431f0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
43200 67 61 69 61 4f 75 74 42 75 66 66 65 72 49 6e 69  gaiaOutBufferIni
43210 74 69 61 6c 69 7a 65 20 28 26 6f 75 74 5f 62 75  tialize (&out_bu
43220 66 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  f);.    geo =..g
43230 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
43240 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
43250 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
43260 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
43270 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
43280 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
43290 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
432a0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
432b0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
432c0 7b 0a 09 20 20 2f 2a 20 70 72 6f 64 75 63 65 20  {..  /* produce 
432d0 47 4d 4c 2d 6e 6f 74 61 74 69 6f 6e 20 2d 20 61  GML-notation - a
432e0 63 74 75 61 6c 20 77 6f 72 6b 20 69 73 20 64 6f  ctual work is do
432f0 6e 65 20 69 6e 20 67 61 69 61 67 65 6f 2f 67 67  ne in gaiageo/gg
43300 5f 77 6b 74 2e 63 20 2a 2f 0a 09 20 20 67 61 69  _wkt.c */..  gai
43310 61 4f 75 74 47 6d 6c 20 28 26 6f 75 74 5f 62 75  aOutGml (&out_bu
43320 66 2c 20 76 65 72 73 69 6f 6e 2c 20 70 72 65 63  f, version, prec
43330 69 73 69 6f 6e 2c 20 67 65 6f 29 3b 0a 09 20 20  ision, geo);..  
43340 69 66 20 28 6f 75 74 5f 62 75 66 2e 45 72 72 6f  if (out_buf.Erro
43350 72 20 7c 7c 20 6f 75 74 5f 62 75 66 2e 42 75 66  r || out_buf.Buf
43360 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  fer == NULL)..  
43370 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
43380 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
43390 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
433a0 7b 0a 09 09 6c 65 6e 20 3d 20 6f 75 74 5f 62 75  {...len = out_bu
433b0 66 2e 57 72 69 74 65 4f 66 66 73 65 74 3b 0a 09  f.WriteOffset;..
433c0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
433d0 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 6f  text (context, o
433e0 75 74 5f 62 75 66 2e 42 75 66 66 65 72 2c 20 6c  ut_buf.Buffer, l
433f0 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 6f 75 74  en, free);...out
43400 5f 62 75 66 2e 42 75 66 66 65 72 20 3d 20 4e 55  _buf.Buffer = NU
43410 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  LL;..    }.     
43420 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
43430 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20  eomColl (geo);. 
43440 20 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72     gaiaOutBuffer
43450 52 65 73 65 74 20 28 26 6f 75 74 5f 62 75 66 29  Reset (&out_buf)
43460 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
43470 0a 66 6e 63 74 5f 41 73 47 65 6f 4a 53 4f 4e 20  .fnct_AsGeoJSON 
43480 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
43490 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
434a0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
434b0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
434c0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
434d0 2f 20 41 73 47 65 6f 4a 53 4f 4e 28 42 4c 4f 42  / AsGeoJSON(BLOB
434e0 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
434f0 79 29 0a 2f 20 20 20 20 6f 72 0a 2f 20 41 73 47  y)./    or./ AsG
43500 65 6f 4a 53 4f 4e 28 42 4c 4f 42 20 65 6e 63 6f  eoJSON(BLOB enco
43510 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20 69 6e  ded geometry, in
43520 74 65 67 65 72 20 70 72 65 63 69 73 69 6f 6e 29  teger precision)
43530 0a 2f 20 20 20 20 6f 72 0a 2f 20 41 73 47 65 6f  ./    or./ AsGeo
43540 4a 53 4f 4e 28 42 4c 4f 42 20 65 6e 63 6f 64 65  JSON(BLOB encode
43550 64 20 67 65 6f 6d 65 74 72 79 2c 20 69 6e 74 65  d geometry, inte
43560 67 65 72 20 70 72 65 63 69 73 69 6f 6e 2c 20 69  ger precision, i
43570 6e 74 65 67 65 72 20 6f 70 74 69 6f 6e 73 29 0a  nteger options).
43580 2f 0a 2f 20 2a 70 72 65 63 69 73 69 6f 6e 2a 20  /./ *precision* 
43590 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
435a0 20 6f 75 74 70 75 74 20 64 65 63 69 6d 61 6c 20   output decimal 
435b0 64 69 67 69 74 73 0a 2f 20 64 65 66 61 75 6c 74  digits./ default
435c0 20 2a 70 72 65 63 69 73 69 6f 6e 2a 3a 20 31 35   *precision*: 15
435d0 0a 2f 0a 2f 20 2a 6f 70 74 69 6f 6e 73 2a 20 6d  ././ *options* m
435e0 61 79 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ay be one of the
435f0 20 66 6f 6c 6c 6f 77 69 6e 67 73 3a 0a 2f 20 20   followings:./  
43600 20 30 20 3d 20 6e 6f 20 6f 70 74 69 6f 6e 73 20   0 = no options 
43610 5b 64 65 66 61 75 6c 74 5d 0a 2f 20 20 20 31 20  [default]./   1 
43620 3d 20 47 65 6f 4a 53 4f 4e 20 4d 42 52 0a 2f 20  = GeoJSON MBR./ 
43630 20 20 32 20 3d 20 47 65 6f 4a 53 4f 4e 20 53 68    2 = GeoJSON Sh
43640 6f 72 74 20 43 52 53 20 28 65 2e 67 20 45 50 53  ort CRS (e.g EPS
43650 47 3a 34 33 32 36 29 20 0a 2f 20 20 20 33 20 3d  G:4326) ./   3 =
43660 20 31 20 2b 20 32 20 28 4d 62 72 20 2b 20 73 68   1 + 2 (Mbr + sh
43670 6f 72 74 43 72 73 29 0a 2f 20 20 20 34 20 3d 20  ortCrs)./   4 = 
43680 47 65 6f 4a 53 4f 4e 20 4c 6f 6e 67 20 43 52 53  GeoJSON Long CRS
43690 20 28 65 2e 67 20 75 72 6e 3a 6f 67 63 3a 64 65   (e.g urn:ogc:de
436a0 66 3a 63 72 73 3a 45 50 53 47 3a 3a 34 33 32 36  f:crs:EPSG::4326
436b0 29 0a 2f 20 20 20 35 20 3d 20 31 20 2b 20 34 20  )./   5 = 1 + 4 
436c0 28 4d 62 72 20 2b 20 6c 6f 6e 67 43 72 73 29 0a  (Mbr + longCrs).
436d0 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20  /./ returns the 
436e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 47 4d  corresponding GM
436f0 4c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  L representation
43700 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
43710 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
43720 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75  untered.*/.    u
43730 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
43740 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
43750 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c  bytes;.    int l
43760 65 6e 3b 0a 20 20 20 20 69 6e 74 20 70 72 65 63  en;.    int prec
43770 69 73 69 6f 6e 20 3d 20 31 35 3b 0a 20 20 20 20  ision = 15;.    
43780 69 6e 74 20 6f 70 74 69 6f 6e 73 20 3d 20 30 3b  int options = 0;
43790 0a 20 20 20 20 67 61 69 61 4f 75 74 42 75 66 66  .    gaiaOutBuff
437a0 65 72 20 6f 75 74 5f 62 75 66 3b 0a 20 20 20 20  er out_buf;.    
437b0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
437c0 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
437d0 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
437e0 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
437f0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
43800 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
43810 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
43820 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
43830 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
43840 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
43850 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
43860 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
43870 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
43880 3d 20 4e 55 4c 4c 29 0a 09 67 70 6b 67 5f 61 6d  = NULL)..gpkg_am
43890 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
438a0 2d 3e 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61  ->gpkg_mode = ca
438b0 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 3b  che->gpkg_mode;;
438c0 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
438d0 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   3).      {..  i
438e0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
438f0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
43900 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 09  == SQLITE_BLOB..
43910 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
43920 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
43930 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
43940 49 4e 54 45 47 45 52 0a 09 20 20 20 20 20 20 26  INTEGER..      &
43950 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
43960 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
43970 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
43980 29 0a 09 20 20 20 20 7b 0a 09 09 70 5f 62 6c 6f  )..    {...p_blo
43990 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
439a0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
439b0 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
439c0 5d 29 3b 0a 09 09 6e 5f 62 79 74 65 73 20 3d 20  ]);...n_bytes = 
439d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
439e0 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  tes (argv[0]);..
439f0 09 70 72 65 63 69 73 69 6f 6e 20 3d 20 73 71 6c  .precision = sql
43a00 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
43a10 61 72 67 76 5b 31 5d 29 3b 0a 09 09 6f 70 74 69  argv[1]);...opti
43a20 6f 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ons = sqlite3_va
43a30 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
43a40 29 3b 0a 09 09 69 66 20 28 6f 70 74 69 6f 6e 73  );...if (options
43a50 20 3e 3d 20 31 20 26 26 20 6f 70 74 69 6f 6e 73   >= 1 && options
43a60 20 3c 3d 20 35 29 0a 09 09 20 20 20 20 3b 0a 09   <= 5)...    ;..
43a70 09 65 6c 73 65 0a 09 09 20 20 20 20 6f 70 74 69  .else...    opti
43a80 6f 6e 73 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a  ons = 0;..    }.
43a90 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
43aa0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
43ab0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
43ac0 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
43ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
43ae0 65 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29  e if (argc == 2)
43af0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
43b00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
43b10 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
43b20 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 09 20 20 20  SQLITE_BLOB..   
43b30 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61     && sqlite3_va
43b40 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
43b50 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
43b60 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 70  EGER)..    {...p
43b70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
43b80 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
43b90 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
43ba0 67 76 5b 30 5d 29 3b 0a 09 09 6e 5f 62 79 74 65  gv[0]);...n_byte
43bb0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
43bc0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
43bd0 29 3b 0a 09 09 70 72 65 63 69 73 69 6f 6e 20 3d  );...precision =
43be0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
43bf0 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
43c00 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
43c10 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
43c20 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
43c30 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
43c40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
43c50 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
43c60 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
43c70 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
43c80 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
43c90 42 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  B)..    {...sqli
43ca0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
43cb0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
43cc0 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70  urn;..    }..  p
43cd0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
43ce0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
43cf0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
43d00 67 76 5b 30 5d 29 3b 0a 09 20 20 6e 5f 62 79 74  gv[0]);..  n_byt
43d10 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
43d20 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
43d30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
43d40 67 61 69 61 4f 75 74 42 75 66 66 65 72 49 6e 69  gaiaOutBufferIni
43d50 74 69 61 6c 69 7a 65 20 28 26 6f 75 74 5f 62 75  tialize (&out_bu
43d60 66 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  f);.    geo =..g
43d70 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
43d80 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
43d90 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
43da0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
43db0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
43dc0 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
43dd0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
43de0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
43df0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
43e00 7b 0a 09 20 20 2f 2a 20 70 72 6f 64 75 63 65 20  {..  /* produce 
43e10 47 65 6f 4a 53 4f 4e 2d 6e 6f 74 61 74 69 6f 6e  GeoJSON-notation
43e20 20 2d 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 69   - actual work i
43e30 73 20 64 6f 6e 65 20 69 6e 20 67 61 69 61 67 65  s done in gaiage
43e40 6f 2f 67 67 5f 77 6b 74 2e 63 20 2a 2f 0a 09 20  o/gg_wkt.c */.. 
43e50 20 67 61 69 61 4f 75 74 47 65 6f 4a 53 4f 4e 20   gaiaOutGeoJSON 
43e60 28 26 6f 75 74 5f 62 75 66 2c 20 67 65 6f 2c 20  (&out_buf, geo, 
43e70 70 72 65 63 69 73 69 6f 6e 2c 20 6f 70 74 69 6f  precision, optio
43e80 6e 73 29 3b 0a 09 20 20 69 66 20 28 6f 75 74 5f  ns);..  if (out_
43e90 62 75 66 2e 45 72 72 6f 72 20 7c 7c 20 6f 75 74  buf.Error || out
43ea0 5f 62 75 66 2e 42 75 66 66 65 72 20 3d 3d 20 4e  _buf.Buffer == N
43eb0 55 4c 4c 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ULL)..      sqli
43ec0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
43ed0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
43ee0 73 65 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e 20  se..    {...len 
43ef0 3d 20 6f 75 74 5f 62 75 66 2e 57 72 69 74 65 4f  = out_buf.WriteO
43f00 66 66 73 65 74 3b 0a 09 09 73 71 6c 69 74 65 33  ffset;...sqlite3
43f10 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f  _result_text (co
43f20 6e 74 65 78 74 2c 20 6f 75 74 5f 62 75 66 2e 42  ntext, out_buf.B
43f30 75 66 66 65 72 2c 20 6c 65 6e 2c 20 66 72 65 65  uffer, len, free
43f40 29 3b 0a 09 09 6f 75 74 5f 62 75 66 2e 42 75 66  );...out_buf.Buf
43f50 66 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  fer = NULL;..   
43f60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
43f70 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
43f80 28 67 65 6f 29 3b 0a 20 20 20 20 67 61 69 61 4f  (geo);.    gaiaO
43f90 75 74 42 75 66 66 65 72 52 65 73 65 74 20 28 26  utBufferReset (&
43fa0 6f 75 74 5f 62 75 66 29 3b 0a 7d 0a 0a 73 74 61  out_buf);.}..sta
43fb0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 41 73  tic void.fnct_As
43fc0 42 69 6e 61 72 79 20 28 73 71 6c 69 74 65 33 5f  Binary (sqlite3_
43fd0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
43fe0 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
43ff0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
44000 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
44010 63 74 69 6f 6e 3a 0a 2f 20 41 73 42 69 6e 61 72  ction:./ AsBinar
44020 79 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67  y(BLOB encoded g
44030 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74  eometry)././ ret
44040 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70  urns the corresp
44050 6f 6e 64 69 6e 67 20 57 4b 42 20 65 6e 63 6f 64  onding WKB encod
44060 65 64 20 76 61 6c 75 65 0a 2f 20 6f 72 20 4e 55  ed value./ or NU
44070 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
44080 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
44090 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
440a0 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
440b0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
440c0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
440d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
440e0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
440f0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
44100 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
44110 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
44120 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
44130 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
44140 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
44150 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
44160 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
44170 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
44180 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
44190 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
441a0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
441b0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
441c0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
441d0 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
441e0 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
441f0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
44200 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
44210 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
44220 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
44230 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
44240 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
44250 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
44260 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
44270 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
44280 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
44290 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
442a0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
442b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
442c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
442d0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
442e0 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
442f0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
44300 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
44310 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  o =..gaiaFromSpa
44320 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
44330 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
44340 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
44350 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
44360 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
44370 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f  (!geo)..sqlite3_
44380 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
44390 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
443a0 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 54        {..  gaiaT
443b0 6f 57 6b 62 20 28 67 65 6f 2c 20 26 70 5f 72 65  oWkb (geo, &p_re
443c0 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  sult, &len);..  
443d0 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29 0a 09  if (!p_result)..
443e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
443f0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
44400 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  xt);..  else..  
44410 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
44420 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
44430 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c  , p_result, len,
44440 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a   free);.      }.
44450 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
44460 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73  Coll (geo);.}..s
44470 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
44480 41 73 46 47 46 20 28 73 71 6c 69 74 65 33 5f 63  AsFGF (sqlite3_c
44490 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
444a0 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
444b0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
444c0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
444d0 74 69 6f 6e 3a 0a 2f 20 41 73 46 47 46 28 42 4c  tion:./ AsFGF(BL
444e0 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  OB encoded geome
444f0 74 72 79 2c 20 69 6e 74 20 64 69 6d 73 29 0a 2f  try, int dims)./
44500 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ./ returns the c
44510 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 46 47 46  orresponding FGF
44520 20 65 6e 63 6f 64 65 64 20 76 61 6c 75 65 0a 2f   encoded value./
44530 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
44540 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
44550 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ered.*/.    unsi
44560 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
44570 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
44580 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  es;.    int len;
44590 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
445a0 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
445b0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
445c0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
445d0 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6f  ULL;.    int coo
445e0 72 64 5f 64 69 6d 73 3b 0a 20 20 20 20 69 6e 74  rd_dims;.    int
445f0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
44600 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
44610 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
44620 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
44630 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
44640 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
44650 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
44660 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
44670 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
44680 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
44690 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
446a0 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
446b0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
446c0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
446d0 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
446e0 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
446f0 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
44700 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
44710 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
44720 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
44730 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
44740 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
44750 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
44760 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
44770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
44780 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
44790 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
447a0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
447b0 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
447c0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
447d0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
447e0 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ]);.    if (sqli
447f0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
44800 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
44810 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
44820 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74    {..  spatialit
44830 65 5f 65 0a 09 20 20 20 20 20 20 28 22 41 73 46  e_e..      ("AsF
44840 47 46 28 29 20 65 72 72 6f 72 3a 20 61 72 67 75  GF() error: argu
44850 6d 65 6e 74 20 32 20 5b 67 65 6f 6d 5f 63 6f 6f  ment 2 [geom_coo
44860 72 64 73 5d 20 69 73 20 6e 6f 74 20 6f 66 20 74  rds] is not of t
44870 68 65 20 49 6e 74 65 67 65 72 20 74 79 70 65 5c  he Integer type\
44880 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  n");..  sqlite3_
44890 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
448a0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
448b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f  ;.      }.    co
448c0 6f 72 64 5f 64 69 6d 73 20 3d 20 73 71 6c 69 74  ord_dims = sqlit
448d0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
448e0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[1]);.    if (
448f0 63 6f 6f 72 64 5f 64 69 6d 73 0a 09 3d 3d 20 30  coord_dims..== 0
44900 20 7c 7c 20 63 6f 6f 72 64 5f 64 69 6d 73 20 3d   || coord_dims =
44910 3d 20 31 20 7c 7c 20 63 6f 6f 72 64 5f 64 69 6d  = 1 || coord_dim
44920 73 20 3d 3d 20 32 20 7c 7c 20 63 6f 6f 72 64 5f  s == 2 || coord_
44930 64 69 6d 73 20 3d 3d 20 33 29 0a 09 3b 0a 20 20  dims == 3)..;.  
44940 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
44950 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
44960 20 20 20 20 20 20 28 22 41 73 46 47 46 28 29 20        ("AsFGF() 
44970 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20  error: argument 
44980 32 20 5b 67 65 6f 6d 5f 63 6f 6f 72 64 73 5d 20  2 [geom_coords] 
44990 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 5b 30 2c  out of range [0,
449a0 31 2c 32 2c 33 5d 5c 6e 22 29 3b 0a 09 20 20 73  1,2,3]\n");..  s
449b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
449c0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
449d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
449e0 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
449f0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
44a00 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
44a10 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
44a20 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
44a30 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
44a40 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
44a50 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
44a60 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
44a70 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
44a80 20 20 67 61 69 61 54 6f 46 67 66 20 28 67 65 6f    gaiaToFgf (geo
44a90 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
44aa0 6e 2c 20 63 6f 6f 72 64 5f 64 69 6d 73 29 3b 0a  n, coord_dims);.
44ab0 09 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74  .  if (!p_result
44ac0 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
44ad0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
44ae0 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
44af0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
44b00 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
44b10 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
44b20 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20  en, free);.     
44b30 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
44b40 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d  eomColl (geo);.}
44b50 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
44b60 63 74 5f 74 69 6e 79 5f 70 6f 69 6e 74 5f 65 6e  ct_tiny_point_en
44b70 63 6f 64 65 20 28 73 71 6c 69 74 65 33 5f 63 6f  code (sqlite3_co
44b80 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
44b90 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 73 71   int argc,....sq
44ba0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
44bb0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
44bc0 6e 63 74 69 6f 6e 3a 0a 2f 20 54 69 6e 79 50 6f  nction:./ TinyPo
44bd0 69 6e 74 45 6e 63 6f 64 65 28 76 61 72 69 61 62  intEncode(variab
44be0 6c 65 2d 74 79 70 65 29 0a 2f 0a 2f 20 72 65 74  le-type)././ ret
44bf0 75 72 6e 73 20 61 20 42 4c 4f 42 20 54 69 6e 79  urns a BLOB Tiny
44c00 50 6f 69 6e 74 20 69 66 20 74 68 65 20 72 65 63  Point if the rec
44c10 65 69 76 65 64 20 61 72 67 75 6d 65 6e 74 20 69  eived argument i
44c20 73 20 61 20 42 4c 4f 42 2d 47 45 4f 4d 45 54 52  s a BLOB-GEOMETR
44c30 59 20 50 4f 49 4e 54 0a 2f 20 69 6e 20 61 6e 79  Y POINT./ in any
44c40 20 6f 74 68 65 72 20 63 61 73 65 20 74 68 65 20   other case the 
44c50 72 65 63 65 69 76 65 64 20 61 72 67 75 6d 65 6e  received argumen
44c60 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
44c70 65 64 20 22 61 73 20 69 73 22 0a 2a 2f 0a 20 20  ed "as is".*/.  
44c80 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
44c90 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
44ca0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
44cb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
44cc0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
44cd0 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
44ce0 20 20 20 7b 0a 09 20 20 69 6e 74 20 67 65 6f 6d     {..  int geom
44cf0 5f 70 6f 69 6e 74 20 3d 20 31 3b 0a 09 20 20 63  _point = 1;..  c
44d00 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
44d10 61 72 20 2a 62 6c 6f 62 20 3d 0a 09 20 20 20 20  ar *blob =..    
44d20 20 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65    (const unsigne
44d30 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
44d40 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
44d50 67 76 5b 30 5d 29 3b 0a 09 20 20 69 6e 74 20 73  gv[0]);..  int s
44d60 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ize = sqlite3_va
44d70 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
44d80 30 5d 29 3b 0a 09 20 20 69 66 20 28 73 69 7a 65  0]);..  if (size
44d90 20 3c 20 34 35 29 0a 09 20 20 20 20 20 20 67 65   < 45)..      ge
44da0 6f 6d 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 09 20  om_point = 0;.. 
44db0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69   else..    {...i
44dc0 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 20 3d  nt endian_arch =
44dd0 20 67 61 69 61 45 6e 64 69 61 6e 41 72 63 68 20   gaiaEndianArch 
44de0 28 29 3b 0a 09 09 69 6e 74 20 74 79 70 65 3b 0a  ();...int type;.
44df0 09 09 69 6e 74 20 6c 69 74 74 6c 65 5f 65 6e 64  ..int little_end
44e00 69 61 6e 20 3d 20 30 3b 0a 09 09 69 66 20 28 2a  ian = 0;...if (*
44e10 28 62 6c 6f 62 20 2b 20 30 29 20 21 3d 20 47 41  (blob + 0) != GA
44e20 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54 29 0a 09  IA_MARK_START)..
44e30 09 20 20 20 20 67 65 6f 6d 5f 70 6f 69 6e 74 20  .    geom_point 
44e40 3d 20 30 3b 0a 09 09 69 66 20 28 2a 28 62 6c 6f  = 0;...if (*(blo
44e50 62 20 2b 20 28 73 69 7a 65 20 2d 20 31 29 29 20  b + (size - 1)) 
44e60 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44  != GAIA_MARK_END
44e70 29 0a 09 09 20 20 20 20 67 65 6f 6d 5f 70 6f 69  )...    geom_poi
44e80 6e 74 20 3d 20 30 3b 0a 09 09 69 66 20 28 2a 28  nt = 0;...if (*(
44e90 62 6c 6f 62 20 2b 20 33 38 29 20 21 3d 20 47 41  blob + 38) != GA
44ea0 49 41 5f 4d 41 52 4b 5f 4d 42 52 29 0a 09 09 20  IA_MARK_MBR)... 
44eb0 20 20 20 67 65 6f 6d 5f 70 6f 69 6e 74 20 3d 20     geom_point = 
44ec0 30 3b 0a 09 09 69 66 20 28 2a 28 62 6c 6f 62 20  0;...if (*(blob 
44ed0 2b 20 31 29 20 3d 3d 20 47 41 49 41 5f 4c 49 54  + 1) == GAIA_LIT
44ee0 54 4c 45 5f 45 4e 44 49 41 4e 29 0a 09 09 20 20  TLE_ENDIAN)...  
44ef0 20 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 20    little_endian 
44f00 3d 20 31 3b 0a 09 09 65 6c 73 65 20 69 66 20 28  = 1;...else if (
44f10 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47  *(blob + 1) == G
44f20 41 49 41 5f 42 49 47 5f 45 4e 44 49 41 4e 29 0a  AIA_BIG_ENDIAN).
44f30 09 09 20 20 20 20 3b 0a 09 09 65 6c 73 65 0a 09  ..    ;...else..
44f40 09 20 20 20 20 67 65 6f 6d 5f 70 6f 69 6e 74 20  .    geom_point 
44f50 3d 20 30 3b 0a 09 09 74 79 70 65 20 3d 20 67 61  = 0;...type = ga
44f60 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62  iaImport32 (blob
44f70 20 2b 20 33 39 2c 20 6c 69 74 74 6c 65 5f 65 6e   + 39, little_en
44f80 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  dian, endian_arc
44f90 68 29 3b 0a 09 09 69 66 20 28 74 79 70 65 20 3d  h);...if (type =
44fa0 3d 20 47 41 49 41 5f 50 4f 49 4e 54 20 7c 7c 20  = GAIA_POINT || 
44fb0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 49  type == GAIA_POI
44fc0 4e 54 5a 0a 09 09 20 20 20 20 7c 7c 20 74 79 70  NTZ...    || typ
44fd0 65 20 3d 3d 20 47 41 49 41 5f 50 4f 49 4e 54 4d  e == GAIA_POINTM
44fe0 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
44ff0 5f 50 4f 49 4e 54 5a 4d 29 0a 09 09 20 20 20 20  _POINTZM)...    
45000 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67  ;...else...    g
45010 65 6f 6d 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 09  eom_point = 0;..
45020 20 20 20 20 7d 0a 09 20 20 69 66 20 28 67 65 6f      }..  if (geo
45030 6d 5f 70 6f 69 6e 74 29 0a 09 20 20 20 20 7b 0a  m_point)..    {.
45040 09 09 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63  ..int endian_arc
45050 68 20 3d 20 67 61 69 61 45 6e 64 69 61 6e 41 72  h = gaiaEndianAr
45060 63 68 20 28 29 3b 0a 09 09 69 6e 74 20 74 79 70  ch ();...int typ
45070 65 3b 0a 09 09 69 6e 74 20 6c 69 74 74 6c 65 5f  e;...int little_
45080 65 6e 64 69 61 6e 20 3d 20 30 3b 0a 09 09 69 6e  endian = 0;...in
45090 74 20 73 72 69 64 3b 0a 09 09 64 6f 75 62 6c 65  t srid;...double
450a0 20 78 3b 0a 09 09 64 6f 75 62 6c 65 20 79 3b 0a   x;...double y;.
450b0 09 09 64 6f 75 62 6c 65 20 7a 3b 0a 09 09 64 6f  ..double z;...do
450c0 75 62 6c 65 20 6d 3b 0a 09 09 75 6e 73 69 67 6e  uble m;...unsign
450d0 65 64 20 63 68 61 72 20 2a 6f 75 74 3b 0a 09 09  ed char *out;...
450e0 69 6e 74 20 6f 75 74 5f 73 7a 3b 0a 09 09 69 66  int out_sz;...if
450f0 20 28 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d   (*(blob + 1) ==
45100 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
45110 49 41 4e 29 0a 09 09 20 20 20 20 6c 69 74 74 6c  IAN)...    littl
45120 65 5f 65 6e 64 69 61 6e 20 3d 20 31 3b 0a 09 09  e_endian = 1;...
45130 73 72 69 64 20 3d 20 67 61 69 61 49 6d 70 6f 72  srid = gaiaImpor
45140 74 33 32 20 28 62 6c 6f 62 20 2b 20 32 2c 20 6c  t32 (blob + 2, l
45150 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e  ittle_endian, en
45160 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 74 79  dian_arch);...ty
45170 70 65 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 33  pe = gaiaImport3
45180 32 20 28 62 6c 6f 62 20 2b 20 33 39 2c 20 6c 69  2 (blob + 39, li
45190 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e 64  ttle_endian, end
451a0 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 78 20 3d  ian_arch);...x =
451b0 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62   gaiaImport64 (b
451c0 6c 6f 62 20 2b 20 34 33 2c 20 6c 69 74 74 6c 65  lob + 43, little
451d0 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f  _endian, endian_
451e0 61 72 63 68 29 3b 0a 09 09 79 20 3d 20 67 61 69  arch);...y = gai
451f0 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20  aImport64 (blob 
45200 2b 20 35 31 2c 20 6c 69 74 74 6c 65 5f 65 6e 64  + 51, little_end
45210 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  ian, endian_arch
45220 29 3b 0a 09 09 73 77 69 74 63 68 20 28 74 79 70  );...switch (typ
45230 65 29 0a 09 09 20 20 7b 0a 09 09 20 20 63 61 73  e)...  {...  cas
45240 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09  e GAIA_POINT:...
45250 20 20 20 20 20 20 67 61 69 61 4d 61 6b 65 50 6f        gaiaMakePo
45260 69 6e 74 45 78 20 28 31 2c 20 78 2c 20 79 2c 20  intEx (1, x, y, 
45270 73 72 69 64 2c 20 26 6f 75 74 2c 20 26 6f 75 74  srid, &out, &out
45280 5f 73 7a 29 3b 0a 09 09 20 20 20 20 20 20 62 72  _sz);...      br
45290 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 47 41  eak;...  case GA
452a0 49 41 5f 50 4f 49 4e 54 5a 3a 0a 09 09 20 20 20  IA_POINTZ:...   
452b0 20 20 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72     z = gaiaImpor
452c0 74 36 34 20 28 62 6c 6f 62 20 2b 20 35 39 2c 20  t64 (blob + 59, 
452d0 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65  little_endian, e
452e0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20  ndian_arch);... 
452f0 20 20 20 20 20 67 61 69 61 4d 61 6b 65 50 6f 69       gaiaMakePoi
45300 6e 74 5a 45 78 20 28 31 2c 20 78 2c 20 79 2c 20  ntZEx (1, x, y, 
45310 7a 2c 20 73 72 69 64 2c 20 26 6f 75 74 2c 20 26  z, srid, &out, &
45320 6f 75 74 5f 73 7a 29 3b 0a 09 09 20 20 20 20 20  out_sz);...     
45330 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65   break;...  case
45340 20 47 41 49 41 5f 50 4f 49 4e 54 4d 3a 0a 09 09   GAIA_POINTM:...
45350 20 20 20 20 20 20 6d 20 3d 20 67 61 69 61 49 6d        m = gaiaIm
45360 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20 35  port64 (blob + 5
45370 39 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e  9, little_endian
45380 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
45390 09 09 20 20 20 20 20 20 67 61 69 61 4d 61 6b 65  ..      gaiaMake
453a0 50 6f 69 6e 74 4d 45 78 20 28 31 2c 20 78 2c 20  PointMEx (1, x, 
453b0 79 2c 20 6d 2c 20 73 72 69 64 2c 20 26 6f 75 74  y, m, srid, &out
453c0 2c 20 26 6f 75 74 5f 73 7a 29 3b 0a 09 09 20 20  , &out_sz);...  
453d0 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 63      break;...  c
453e0 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d  ase GAIA_POINTZM
453f0 3a 0a 09 09 20 20 20 20 20 20 7a 20 3d 20 67 61  :...      z = ga
45400 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62  iaImport64 (blob
45410 20 2b 20 35 39 2c 20 6c 69 74 74 6c 65 5f 65 6e   + 59, little_en
45420 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  dian, endian_arc
45430 68 29 3b 0a 09 09 20 20 20 20 20 20 6d 20 3d 20  h);...      m = 
45440 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c  gaiaImport64 (bl
45450 6f 62 20 2b 20 36 37 2c 20 6c 69 74 74 6c 65 5f  ob + 67, little_
45460 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61  endian, endian_a
45470 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61  rch);...      ga
45480 69 61 4d 61 6b 65 50 6f 69 6e 74 5a 4d 45 78 20  iaMakePointZMEx 
45490 28 31 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 2c 20  (1, x, y, z, m, 
454a0 73 72 69 64 2c 20 26 6f 75 74 2c 20 26 6f 75 74  srid, &out, &out
454b0 5f 73 7a 29 3b 0a 09 09 20 20 20 20 20 20 62 72  _sz);...      br
454c0 65 61 6b 3b 0a 09 09 20 20 7d 3b 0a 09 09 73 71  eak;...  };...sq
454d0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
454e0 62 20 28 63 6f 6e 74 65 78 74 2c 20 6f 75 74 2c  b (context, out,
454f0 20 6f 75 74 5f 73 7a 2c 20 66 72 65 65 29 3b 0a   out_sz, free);.
45500 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
45510 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
45520 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
45530 78 74 2c 20 62 6c 6f 62 2c 20 73 69 7a 65 2c 20  xt, blob, size, 
45540 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
45550 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  );..      }.    
45560 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
45570 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
45580 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
45590 49 4e 54 45 47 45 52 29 0a 09 73 71 6c 69 74 65  INTEGER)..sqlite
455a0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
455b0 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
455c0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30  alue_int (argv[0
455d0 5d 29 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  ]));.    else if
455e0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
455f0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
45600 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
45610 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
45620 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
45630 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
45640 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 29  ouble (argv[0]))
45650 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
45660 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
45670 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
45680 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 73 71 6c  QLITE_TEXT)..sql
45690 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
456a0 20 28 63 6f 6e 74 65 78 74 2c 0a 09 09 09 20 20   (context,....  
456b0 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
456c0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
456d0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 2c 0a  text (argv[0]),.
456e0 09 09 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ...     sqlite3_
456f0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
45700 76 5b 30 5d 29 2c 20 53 51 4c 49 54 45 5f 54 52  v[0]), SQLITE_TR
45710 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 65 6c  ANSIENT);.    el
45720 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  se..sqlite3_resu
45730 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
45740 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
45750 64 0a 66 6e 63 74 5f 67 65 6f 6d 65 74 72 79 5f  d.fnct_geometry_
45760 70 6f 69 6e 74 5f 65 6e 63 6f 64 65 20 28 73 71  point_encode (sq
45770 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
45780 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
45790 63 2c 0a 09 09 09 20 20 20 20 73 71 6c 69 74 65  c,....    sqlite
457a0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
457b0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
457c0 6f 6e 3a 0a 2f 20 47 65 6f 6d 65 74 72 79 50 6f  on:./ GeometryPo
457d0 69 6e 74 45 6e 63 6f 64 65 28 76 61 72 69 61 62  intEncode(variab
457e0 6c 65 2d 74 79 70 65 29 0a 2f 0a 2f 20 72 65 74  le-type)././ ret
457f0 75 72 6e 73 20 61 20 42 4c 4f 42 20 47 45 4f 4d  urns a BLOB GEOM
45800 45 54 52 59 20 69 66 20 74 68 65 20 72 65 63 65  ETRY if the rece
45810 69 76 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73  ived argument is
45820 20 61 20 42 4c 4f 42 2d 54 69 6e 79 50 6f 69 6e   a BLOB-TinyPoin
45830 74 20 50 4f 49 4e 54 0a 2f 20 69 6e 20 61 6e 79  t POINT./ in any
45840 20 6f 74 68 65 72 20 63 61 73 65 20 74 68 65 20   other case the 
45850 72 65 63 65 69 76 65 64 20 61 72 67 75 6d 65 6e  received argumen
45860 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
45870 65 64 20 22 61 73 20 69 73 22 0a 2a 2f 0a 20 20  ed "as is".*/.  
45880 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
45890 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
458a0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
458b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
458c0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
458d0 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
458e0 20 20 20 7b 0a 09 20 20 69 6e 74 20 74 69 6e 79     {..  int tiny
458f0 5f 70 6f 69 6e 74 20 3d 20 31 3b 0a 09 20 20 63  _point = 1;..  c
45900 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
45910 61 72 20 2a 62 6c 6f 62 20 3d 0a 09 20 20 20 20  ar *blob =..    
45920 20 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65    (const unsigne
45930 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
45940 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
45950 67 76 5b 30 5d 29 3b 0a 09 20 20 69 6e 74 20 73  gv[0]);..  int s
45960 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ize = sqlite3_va
45970 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
45980 30 5d 29 3b 0a 09 20 20 69 66 20 28 73 69 7a 65  0]);..  if (size
45990 20 3c 20 32 34 29 0a 09 20 20 20 20 20 20 74 69   < 24)..      ti
459a0 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 09 20  ny_point = 0;.. 
459b0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69   else..    {...i
459c0 66 20 28 73 69 7a 65 20 3d 3d 20 32 34 20 7c 7c  f (size == 24 ||
459d0 20 73 69 7a 65 20 3d 3d 20 33 32 20 7c 7c 20 73   size == 32 || s
459e0 69 7a 65 20 3d 3d 20 34 30 29 0a 09 09 20 20 20  ize == 40)...   
459f0 20 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20   ;...else...    
45a00 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
45a10 09 09 69 66 20 28 2a 28 62 6c 6f 62 20 2b 20 30  ..if (*(blob + 0
45a20 29 20 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53  ) != GAIA_MARK_S
45a30 54 41 52 54 29 0a 09 09 20 20 20 20 74 69 6e 79  TART)...    tiny
45a40 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 09 09 69 66  _point = 0;...if
45a50 20 28 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d   (*(blob + 1) ==
45a60 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f   GAIA_TINYPOINT_
45a70 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 0a 09 09  LITTLE_ENDIAN...
45a80 20 20 20 20 7c 7c 20 2a 28 62 6c 6f 62 20 2b 20      || *(blob + 
45a90 31 29 20 3d 3d 20 47 41 49 41 5f 54 49 4e 59 50  1) == GAIA_TINYP
45aa0 4f 49 4e 54 5f 42 49 47 5f 45 4e 44 49 41 4e 29  OINT_BIG_ENDIAN)
45ab0 0a 09 09 20 20 20 20 3b 0a 09 09 65 6c 73 65 0a  ...    ;...else.
45ac0 09 09 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74  ..    tiny_point
45ad0 20 3d 20 30 3b 0a 09 09 69 66 20 28 2a 28 62 6c   = 0;...if (*(bl
45ae0 6f 62 20 2b 20 36 29 20 3d 3d 20 47 41 49 41 5f  ob + 6) == GAIA_
45af0 54 49 4e 59 50 4f 49 4e 54 5f 58 59 0a 09 09 20  TINYPOINT_XY... 
45b00 20 20 20 7c 7c 20 2a 28 62 6c 6f 62 20 2b 20 36     || *(blob + 6
45b10 29 20 3d 3d 20 47 41 49 41 5f 54 49 4e 59 50 4f  ) == GAIA_TINYPO
45b20 49 4e 54 5f 58 59 5a 0a 09 09 20 20 20 20 7c 7c  INT_XYZ...    ||
45b30 20 2a 28 62 6c 6f 62 20 2b 20 36 29 20 3d 3d 20   *(blob + 6) == 
45b40 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 58  GAIA_TINYPOINT_X
45b50 59 4d 0a 09 09 20 20 20 20 7c 7c 20 2a 28 62 6c  YM...    || *(bl
45b60 6f 62 20 2b 20 36 29 20 3d 3d 20 47 41 49 41 5f  ob + 6) == GAIA_
45b70 54 49 4e 59 50 4f 49 4e 54 5f 58 59 5a 4d 29 0a  TINYPOINT_XYZM).
45b80 09 09 20 20 20 20 3b 0a 09 09 65 6c 73 65 0a 09  ..    ;...else..
45b90 09 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20  .    tiny_point 
45ba0 3d 20 30 3b 0a 09 09 69 66 20 28 2a 28 62 6c 6f  = 0;...if (*(blo
45bb0 62 20 2b 20 28 73 69 7a 65 20 2d 20 31 29 29 20  b + (size - 1)) 
45bc0 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44  != GAIA_MARK_END
45bd0 29 0a 09 09 20 20 20 20 74 69 6e 79 5f 70 6f 69  )...    tiny_poi
45be0 6e 74 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09  nt = 0;..    }..
45bf0 20 20 69 66 20 28 74 69 6e 79 5f 70 6f 69 6e 74    if (tiny_point
45c00 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 65  )..    {...int e
45c10 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20 67 61 69  ndian_arch = gai
45c20 61 45 6e 64 69 61 6e 41 72 63 68 20 28 29 3b 0a  aEndianArch ();.
45c30 09 09 69 6e 74 20 74 79 70 65 20 3d 20 2a 28 62  ..int type = *(b
45c40 6c 6f 62 20 2b 20 36 29 3b 0a 09 09 69 6e 74 20  lob + 6);...int 
45c50 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 20 3d 20  little_endian = 
45c60 30 3b 0a 09 09 69 6e 74 20 73 72 69 64 3b 0a 09  0;...int srid;..
45c70 09 64 6f 75 62 6c 65 20 78 3b 0a 09 09 64 6f 75  .double x;...dou
45c80 62 6c 65 20 79 3b 0a 09 09 64 6f 75 62 6c 65 20  ble y;...double 
45c90 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 3b 0a 09  z;...double m;..
45ca0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
45cb0 6f 75 74 3b 0a 09 09 69 6e 74 20 6f 75 74 5f 73  out;...int out_s
45cc0 7a 3b 0a 09 09 69 66 20 28 2a 28 62 6c 6f 62 20  z;...if (*(blob 
45cd0 2b 20 31 29 20 3d 3d 20 47 41 49 41 5f 54 49 4e  + 1) == GAIA_TIN
45ce0 59 50 4f 49 4e 54 5f 4c 49 54 54 4c 45 5f 45 4e  YPOINT_LITTLE_EN
45cf0 44 49 41 4e 29 0a 09 09 20 20 20 20 6c 69 74 74  DIAN)...    litt
45d00 6c 65 5f 65 6e 64 69 61 6e 20 3d 20 31 3b 0a 09  le_endian = 1;..
45d10 09 73 72 69 64 20 3d 20 67 61 69 61 49 6d 70 6f  .srid = gaiaImpo
45d20 72 74 33 32 20 28 62 6c 6f 62 20 2b 20 32 2c 20  rt32 (blob + 2, 
45d30 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65  little_endian, e
45d40 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 78  ndian_arch);...x
45d50 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
45d60 28 62 6c 6f 62 20 2b 20 37 2c 20 6c 69 74 74 6c  (blob + 7, littl
45d70 65 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e  e_endian, endian
45d80 5f 61 72 63 68 29 3b 0a 09 09 79 20 3d 20 67 61  _arch);...y = ga
45d90 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62  iaImport64 (blob
45da0 20 2b 20 31 35 2c 20 6c 69 74 74 6c 65 5f 65 6e   + 15, little_en
45db0 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  dian, endian_arc
45dc0 68 29 3b 0a 09 09 73 77 69 74 63 68 20 28 74 79  h);...switch (ty
45dd0 70 65 29 0a 09 09 20 20 7b 0a 09 09 20 20 63 61  pe)...  {...  ca
45de0 73 65 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e  se GAIA_TINYPOIN
45df0 54 5f 58 59 3a 0a 09 09 20 20 20 20 20 20 67 61  T_XY:...      ga
45e00 69 61 4d 61 6b 65 50 6f 69 6e 74 45 78 20 28 30  iaMakePointEx (0
45e10 2c 20 78 2c 20 79 2c 20 73 72 69 64 2c 20 26 6f  , x, y, srid, &o
45e20 75 74 2c 20 26 6f 75 74 5f 73 7a 29 3b 0a 09 09  ut, &out_sz);...
45e30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20        break;... 
45e40 20 63 61 73 65 20 47 41 49 41 5f 54 49 4e 59 50   case GAIA_TINYP
45e50 4f 49 4e 54 5f 58 59 5a 3a 0a 09 09 20 20 20 20  OINT_XYZ:...    
45e60 20 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74    z = gaiaImport
45e70 36 34 20 28 62 6c 6f 62 20 2b 20 32 33 2c 20 6c  64 (blob + 23, l
45e80 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e  ittle_endian, en
45e90 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
45ea0 20 20 20 20 67 61 69 61 4d 61 6b 65 50 6f 69 6e      gaiaMakePoin
45eb0 74 5a 45 78 20 28 30 2c 20 78 2c 20 79 2c 20 7a  tZEx (0, x, y, z
45ec0 2c 20 73 72 69 64 2c 20 26 6f 75 74 2c 20 26 6f  , srid, &out, &o
45ed0 75 74 5f 73 7a 29 3b 0a 09 09 20 20 20 20 20 20  ut_sz);...      
45ee0 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20  break;...  case 
45ef0 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 58  GAIA_TINYPOINT_X
45f00 59 4d 3a 0a 09 09 20 20 20 20 20 20 6d 20 3d 20  YM:...      m = 
45f10 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c  gaiaImport64 (bl
45f20 6f 62 20 2b 20 32 33 2c 20 6c 69 74 74 6c 65 5f  ob + 23, little_
45f30 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61  endian, endian_a
45f40 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61  rch);...      ga
45f50 69 61 4d 61 6b 65 50 6f 69 6e 74 4d 45 78 20 28  iaMakePointMEx (
45f60 30 2c 20 78 2c 20 79 2c 20 6d 2c 20 73 72 69 64  0, x, y, m, srid
45f70 2c 20 26 6f 75 74 2c 20 26 6f 75 74 5f 73 7a 29  , &out, &out_sz)
45f80 3b 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b  ;...      break;
45f90 0a 09 09 20 20 63 61 73 65 20 47 41 49 41 5f 54  ...  case GAIA_T
45fa0 49 4e 59 50 4f 49 4e 54 5f 58 59 5a 4d 3a 0a 09  INYPOINT_XYZM:..
45fb0 09 20 20 20 20 20 20 7a 20 3d 20 67 61 69 61 49  .      z = gaiaI
45fc0 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20  mport64 (blob + 
45fd0 32 33 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61  23, little_endia
45fe0 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  n, endian_arch);
45ff0 0a 09 09 20 20 20 20 20 20 6d 20 3d 20 67 61 69  ...      m = gai
46000 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20  aImport64 (blob 
46010 2b 20 33 31 2c 20 6c 69 74 74 6c 65 5f 65 6e 64  + 31, little_end
46020 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  ian, endian_arch
46030 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 4d  );...      gaiaM
46040 61 6b 65 50 6f 69 6e 74 5a 4d 45 78 20 28 30 2c  akePointZMEx (0,
46050 20 78 2c 20 79 2c 20 7a 2c 20 6d 2c 20 73 72 69   x, y, z, m, sri
46060 64 2c 20 26 6f 75 74 2c 20 26 6f 75 74 5f 73 7a  d, &out, &out_sz
46070 29 3b 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b  );...      break
46080 3b 0a 09 09 20 20 7d 3b 0a 09 09 73 71 6c 69 74  ;...  };...sqlit
46090 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
460a0 63 6f 6e 74 65 78 74 2c 20 6f 75 74 2c 20 6f 75  context, out, ou
460b0 74 5f 73 7a 2c 20 66 72 65 65 29 3b 0a 09 20 20  t_sz, free);..  
460c0 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
460d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
460e0 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
460f0 20 62 6c 6f 62 2c 20 73 69 7a 65 2c 20 53 51 4c   blob, size, SQL
46100 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
46110 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
46120 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
46130 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
46140 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
46150 47 45 52 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  GER)..sqlite3_re
46160 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
46170 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
46180 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 29 3b  _int (argv[0]));
46190 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
461a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
461b0 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
461c0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 73 71 6c  LITE_FLOAT)..sql
461d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
461e0 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  le (context, sql
461f0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
46200 65 20 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  e (argv[0]));.  
46210 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
46220 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
46230 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
46240 45 5f 54 45 58 54 29 0a 09 73 71 6c 69 74 65 33  E_TEXT)..sqlite3
46250 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f  _result_text (co
46260 6e 74 65 78 74 2c 0a 09 09 09 20 20 20 20 20 28  ntext,....     (
46270 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
46280 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
46290 20 28 61 72 67 76 5b 30 5d 29 2c 0a 09 09 09 20   (argv[0]),.... 
462a0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
462b0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
462c0 29 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  ), SQLITE_TRANSI
462d0 45 4e 54 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  ENT);.    else..
462e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
462f0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d  ull (context);.}
46300 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
46310 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 31 20 28 73  ct_MakePoint1 (s
46320 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
46330 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
46340 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
46350 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
46360 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
46370 4d 61 6b 65 50 6f 69 6e 74 28 64 6f 75 62 6c 65  MakePoint(double
46380 20 58 2c 20 64 6f 75 62 6c 65 20 59 29 0a 2f 20   X, double Y)./ 
46390 20 20 20 61 6c 69 61 73 0a 2f 20 53 54 5f 50 6f     alias./ ST_Po
463a0 69 6e 74 28 64 6f 75 62 6c 65 20 58 2c 20 64 6f  int(double X, do
463b0 75 62 6c 65 20 59 29 0a 2f 0a 2f 20 62 75 69 6c  uble Y)././ buil
463c0 64 73 20 61 20 50 4f 49 4e 54 20 0a 2f 20 6f 72  ds a POINT ./ or
463d0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
463e0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
463f0 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  d.*/.    int len
46400 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  ;.    int int_va
46410 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  lue;.    unsigne
46420 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
46430 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75   = NULL;.    dou
46440 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c  ble x;.    doubl
46450 65 20 79 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  e y;.    int tin
46460 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
46470 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
46480 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
46490 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
464a0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
464b0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
464c0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
464d0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
464e0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
464f0 55 4c 4c 29 0a 09 74 69 6e 79 5f 70 6f 69 6e 74  ULL)..tiny_point
46500 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
46510 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
46520 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
46530 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
46540 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
46550 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33 5f 76  )..x = sqlite3_v
46560 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
46570 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[0]);.    else 
46580 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
46590 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
465a0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
465b0 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
465c0 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
465d0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
465e0 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69  gv[0]);..  x = i
465f0 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  nt_value;.      
46600 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
46610 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
46620 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
46630 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
46640 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
46650 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
46660 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
46670 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79  SQLITE_FLOAT)..y
46680 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
46690 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d  _double (argv[1]
466a0 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
466b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
466c0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
466d0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
466e0 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76        {..  int_v
466f0 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
46700 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
46710 5d 29 3b 0a 09 20 20 79 20 3d 20 69 6e 74 5f 76  ]);..  y = int_v
46720 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alue;.      }.  
46730 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
46740 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
46750 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
46760 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
46770 20 20 7d 0a 20 20 20 20 67 61 69 61 4d 61 6b 65    }.    gaiaMake
46780 50 6f 69 6e 74 45 78 20 28 74 69 6e 79 5f 70 6f  PointEx (tiny_po
46790 69 6e 74 2c 20 78 2c 20 79 2c 20 30 2c 20 26 70  int, x, y, 0, &p
467a0 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a  _result, &len);.
467b0 20 20 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c      if (!p_resul
467c0 74 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  t)..sqlite3_resu
467d0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
467e0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
467f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
46800 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73   (context, p_res
46810 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b  ult, len, free);
46820 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
46830 66 6e 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 32 20  fnct_MakePoint2 
46840 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
46850 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
46860 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
46870 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
46880 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
46890 2f 20 4d 61 6b 65 50 6f 69 6e 74 28 64 6f 75 62  / MakePoint(doub
468a0 6c 65 20 58 2c 20 64 6f 75 62 6c 65 20 59 2c 20  le X, double Y, 
468b0 69 6e 74 20 53 52 49 44 29 0a 2f 0a 2f 20 62 75  int SRID)././ bu
468c0 69 6c 64 73 20 61 20 50 4f 49 4e 54 20 0a 2f 20  ilds a POINT ./ 
468d0 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
468e0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
468f0 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  red.*/.    int l
46900 65 6e 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f  en;.    int int_
46910 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69 67  value;.    unsig
46920 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
46930 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  lt = NULL;.    d
46940 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75  ouble x;.    dou
46950 62 6c 65 20 79 3b 0a 20 20 20 20 69 6e 74 20 73  ble y;.    int s
46960 72 69 64 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  rid;.    int tin
46970 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
46980 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
46990 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
469a0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
469b0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
469c0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
469d0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
469e0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
469f0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
46a00 55 4c 4c 29 0a 09 74 69 6e 79 5f 70 6f 69 6e 74  ULL)..tiny_point
46a10 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
46a20 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
46a30 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
46a40 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
46a50 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
46a60 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33 5f 76  )..x = sqlite3_v
46a70 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
46a80 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[0]);.    else 
46a90 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
46aa0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
46ab0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
46ac0 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
46ad0 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
46ae0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
46af0 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69  gv[0]);..  x = i
46b00 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  nt_value;.      
46b10 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
46b20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
46b30 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
46b40 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
46b50 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
46b60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
46b70 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
46b80 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79  SQLITE_FLOAT)..y
46b90 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
46ba0 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d  _double (argv[1]
46bb0 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
46bc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
46bd0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
46be0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
46bf0 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76        {..  int_v
46c00 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
46c10 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
46c20 5d 29 3b 0a 09 20 20 79 20 3d 20 69 6e 74 5f 76  ]);..  y = int_v
46c30 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alue;.      }.  
46c40 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
46c50 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
46c60 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
46c70 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
46c80 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
46c90 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
46ca0 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
46cb0 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 73 72 69  TE_INTEGER)..sri
46cc0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
46cd0 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b  e_int (argv[2]);
46ce0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
46cf0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
46d00 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
46d10 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
46d20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 4d       }.    gaiaM
46d30 61 6b 65 50 6f 69 6e 74 45 78 20 28 74 69 6e 79  akePointEx (tiny
46d40 5f 70 6f 69 6e 74 2c 20 78 2c 20 79 2c 20 73 72  _point, x, y, sr
46d50 69 64 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  id, &p_result, &
46d60 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 21 70  len);.    if (!p
46d70 5f 72 65 73 75 6c 74 29 0a 09 73 71 6c 69 74 65  _result)..sqlite
46d80 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
46d90 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
46da0 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
46db0 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
46dc0 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
46dd0 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  free);.}..static
46de0 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 50   void.fnct_MakeP
46df0 6f 69 6e 74 5a 31 20 28 73 71 6c 69 74 65 33 5f  ointZ1 (sqlite3_
46e00 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
46e10 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
46e20 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
46e30 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
46e40 63 74 69 6f 6e 3a 0a 2f 20 4d 61 6b 65 50 6f 69  ction:./ MakePoi
46e50 6e 74 5a 28 64 6f 75 62 6c 65 20 58 2c 20 64 6f  ntZ(double X, do
46e60 75 62 6c 65 20 59 2c 20 64 6f 75 62 6c 65 20 5a  uble Y, double Z
46e70 29 0a 2f 0a 2f 20 62 75 69 6c 64 73 20 61 20 50  )././ builds a P
46e80 4f 49 4e 54 20 5a 20 0a 2f 20 6f 72 20 4e 55 4c  OINT Z ./ or NUL
46e90 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
46ea0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
46eb0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
46ec0 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b    int int_value;
46ed0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
46ee0 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
46ef0 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ULL;.    double 
46f00 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b  x;.    double y;
46f10 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20  .    double z;. 
46f20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
46f30 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
46f40 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
46f50 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
46f60 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
46f70 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
46f80 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
46f90 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
46fa0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
46fb0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  cache != NULL)..
46fc0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
46fd0 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
46fe0 62 6c 65 64 3b 0a 20 20 20 20 69 66 20 28 73 71  bled;.    if (sq
46ff0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
47000 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
47010 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 78 20 3d  LITE_FLOAT)..x =
47020 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
47030 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b  ouble (argv[0]);
47040 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
47050 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
47060 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
47070 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
47080 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
47090 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
470a0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
470b0 3b 0a 09 20 20 78 20 3d 20 69 6e 74 5f 76 61 6c  ;..  x = int_val
470c0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
470d0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
470e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
470f0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
47100 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
47110 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
47120 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
47130 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
47140 5f 46 4c 4f 41 54 29 0a 09 79 20 3d 20 73 71 6c  _FLOAT)..y = sql
47150 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
47160 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  e (argv[1]);.   
47170 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
47180 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
47190 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
471a0 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
471b0 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
471c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
471d0 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
471e0 20 79 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   y = int_value;.
471f0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
47200 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
47210 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
47220 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
47230 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
47240 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
47250 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
47260 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
47270 41 54 29 0a 09 7a 20 3d 20 73 71 6c 69 74 65 33  AT)..z = sqlite3
47280 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
47290 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[2]);.    els
472a0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
472b0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
472c0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
472d0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
472e0 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
472f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
47300 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 7a 20 3d  argv[2]);..  z =
47310 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
47320 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
47330 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
47340 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
47350 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
47360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
47370 69 61 4d 61 6b 65 50 6f 69 6e 74 5a 45 78 20 28  iaMakePointZEx (
47380 74 69 6e 79 5f 70 6f 69 6e 74 2c 20 78 2c 20 79  tiny_point, x, y
47390 2c 20 7a 2c 20 30 2c 20 26 70 5f 72 65 73 75 6c  , z, 0, &p_resul
473a0 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66  t, &len);.    if
473b0 20 28 21 70 5f 72 65 73 75 6c 74 29 0a 09 73 71   (!p_result)..sq
473c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
473d0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
473e0 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
473f0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
47400 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
47410 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74  en, free);.}..st
47420 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d  atic void.fnct_M
47430 61 6b 65 50 6f 69 6e 74 5a 32 20 28 73 71 6c 69  akePointZ2 (sqli
47440 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
47450 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
47460 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
47470 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
47480 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 61 6b   function:./ Mak
47490 65 50 6f 69 6e 74 5a 28 64 6f 75 62 6c 65 20 58  ePointZ(double X
474a0 2c 20 64 6f 75 62 6c 65 20 59 2c 20 64 6f 75 62  , double Y, doub
474b0 6c 65 20 5a 2c 20 69 6e 74 20 53 52 49 44 29 0a  le Z, int SRID).
474c0 2f 0a 2f 20 62 75 69 6c 64 73 20 61 20 50 4f 49  /./ builds a POI
474d0 4e 54 20 5a 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  NT Z./ or NULL i
474e0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
474f0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
47500 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69    int len;.    i
47510 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20  nt int_value;.  
47520 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
47530 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
47540 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  ;.    double x;.
47550 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
47560 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20    double z;.    
47570 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20 69 6e  int srid;.    in
47580 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
47590 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
475a0 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
475b0 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
475c0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
475d0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
475e0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
475f0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
47600 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
47610 20 21 3d 20 4e 55 4c 4c 29 0a 09 74 69 6e 79 5f   != NULL)..tiny_
47620 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
47630 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
47640 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
47650 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
47660 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
47670 46 4c 4f 41 54 29 0a 09 78 20 3d 20 73 71 6c 69  FLOAT)..x = sqli
47680 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
47690 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
476a0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
476b0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
476c0 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
476d0 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
476e0 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20  ..  int_value = 
476f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
47700 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20  t (argv[0]);..  
47710 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  x = int_value;. 
47720 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
47730 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
47740 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
47750 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
47760 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
47770 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
47780 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
47790 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
477a0 54 29 0a 09 79 20 3d 20 73 71 6c 69 74 65 33 5f  T)..y = sqlite3_
477b0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
477c0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[1]);.    else
477d0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
477e0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
477f0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
47800 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
47810 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
47820 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
47830 72 67 76 5b 31 5d 29 3b 0a 09 20 20 79 20 3d 20  rgv[1]);..  y = 
47840 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
47850 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
47860 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
47870 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
47880 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
47890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
478a0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
478b0 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d  ype (argv[2]) ==
478c0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
478d0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
478e0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
478f0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
47900 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
47910 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d  ype (argv[2]) ==
47920 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
47930 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f  .      {..  int_
47940 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
47950 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
47960 32 5d 29 3b 0a 09 20 20 7a 20 3d 20 69 6e 74 5f  2]);..  z = int_
47970 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  value;.      }. 
47980 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
47990 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
479a0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
479b0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
479c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
479d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
479e0 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
479f0 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 73 72  ITE_INTEGER)..sr
47a00 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
47a10 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29  ue_int (argv[3])
47a20 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
47a30 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
47a40 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
47a50 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
47a60 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
47a70 4d 61 6b 65 50 6f 69 6e 74 5a 45 78 20 28 74 69  MakePointZEx (ti
47a80 6e 79 5f 70 6f 69 6e 74 2c 20 78 2c 20 79 2c 20  ny_point, x, y, 
47a90 7a 2c 20 73 72 69 64 2c 20 26 70 5f 72 65 73 75  z, srid, &p_resu
47aa0 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69  lt, &len);.    i
47ab0 66 20 28 21 70 5f 72 65 73 75 6c 74 29 0a 09 73  f (!p_result)..s
47ac0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
47ad0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
47ae0 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
47af0 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
47b00 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
47b10 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73  len, free);.}..s
47b20 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
47b30 4d 61 6b 65 50 6f 69 6e 74 4d 31 20 28 73 71 6c  MakePointM1 (sql
47b40 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
47b50 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
47b60 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
47b70 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
47b80 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 61  L function:./ Ma
47b90 6b 65 50 6f 69 6e 74 4d 28 64 6f 75 62 6c 65 20  kePointM(double 
47ba0 58 2c 20 64 6f 75 62 6c 65 20 59 2c 20 64 6f 75  X, double Y, dou
47bb0 62 6c 65 20 4d 29 0a 2f 0a 2f 20 62 75 69 6c 64  ble M)././ build
47bc0 73 20 61 20 50 4f 49 4e 54 20 4d 0a 2f 20 6f 72  s a POINT M./ or
47bd0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
47be0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
47bf0 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  d.*/.    int len
47c00 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  ;.    int int_va
47c10 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  lue;.    unsigne
47c20 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
47c30 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75   = NULL;.    dou
47c40 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c  ble x;.    doubl
47c50 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e y;.    double 
47c60 6d 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  m;.    int tiny_
47c70 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
47c80 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
47c90 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
47ca0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
47cb0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
47cc0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
47cd0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
47ce0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
47cf0 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
47d00 4c 29 0a 09 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  L)..tiny_point =
47d10 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
47d20 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 69 66  tEnabled;.    if
47d30 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
47d40 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
47d50 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
47d60 09 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .x = sqlite3_val
47d70 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
47d80 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  0]);.    else if
47d90 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
47da0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
47db0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
47dc0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
47dd0 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
47de0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
47df0 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74  [0]);..  x = int
47e00 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
47e10 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
47e20 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
47e30 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
47e40 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
47e50 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
47e60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
47e70 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
47e80 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79 20 3d  LITE_FLOAT)..y =
47e90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
47ea0 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b  ouble (argv[1]);
47eb0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
47ec0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
47ed0 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
47ee0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
47ef0 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
47f00 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
47f10 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
47f20 3b 0a 09 20 20 79 20 3d 20 69 6e 74 5f 76 61 6c  ;..  y = int_val
47f30 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
47f40 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
47f50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
47f60 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
47f70 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
47f80 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
47f90 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
47fa0 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
47fb0 5f 46 4c 4f 41 54 29 0a 09 6d 20 3d 20 73 71 6c  _FLOAT)..m = sql
47fc0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
47fd0 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  e (argv[2]);.   
47fe0 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
47ff0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
48000 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
48010 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
48020 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
48030 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
48040 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20  nt (argv[2]);.. 
48050 20 6d 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   m = int_value;.
48060 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
48070 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
48080 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
48090 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
480a0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
480b0 20 20 67 61 69 61 4d 61 6b 65 50 6f 69 6e 74 4d    gaiaMakePointM
480c0 45 78 20 28 74 69 6e 79 5f 70 6f 69 6e 74 2c 20  Ex (tiny_point, 
480d0 78 2c 20 79 2c 20 6d 2c 20 30 2c 20 26 70 5f 72  x, y, m, 0, &p_r
480e0 65 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20  esult, &len);.  
480f0 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29    if (!p_result)
48100 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
48110 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
48120 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
48130 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
48140 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
48150 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d  t, len, free);.}
48160 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
48170 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 4d 32 20 28  ct_MakePointM2 (
48180 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
48190 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
481a0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
481b0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
481c0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
481d0 20 4d 61 6b 65 50 6f 69 6e 74 4d 28 64 6f 75 62   MakePointM(doub
481e0 6c 65 20 58 2c 20 64 6f 75 62 6c 65 20 59 2c 20  le X, double Y, 
481f0 64 6f 75 62 6c 65 20 4d 2c 20 69 6e 74 20 53 52  double M, int SR
48200 49 44 29 0a 2f 0a 2f 20 62 75 69 6c 64 73 20 61  ID)././ builds a
48210 20 50 4f 49 4e 54 20 4d 0a 2f 20 6f 72 20 4e 55   POINT M./ or NU
48220 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
48230 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
48240 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  /.    int len;. 
48250 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65     int int_value
48260 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
48270 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
48280 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65  NULL;.    double
48290 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79   x;.    double y
482a0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b 0a  ;.    double m;.
482b0 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a 20 20      int srid;.  
482c0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
482d0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
482e0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
482f0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
48300 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
48310 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
48320 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
48330 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
48340 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
48350 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 74  ache != NULL)..t
48360 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
48370 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
48380 6c 65 64 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  led;.    if (sql
48390 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
483a0 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
483b0 49 54 45 5f 46 4c 4f 41 54 29 0a 09 78 20 3d 20  ITE_FLOAT)..x = 
483c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
483d0 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a  uble (argv[0]);.
483e0 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
483f0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
48400 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
48410 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
48420 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75     {..  int_valu
48430 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
48440 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
48450 0a 09 20 20 78 20 3d 20 69 6e 74 5f 76 61 6c 75  ..  x = int_valu
48460 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  e;.      }.    e
48470 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
48480 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
48490 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
484a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
484b0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
484c0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
484d0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
484e0 46 4c 4f 41 54 29 0a 09 79 20 3d 20 73 71 6c 69  FLOAT)..y = sqli
484f0 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
48500 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
48510 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
48520 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
48530 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
48540 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
48550 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20  ..  int_value = 
48560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
48570 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
48580 79 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  y = int_value;. 
48590 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
485a0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
485b0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
485c0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
485d0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
485e0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
485f0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
48600 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
48610 54 29 0a 09 6d 20 3d 20 73 71 6c 69 74 65 33 5f  T)..m = sqlite3_
48620 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
48630 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[2]);.    else
48640 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
48650 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
48660 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
48670 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
48680 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
48690 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
486a0 72 67 76 5b 32 5d 29 3b 0a 09 20 20 6d 20 3d 20  rgv[2]);..  m = 
486b0 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
486c0 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
486d0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
486e0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
486f0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
48700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
48710 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
48720 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d  ype (argv[3]) ==
48730 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
48740 0a 09 73 72 69 64 20 3d 20 73 71 6c 69 74 65 33  ..srid = sqlite3
48750 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
48760 5b 33 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  [3]);.    else. 
48770 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
48780 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
48790 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
487a0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
487b0 67 61 69 61 4d 61 6b 65 50 6f 69 6e 74 4d 45 78  gaiaMakePointMEx
487c0 20 28 74 69 6e 79 5f 70 6f 69 6e 74 2c 20 78 2c   (tiny_point, x,
487d0 20 79 2c 20 6d 2c 20 73 72 69 64 2c 20 26 70 5f   y, m, srid, &p_
487e0 72 65 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20  result, &len);. 
487f0 20 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74     if (!p_result
48800 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
48810 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
48820 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
48830 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
48840 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
48850 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
48860 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
48870 6e 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 5a 4d 31  nct_MakePointZM1
48880 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
48890 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
488a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
488b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
488c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
488d0 0a 2f 20 4d 61 6b 65 50 6f 69 6e 74 5a 4d 28 64  ./ MakePointZM(d
488e0 6f 75 62 6c 65 20 58 2c 20 64 6f 75 62 6c 65 20  ouble X, double 
488f0 59 2c 20 64 6f 75 62 6c 65 20 5a 2c 20 64 6f 75  Y, double Z, dou
48900 62 6c 65 20 4d 29 0a 2f 0a 2f 20 62 75 69 6c 64  ble M)././ build
48910 73 20 61 20 50 4f 49 4e 54 20 5a 4d 20 0a 2f 20  s a POINT ZM ./ 
48920 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
48930 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
48940 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  red.*/.    int l
48950 65 6e 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f  en;.    int int_
48960 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69 67  value;.    unsig
48970 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
48980 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  lt = NULL;.    d
48990 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75  ouble x;.    dou
489a0 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  ble y;.    doubl
489b0 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e z;.    double 
489c0 6d 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  m;.    int tiny_
489d0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
489e0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
489f0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
48a00 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
48a10 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
48a20 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
48a30 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
48a40 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
48a50 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
48a60 4c 29 0a 09 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  L)..tiny_point =
48a70 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
48a80 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 69 66  tEnabled;.    if
48a90 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
48aa0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
48ab0 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
48ac0 09 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .x = sqlite3_val
48ad0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
48ae0 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  0]);.    else if
48af0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
48b00 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
48b10 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
48b20 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
48b30 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
48b40 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
48b50 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74  [0]);..  x = int
48b60 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
48b70 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
48b80 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
48b90 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
48ba0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
48bb0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
48bc0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
48bd0 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
48be0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79 20 3d  LITE_FLOAT)..y =
48bf0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
48c00 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b  ouble (argv[1]);
48c10 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
48c20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
48c30 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
48c40 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
48c50 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
48c60 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
48c70 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
48c80 3b 0a 09 20 20 79 20 3d 20 69 6e 74 5f 76 61 6c  ;..  y = int_val
48c90 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
48ca0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
48cb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
48cc0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
48cd0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
48ce0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
48cf0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
48d00 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
48d10 5f 46 4c 4f 41 54 29 0a 09 7a 20 3d 20 73 71 6c  _FLOAT)..z = sql
48d20 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
48d30 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  e (argv[2]);.   
48d40 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
48d50 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
48d60 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
48d70 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
48d80 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
48d90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
48da0 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20  nt (argv[2]);.. 
48db0 20 7a 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   z = int_value;.
48dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
48dd0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
48de0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
48df0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
48e00 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
48e10 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
48e20 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33  lue_type (argv[3
48e30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
48e40 41 54 29 0a 09 6d 20 3d 20 73 71 6c 69 74 65 33  AT)..m = sqlite3
48e50 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
48e60 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[3]);.    els
48e70 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
48e80 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33  lue_type (argv[3
48e90 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
48ea0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
48eb0 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
48ec0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
48ed0 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 6d 20 3d  argv[3]);..  m =
48ee0 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
48ef0 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
48f00 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
48f10 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
48f20 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
48f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
48f40 69 61 4d 61 6b 65 50 6f 69 6e 74 5a 4d 45 78 20  iaMakePointZMEx 
48f50 28 74 69 6e 79 5f 70 6f 69 6e 74 2c 20 78 2c 20  (tiny_point, x, 
48f60 79 2c 20 7a 2c 20 6d 2c 20 30 2c 20 26 70 5f 72  y, z, m, 0, &p_r
48f70 65 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20  esult, &len);.  
48f80 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29    if (!p_result)
48f90 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
48fa0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
48fb0 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
48fc0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
48fd0 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
48fe0 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d  t, len, free);.}
48ff0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
49000 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 5a 4d 32 20  ct_MakePointZM2 
49010 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
49020 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
49030 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
49040 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
49050 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
49060 2f 20 4d 61 6b 65 50 6f 69 6e 74 5a 4d 28 64 6f  / MakePointZM(do
49070 75 62 6c 65 20 58 2c 20 64 6f 75 62 6c 65 20 59  uble X, double Y
49080 2c 20 64 6f 75 62 6c 65 20 5a 2c 20 64 6f 75 62  , double Z, doub
49090 6c 65 20 4d 2c 20 69 6e 74 20 53 52 49 44 29 0a  le M, int SRID).
490a0 2f 0a 2f 20 62 75 69 6c 64 73 20 61 20 50 4f 49  /./ builds a POI
490b0 4e 54 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  NT ./ or NULL if
490c0 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
490d0 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
490e0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e   int len;.    in
490f0 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  t int_value;.   
49100 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
49110 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
49120 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20  .    double x;. 
49130 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20     double y;.   
49140 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64   double z;.    d
49150 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20 69 6e 74  ouble m;.    int
49160 20 73 72 69 64 3b 0a 20 20 20 20 69 6e 74 20 74   srid;.    int t
49170 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  iny_point = 0;. 
49180 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
49190 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
491a0 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
491b0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
491c0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
491d0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
491e0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
491f0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
49200 20 4e 55 4c 4c 29 0a 09 74 69 6e 79 5f 70 6f 69   NULL)..tiny_poi
49210 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79  nt = cache->tiny
49220 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20  PointEnabled;.  
49230 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
49240 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
49250 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
49260 41 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33  AT)..x = sqlite3
49270 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
49280 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
49290 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
492a0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
492b0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
492c0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
492d0 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
492e0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
492f0 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d  argv[0]);..  x =
49300 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
49310 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
49320 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
49330 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
49340 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
49350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
49360 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
49370 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
49380 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
49390 09 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .y = sqlite3_val
493a0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
493b0 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  1]);.    else if
493c0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
493d0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
493e0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
493f0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
49400 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
49410 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
49420 5b 31 5d 29 3b 0a 09 20 20 79 20 3d 20 69 6e 74  [1]);..  y = int
49430 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
49440 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
49450 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
49460 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
49470 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
49480 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
49490 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
494a0 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
494b0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 7a 20 3d  LITE_FLOAT)..z =
494c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
494d0 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b  ouble (argv[2]);
494e0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
494f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
49500 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
49510 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
49520 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
49530 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
49540 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
49550 3b 0a 09 20 20 7a 20 3d 20 69 6e 74 5f 76 61 6c  ;..  z = int_val
49560 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
49570 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
49580 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
49590 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
495a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
495b0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
495c0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
495d0 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[3]) == SQLITE
495e0 5f 46 4c 4f 41 54 29 0a 09 6d 20 3d 20 73 71 6c  _FLOAT)..m = sql
495f0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
49600 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  e (argv[3]);.   
49610 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
49620 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
49630 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[3]) == SQLITE
49640 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
49650 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
49660 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
49670 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20  nt (argv[3]);.. 
49680 20 6d 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   m = int_value;.
49690 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
496a0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
496b0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
496c0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
496d0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
496e0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
496f0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34  lue_type (argv[4
49700 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
49710 45 47 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71  EGER)..srid = sq
49720 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
49730 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 65  (argv[4]);.    e
49740 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
49750 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
49760 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
49770 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
49780 0a 20 20 20 20 67 61 69 61 4d 61 6b 65 50 6f 69  .    gaiaMakePoi
49790 6e 74 5a 4d 45 78 20 28 74 69 6e 79 5f 70 6f 69  ntZMEx (tiny_poi
497a0 6e 74 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 2c 20  nt, x, y, z, m, 
497b0 73 72 69 64 2c 20 26 70 5f 72 65 73 75 6c 74 2c  srid, &p_result,
497c0 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28   &len);.    if (
497d0 21 70 5f 72 65 73 75 6c 74 29 0a 09 73 71 6c 69  !p_result)..sqli
497e0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
497f0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
49800 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  lse..sqlite3_res
49810 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
49820 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
49830 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74  , free);.}..stat
49840 69 63 20 76 6f 69 64 0a 61 64 64 47 65 6f 6d 50  ic void.addGeomP
49850 6f 69 6e 74 54 6f 44 79 6e 61 6d 69 63 4c 69 6e  ointToDynamicLin
49860 65 20 28 67 61 69 61 44 79 6e 61 6d 69 63 4c 69  e (gaiaDynamicLi
49870 6e 65 50 74 72 20 64 79 6e 2c 20 67 61 69 61 47  nePtr dyn, gaiaG
49880 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 29  eomCollPtr geom)
49890 0a 7b 0a 2f 2a 20 61 70 70 65 6e 64 69 6e 67 20  .{./* appending 
498a0 61 20 73 69 6d 70 6c 65 2d 50 6f 69 6e 74 20 47  a simple-Point G
498b0 65 6f 6d 65 74 72 79 20 74 6f 20 61 20 44 79 6e  eometry to a Dyn
498c0 61 6d 69 63 20 4c 69 6e 65 20 2a 2f 0a 20 20 20  amic Line */.   
498d0 20 69 6e 74 20 70 74 73 3b 0a 20 20 20 20 69 6e   int pts;.    in
498e0 74 20 6c 6e 73 3b 0a 20 20 20 20 69 6e 74 20 70  t lns;.    int p
498f0 67 73 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e  gs;.    gaiaPoin
49900 74 50 74 72 20 70 74 3b 0a 20 20 20 20 67 61 69  tPtr pt;.    gai
49910 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c  aLinestringPtr l
49920 6e 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67  n;.    gaiaPolyg
49930 6f 6e 50 74 72 20 70 67 3b 0a 0a 20 20 20 20 69  onPtr pg;..    i
49940 66 20 28 64 79 6e 20 3d 3d 20 4e 55 4c 4c 29 0a  f (dyn == NULL).
49950 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 20  .return;.    if 
49960 28 64 79 6e 2d 3e 45 72 72 6f 72 29 0a 09 72 65  (dyn->Error)..re
49970 74 75 72 6e 3b 0a 2f 2a 20 63 68 65 63 6b 69 6e  turn;./* checkin
49980 67 20 69 66 20 47 45 4f 4d 20 73 69 6d 70 6c 79  g if GEOM simply
49990 20 69 73 20 61 20 50 4f 49 4e 54 20 2a 2f 0a 20   is a POINT */. 
499a0 20 20 20 69 66 20 28 67 65 6f 6d 20 3d 3d 20 4e     if (geom == N
499b0 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
499c0 64 79 6e 2d 3e 45 72 72 6f 72 20 3d 20 31 3b 0a  dyn->Error = 1;.
499d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
499e0 20 7d 0a 20 20 20 20 70 74 73 20 3d 20 30 3b 0a   }.    pts = 0;.
499f0 20 20 20 20 6c 6e 73 20 3d 20 30 3b 0a 20 20 20      lns = 0;.   
49a00 20 70 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 74   pgs = 0;.    pt
49a10 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f   = geom->FirstPo
49a20 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  int;.    while (
49a30 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70  pt).      {..  p
49a40 74 73 2b 2b 3b 0a 09 20 20 70 74 20 3d 20 70 74  ts++;..  pt = pt
49a50 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ->Next;.      }.
49a60 20 20 20 20 6c 6e 20 3d 20 67 65 6f 6d 2d 3e 46      ln = geom->F
49a70 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a  irstLinestring;.
49a80 20 20 20 20 77 68 69 6c 65 20 28 6c 6e 29 0a 20      while (ln). 
49a90 20 20 20 20 20 7b 0a 09 20 20 6c 6e 73 2b 2b 3b       {..  lns++;
49aa0 0a 09 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65 78  ..  ln = ln->Nex
49ab0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  t;.      }.    p
49ac0 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  g = geom->FirstP
49ad0 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69 6c  olygon;.    whil
49ae0 65 20 28 70 67 29 0a 20 20 20 20 20 20 7b 0a 09  e (pg).      {..
49af0 20 20 70 67 73 2b 2b 3b 0a 09 20 20 70 67 20 3d    pgs++;..  pg =
49b00 20 70 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20   pg->Next;.     
49b10 20 7d 0a 20 20 20 20 69 66 20 28 70 74 73 20 3d   }.    if (pts =
49b20 3d 20 31 20 26 26 20 6c 6e 73 20 3d 3d 20 30 20  = 1 && lns == 0 
49b30 26 26 20 70 67 73 20 3d 3d 20 30 29 0a 09 3b 0a  && pgs == 0)..;.
49b40 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
49b50 0a 09 20 20 2f 2a 20 66 61 69 6c 75 72 65 3a 20  ..  /* failure: 
49b60 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 50 4f 49  not a simple POI
49b70 4e 54 20 2a 2f 0a 09 20 20 64 79 6e 2d 3e 45 72  NT */..  dyn->Er
49b80 72 6f 72 20 3d 20 31 3b 0a 09 20 20 72 65 74 75  ror = 1;..  retu
49b90 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rn;.      }..   
49ba0 20 69 66 20 28 64 79 6e 2d 3e 53 72 69 64 20 21   if (dyn->Srid !
49bb0 3d 20 67 65 6f 6d 2d 3e 53 72 69 64 29 0a 20 20  = geom->Srid).  
49bc0 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66 61 69 6c      {..  /* fail
49bd0 75 72 65 3a 20 53 52 49 44 20 6d 69 73 6d 61 74  ure: SRID mismat
49be0 63 68 20 2a 2f 0a 09 20 20 64 79 6e 2d 3e 45 72  ch */..  dyn->Er
49bf0 72 6f 72 20 3d 20 31 3b 0a 09 20 20 72 65 74 75  ror = 1;..  retu
49c00 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rn;.      }..   
49c10 20 73 77 69 74 63 68 20 28 67 65 6f 6d 2d 3e 46   switch (geom->F
49c20 69 72 73 74 50 6f 69 6e 74 2d 3e 44 69 6d 65 6e  irstPoint->Dimen
49c30 73 69 6f 6e 4d 6f 64 65 6c 29 0a 20 20 20 20 20  sionModel).     
49c40 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41   {.      case GA
49c50 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 20 20 67 61  IA_XY_Z_M:..  ga
49c60 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 5a 4d 54  iaAppendPointZMT
49c70 6f 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79  oDynamicLine (dy
49c80 6e 2c 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f  n, geom->FirstPo
49c90 69 6e 74 2d 3e 58 2c 0a 09 09 09 09 09 20 20 67  int->X,......  g
49ca0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d  eom->FirstPoint-
49cb0 3e 59 2c 0a 09 09 09 09 09 20 20 67 65 6f 6d 2d  >Y,......  geom-
49cc0 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 5a 2c 0a  >FirstPoint->Z,.
49cd0 09 09 09 09 09 20 20 67 65 6f 6d 2d 3e 46 69 72  .....  geom->Fir
49ce0 73 74 50 6f 69 6e 74 2d 3e 4d 29 3b 0a 09 20 20  stPoint->M);..  
49cf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
49d00 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 20 20  e GAIA_XY_Z:..  
49d10 67 61 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 5a  gaiaAppendPointZ
49d20 54 6f 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64  ToDynamicLine (d
49d30 79 6e 2c 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  yn, geom->FirstP
49d40 6f 69 6e 74 2d 3e 58 2c 0a 09 09 09 09 09 20 67  oint->X,...... g
49d50 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d  eom->FirstPoint-
49d60 3e 59 2c 0a 09 09 09 09 09 20 67 65 6f 6d 2d 3e  >Y,...... geom->
49d70 46 69 72 73 74 50 6f 69 6e 74 2d 3e 5a 29 3b 0a  FirstPoint->Z);.
49d80 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
49d90 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d 3a 0a  case GAIA_XY_M:.
49da0 09 20 20 67 61 69 61 41 70 70 65 6e 64 50 6f 69  .  gaiaAppendPoi
49db0 6e 74 4d 54 6f 44 79 6e 61 6d 69 63 4c 69 6e 65  ntMToDynamicLine
49dc0 20 28 64 79 6e 2c 20 67 65 6f 6d 2d 3e 46 69 72   (dyn, geom->Fir
49dd0 73 74 50 6f 69 6e 74 2d 3e 58 2c 0a 09 09 09 09  stPoint->X,.....
49de0 09 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69  . geom->FirstPoi
49df0 6e 74 2d 3e 59 2c 0a 09 09 09 09 09 20 67 65 6f  nt->Y,...... geo
49e00 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 4d  m->FirstPoint->M
49e10 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  );..  break;.   
49e20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 67     default:..  g
49e30 61 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 54 6f  aiaAppendPointTo
49e40 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e  DynamicLine (dyn
49e50 2c 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69  , geom->FirstPoi
49e60 6e 74 2d 3e 58 2c 0a 09 09 09 09 09 67 65 6f 6d  nt->X,......geom
49e70 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 59 29  ->FirstPoint->Y)
49e80 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
49e90 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
49ea0 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 4c 69 6e 65  id.fnct_MakeLine
49eb0 5f 73 74 65 70 20 28 73 71 6c 69 74 65 33 5f 63  _step (sqlite3_c
49ec0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
49ed0 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
49ee0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
49ef0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
49f00 74 69 6f 6e 3a 0a 2f 20 4d 61 6b 65 4c 69 6e 65  tion:./ MakeLine
49f10 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
49f20 6d 29 0a 2f 0a 2f 20 61 67 67 72 65 67 61 74 65  m)././ aggregate
49f30 20 66 75 6e 63 74 69 6f 6e 20 2d 20 53 54 45 50   function - STEP
49f40 0a 2f 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ./.*/.    unsign
49f50 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
49f60 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
49f70 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
49f80 6c 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20  llPtr geom;.    
49f90 67 61 69 61 44 79 6e 61 6d 69 63 4c 69 6e 65 50  gaiaDynamicLineP
49fa0 74 72 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20 67  tr *p;.    int g
49fb0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
49fc0 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
49fd0 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
49fe0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
49ff0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
4a000 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
4a010 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
4a020 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
4a030 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
4a040 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
4a050 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
4a060 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
4a070 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
4a080 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
4a090 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
4a0a0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
4a0b0 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
4a0c0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
4a0d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4a0e0 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
4a0f0 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
4a100 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
4a110 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
4a120 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
4a130 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
4a140 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
4a150 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
4a160 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
4a170 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
4a180 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4a190 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
4a1a0 3b 0a 20 20 20 20 67 65 6f 6d 20 3d 0a 09 67 61  ;.    geom =..ga
4a1b0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
4a1c0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
4a1d0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
4a1e0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
4a1f0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
4a200 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 6d 29  ;.    if (!geom)
4a210 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 20  ..return;.    p 
4a220 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
4a230 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63 6f 6e  ate_context (con
4a240 74 65 78 74 2c 20 73 69 7a 65 6f 66 20 28 67 61  text, sizeof (ga
4a250 69 61 44 79 6e 61 6d 69 63 4c 69 6e 65 50 74 72  iaDynamicLinePtr
4a260 29 29 3b 0a 20 20 20 20 69 66 20 28 21 28 2a 70  ));.    if (!(*p
4a270 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  )).      {..  /*
4a280 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
4a290 73 74 20 72 6f 77 20 2a 2f 0a 09 20 20 2a 70 20  st row */..  *p 
4a2a0 3d 20 67 61 69 61 41 6c 6c 6f 63 44 79 6e 61 6d  = gaiaAllocDynam
4a2b0 69 63 4c 69 6e 65 20 28 29 3b 0a 09 20 20 28 2a  icLine ();..  (*
4a2c0 70 29 2d 3e 53 72 69 64 20 3d 20 67 65 6f 6d 2d  p)->Srid = geom-
4a2d0 3e 53 72 69 64 3b 0a 09 20 20 61 64 64 47 65 6f  >Srid;..  addGeo
4a2e0 6d 50 6f 69 6e 74 54 6f 44 79 6e 61 6d 69 63 4c  mPointToDynamicL
4a2f0 69 6e 65 20 28 2a 70 2c 20 67 65 6f 6d 29 3b 0a  ine (*p, geom);.
4a300 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43  .  gaiaFreeGeomC
4a310 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 20 20 20 20  oll (geom);.    
4a320 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
4a330 20 20 20 7b 0a 09 20 20 2f 2a 20 73 75 62 73 65     {..  /* subse
4a340 71 75 65 6e 74 20 72 6f 77 73 20 2a 2f 0a 09 20  quent rows */.. 
4a350 20 61 64 64 47 65 6f 6d 50 6f 69 6e 74 54 6f 44   addGeomPointToD
4a360 79 6e 61 6d 69 63 4c 69 6e 65 20 28 2a 70 2c 20  ynamicLine (*p, 
4a370 67 65 6f 6d 29 3b 0a 09 20 20 67 61 69 61 46 72  geom);..  gaiaFr
4a380 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
4a390 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74  );.      }.}..st
4a3a0 61 74 69 63 20 67 61 69 61 47 65 6f 6d 43 6f 6c  atic gaiaGeomCol
4a3b0 6c 50 74 72 0a 67 65 6f 6d 46 72 6f 6d 44 79 6e  lPtr.geomFromDyn
4a3c0 61 6d 69 63 4c 69 6e 65 20 28 67 61 69 61 44 79  amicLine (gaiaDy
4a3d0 6e 61 6d 69 63 4c 69 6e 65 50 74 72 20 64 79 6e  namicLinePtr dyn
4a3e0 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e  ).{./* attemptin
4a3f0 67 20 74 6f 20 62 75 69 6c 64 20 61 20 47 65 6f  g to build a Geo
4a400 6d 65 74 72 79 20 66 72 6f 6d 20 61 20 44 79 6e  metry from a Dyn
4a410 61 6d 69 63 20 4c 69 6e 65 20 2a 2f 0a 20 20 20  amic Line */.   
4a420 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
4a430 20 67 65 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geom = NULL;.  
4a440 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e 67    gaiaLinestring
4a450 50 74 72 20 6c 6e 20 3d 20 4e 55 4c 4c 3b 0a 20  Ptr ln = NULL;. 
4a460 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72 20     gaiaPointPtr 
4a470 70 74 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a  pt;.    int iv;.
4a480 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20      int count = 
4a490 30 3b 0a 20 20 20 20 69 6e 74 20 64 69 6d 73 20  0;.    int dims 
4a4a0 3d 20 47 41 49 41 5f 58 59 3b 0a 0a 20 20 20 20  = GAIA_XY;..    
4a4b0 69 66 20 28 64 79 6e 20 3d 3d 20 4e 55 4c 4c 29  if (dyn == NULL)
4a4c0 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
4a4d0 20 20 20 69 66 20 28 64 79 6e 2d 3e 45 72 72 6f     if (dyn->Erro
4a4e0 72 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  r)..return NULL;
4a4f0 0a 0a 20 20 20 20 70 74 20 3d 20 64 79 6e 2d 3e  ..    pt = dyn->
4a500 46 69 72 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  First;.    while
4a510 20 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20   (pt).      {.. 
4a520 20 2f 2a 20 63 6f 75 6e 74 69 6e 67 20 70 6f 69   /* counting poi
4a530 6e 74 73 20 61 6e 64 20 63 68 65 63 6b 69 6e 67  nts and checking
4a540 20 64 69 6d 73 20 2a 2f 0a 09 20 20 63 6f 75 6e   dims */..  coun
4a550 74 2b 2b 3b 0a 09 20 20 69 66 20 28 64 69 6d 73  t++;..  if (dims
4a560 20 3d 3d 20 47 41 49 41 5f 58 59 20 26 26 20 70   == GAIA_XY && p
4a570 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  t->DimensionMode
4a580 6c 20 21 3d 20 47 41 49 41 5f 58 59 29 0a 09 20  l != GAIA_XY).. 
4a590 20 20 20 20 20 64 69 6d 73 20 3d 20 70 74 2d 3e       dims = pt->
4a5a0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 3b 0a  DimensionModel;.
4a5b0 09 20 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  .  if (dims == G
4a5c0 41 49 41 5f 58 59 5f 5a 0a 09 20 20 20 20 20 20  AIA_XY_Z..      
4a5d0 26 26 20 28 70 74 2d 3e 44 69 6d 65 6e 73 69 6f  && (pt->Dimensio
4a5e0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
4a5f0 59 5f 4d 0a 09 09 20 20 7c 7c 20 70 74 2d 3e 44  Y_M...  || pt->D
4a600 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
4a610 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 29 0a 09   GAIA_XY_Z_M))..
4a620 20 20 20 20 20 20 64 69 6d 73 20 3d 20 47 41 49        dims = GAI
4a630 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20 20 69 66 20  A_XY_Z_M;..  if 
4a640 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59  (dims == GAIA_XY
4a650 5f 4d 0a 09 20 20 20 20 20 20 26 26 20 28 70 74  _M..      && (pt
4a660 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
4a670 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09 09   == GAIA_XY_Z...
4a680 20 20 7c 7c 20 70 74 2d 3e 44 69 6d 65 6e 73 69    || pt->Dimensi
4a690 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
4a6a0 58 59 5f 5a 5f 4d 29 29 0a 09 20 20 20 20 20 20  XY_Z_M))..      
4a6b0 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a  dims = GAIA_XY_Z
4a6c0 5f 4d 3b 0a 09 20 20 70 74 20 3d 20 70 74 2d 3e  _M;..  pt = pt->
4a6d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
4a6e0 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 32 29    if (count < 2)
4a6f0 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a  ..return NULL;..
4a700 20 20 20 20 73 77 69 74 63 68 20 28 64 69 6d 73      switch (dims
4a710 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
4a720 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  case GAIA_XY_Z_M
4a730 3a 0a 09 20 20 67 65 6f 6d 20 3d 20 67 61 69 61  :..  geom = gaia
4a740 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a  AllocGeomCollXYZ
4a750 4d 20 28 29 3b 0a 09 20 20 6c 6e 20 3d 20 67 61  M ();..  ln = ga
4a760 69 61 41 6c 6c 6f 63 4c 69 6e 65 73 74 72 69 6e  iaAllocLinestrin
4a770 67 58 59 5a 4d 20 28 63 6f 75 6e 74 29 3b 0a 09  gXYZM (count);..
4a780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
4a790 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09  ase GAIA_XY_Z:..
4a7a0 20 20 67 65 6f 6d 20 3d 20 67 61 69 61 41 6c 6c    geom = gaiaAll
4a7b0 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29  ocGeomCollXYZ ()
4a7c0 3b 0a 09 20 20 6c 6e 20 3d 20 67 61 69 61 41 6c  ;..  ln = gaiaAl
4a7d0 6c 6f 63 4c 69 6e 65 73 74 72 69 6e 67 58 59 5a  locLinestringXYZ
4a7e0 20 28 63 6f 75 6e 74 29 3b 0a 09 20 20 62 72 65   (count);..  bre
4a7f0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
4a800 41 49 41 5f 58 59 5f 4d 3a 0a 09 20 20 67 65 6f  AIA_XY_M:..  geo
4a810 6d 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f  m = gaiaAllocGeo
4a820 6d 43 6f 6c 6c 58 59 4d 20 28 29 3b 0a 09 20 20  mCollXYM ();..  
4a830 6c 6e 20 3d 20 67 61 69 61 41 6c 6c 6f 63 4c 69  ln = gaiaAllocLi
4a840 6e 65 73 74 72 69 6e 67 58 59 4d 20 28 63 6f 75  nestringXYM (cou
4a850 6e 74 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  nt);..  break;. 
4a860 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20       default:.. 
4a870 20 67 65 6f 6d 20 3d 20 67 61 69 61 41 6c 6c 6f   geom = gaiaAllo
4a880 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 20  cGeomColl ();.. 
4a890 20 6c 6e 20 3d 20 67 61 69 61 41 6c 6c 6f 63 4c   ln = gaiaAllocL
4a8a0 69 6e 65 73 74 72 69 6e 67 20 28 63 6f 75 6e 74  inestring (count
4a8b0 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  );..  break;.   
4a8c0 20 20 20 7d 3b 0a 0a 20 20 20 20 69 66 20 28 67     };..    if (g
4a8d0 65 6f 6d 20 21 3d 20 4e 55 4c 4c 20 26 26 20 6c  eom != NULL && l
4a8e0 6e 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  n != NULL).     
4a8f0 20 7b 0a 09 20 20 67 61 69 61 49 6e 73 65 72 74   {..  gaiaInsert
4a900 4c 69 6e 65 73 74 72 69 6e 67 49 6e 47 65 6f 6d  LinestringInGeom
4a910 43 6f 6c 6c 20 28 67 65 6f 6d 2c 20 6c 6e 29 3b  Coll (geom, ln);
4a920 0a 09 20 20 67 65 6f 6d 2d 3e 53 72 69 64 20 3d  ..  geom->Srid =
4a930 20 64 79 6e 2d 3e 53 72 69 64 3b 0a 20 20 20 20   dyn->Srid;.    
4a940 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
4a950 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d     {..  if (geom
4a960 29 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 65  )..      gaiaFre
4a970 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29  eGeomColl (geom)
4a980 3b 0a 09 20 20 69 66 20 28 6c 6e 29 0a 09 20 20  ;..  if (ln)..  
4a990 20 20 20 20 67 61 69 61 46 72 65 65 4c 69 6e 65      gaiaFreeLine
4a9a0 73 74 72 69 6e 67 20 28 6c 6e 29 3b 0a 09 20 20  string (ln);..  
4a9b0 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
4a9c0 20 20 20 7d 0a 0a 20 20 20 20 69 76 20 3d 20 30     }..    iv = 0
4a9d0 3b 0a 20 20 20 20 70 74 20 3d 20 64 79 6e 2d 3e  ;.    pt = dyn->
4a9e0 46 69 72 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  First;.    while
4a9f0 20 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20   (pt).      {.. 
4aa00 20 2f 2a 20 73 65 74 74 69 6e 67 20 6c 69 6e 65   /* setting line
4aa10 73 74 72 69 6e 67 20 70 6f 69 6e 74 73 20 2a 2f  string points */
4aa20 0a 09 20 20 69 66 20 28 64 69 6d 73 20 3d 3d 20  ..  if (dims == 
4aa30 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20  GAIA_XY_Z_M)..  
4aa40 20 20 7b 0a 09 09 67 61 69 61 53 65 74 50 6f 69    {...gaiaSetPoi
4aa50 6e 74 58 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72  ntXYZM (ln->Coor
4aa60 64 73 2c 20 69 76 2c 20 70 74 2d 3e 58 2c 20 70  ds, iv, pt->X, p
4aa70 74 2d 3e 59 2c 20 70 74 2d 3e 5a 2c 20 70 74 2d  t->Y, pt->Z, pt-
4aa80 3e 4d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  >M);..    }..  e
4aa90 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20  lse if (dims == 
4aaa0 47 41 49 41 5f 58 59 5f 5a 29 0a 09 20 20 20 20  GAIA_XY_Z)..    
4aab0 7b 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74  {...gaiaSetPoint
4aac0 58 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  XYZ (ln->Coords,
4aad0 20 69 76 2c 20 70 74 2d 3e 58 2c 20 70 74 2d 3e   iv, pt->X, pt->
4aae0 59 2c 20 70 74 2d 3e 5a 29 3b 0a 09 20 20 20 20  Y, pt->Z);..    
4aaf0 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 64 69  }..  else if (di
4ab00 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  ms == GAIA_XY_M)
4ab10 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 53 65  ..    {...gaiaSe
4ab20 74 50 6f 69 6e 74 58 59 4d 20 28 6c 6e 2d 3e 43  tPointXYM (ln->C
4ab30 6f 6f 72 64 73 2c 20 69 76 2c 20 70 74 2d 3e 58  oords, iv, pt->X
4ab40 2c 20 70 74 2d 3e 59 2c 20 70 74 2d 3e 4d 29 3b  , pt->Y, pt->M);
4ab50 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
4ab60 09 20 20 20 20 7b 0a 09 09 67 61 69 61 53 65 74  .    {...gaiaSet
4ab70 50 6f 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64  Point (ln->Coord
4ab80 73 2c 20 69 76 2c 20 70 74 2d 3e 58 2c 20 70 74  s, iv, pt->X, pt
4ab90 2d 3e 59 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  ->Y);..    }..  
4aba0 69 76 2b 2b 3b 0a 09 20 20 70 74 20 3d 20 70 74  iv++;..  pt = pt
4abb0 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ->Next;.      }.
4abc0 20 20 20 20 72 65 74 75 72 6e 20 67 65 6f 6d 3b      return geom;
4abd0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
4abe0 66 6e 63 74 5f 4d 61 6b 65 4c 69 6e 65 5f 66 69  fnct_MakeLine_fi
4abf0 6e 61 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal (sqlite3_con
4ac00 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 29 0a  text * context).
4ac10 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
4ac20 6e 3a 0a 2f 20 4d 61 6b 65 4c 69 6e 65 28 42 4c  n:./ MakeLine(BL
4ac30 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 29 0a  OBencoded geom).
4ac40 2f 0a 2f 20 61 67 67 72 65 67 61 74 65 20 66 75  /./ aggregate fu
4ac50 6e 63 74 69 6f 6e 20 2d 20 46 49 4e 41 4c 0a 2f  nction - FINAL./
4ac60 0a 2a 2f 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  .*/.    gaiaGeom
4ac70 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
4ac80 20 20 20 20 67 61 69 61 44 79 6e 61 6d 69 63 4c      gaiaDynamicL
4ac90 69 6e 65 50 74 72 20 2a 70 20 3d 20 73 71 6c 69  inePtr *p = sqli
4aca0 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
4acb0 6e 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  ntext (context, 
4acc0 30 29 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  0);.    int gpkg
4acd0 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
4ace0 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
4acf0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
4ad00 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
4ad10 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
4ad20 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
4ad30 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 66  context);.    if
4ad40 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
4ad50 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
4ad60 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
4ad70 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
4ad80 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
4ad90 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
4ada0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
4adb0 66 20 28 21 70 29 0a 20 20 20 20 20 20 7b 0a 09  f (!p).      {..
4adc0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4add0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
4ade0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
4adf0 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d    }.    result =
4ae00 20 67 65 6f 6d 46 72 6f 6d 44 79 6e 61 6d 69 63   geomFromDynamic
4ae10 4c 69 6e 65 20 28 2a 70 29 3b 0a 20 20 20 20 67  Line (*p);.    g
4ae20 61 69 61 46 72 65 65 44 79 6e 61 6d 69 63 4c 69  aiaFreeDynamicLi
4ae30 6e 65 20 28 2a 70 29 3b 0a 20 20 20 20 69 66 20  ne (*p);.    if 
4ae40 28 21 72 65 73 75 6c 74 29 0a 09 73 71 6c 69 74  (!result)..sqlit
4ae50 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4ae60 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
4ae70 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  se.      {..  /*
4ae80 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42   builds the BLOB
4ae90 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20   geometry to be 
4aea0 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 20 20 69  returned */..  i
4aeb0 6e 74 20 6c 65 6e 3b 0a 09 20 20 75 6e 73 69 67  nt len;..  unsig
4aec0 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
4aed0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 67 61  lt = NULL;..  ga
4aee0 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
4aef0 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74  obWkbEx2 (result
4af00 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
4af10 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  n, gpkg_mode,...
4af20 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69  ..      tiny_poi
4af30 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  nt);..  sqlite3_
4af40 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
4af50 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
4af60 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 67  len, free);..  g
4af70 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
4af80 28 72 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  (result);.      
4af90 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
4afa0 0a 62 75 69 6c 64 4c 69 6e 65 46 72 6f 6d 4d 75  .buildLineFromMu
4afb0 6c 74 69 50 6f 69 6e 74 20 28 73 71 6c 69 74 65  ltiPoint (sqlite
4afc0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
4afd0 65 78 74 2c 20 67 61 69 61 47 65 6f 6d 43 6f 6c  ext, gaiaGeomCol
4afe0 6c 50 74 72 20 67 65 6f 6d 2c 0a 09 09 09 20 69  lPtr geom,.... i
4aff0 6e 74 20 64 69 72 65 63 74 69 6f 6e 29 0a 7b 0a  nt direction).{.
4b000 2f 2a 20 69 6e 74 65 72 6e 61 6c 3a 20 62 75 69  /* internal: bui
4b010 6c 64 69 6e 67 20 61 20 4c 69 6e 65 73 74 72 69  lding a Linestri
4b020 6e 67 20 66 72 6f 6d 20 61 20 4d 75 6c 74 69 50  ng from a MultiP
4b030 6f 6c 79 67 6f 6e 20 2a 2f 0a 20 20 20 20 67 61  olygon */.    ga
4b040 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65  iaGeomCollPtr re
4b050 73 75 6c 74 3b 0a 20 20 20 20 67 61 69 61 44 79  sult;.    gaiaDy
4b060 6e 61 6d 69 63 4c 69 6e 65 50 74 72 20 64 79 6e  namicLinePtr dyn
4b070 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 70 74 73 20  ;.    int n_pts 
4b080 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 6c  = 0;.    int n_l
4b090 6e 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ns = 0;.    int 
4b0a0 6e 5f 70 67 73 20 3d 20 30 3b 0a 20 20 20 20 67  n_pgs = 0;.    g
4b0b0 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
4b0c0 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
4b0d0 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
4b0e0 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b  iaPolygonPtr pg;
4b0f0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
4b100 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
4b110 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
4b120 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
4b130 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
4b140 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
4b150 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
4b160 74 65 78 74 29 3b 0a 20 20 20 20 69 66 20 28 63  text);.    if (c
4b170 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
4b180 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f      {..  gpkg_mo
4b190 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
4b1a0 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
4b1b0 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
4b1c0 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
4b1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
4b1e0 67 65 6f 6d 29 0a 20 20 20 20 20 20 7b 0a 09 20  geom).      {.. 
4b1f0 20 70 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73   pt = geom->Firs
4b200 74 50 6f 69 6e 74 3b 0a 09 20 20 77 68 69 6c 65  tPoint;..  while
4b210 20 28 70 74 29 0a 09 20 20 20 20 7b 0a 09 09 6e   (pt)..    {...n
4b220 5f 70 74 73 2b 2b 3b 0a 09 09 70 74 20 3d 20 70  _pts++;...pt = p
4b230 74 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20 7d 0a  t->Next;..    }.
4b240 09 20 20 6c 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69  .  ln = geom->Fi
4b250 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09  rstLinestring;..
4b260 20 20 77 68 69 6c 65 20 28 6c 6e 29 0a 09 20 20    while (ln)..  
4b270 20 20 7b 0a 09 09 6e 5f 6c 6e 73 2b 2b 3b 0a 09    {...n_lns++;..
4b280 09 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74 3b 0a  .ln = ln->Next;.
4b290 09 20 20 20 20 7d 0a 09 20 20 70 67 20 3d 20 67  .    }..  pg = g
4b2a0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f  eom->FirstPolygo
4b2b0 6e 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 67 29  n;..  while (pg)
4b2c0 0a 09 20 20 20 20 7b 0a 09 09 6e 5f 70 67 73 2b  ..    {...n_pgs+
4b2d0 2b 3b 0a 09 09 70 67 20 3d 20 70 67 2d 3e 4e 65  +;...pg = pg->Ne
4b2e0 78 74 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  xt;..    }.     
4b2f0 20 7d 0a 20 20 20 20 2f 2a 20 63 68 65 63 6b 69   }.    /* checki
4b300 6e 67 20 69 66 20 72 65 61 6c 6c 79 20 69 73 20  ng if really is 
4b310 61 20 4d 75 6c 74 69 50 6f 69 6e 74 20 2a 2f 0a  a MultiPoint */.
4b320 20 20 20 20 69 66 20 28 6e 5f 70 74 73 20 3e 3d      if (n_pts >=
4b330 20 32 20 26 26 20 6e 5f 6c 6e 73 20 3d 3d 20 30   2 && n_lns == 0
4b340 20 26 26 20 6e 5f 70 67 73 20 3d 3d 20 30 29 0a   && n_pgs == 0).
4b350 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .;.    else.    
4b360 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
4b370 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
4b380 65 78 74 29 3b 0a 09 20 20 67 6f 74 6f 20 65 6e  ext);..  goto en
4b390 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  d;.      }.    d
4b3a0 79 6e 20 3d 20 67 61 69 61 41 6c 6c 6f 63 44 79  yn = gaiaAllocDy
4b3b0 6e 61 6d 69 63 4c 69 6e 65 20 28 29 3b 0a 20 20  namicLine ();.  
4b3c0 20 20 64 79 6e 2d 3e 53 72 69 64 20 3d 20 67 65    dyn->Srid = ge
4b3d0 6f 6d 2d 3e 53 72 69 64 3b 0a 20 20 20 20 70 74  om->Srid;.    pt
4b3e0 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f   = geom->FirstPo
4b3f0 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  int;.    while (
4b400 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  pt).      {..  /
4b410 2a 20 69 6e 73 65 72 74 69 6e 67 20 61 6c 6c 20  * inserting all 
4b420 50 6f 69 6e 74 73 20 61 63 63 6f 72 64 69 6e 67  Points according
4b430 6c 79 20 74 6f 20 72 65 71 75 69 72 65 64 20 64  ly to required d
4b440 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 09 20 20 69  irection */..  i
4b450 66 20 28 64 69 72 65 63 74 69 6f 6e 29 0a 09 20  f (direction).. 
4b460 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 6e 66 6f 72     {.../* confor
4b470 6d 61 6e 74 20 64 69 72 65 63 74 69 6f 6e 20 2a  mant direction *
4b480 2f 0a 09 09 73 77 69 74 63 68 20 28 70 74 2d 3e  /...switch (pt->
4b490 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 29 0a  DimensionModel).
4b4a0 09 09 20 20 7b 0a 09 09 20 20 63 61 73 65 20 47  ..  {...  case G
4b4b0 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 20 20  AIA_XY_Z_M:...  
4b4c0 20 20 20 20 67 61 69 61 41 70 70 65 6e 64 50 6f      gaiaAppendPo
4b4d0 69 6e 74 5a 4d 54 6f 44 79 6e 61 6d 69 63 4c 69  intZMToDynamicLi
4b4e0 6e 65 20 28 64 79 6e 2c 20 70 74 2d 3e 58 2c 20  ne (dyn, pt->X, 
4b4f0 70 74 2d 3e 59 2c 0a 09 09 09 09 09 09 20 20 20  pt->Y,.......   
4b500 20 20 20 70 74 2d 3e 5a 2c 20 70 74 2d 3e 4d 29     pt->Z, pt->M)
4b510 3b 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b  ;...      break;
4b520 0a 09 09 20 20 63 61 73 65 20 47 41 49 41 5f 58  ...  case GAIA_X
4b530 59 5f 5a 3a 0a 09 09 20 20 20 20 20 20 67 61 69  Y_Z:...      gai
4b540 61 41 70 70 65 6e 64 50 6f 69 6e 74 5a 54 6f 44  aAppendPointZToD
4b550 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e 2c  ynamicLine (dyn,
4b560 20 70 74 2d 3e 58 2c 20 70 74 2d 3e 59 2c 20 70   pt->X, pt->Y, p
4b570 74 2d 3e 5a 29 3b 0a 09 09 20 20 20 20 20 20 62  t->Z);...      b
4b580 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65 20 47  reak;...  case G
4b590 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 20 20 20 20  AIA_XY_M:...    
4b5a0 20 20 67 61 69 61 41 70 70 65 6e 64 50 6f 69 6e    gaiaAppendPoin
4b5b0 74 4d 54 6f 44 79 6e 61 6d 69 63 4c 69 6e 65 20  tMToDynamicLine 
4b5c0 28 64 79 6e 2c 20 70 74 2d 3e 58 2c 20 70 74 2d  (dyn, pt->X, pt-
4b5d0 3e 59 2c 20 70 74 2d 3e 4d 29 3b 0a 09 09 20 20  >Y, pt->M);...  
4b5e0 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 64      break;...  d
4b5f0 65 66 61 75 6c 74 3a 0a 09 09 20 20 20 20 20 20  efault:...      
4b600 67 61 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 54  gaiaAppendPointT
4b610 6f 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79  oDynamicLine (dy
4b620 6e 2c 20 70 74 2d 3e 58 2c 20 70 74 2d 3e 59 29  n, pt->X, pt->Y)
4b630 3b 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b  ;...      break;
4b640 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20  ...  }..    }.. 
4b650 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f   else..    {.../
4b660 2a 20 72 65 76 65 72 73 65 20 64 69 72 65 63 74  * reverse direct
4b670 69 6f 6e 20 2a 2f 0a 09 09 73 77 69 74 63 68 20  ion */...switch 
4b680 28 70 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  (pt->DimensionMo
4b690 64 65 6c 29 0a 09 09 20 20 7b 0a 09 09 20 20 63  del)...  {...  c
4b6a0 61 73 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a  ase GAIA_XY_Z_M:
4b6b0 0a 09 09 20 20 20 20 20 20 67 61 69 61 50 72 65  ...      gaiaPre
4b6c0 70 65 6e 64 50 6f 69 6e 74 5a 4d 54 6f 44 79 6e  pendPointZMToDyn
4b6d0 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e 2c 20 70  amicLine (dyn, p
4b6e0 74 2d 3e 58 2c 20 70 74 2d 3e 59 2c 0a 09 09 09  t->X, pt->Y,....
4b6f0 09 09 09 20 20 20 20 20 20 20 70 74 2d 3e 5a 2c  ...       pt->Z,
4b700 20 70 74 2d 3e 4d 29 3b 0a 09 09 20 20 20 20 20   pt->M);...     
4b710 20 62 72 65 61 6b 3b 0a 09 09 20 20 63 61 73 65   break;...  case
4b720 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 09 09 20 20   GAIA_XY_Z:...  
4b730 20 20 20 20 67 61 69 61 50 72 65 70 65 6e 64 50      gaiaPrependP
4b740 6f 69 6e 74 5a 54 6f 44 79 6e 61 6d 69 63 4c 69  ointZToDynamicLi
4b750 6e 65 20 28 64 79 6e 2c 20 70 74 2d 3e 58 2c 20  ne (dyn, pt->X, 
4b760 70 74 2d 3e 59 2c 20 70 74 2d 3e 5a 29 3b 0a 09  pt->Y, pt->Z);..
4b770 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  .      break;...
4b780 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d    case GAIA_XY_M
4b790 3a 0a 09 09 20 20 20 20 20 20 67 61 69 61 50 72  :...      gaiaPr
4b7a0 65 70 65 6e 64 50 6f 69 6e 74 4d 54 6f 44 79 6e  ependPointMToDyn
4b7b0 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e 2c 20 70  amicLine (dyn, p
4b7c0 74 2d 3e 58 2c 20 70 74 2d 3e 59 2c 20 70 74 2d  t->X, pt->Y, pt-
4b7d0 3e 4d 29 3b 0a 09 09 20 20 20 20 20 20 62 72 65  >M);...      bre
4b7e0 61 6b 3b 0a 09 09 20 20 64 65 66 61 75 6c 74 3a  ak;...  default:
4b7f0 0a 09 09 20 20 20 20 20 20 67 61 69 61 50 72 65  ...      gaiaPre
4b800 70 65 6e 64 50 6f 69 6e 74 54 6f 44 79 6e 61 6d  pendPointToDynam
4b810 69 63 4c 69 6e 65 20 28 64 79 6e 2c 20 70 74 2d  icLine (dyn, pt-
4b820 3e 58 2c 20 70 74 2d 3e 59 29 3b 0a 09 09 20 20  >X, pt->Y);...  
4b830 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 7d      break;...  }
4b840 0a 09 20 20 20 20 7d 0a 09 20 20 70 74 20 3d 20  ..    }..  pt = 
4b850 70 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20  pt->Next;.      
4b860 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67  }.    result = g
4b870 65 6f 6d 46 72 6f 6d 44 79 6e 61 6d 69 63 4c 69  eomFromDynamicLi
4b880 6e 65 20 28 64 79 6e 29 3b 0a 20 20 20 20 67 61  ne (dyn);.    ga
4b890 69 61 46 72 65 65 44 79 6e 61 6d 69 63 4c 69 6e  iaFreeDynamicLin
4b8a0 65 20 28 64 79 6e 29 3b 0a 20 20 20 20 69 66 20  e (dyn);.    if 
4b8b0 28 21 72 65 73 75 6c 74 29 0a 09 73 71 6c 69 74  (!result)..sqlit
4b8c0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4b8d0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
4b8e0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  se.      {..  /*
4b8f0 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42   builds the BLOB
4b900 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20   geometry to be 
4b910 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 20 20 69  returned */..  i
4b920 6e 74 20 6c 65 6e 3b 0a 09 20 20 75 6e 73 69 67  nt len;..  unsig
4b930 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
4b940 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 67 61  lt = NULL;..  ga
4b950 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
4b960 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74  obWkbEx2 (result
4b970 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
4b980 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  n, gpkg_mode,...
4b990 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69  ..      tiny_poi
4b9a0 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  nt);..  sqlite3_
4b9b0 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
4b9c0 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
4b9d0 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 67  len, free);..  g
4b9e0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
4b9f0 28 72 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  (result);.      
4ba00 7d 0a 20 20 65 6e 64 3a 0a 20 20 20 20 67 61 69  }.  end:.    gai
4ba10 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
4ba20 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  eom);.}..static 
4ba30 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 4c 69  void.fnct_MakeLi
4ba40 6e 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ne (sqlite3_cont
4ba50 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
4ba60 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
4ba70 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
4ba80 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
4ba90 6e 3a 0a 2f 20 4d 61 6b 65 4c 69 6e 65 28 70 6f  n:./ MakeLine(po
4baa0 69 6e 74 2d 67 65 6f 6d 65 74 72 79 20 67 65 6f  int-geometry geo
4bab0 6d 31 2c 20 70 6f 69 6e 74 2d 67 65 6f 6d 65 74  m1, point-geomet
4bac0 72 79 20 67 65 6f 6d 32 29 0a 2f 20 20 20 20 20  ry geom2)./     
4bad0 6f 72 0a 2f 20 4d 61 6b 65 4c 69 6e 65 28 6d 75  or./ MakeLine(mu
4bae0 6c 74 69 70 6f 69 6e 74 20 67 65 6f 6d 2c 20 62  ltipoint geom, b
4baf0 6f 6f 6c 65 61 6e 20 64 69 72 65 63 74 69 6f 6e  oolean direction
4bb00 29 0a 2f 0a 2f 20 2d 20 62 75 69 6c 64 73 20 61  )././ - builds a
4bb10 20 53 45 47 4d 45 4e 54 20 6a 6f 69 6e 69 6e 67   SEGMENT joining
4bb20 20 74 77 6f 20 50 4f 49 4e 54 73 20 0a 2f 20 2d   two POINTs ./ -
4bb30 20 74 68 65 20 4d 75 6c 74 69 50 6f 69 6e 74 20   the MultiPoint 
4bb40 76 65 72 73 69 6f 6e 20 77 6f 72 6b 73 20 65 78  version works ex
4bb50 61 63 74 65 6c 79 20 61 73 20 74 68 65 20 63 6f  actely as the co
4bb60 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 67 67 72  rresponding aggr
4bb70 65 67 61 74 65 0a 2f 20 20 20 66 75 6e 63 74 69  egate./   functi
4bb80 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 72 65 71 75  on, but not requ
4bb90 69 72 69 6e 67 20 61 67 67 72 65 67 61 74 69 6f  iring aggregatio
4bba0 6e 3b 20 64 69 72 65 63 74 69 6f 6e 3d 54 52 55  n; direction=TRU
4bbb0 45 20 64 69 72 65 63 74 20 6f 72 64 65 72 2c 0a  E direct order,.
4bbc0 2f 20 20 20 64 69 72 65 63 74 69 6f 6e 3d 46 41  /   direction=FA
4bbd0 4c 53 45 20 72 65 76 65 72 73 65 20 6f 72 64 65  LSE reverse orde
4bbe0 72 0a 2f 20 2d 20 6f 72 20 4e 55 4c 4c 20 69 66  r./ - or NULL if
4bbf0 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
4bc00 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
4bc10 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e   int len;.    un
4bc20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
4bc30 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
4bc40 79 74 65 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e  ytes;.    unsign
4bc50 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
4bc60 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
4bc70 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
4bc80 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  o1 = NULL;.    g
4bc90 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
4bca0 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  eo2 = NULL;.    
4bcb0 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
4bcc0 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
4bcd0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
4bce0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
4bcf0 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
4bd00 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
4bd10 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
4bd20 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
4bd30 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
4bd40 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
4bd50 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
4bd60 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
4bd70 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
4bd80 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
4bd90 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
4bda0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
4bdb0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
4bdc0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
4bdd0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4bde0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
4bdf0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
4be00 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
4be10 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4be20 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74  context);..  got
4be30 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  o stop;.      }.
4be40 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
4be50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
4be60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
4be70 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
4be80 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
4be90 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
4bea0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
4beb0 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  o1 =..gaiaFromSp
4bec0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
4bed0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
4bee0 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
4bef0 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
4bf00 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
4bf10 20 28 21 67 65 6f 31 29 0a 20 20 20 20 20 20 7b   (!geo1).      {
4bf20 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
4bf30 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
4bf40 29 3b 0a 09 20 20 67 6f 74 6f 20 73 74 6f 70 3b  );..  goto stop;
4bf50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
4bf60 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
4bf70 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
4bf80 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
4bf90 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 65  .      {..  /* e
4bfa0 78 70 65 63 74 69 6e 67 20 61 20 73 69 6e 67 6c  xpecting a singl
4bfb0 65 20 4d 75 6c 74 69 50 6f 69 6e 74 20 69 6e 70  e MultiPoint inp
4bfc0 75 74 20 2a 2f 0a 09 20 20 69 6e 74 20 64 69 72  ut */..  int dir
4bfd0 65 63 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  ection = sqlite3
4bfe0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
4bff0 5b 31 5d 29 3b 0a 09 20 20 62 75 69 6c 64 4c 69  [1]);..  buildLi
4c000 6e 65 46 72 6f 6d 4d 75 6c 74 69 50 6f 69 6e 74  neFromMultiPoint
4c010 20 28 63 6f 6e 74 65 78 74 2c 20 67 65 6f 31 2c   (context, geo1,
4c020 20 64 69 72 65 63 74 69 6f 6e 29 3b 0a 09 20 20   direction);..  
4c030 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
4c040 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
4c050 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
4c060 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [1]) != SQLITE_B
4c070 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
4c080 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
4c090 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
4c0a0 20 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 20 20 20    goto stop;.   
4c0b0 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
4c0c0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
4c0d0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
4c0e0 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29  e_blob (argv[1])
4c0f0 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
4c100 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4c110 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  tes (argv[1]);. 
4c120 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69 61 46     geo2 =..gaiaF
4c130 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
4c140 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
4c150 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
4c160 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
4c170 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
4c180 20 20 20 69 66 20 28 21 67 65 6f 32 29 0a 20 20     if (!geo2).  
4c190 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
4c1a0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
4c1b0 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74 6f 20  ntext);..  goto 
4c1c0 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stop;.      }.  
4c1d0 20 20 67 61 69 61 4d 61 6b 65 4c 69 6e 65 20 28    gaiaMakeLine (
4c1e0 67 65 6f 31 2c 20 67 65 6f 32 2c 20 26 70 5f 72  geo1, geo2, &p_r
4c1f0 65 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20  esult, &len);.  
4c200 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29    if (!p_result)
4c210 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
4c220 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
4c230 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
4c240 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
4c250 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
4c260 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20  t, len, free);. 
4c270 20 73 74 6f 70 3a 0a 20 20 20 20 69 66 20 28 67   stop:.    if (g
4c280 65 6f 31 29 0a 09 67 61 69 61 46 72 65 65 47 65  eo1)..gaiaFreeGe
4c290 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a 20  omColl (geo1);. 
4c2a0 20 20 20 69 66 20 28 67 65 6f 32 29 0a 09 67 61     if (geo2)..ga
4c2b0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
4c2c0 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  geo2);.}..static
4c2d0 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 43   void.fnct_MakeC
4c2e0 69 72 63 6c 65 20 28 73 71 6c 69 74 65 33 5f 63  ircle (sqlite3_c
4c2f0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
4c300 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
4c310 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
4c320 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
4c330 74 69 6f 6e 3a 0a 2f 20 4d 61 6b 65 43 69 72 63  tion:./ MakeCirc
4c340 6c 65 28 64 6f 75 62 6c 65 20 63 78 2c 20 64 6f  le(double cx, do
4c350 75 62 6c 65 20 63 79 2c 20 64 6f 75 62 6c 65 20  uble cy, double 
4c360 72 61 64 69 75 73 29 0a 2f 20 20 20 20 20 6f 72  radius)./     or
4c370 0a 2f 20 4d 61 6b 65 43 69 72 63 6c 65 28 64 6f  ./ MakeCircle(do
4c380 75 62 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65 20  uble cx, double 
4c390 63 79 2c 20 64 6f 75 62 6c 65 20 72 61 64 69 75  cy, double radiu
4c3a0 73 2c 20 69 6e 74 20 73 72 69 64 29 0a 2f 20 20  s, int srid)./  
4c3b0 20 20 20 6f 72 0a 2f 20 4d 61 6b 65 43 69 72 63     or./ MakeCirc
4c3c0 6c 65 28 64 6f 75 62 6c 65 20 63 78 2c 20 64 6f  le(double cx, do
4c3d0 75 62 6c 65 20 63 79 2c 20 64 6f 75 62 6c 65 20  uble cy, double 
4c3e0 72 61 64 69 75 73 2c 20 69 6e 74 20 73 72 69 64  radius, int srid
4c3f0 2c 20 64 6f 75 62 6c 65 20 73 74 65 70 29 0a 2f  , double step)./
4c400 0a 2f 20 2d 20 62 75 69 6c 64 73 20 61 20 4c 69  ./ - builds a Li
4c410 6e 65 73 74 72 69 6e 67 20 61 70 70 72 6f 78 69  nestring approxi
4c420 6d 61 74 69 6e 67 20 61 20 43 69 72 63 6c 65 0a  mating a Circle.
4c430 2f 20 2d 20 73 74 65 70 20 69 73 20 74 68 65 20  / - step is the 
4c440 61 6e 67 75 6c 61 72 20 64 69 73 74 61 6e 63 65  angular distance
4c450 20 28 69 6e 20 64 65 67 72 65 65 73 29 20 62 65   (in degrees) be
4c460 74 77 65 65 6e 20 70 6f 69 6e 74 73 20 6f 6e 20  tween points on 
4c470 0a 2f 20 20 20 74 68 65 20 63 69 72 63 75 72 6d  ./   the circurm
4c480 66 65 72 65 6e 63 65 20 28 62 79 20 64 65 66 61  ference (by defa
4c490 75 6c 74 3a 20 65 76 65 72 79 20 31 30 20 64 65  ult: every 10 de
4c4a0 67 73 29 20 0a 2f 20 2d 20 6f 72 20 4e 55 4c 4c  gs) ./ - or NULL
4c4b0 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
4c4c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
4c4d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
4c4e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c4f0 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
4c500 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
4c510 6c 50 74 72 20 67 65 6f 6d 20 3d 20 4e 55 4c 4c  lPtr geom = NULL
4c520 3b 0a 20 20 20 20 69 6e 74 20 69 76 61 6c 3b 0a  ;.    int ival;.
4c530 20 20 20 20 64 6f 75 62 6c 65 20 63 78 3b 0a 20      double cx;. 
4c540 20 20 20 64 6f 75 62 6c 65 20 63 79 3b 0a 20 20     double cy;.  
4c550 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
4c560 69 6e 74 20 73 72 69 64 20 3d 20 30 3b 0a 20 20  int srid = 0;.  
4c570 20 20 64 6f 75 62 6c 65 20 73 74 65 70 20 3d 20    double step = 
4c580 31 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 67 70  10.0;.    int gp
4c590 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
4c5a0 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
4c5b0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
4c5c0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
4c5d0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
4c5e0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
4c5f0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
4c600 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
4c610 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
4c620 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
4c630 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
4c640 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64     {..  gpkg_mod
4c650 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
4c660 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
4c670 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
4c680 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
4c690 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
4c6a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4c6b0 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
4c6c0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
4c6d0 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d       {..  ival =
4c6e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
4c6f0 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  nt (argv[0]);.. 
4c700 20 63 78 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20   cx = ival;.    
4c710 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
4c720 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
4c730 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d  ype (argv[0]) ==
4c740 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
4c750 63 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  cx = sqlite3_val
4c760 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
4c770 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  0]);.    else.  
4c780 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
4c790 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
4c7a0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
4c7b0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
4c7c0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4c7d0 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
4c7e0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
4c7f0 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 76  R).      {..  iv
4c800 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
4c810 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
4c820 3b 0a 09 20 20 63 79 20 3d 20 69 76 61 6c 3b 0a  ;..  cy = ival;.
4c830 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
4c840 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
4c850 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
4c860 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
4c870 54 29 0a 09 63 79 20 3d 20 73 71 6c 69 74 65 33  T)..cy = sqlite3
4c880 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
4c890 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
4c8a0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
4c8b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
4c8c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
4c8d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
4c8e0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
4c8f0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
4c900 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) == SQLITE_IN
4c910 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
4c920 20 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33    ival = sqlite3
4c930 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
4c940 5b 32 5d 29 3b 0a 09 20 20 72 20 3d 20 69 76 61  [2]);..  r = iva
4c950 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  l;.      }.    e
4c960 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
4c970 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
4c980 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [2]) == SQLITE_F
4c990 4c 4f 41 54 29 0a 09 72 20 3d 20 73 71 6c 69 74  LOAT)..r = sqlit
4c9a0 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
4c9b0 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65  (argv[2]);.    e
4c9c0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
4c9d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
4c9e0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
4c9f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
4ca00 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d  .    if (argc >=
4ca10 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   4).      {..  i
4ca20 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4ca30 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20  _type (argv[3]) 
4ca40 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
4ca50 52 29 0a 09 20 20 20 20 20 20 73 72 69 64 20 3d  R)..      srid =
4ca60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
4ca70 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20  nt (argv[3]);.. 
4ca80 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
4ca90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
4caa0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
4cab0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20  return;..    }. 
4cac0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
4cad0 72 67 63 20 3d 3d 20 35 29 0a 20 20 20 20 20 20  rgc == 5).      
4cae0 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
4caf0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
4cb00 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[4]) == SQLITE_
4cb10 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
4cb20 09 09 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33  ..ival = sqlite3
4cb30 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
4cb40 5b 34 5d 29 3b 0a 09 09 73 74 65 70 20 3d 20 69  [4]);...step = i
4cb50 76 61 6c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  val;..    }..  e
4cb60 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
4cb70 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
4cb80 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [4]) == SQLITE_F
4cb90 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 73 74 65  LOAT)..      ste
4cba0 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  p = sqlite3_valu
4cbb0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 34  e_double (argv[4
4cbc0 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  ]);..  else..   
4cbd0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
4cbe0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
4cbf0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
4cc00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
4cc10 20 20 67 65 6f 6d 20 3d 20 67 61 69 61 4d 61 6b    geom = gaiaMak
4cc20 65 43 69 72 63 6c 65 20 28 63 78 2c 20 63 79 2c  eCircle (cx, cy,
4cc30 20 72 2c 20 73 74 65 70 29 3b 0a 20 20 20 20 69   r, step);.    i
4cc40 66 20 28 21 67 65 6f 6d 29 0a 09 73 71 6c 69 74  f (!geom)..sqlit
4cc50 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4cc60 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
4cc70 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  se.      {..  if
4cc80 20 28 73 72 69 64 20 21 3d 20 30 29 0a 09 20 20   (srid != 0)..  
4cc90 20 20 20 20 67 65 6f 6d 2d 3e 53 72 69 64 20 3d      geom->Srid =
4cca0 20 73 72 69 64 3b 0a 09 20 20 67 61 69 61 54 6f   srid;..  gaiaTo
4ccb0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
4ccc0 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 70 5f 72  bEx2 (geom, &p_r
4ccd0 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b  esult, &len, gpk
4cce0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
4ccf0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09    tiny_point);..
4cd00 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4cd10 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
4cd20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
4cd30 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ree);.      }.  
4cd40 20 20 69 66 20 28 67 65 6f 6d 29 0a 09 67 61 69    if (geom)..gai
4cd50 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
4cd60 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  eom);.}..static 
4cd70 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 41 72  void.fnct_MakeAr
4cd80 63 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c (sqlite3_conte
4cd90 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
4cda0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
4cdb0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
4cdc0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
4cdd0 3a 0a 2f 20 4d 61 6b 65 41 72 63 28 64 6f 75 62  :./ MakeArc(doub
4cde0 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65 20 63 79  le cx, double cy
4cdf0 2c 20 64 6f 75 62 6c 65 20 72 61 64 69 75 73 2c  , double radius,
4ce00 20 64 6f 75 62 6c 65 20 73 74 61 72 74 2c 20 64   double start, d
4ce10 6f 75 62 6c 65 20 73 74 6f 70 29 0a 2f 20 20 20  ouble stop)./   
4ce20 20 20 6f 72 0a 2f 20 4d 61 6b 65 41 72 63 28 64    or./ MakeArc(d
4ce30 6f 75 62 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65  ouble cx, double
4ce40 20 63 79 2c 20 64 6f 75 62 6c 65 20 72 61 64 69   cy, double radi
4ce50 75 73 2c 20 64 6f 75 62 6c 65 20 73 74 61 72 74  us, double start
4ce60 2c 20 64 6f 75 62 6c 65 20 73 74 6f 70 2c 20 0a  , double stop, .
4ce70 2f 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 72  /         int sr
4ce80 69 64 29 0a 2f 20 20 20 20 20 6f 72 0a 2f 20 4d  id)./     or./ M
4ce90 61 6b 65 41 72 63 28 64 6f 75 62 6c 65 20 63 78  akeArc(double cx
4cea0 2c 20 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f 75  , double cy, dou
4ceb0 62 6c 65 20 72 61 64 69 75 73 2c 20 64 6f 75 62  ble radius, doub
4cec0 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c 65  le start, double
4ced0 20 73 74 6f 70 2c 20 0a 2f 20 20 20 20 20 20 20   stop, ./       
4cee0 20 20 69 6e 74 20 73 72 69 64 2c 20 64 6f 75 62    int srid, doub
4cef0 6c 65 20 73 74 65 70 29 0a 2f 0a 2f 20 2d 20 62  le step)././ - b
4cf00 75 69 6c 64 73 20 61 20 4c 69 6e 65 73 74 72 69  uilds a Linestri
4cf10 6e 67 20 61 70 70 72 6f 78 69 6d 61 74 69 6e 67  ng approximating
4cf20 20 61 20 43 69 72 63 75 6c 61 72 20 41 72 63 0a   a Circular Arc.
4cf30 2f 20 2d 20 73 74 61 72 74 20 61 6e 64 20 73 74  / - start and st
4cf40 6f 70 20 61 72 65 20 74 68 65 20 69 6e 69 74 69  op are the initi
4cf50 61 6c 20 61 6e 64 20 66 69 6e 61 6c 20 61 6e 67  al and final ang
4cf60 6c 65 73 20 28 69 6e 20 64 65 67 72 65 65 73 29  les (in degrees)
4cf70 0a 2f 20 2d 20 73 74 65 70 20 69 73 20 74 68 65  ./ - step is the
4cf80 20 61 6e 67 75 6c 61 72 20 64 69 73 74 61 6e 63   angular distanc
4cf90 65 20 28 69 6e 20 64 65 67 72 65 65 73 29 20 62  e (in degrees) b
4cfa0 65 74 77 65 65 6e 20 70 6f 69 6e 74 73 20 6f 6e  etween points on
4cfb0 20 0a 2f 20 20 20 74 68 65 20 63 69 72 63 75 72   ./   the circur
4cfc0 6d 66 65 72 65 6e 63 65 20 28 62 79 20 64 65 66  mference (by def
4cfd0 61 75 6c 74 3a 20 65 76 65 72 79 20 31 30 20 64  ault: every 10 d
4cfe0 65 67 73 29 20 0a 2f 20 2d 20 6f 72 20 4e 55 4c  egs) ./ - or NUL
4cff0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
4d000 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
4d010 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
4d020 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4d030 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
4d040 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
4d050 6c 6c 50 74 72 20 67 65 6f 6d 20 3d 20 4e 55 4c  llPtr geom = NUL
4d060 4c 3b 0a 20 20 20 20 69 6e 74 20 69 76 61 6c 3b  L;.    int ival;
4d070 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 78 3b 0a  .    double cx;.
4d080 20 20 20 20 64 6f 75 62 6c 65 20 63 79 3b 0a 20      double cy;. 
4d090 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
4d0a0 20 64 6f 75 62 6c 65 20 73 74 61 72 74 3b 0a 20   double start;. 
4d0b0 20 20 20 64 6f 75 62 6c 65 20 73 74 6f 70 3b 0a     double stop;.
4d0c0 20 20 20 20 69 6e 74 20 73 72 69 64 20 3d 20 30      int srid = 0
4d0d0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 74 65  ;.    double ste
4d0e0 70 20 3d 20 31 30 2e 30 3b 0a 20 20 20 20 69 6e  p = 10.0;.    in
4d0f0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
4d100 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
4d110 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
4d120 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
4d130 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
4d140 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
4d150 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
4d160 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
4d170 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
4d180 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
4d190 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
4d1a0 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
4d1b0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
4d1c0 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
4d1d0 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
4d1e0 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
4d1f0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
4d200 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4d210 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
4d220 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
4d230 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 76  R).      {..  iv
4d240 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
4d250 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
4d260 3b 0a 09 20 20 63 78 20 3d 20 69 76 61 6c 3b 0a  ;..  cx = ival;.
4d270 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
4d280 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
4d290 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
4d2a0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
4d2b0 54 29 0a 09 63 78 20 3d 20 73 71 6c 69 74 65 33  T)..cx = sqlite3
4d2c0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
4d2d0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
4d2e0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
4d2f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
4d300 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
4d310 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
4d320 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
4d330 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
4d340 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  1]) == SQLITE_IN
4d350 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
4d360 20 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33    ival = sqlite3
4d370 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
4d380 5b 31 5d 29 3b 0a 09 20 20 63 79 20 3d 20 69 76  [1]);..  cy = iv
4d390 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
4d3a0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
4d3b0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
4d3c0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
4d3d0 46 4c 4f 41 54 29 0a 09 63 79 20 3d 20 73 71 6c  FLOAT)..cy = sql
4d3e0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
4d3f0 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  e (argv[1]);.   
4d400 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
4d410 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4d420 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
4d430 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
4d440 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
4d450 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
4d460 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
4d470 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
4d480 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71 6c   {..  ival = sql
4d490 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
4d4a0 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 72 20 3d  argv[2]);..  r =
4d4b0 20 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   ival;.      }. 
4d4c0 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
4d4d0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
4d4e0 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
4d4f0 54 45 5f 46 4c 4f 41 54 29 0a 09 72 20 3d 20 73  TE_FLOAT)..r = s
4d500 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
4d510 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20  ble (argv[2]);. 
4d520 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
4d530 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4d540 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
4d550 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
4d560 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
4d570 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
4d580 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
4d590 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
4d5a0 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73     {..  ival = s
4d5b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4d5c0 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 73   (argv[3]);..  s
4d5d0 74 61 72 74 20 3d 20 69 76 61 6c 3b 0a 20 20 20  tart = ival;.   
4d5e0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
4d5f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
4d600 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d  type (argv[3]) =
4d610 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
4d620 09 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  .start = sqlite3
4d630 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
4d640 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[3]);.    els
4d650 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
4d660 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
4d670 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
4d680 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
4d690 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
4d6a0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
4d6b0 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  4]) == SQLITE_IN
4d6c0 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
4d6d0 20 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33    ival = sqlite3
4d6e0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
4d6f0 5b 34 5d 29 3b 0a 09 20 20 73 74 6f 70 20 3d 20  [4]);..  stop = 
4d700 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ival;.      }.  
4d710 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
4d720 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
4d730 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[4]) == SQLIT
4d740 45 5f 46 4c 4f 41 54 29 0a 09 73 74 6f 70 20 3d  E_FLOAT)..stop =
4d750 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
4d760 6f 75 62 6c 65 20 28 61 72 67 76 5b 34 5d 29 3b  ouble (argv[4]);
4d770 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
4d780 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
4d790 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
4d7a0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
4d7b0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
4d7c0 72 67 63 20 3e 3d 20 36 29 0a 20 20 20 20 20 20  rgc >= 6).      
4d7d0 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
4d7e0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
4d7f0 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[5]) == SQLITE_
4d800 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20  INTEGER)..      
4d810 73 72 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  srid = sqlite3_v
4d820 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 35  alue_int (argv[5
4d830 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  ]);..  else..   
4d840 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
4d850 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
4d860 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
4d870 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4d880 20 69 66 20 28 61 72 67 63 20 3d 3d 20 37 29 0a   if (argc == 7).
4d890 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
4d8a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4d8b0 65 20 28 61 72 67 76 5b 36 5d 29 20 3d 3d 20 53  e (argv[6]) == S
4d8c0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
4d8d0 20 20 20 20 7b 0a 09 09 69 76 61 6c 20 3d 20 73      {...ival = s
4d8e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4d8f0 20 28 61 72 67 76 5b 36 5d 29 3b 0a 09 09 73 74   (argv[6]);...st
4d900 65 70 20 3d 20 69 76 61 6c 3b 0a 09 20 20 20 20  ep = ival;..    
4d910 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71  }..  else if (sq
4d920 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4d930 20 28 61 72 67 76 5b 36 5d 29 20 3d 3d 20 53 51   (argv[6]) == SQ
4d940 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20  LITE_FLOAT)..   
4d950 20 20 20 73 74 65 70 20 3d 20 73 71 6c 69 74 65     step = sqlite
4d960 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
4d970 61 72 67 76 5b 36 5d 29 3b 0a 09 20 20 65 6c 73  argv[6]);..  els
4d980 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
4d990 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4d9a0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
4d9b0 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  rn;..    }.     
4d9c0 20 7d 0a 0a 20 20 20 20 67 65 6f 6d 20 3d 20 67   }..    geom = g
4d9d0 61 69 61 4d 61 6b 65 41 72 63 20 28 63 78 2c 20  aiaMakeArc (cx, 
4d9e0 63 79 2c 20 72 2c 20 73 74 61 72 74 2c 20 73 74  cy, r, start, st
4d9f0 6f 70 2c 20 73 74 65 70 29 3b 0a 20 20 20 20 69  op, step);.    i
4da00 66 20 28 21 67 65 6f 6d 29 0a 09 73 71 6c 69 74  f (!geom)..sqlit
4da10 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4da20 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
4da30 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  se.      {..  if
4da40 20 28 73 72 69 64 20 21 3d 20 30 29 0a 09 20 20   (srid != 0)..  
4da50 20 20 20 20 67 65 6f 6d 2d 3e 53 72 69 64 20 3d      geom->Srid =
4da60 20 73 72 69 64 3b 0a 09 20 20 67 61 69 61 54 6f   srid;..  gaiaTo
4da70 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
4da80 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 70 5f 72  bEx2 (geom, &p_r
4da90 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b  esult, &len, gpk
4daa0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
4dab0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09    tiny_point);..
4dac0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4dad0 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
4dae0 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
4daf0 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ree);.      }.  
4db00 20 20 69 66 20 28 67 65 6f 6d 29 0a 09 67 61 69    if (geom)..gai
4db10 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
4db20 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  eom);.}..static 
4db30 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 45 6c  void.fnct_MakeEl
4db40 6c 69 70 73 65 20 28 73 71 6c 69 74 65 33 5f 63  lipse (sqlite3_c
4db50 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
4db60 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
4db70 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
4db80 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
4db90 74 69 6f 6e 3a 0a 2f 20 4d 61 6b 65 45 6c 6c 69  tion:./ MakeElli
4dba0 70 73 65 28 64 6f 75 62 6c 65 20 63 78 2c 20 64  pse(double cx, d
4dbb0 6f 75 62 6c 65 20 63 79 2c 20 64 6f 75 62 6c 65  ouble cy, double
4dbc0 20 78 5f 61 78 69 73 2c 20 64 6f 75 62 6c 65 20   x_axis, double 
4dbd0 79 5f 61 78 69 73 29 0a 2f 20 20 20 20 20 6f 72  y_axis)./     or
4dbe0 0a 2f 20 4d 61 6b 65 45 6c 6c 69 70 73 65 28 64  ./ MakeEllipse(d
4dbf0 6f 75 62 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65  ouble cx, double
4dc00 20 63 79 2c 20 64 6f 75 62 6c 65 20 78 5f 61 78   cy, double x_ax
4dc10 69 73 2c 20 64 6f 75 62 6c 65 20 79 5f 61 78 69  is, double y_axi
4dc20 73 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s,./            
4dc30 69 6e 74 20 73 72 69 64 29 0a 2f 20 20 20 20 20  int srid)./     
4dc40 6f 72 0a 2f 20 4d 61 6b 65 45 6c 6c 69 70 73 65  or./ MakeEllipse
4dc50 28 64 6f 75 62 6c 65 20 63 78 2c 20 64 6f 75 62  (double cx, doub
4dc60 6c 65 20 63 79 2c 20 64 6f 75 62 6c 65 20 78 5f  le cy, double x_
4dc70 61 78 69 73 2c 20 64 6f 75 62 6c 65 20 79 5f 61  axis, double y_a
4dc80 78 69 73 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  xis,./          
4dc90 20 20 20 69 6e 74 20 73 72 69 64 2c 20 64 6f 75     int srid, dou
4dca0 62 6c 65 20 73 74 65 70 29 0a 2f 0a 2f 20 2d 20  ble step)././ - 
4dcb0 62 75 69 6c 64 73 20 61 20 4c 69 6e 65 73 74 72  builds a Linestr
4dcc0 69 6e 67 20 61 70 70 72 6f 78 69 6d 61 74 69 6e  ing approximatin
4dcd0 67 20 61 6e 20 45 6c 6c 69 70 73 65 0a 2f 20 2d  g an Ellipse./ -
4dce0 20 73 74 65 70 20 69 73 20 74 68 65 20 61 6e 67   step is the ang
4dcf0 75 6c 61 72 20 64 69 73 74 61 6e 63 65 20 28 69  ular distance (i
4dd00 6e 20 64 65 67 72 65 65 73 29 20 62 65 74 77 65  n degrees) betwe
4dd10 65 6e 20 70 6f 69 6e 74 73 20 6f 6e 20 0a 2f 20  en points on ./ 
4dd20 20 20 74 68 65 20 65 6c 6c 69 70 73 65 20 28 62    the ellipse (b
4dd30 79 20 64 65 66 61 75 6c 74 3a 20 65 76 65 72 79  y default: every
4dd40 20 31 30 20 64 65 67 73 29 20 0a 2f 20 2d 20 6f   10 degs) ./ - o
4dd50 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
4dd60 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
4dd70 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  ed.*/.    int le
4dd80 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
4dd90 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
4dda0 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
4ddb0 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 20  eomCollPtr geom 
4ddc0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
4ddd0 69 76 61 6c 3b 0a 20 20 20 20 64 6f 75 62 6c 65  ival;.    double
4dde0 20 63 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20   cx;.    double 
4ddf0 63 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  cy;.    double x
4de00 5f 61 78 69 73 3b 0a 20 20 20 20 64 6f 75 62 6c  _axis;.    doubl
4de10 65 20 79 5f 61 78 69 73 3b 0a 20 20 20 20 69 6e  e y_axis;.    in
4de20 74 20 73 72 69 64 20 3d 20 30 3b 0a 20 20 20 20  t srid = 0;.    
4de30 64 6f 75 62 6c 65 20 73 74 65 70 20 3d 20 31 30  double step = 10
4de40 2e 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  .0;.    int gpkg
4de50 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
4de60 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
4de70 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
4de80 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
4de90 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
4dea0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
4deb0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
4dec0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
4ded0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
4dee0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
4def0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
4df00 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20   {..  gpkg_mode 
4df10 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
4df20 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
4df30 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
4df40 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
4df50 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
4df60 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
4df70 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
4df80 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
4df90 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73     {..  ival = s
4dfa0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4dfb0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 63   (argv[0]);..  c
4dfc0 78 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20 20 20  x = ival;.      
4dfd0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  }.    else if (s
4dfe0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4dff0 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
4e000 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 63 78  QLITE_FLOAT)..cx
4e010 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4e020 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d  _double (argv[0]
4e030 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
4e040 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
4e050 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
4e060 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
4e070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
4e080 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
4e090 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
4e0a0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
4e0b0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c  .      {..  ival
4e0c0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4e0d0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
4e0e0 09 20 20 63 79 20 3d 20 69 76 61 6c 3b 0a 20 20  .  cy = ival;.  
4e0f0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
4e100 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4e110 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
4e120 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
4e130 0a 09 63 79 20 3d 20 73 71 6c 69 74 65 33 5f 76  ..cy = sqlite3_v
4e140 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
4e150 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a  v[1]);.    else.
4e160 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
4e170 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
4e180 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
4e190 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
4e1a0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
4e1b0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
4e1c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
4e1d0 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
4e1e0 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  ival = sqlite3_v
4e1f0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32  alue_int (argv[2
4e200 5d 29 3b 0a 09 20 20 78 5f 61 78 69 73 20 3d 20  ]);..  x_axis = 
4e210 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ival;.      }.  
4e220 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
4e230 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
4e240 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
4e250 45 5f 46 4c 4f 41 54 29 0a 09 78 5f 61 78 69 73  E_FLOAT)..x_axis
4e260 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4e270 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d  _double (argv[2]
4e280 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
4e290 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
4e2a0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
4e2b0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
4e2c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
4e2d0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
4e2e0 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d  ype (argv[3]) ==
4e2f0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
4e300 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c  .      {..  ival
4e310 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4e320 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a  _int (argv[3]);.
4e330 09 20 20 79 5f 61 78 69 73 20 3d 20 69 76 61 6c  .  y_axis = ival
4e340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
4e350 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
4e360 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
4e370 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  3]) == SQLITE_FL
4e380 4f 41 54 29 0a 09 79 5f 61 78 69 73 20 3d 20 73  OAT)..y_axis = s
4e390 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
4e3a0 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20  ble (argv[3]);. 
4e3b0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
4e3c0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4e3d0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
4e3e0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
4e3f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
4e400 63 20 3e 3d 20 35 29 0a 20 20 20 20 20 20 7b 0a  c >= 5).      {.
4e410 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
4e420 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
4e430 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  4]) == SQLITE_IN
4e440 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 73 72  TEGER)..      sr
4e450 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
4e460 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 34 5d 29  ue_int (argv[4])
4e470 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
4e480 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
4e490 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
4e4a0 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
4e4b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69   }.      }.    i
4e4c0 66 20 28 61 72 67 63 20 3d 3d 20 36 29 0a 20 20  f (argc == 6).  
4e4d0 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
4e4e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
4e4f0 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c  (argv[5]) == SQL
4e500 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
4e510 20 20 7b 0a 09 09 69 76 61 6c 20 3d 20 73 71 6c    {...ival = sql
4e520 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
4e530 61 72 67 76 5b 35 5d 29 3b 0a 09 09 73 74 65 70  argv[5]);...step
4e540 20 3d 20 69 76 61 6c 3b 0a 09 20 20 20 20 7d 0a   = ival;..    }.
4e550 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69  .  else if (sqli
4e560 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
4e570 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49  argv[5]) == SQLI
4e580 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20  TE_FLOAT)..     
4e590 20 73 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f   step = sqlite3_
4e5a0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
4e5b0 67 76 5b 35 5d 29 3b 0a 09 20 20 65 6c 73 65 0a  gv[5]);..  else.
4e5c0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
4e5d0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
4e5e0 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
4e5f0 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
4e600 0a 20 20 20 20 67 65 6f 6d 20 3d 20 67 61 69 61  .    geom = gaia
4e610 4d 61 6b 65 45 6c 6c 69 70 73 65 20 28 63 78 2c  MakeEllipse (cx,
4e620 20 63 79 2c 20 78 5f 61 78 69 73 2c 20 79 5f 61   cy, x_axis, y_a
4e630 78 69 73 2c 20 73 74 65 70 29 3b 0a 20 20 20 20  xis, step);.    
4e640 69 66 20 28 21 67 65 6f 6d 29 0a 09 73 71 6c 69  if (!geom)..sqli
4e650 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
4e660 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
4e670 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  lse.      {..  i
4e680 66 20 28 73 72 69 64 20 21 3d 20 30 29 0a 09 20  f (srid != 0).. 
4e690 20 20 20 20 20 67 65 6f 6d 2d 3e 53 72 69 64 20       geom->Srid 
4e6a0 3d 20 73 72 69 64 3b 0a 09 20 20 67 61 69 61 54  = srid;..  gaiaT
4e6b0 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
4e6c0 6b 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 70 5f  kbEx2 (geom, &p_
4e6d0 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70  result, &len, gp
4e6e0 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
4e6f0 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a     tiny_point);.
4e700 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4e710 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
4e720 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
4e730 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  free);.      }. 
4e740 20 20 20 69 66 20 28 67 65 6f 6d 29 0a 09 67 61     if (geom)..ga
4e750 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
4e760 67 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  geom);.}..static
4e770 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 45   void.fnct_MakeE
4e780 6c 6c 69 70 74 69 63 41 72 63 20 28 73 71 6c 69  llipticArc (sqli
4e790 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
4e7a0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
4e7b0 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
4e7c0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
4e7d0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
4e7e0 6e 3a 0a 2f 20 4d 61 6b 65 45 6c 6c 69 70 74 69  n:./ MakeEllipti
4e7f0 63 41 72 63 28 64 6f 75 62 6c 65 20 63 78 2c 20  cArc(double cx, 
4e800 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f 75 62 6c  double cy, doubl
4e810 65 20 78 5f 61 78 69 73 2c 20 64 6f 75 62 6c 65  e x_axis, double
4e820 20 79 5f 61 78 69 73 2c 20 0a 2f 20 20 20 20 20   y_axis, ./     
4e830 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
4e840 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c 65  le start, double
4e850 20 73 74 6f 70 29 0a 2f 20 20 20 20 20 6f 72 0a   stop)./     or.
4e860 2f 20 4d 61 6b 65 45 6c 6c 69 70 74 69 63 41 72  / MakeEllipticAr
4e870 63 28 64 6f 75 62 6c 65 20 63 78 2c 20 64 6f 75  c(double cx, dou
4e880 62 6c 65 20 63 79 2c 20 64 6f 75 62 6c 65 20 78  ble cy, double x
4e890 5f 61 78 69 73 2c 20 64 6f 75 62 6c 65 20 79 5f  _axis, double y_
4e8a0 61 78 69 73 2c 0a 2f 20 20 20 20 20 20 20 20 20  axis,./         
4e8b0 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 73          double s
4e8c0 74 61 72 74 2c 20 64 6f 75 62 6c 65 20 73 74 6f  tart, double sto
4e8d0 70 2c 20 69 6e 74 20 73 72 69 64 29 0a 2f 20 20  p, int srid)./  
4e8e0 20 20 20 6f 72 0a 2f 20 4d 61 6b 65 45 6c 6c 69     or./ MakeElli
4e8f0 70 74 69 63 41 72 63 28 64 6f 75 62 6c 65 20 63  pticArc(double c
4e900 78 2c 20 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f  x, double cy, do
4e910 75 62 6c 65 20 78 5f 61 78 69 73 2c 20 64 6f 75  uble x_axis, dou
4e920 62 6c 65 20 79 5f 61 78 69 73 2c 0a 2f 20 20 20  ble y_axis,./   
4e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
4e940 75 62 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62  uble start, doub
4e950 6c 65 20 73 74 6f 70 2c 20 69 6e 74 20 73 72 69  le stop, int sri
4e960 64 2c 20 64 6f 75 62 6c 65 20 73 74 65 70 29 0a  d, double step).
4e970 2f 0a 2f 20 2d 20 62 75 69 6c 64 73 20 61 20 4c  /./ - builds a L
4e980 69 6e 65 73 74 72 69 6e 67 20 61 70 70 72 6f 78  inestring approx
4e990 69 6d 61 74 69 6e 67 20 61 6e 20 45 6c 6c 69 70  imating an Ellip
4e9a0 74 69 63 20 41 72 63 0a 2f 20 2d 20 73 74 61 72  tic Arc./ - star
4e9b0 74 20 61 6e 64 20 73 74 6f 70 20 61 72 65 20 74  t and stop are t
4e9c0 68 65 20 69 6e 69 74 69 61 6c 20 61 6e 64 20 66  he initial and f
4e9d0 69 6e 61 6c 20 61 6e 67 6c 65 73 20 28 69 6e 20  inal angles (in 
4e9e0 64 65 67 72 65 65 73 29 0a 2f 20 2d 20 73 74 65  degrees)./ - ste
4e9f0 70 20 69 73 20 74 68 65 20 61 6e 67 75 6c 61 72  p is the angular
4ea00 20 64 69 73 74 61 6e 63 65 20 28 69 6e 20 64 65   distance (in de
4ea10 67 72 65 65 73 29 20 62 65 74 77 65 65 6e 20 70  grees) between p
4ea20 6f 69 6e 74 73 20 6f 6e 20 0a 2f 20 20 20 74 68  oints on ./   th
4ea30 65 20 65 6c 6c 69 70 73 65 20 28 62 79 20 64 65  e ellipse (by de
4ea40 66 61 75 6c 74 3a 20 65 76 65 72 79 20 31 30 20  fault: every 10 
4ea50 64 65 67 73 29 20 0a 2f 20 2d 20 6f 72 20 4e 55  degs) ./ - or NU
4ea60 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
4ea70 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
4ea80 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  /.    int len;. 
4ea90 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4eaa0 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
4eab0 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
4eac0 6f 6c 6c 50 74 72 20 67 65 6f 6d 20 3d 20 4e 55  ollPtr geom = NU
4ead0 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 69 76 61 6c  LL;.    int ival
4eae0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 78 3b  ;.    double cx;
4eaf0 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 79 3b 0a  .    double cy;.
4eb00 20 20 20 20 64 6f 75 62 6c 65 20 78 5f 61 78 69      double x_axi
4eb10 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 5f  s;.    double y_
4eb20 61 78 69 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65  axis;.    double
4eb30 20 73 74 61 72 74 3b 0a 20 20 20 20 64 6f 75 62   start;.    doub
4eb40 6c 65 20 73 74 6f 70 3b 0a 20 20 20 20 69 6e 74  le stop;.    int
4eb50 20 73 72 69 64 20 3d 20 30 3b 0a 20 20 20 20 64   srid = 0;.    d
4eb60 6f 75 62 6c 65 20 73 74 65 70 20 3d 20 31 30 2e  ouble step = 10.
4eb70 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
4eb80 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mode = 0;.    in
4eb90 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
4eba0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
4ebb0 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
4ebc0 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
4ebd0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
4ebe0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
4ebf0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
4ec00 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
4ec10 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
4ec20 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
4ec30 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  {..  gpkg_mode =
4ec40 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
4ec50 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
4ec60 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
4ec70 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
4ec80 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
4ec90 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
4eca0 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49  argv[0]) == SQLI
4ecb0 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
4ecc0 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71    {..  ival = sq
4ecd0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
4ece0 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 63 78  (argv[0]);..  cx
4ecf0 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d   = ival;.      }
4ed00 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
4ed10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4ed20 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
4ed30 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 63 78 20  LITE_FLOAT)..cx 
4ed40 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4ed50 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29  double (argv[0])
4ed60 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
4ed70 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
4ed80 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
4ed90 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
4eda0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
4edb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
4edc0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
4edd0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
4ede0 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20        {..  ival 
4edf0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4ee00 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  int (argv[1]);..
4ee10 20 20 63 79 20 3d 20 69 76 61 6c 3b 0a 20 20 20    cy = ival;.   
4ee20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
4ee30 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
4ee40 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
4ee50 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
4ee60 09 63 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  .cy = sqlite3_va
4ee70 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
4ee80 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  [1]);.    else. 
4ee90 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
4eea0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
4eeb0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
4eec0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
4eed0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
4eee0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
4eef0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
4ef00 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
4ef10 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
4ef20 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
4ef30 29 3b 0a 09 20 20 78 5f 61 78 69 73 20 3d 20 69  );..  x_axis = i
4ef40 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  val;.      }.   
4ef50 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
4ef60 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
4ef70 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
4ef80 5f 46 4c 4f 41 54 29 0a 09 78 5f 61 78 69 73 20  _FLOAT)..x_axis 
4ef90 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4efa0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29  double (argv[2])
4efb0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
4efc0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
4efd0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
4efe0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
4eff0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
4f000 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
4f010 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
4f020 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
4f030 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20        {..  ival 
4f040 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4f050 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09  int (argv[3]);..
4f060 20 20 79 5f 61 78 69 73 20 3d 20 69 76 61 6c 3b    y_axis = ival;
4f070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
4f080 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
4f090 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33  lue_type (argv[3
4f0a0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
4f0b0 41 54 29 0a 09 79 5f 61 78 69 73 20 3d 20 73 71  AT)..y_axis = sq
4f0c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
4f0d0 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20  le (argv[3]);.  
4f0e0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
4f0f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4f100 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
4f110 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
4f120 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
4f130 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
4f140 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
4f150 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
4f160 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71    {..  ival = sq
4f170 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
4f180 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20 20 73 74  (argv[4]);..  st
4f190 61 72 74 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20  art = ival;.    
4f1a0 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
4f1b0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
4f1c0 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d 3d  ype (argv[4]) ==
4f1d0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
4f1e0 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  start = sqlite3_
4f1f0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
4f200 67 76 5b 34 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[4]);.    else
4f210 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
4f220 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
4f230 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
4f240 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
4f250 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
4f260 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
4f270 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
4f280 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
4f290 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   ival = sqlite3_
4f2a0 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
4f2b0 35 5d 29 3b 0a 09 20 20 73 74 6f 70 20 3d 20 69  5]);..  stop = i
4f2c0 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  val;.      }.   
4f2d0 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
4f2e0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
4f2f0 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[5]) == SQLITE
4f300 5f 46 4c 4f 41 54 29 0a 09 73 74 6f 70 20 3d 20  _FLOAT)..stop = 
4f310 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
4f320 75 62 6c 65 20 28 61 72 67 76 5b 35 5d 29 3b 0a  uble (argv[5]);.
4f330 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
4f340 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
4f350 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
4f360 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
4f370 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
4f380 67 63 20 3e 3d 20 37 29 0a 20 20 20 20 20 20 7b  gc >= 7).      {
4f390 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
4f3a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
4f3b0 5b 36 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [6]) == SQLITE_I
4f3c0 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 73  NTEGER)..      s
4f3d0 72 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rid = sqlite3_va
4f3e0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 36 5d  lue_int (argv[6]
4f3f0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
4f400 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
4f410 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
4f420 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
4f430 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4f440 69 66 20 28 61 72 67 63 20 3d 3d 20 38 29 0a 20  if (argc == 8). 
4f450 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
4f460 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4f470 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51   (argv[7]) == SQ
4f480 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
4f490 20 20 20 7b 0a 09 09 69 76 61 6c 20 3d 20 73 71     {...ival = sq
4f4a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
4f4b0 28 61 72 67 76 5b 37 5d 29 3b 0a 09 09 73 74 65  (argv[7]);...ste
4f4c0 70 20 3d 20 69 76 61 6c 3b 0a 09 20 20 20 20 7d  p = ival;..    }
4f4d0 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c  ..  else if (sql
4f4e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
4f4f0 28 61 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51 4c  (argv[7]) == SQL
4f500 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20  ITE_FLOAT)..    
4f510 20 20 73 74 65 70 20 3d 20 73 71 6c 69 74 65 33    step = sqlite3
4f520 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
4f530 72 67 76 5b 37 5d 29 3b 0a 09 20 20 65 6c 73 65  rgv[7]);..  else
4f540 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
4f550 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
4f560 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
4f570 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
4f580 7d 0a 0a 20 20 20 20 67 65 6f 6d 20 3d 20 67 61  }..    geom = ga
4f590 69 61 4d 61 6b 65 45 6c 6c 69 70 74 69 63 41 72  iaMakeEllipticAr
4f5a0 63 20 28 63 78 2c 20 63 79 2c 20 78 5f 61 78 69  c (cx, cy, x_axi
4f5b0 73 2c 20 79 5f 61 78 69 73 2c 20 73 74 61 72 74  s, y_axis, start
4f5c0 2c 20 73 74 6f 70 2c 20 73 74 65 70 29 3b 0a 20  , stop, step);. 
4f5d0 20 20 20 69 66 20 28 21 67 65 6f 6d 29 0a 09 73     if (!geom)..s
4f5e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
4f5f0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
4f600 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
4f610 20 20 69 66 20 28 73 72 69 64 20 21 3d 20 30 29    if (srid != 0)
4f620 0a 09 20 20 20 20 20 20 67 65 6f 6d 2d 3e 53 72  ..      geom->Sr
4f630 69 64 20 3d 20 73 72 69 64 3b 0a 09 20 20 67 61  id = srid;..  ga
4f640 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
4f650 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 2c 20  obWkbEx2 (geom, 
4f660 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
4f670 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
4f680 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74        tiny_point
4f690 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
4f6a0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
4f6b0 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
4f6c0 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20  n, free);.      
4f6d0 7d 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 29 0a  }.    if (geom).
4f6e0 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c  .gaiaFreeGeomCol
4f6f0 6c 20 28 67 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61  l (geom);.}..sta
4f700 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61  tic void.fnct_Ma
4f710 6b 65 43 69 72 63 75 6c 61 72 53 65 63 74 6f 72  keCircularSector
4f720 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
4f730 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
4f740 20 61 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74   argc,.... sqlit
4f750 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
4f760 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
4f770 69 6f 6e 3a 0a 2f 20 4d 61 6b 65 43 69 72 63 75  ion:./ MakeCircu
4f780 6c 61 72 53 65 63 74 6f 72 28 64 6f 75 62 6c 65  larSector(double
4f790 20 63 78 2c 20 64 6f 75 62 6c 65 20 63 79 2c 20   cx, double cy, 
4f7a0 64 6f 75 62 6c 65 20 72 61 64 69 75 73 2c 20 64  double radius, d
4f7b0 6f 75 62 6c 65 20 73 74 61 72 74 2c 20 64 6f 75  ouble start, dou
4f7c0 62 6c 65 20 73 74 6f 70 29 0a 2f 20 20 20 20 20  ble stop)./     
4f7d0 6f 72 0a 2f 20 4d 61 6b 65 43 69 72 63 75 6c 61  or./ MakeCircula
4f7e0 72 53 65 63 74 6f 72 28 64 6f 75 62 6c 65 20 63  rSector(double c
4f7f0 78 2c 20 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f  x, double cy, do
4f800 75 62 6c 65 20 72 61 64 69 75 73 2c 20 64 6f 75  uble radius, dou
4f810 62 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c  ble start, doubl
4f820 65 20 73 74 6f 70 2c 20 0a 2f 20 20 20 20 20 20  e stop, ./      
4f830 20 20 20 69 6e 74 20 73 72 69 64 29 0a 2f 20 20     int srid)./  
4f840 20 20 20 6f 72 0a 2f 20 4d 61 6b 65 43 69 72 63     or./ MakeCirc
4f850 75 6c 61 72 53 65 63 74 6f 72 28 64 6f 75 62 6c  ularSector(doubl
4f860 65 20 63 78 2c 20 64 6f 75 62 6c 65 20 63 79 2c  e cx, double cy,
4f870 20 64 6f 75 62 6c 65 20 72 61 64 69 75 73 2c 20   double radius, 
4f880 64 6f 75 62 6c 65 20 73 74 61 72 74 2c 20 64 6f  double start, do
4f890 75 62 6c 65 20 73 74 6f 70 2c 20 0a 2f 20 20 20  uble stop, ./   
4f8a0 20 20 20 20 20 20 69 6e 74 20 73 72 69 64 2c 20        int srid, 
4f8b0 64 6f 75 62 6c 65 20 73 74 65 70 29 0a 2f 0a 2f  double step)././
4f8c0 20 2d 20 62 75 69 6c 64 73 20 61 20 50 6f 6c 79   - builds a Poly
4f8d0 67 6f 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6e  gon approximatin
4f8e0 67 20 61 20 43 69 72 63 75 6c 61 72 20 53 65 63  g a Circular Sec
4f8f0 74 6f 72 0a 2f 20 2d 20 73 74 61 72 74 20 61 6e  tor./ - start an
4f900 64 20 73 74 6f 70 20 61 72 65 20 74 68 65 20 69  d stop are the i
4f910 6e 69 74 69 61 6c 20 61 6e 64 20 66 69 6e 61 6c  nitial and final
4f920 20 61 6e 67 6c 65 73 20 28 69 6e 20 64 65 67 72   angles (in degr
4f930 65 65 73 29 0a 2f 20 2d 20 73 74 65 70 20 69 73  ees)./ - step is
4f940 20 74 68 65 20 61 6e 67 75 6c 61 72 20 64 69 73   the angular dis
4f950 74 61 6e 63 65 20 28 69 6e 20 64 65 67 72 65 65  tance (in degree
4f960 73 29 20 62 65 74 77 65 65 6e 20 70 6f 69 6e 74  s) between point
4f970 73 20 6f 6e 20 0a 2f 20 20 20 74 68 65 20 63 69  s on ./   the ci
4f980 72 63 75 72 6d 66 65 72 65 6e 63 65 20 28 62 79  rcurmference (by
4f990 20 64 65 66 61 75 6c 74 3a 20 65 76 65 72 79 20   default: every 
4f9a0 31 30 20 64 65 67 73 29 20 0a 2f 20 2d 20 6f 72  10 degs) ./ - or
4f9b0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
4f9c0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
4f9d0 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  d.*/.    int len
4f9e0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
4f9f0 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
4fa00 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
4fa10 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 20 3d  omCollPtr geom =
4fa20 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
4fa30 65 6f 6d 43 6f 6c 6c 50 74 72 20 73 65 63 74 6f  eomCollPtr secto
4fa40 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  r = NULL;.    in
4fa50 74 20 69 76 61 6c 3b 0a 20 20 20 20 64 6f 75 62  t ival;.    doub
4fa60 6c 65 20 63 78 3b 0a 20 20 20 20 64 6f 75 62 6c  le cx;.    doubl
4fa70 65 20 63 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  e cy;.    double
4fa80 20 72 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   r;.    double s
4fa90 74 61 72 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65  tart;.    double
4faa0 20 73 74 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73   stop;.    int s
4fab0 72 69 64 20 3d 20 30 3b 0a 20 20 20 20 64 6f 75  rid = 0;.    dou
4fac0 62 6c 65 20 73 74 65 70 20 3d 20 31 30 2e 30 3b  ble step = 10.0;
4fad0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
4fae0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
4faf0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
4fb00 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
4fb10 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
4fb20 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
4fb30 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
4fb40 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
4fb50 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
4fb60 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
4fb70 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
4fb80 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
4fb90 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
4fba0 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
4fbb0 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
4fbc0 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
4fbd0 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
4fbe0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
4fbf0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
4fc00 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
4fc10 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
4fc20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71 6c 69  {..  ival = sqli
4fc30 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
4fc40 72 67 76 5b 30 5d 29 3b 0a 09 20 20 63 78 20 3d  rgv[0]);..  cx =
4fc50 20 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   ival;.      }. 
4fc60 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
4fc70 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
4fc80 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49  argv[0]) == SQLI
4fc90 54 45 5f 46 4c 4f 41 54 29 0a 09 63 78 20 3d 20  TE_FLOAT)..cx = 
4fca0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
4fcb0 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a  uble (argv[0]);.
4fcc0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
4fcd0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
4fce0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
4fcf0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
4fd00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
4fd10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4fd20 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
4fd30 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
4fd40 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20      {..  ival = 
4fd50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4fd60 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
4fd70 63 79 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20 20  cy = ival;.     
4fd80 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28   }.    else if (
4fd90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
4fda0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
4fdb0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 63  SQLITE_FLOAT)..c
4fdc0 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  y = sqlite3_valu
4fdd0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31  e_double (argv[1
4fde0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  ]);.    else.   
4fdf0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
4fe00 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
4fe10 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
4fe20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
4fe30 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
4fe40 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
4fe50 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
4fe60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61  ).      {..  iva
4fe70 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
4fe80 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b  e_int (argv[2]);
4fe90 0a 09 20 20 72 20 3d 20 69 76 61 6c 3b 0a 20 20  ..  r = ival;.  
4fea0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
4feb0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
4fec0 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
4fed0 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
4fee0 0a 09 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ..r = sqlite3_va
4fef0 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
4ff00 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  [2]);.    else. 
4ff10 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
4ff20 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
4ff30 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
4ff40 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
4ff50 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
4ff60 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29  e_type (argv[3])
4ff70 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
4ff80 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
4ff90 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
4ffa0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d  lue_int (argv[3]
4ffb0 29 3b 0a 09 20 20 73 74 61 72 74 20 3d 20 69 76  );..  start = iv
4ffc0 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
4ffd0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
4ffe0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
4fff0 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[3]) == SQLITE_
50000 46 4c 4f 41 54 29 0a 09 73 74 61 72 74 20 3d 20  FLOAT)..start = 
50010 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
50020 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a  uble (argv[3]);.
50030 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
50040 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
50050 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
50060 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
50070 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
50080 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
50090 20 28 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51   (argv[4]) == SQ
500a0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
500b0 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20      {..  ival = 
500c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
500d0 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20 20  t (argv[4]);..  
500e0 73 74 6f 70 20 3d 20 69 76 61 6c 3b 0a 20 20 20  stop = ival;.   
500f0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
50100 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
50110 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d  type (argv[4]) =
50120 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
50130 09 73 74 6f 70 20 3d 20 73 71 6c 69 74 65 33 5f  .stop = sqlite3_
50140 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
50150 67 76 5b 34 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[4]);.    else
50160 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
50170 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
50180 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
50190 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
501a0 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 36 29    if (argc >= 6)
501b0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
501c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
501d0 70 65 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20  pe (argv[5]) == 
501e0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
501f0 09 20 20 20 20 20 20 73 72 69 64 20 3d 20 73 71  .      srid = sq
50200 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
50210 28 61 72 67 76 5b 35 5d 29 3b 0a 09 20 20 65 6c  (argv[5]);..  el
50220 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  se..    {...sqli
50230 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
50240 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
50250 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  urn;..    }.    
50260 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
50270 20 3d 3d 20 37 29 0a 20 20 20 20 20 20 7b 0a 09   == 7).      {..
50280 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
50290 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36  lue_type (argv[6
502a0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
502b0 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69  EGER)..    {...i
502c0 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
502d0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 36 5d  lue_int (argv[6]
502e0 29 3b 0a 09 09 73 74 65 70 20 3d 20 69 76 61 6c  );...step = ival
502f0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
50300 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
50310 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d  ue_type (argv[6]
50320 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
50330 54 29 0a 09 20 20 20 20 20 20 73 74 65 70 20 3d  T)..      step =
50340 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
50350 6f 75 62 6c 65 20 28 61 72 67 76 5b 36 5d 29 3b  ouble (argv[6]);
50360 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
50370 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
50380 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
50390 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
503a0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 67  }.      }..    g
503b0 65 6f 6d 20 3d 20 67 61 69 61 4d 61 6b 65 41 72  eom = gaiaMakeAr
503c0 63 20 28 63 78 2c 20 63 79 2c 20 72 2c 20 73 74  c (cx, cy, r, st
503d0 61 72 74 2c 20 73 74 6f 70 2c 20 73 74 65 70 29  art, stop, step)
503e0 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 6d 29  ;.    if (!geom)
503f0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
50400 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
50410 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
50420 7b 0a 09 20 20 69 6e 74 20 69 69 3b 0a 09 20 20  {..  int ii;..  
50430 69 6e 74 20 69 6f 20 3d 20 30 3b 0a 09 20 20 64  int io = 0;..  d
50440 6f 75 62 6c 65 20 78 3b 0a 09 20 20 64 6f 75 62  ouble x;..  doub
50450 6c 65 20 79 3b 0a 09 20 20 67 61 69 61 4c 69 6e  le y;..  gaiaLin
50460 65 73 74 72 69 6e 67 50 74 72 20 69 6e 20 3d 20  estringPtr in = 
50470 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73  geom->FirstLines
50480 74 72 69 6e 67 3b 0a 09 20 20 67 61 69 61 50 6f  tring;..  gaiaPo
50490 6c 79 67 6f 6e 50 74 72 20 70 67 3b 0a 09 20 20  lygonPtr pg;..  
504a0 67 61 69 61 52 69 6e 67 50 74 72 20 6f 75 74 3b  gaiaRingPtr out;
504b0 0a 09 20 20 73 65 63 74 6f 72 20 3d 20 67 61 69  ..  sector = gai
504c0 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28  aAllocGeomColl (
504d0 29 3b 0a 09 20 20 70 67 20 3d 20 67 61 69 61 41  );..  pg = gaiaA
504e0 64 64 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43  ddPolygonToGeomC
504f0 6f 6c 6c 20 28 73 65 63 74 6f 72 2c 20 69 6e 2d  oll (sector, in-
50500 3e 50 6f 69 6e 74 73 20 2b 20 32 2c 20 30 29 3b  >Points + 2, 0);
50510 0a 09 20 20 6f 75 74 20 3d 20 70 67 2d 3e 45 78  ..  out = pg->Ex
50520 74 65 72 69 6f 72 3b 0a 09 20 20 2f 2a 20 69 6e  terior;..  /* in
50530 73 65 72 74 69 6e 67 20 74 68 65 20 43 65 6e 74  serting the Cent
50540 72 65 20 2d 20 66 69 72 73 74 20 70 6f 69 6e 74  re - first point
50550 20 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f   */..  gaiaSetPo
50560 69 6e 74 20 28 6f 75 74 2d 3e 43 6f 6f 72 64 73  int (out->Coords
50570 2c 20 69 6f 2c 20 63 78 2c 20 63 79 29 3b 0a 09  , io, cx, cy);..
50580 20 20 69 6f 2b 2b 3b 0a 09 20 20 66 6f 72 20 28    io++;..  for (
50590 69 69 20 3d 20 30 3b 20 69 69 20 3c 20 69 6e 2d  ii = 0; ii < in-
505a0 3e 50 6f 69 6e 74 73 3b 20 69 69 2b 2b 29 0a 09  >Points; ii++)..
505b0 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 70 79 69      {.../* copyi
505c0 6e 67 20 74 68 65 20 41 72 63 27 73 20 70 6f 69  ng the Arc's poi
505d0 6e 74 73 20 2a 2f 0a 09 09 67 61 69 61 47 65 74  nts */...gaiaGet
505e0 50 6f 69 6e 74 20 28 69 6e 2d 3e 43 6f 6f 72 64  Point (in->Coord
505f0 73 2c 20 69 69 2c 20 26 78 2c 20 26 79 29 3b 0a  s, ii, &x, &y);.
50600 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28  ..gaiaSetPoint (
50610 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c 20 69 6f 2c  out->Coords, io,
50620 20 78 2c 20 79 29 3b 0a 09 09 69 6f 2b 2b 3b 0a   x, y);...io++;.
50630 09 20 20 20 20 7d 0a 09 20 20 2f 2a 20 69 6e 73  .    }..  /* ins
50640 65 72 74 69 6e 67 20 74 68 65 20 43 65 6e 74 72  erting the Centr
50650 65 20 2d 20 6c 61 73 74 20 70 6f 69 6e 74 20 2a  e - last point *
50660 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69 6e  /..  gaiaSetPoin
50670 74 20 28 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c 20  t (out->Coords, 
50680 69 6f 2c 20 63 78 2c 20 63 79 29 3b 0a 09 20 20  io, cx, cy);..  
50690 69 66 20 28 73 72 69 64 20 21 3d 20 30 29 0a 09  if (srid != 0)..
506a0 20 20 20 20 20 20 73 65 63 74 6f 72 2d 3e 53 72        sector->Sr
506b0 69 64 20 3d 20 73 72 69 64 3b 0a 09 20 20 67 61  id = srid;..  ga
506c0 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
506d0 6f 62 57 6b 62 45 78 32 20 28 73 65 63 74 6f 72  obWkbEx2 (sector
506e0 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
506f0 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  n, gpkg_mode,...
50700 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69  ..      tiny_poi
50710 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  nt);..  sqlite3_
50720 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
50730 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
50740 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20  len, free);.    
50750 20 20 7d 0a 20 20 20 20 69 66 20 28 67 65 6f 6d    }.    if (geom
50760 29 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43  )..gaiaFreeGeomC
50770 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 20 20 20 20  oll (geom);.    
50780 69 66 20 28 73 65 63 74 6f 72 29 0a 09 67 61 69  if (sector)..gai
50790 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 73  aFreeGeomColl (s
507a0 65 63 74 6f 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  ector);.}..stati
507b0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65  c void.fnct_Make
507c0 43 69 72 63 75 6c 61 72 53 74 72 69 70 65 20 28  CircularStripe (
507d0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
507e0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
507f0 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65 33  rgc,.... sqlite3
50800 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
50810 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
50820 6e 3a 0a 2f 20 4d 61 6b 65 43 69 72 63 75 6c 61  n:./ MakeCircula
50830 72 53 74 72 69 70 65 28 64 6f 75 62 6c 65 20 63  rStripe(double c
50840 78 2c 20 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f  x, double cy, do
50850 75 62 6c 65 20 72 61 64 69 75 73 5f 31 2c 20 64  uble radius_1, d
50860 6f 75 62 6c 65 20 72 61 64 69 75 73 5f 32 2c 0a  ouble radius_2,.
50870 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
50880 20 20 20 20 20 64 6f 75 62 6c 65 20 73 74 61 72       double star
50890 74 2c 20 64 6f 75 62 6c 65 20 73 74 6f 70 29 0a  t, double stop).
508a0 2f 20 20 20 20 20 6f 72 0a 2f 20 4d 61 6b 65 43  /     or./ MakeC
508b0 69 72 63 75 6c 61 72 53 74 72 69 70 65 28 64 6f  ircularStripe(do
508c0 75 62 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65 20  uble cx, double 
508d0 63 79 2c 20 64 6f 75 62 6c 65 20 72 61 64 69 75  cy, double radiu
508e0 73 5f 31 2c 20 64 6f 75 62 6c 65 20 72 61 64 69  s_1, double radi
508f0 75 73 5f 32 2c 0a 2f 20 20 20 20 20 20 20 20 20  us_2,./         
50900 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
50910 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c 65 20  e start, double 
50920 73 74 6f 70 2c 20 69 6e 74 20 73 72 69 64 29 0a  stop, int srid).
50930 2f 20 20 20 20 20 6f 72 0a 2f 20 4d 61 6b 65 43  /     or./ MakeC
50940 69 72 63 75 6c 61 72 53 74 72 69 70 65 28 64 6f  ircularStripe(do
50950 75 62 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65 20  uble cx, double 
50960 63 79 2c 20 64 6f 75 62 6c 65 20 72 61 64 69 75  cy, double radiu
50970 73 5f 31 2c 20 64 6f 75 62 6c 65 20 72 61 64 69  s_1, double radi
50980 75 73 5f 32 2c 20 0a 2f 20 20 20 20 20 20 20 20  us_2, ./        
50990 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
509a0 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c 65  le start, double
509b0 20 73 74 6f 70 2c 20 69 6e 74 20 73 72 69 64 2c   stop, int srid,
509c0 20 64 6f 75 62 6c 65 20 73 74 65 70 29 0a 2f 0a   double step)./.
509d0 2f 20 2d 20 62 75 69 6c 64 73 20 61 20 50 6f 6c  / - builds a Pol
509e0 79 67 6f 6e 20 61 70 70 72 6f 78 69 6d 61 74 69  ygon approximati
509f0 6e 67 20 61 20 43 69 72 63 75 6c 61 72 20 53 74  ng a Circular St
50a00 72 69 70 65 20 64 65 6c 69 6d 69 74 65 64 20 62  ripe delimited b
50a10 79 20 74 77 6f 0a 2f 20 20 20 61 72 63 73 20 73  y two./   arcs s
50a20 68 61 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  haring the same 
50a30 43 65 6e 74 72 65 2d 50 6f 69 6e 74 20 62 75 74  Centre-Point but
50a40 20 68 61 76 69 6e 67 20 64 69 66 66 65 72 65 6e   having differen
50a50 74 20 72 61 64 69 69 0a 2f 20 2d 20 73 74 61 72  t radii./ - star
50a60 74 20 61 6e 64 20 73 74 6f 70 20 61 72 65 20 74  t and stop are t
50a70 68 65 20 69 6e 69 74 69 61 6c 20 61 6e 64 20 66  he initial and f
50a80 69 6e 61 6c 20 61 6e 67 6c 65 73 20 28 69 6e 20  inal angles (in 
50a90 64 65 67 72 65 65 73 29 0a 2f 20 2d 20 73 74 65  degrees)./ - ste
50aa0 70 20 69 73 20 74 68 65 20 61 6e 67 75 6c 61 72  p is the angular
50ab0 20 64 69 73 74 61 6e 63 65 20 28 69 6e 20 64 65   distance (in de
50ac0 67 72 65 65 73 29 20 62 65 74 77 65 65 6e 20 70  grees) between p
50ad0 6f 69 6e 74 73 20 6f 6e 20 0a 2f 20 20 20 74 68  oints on ./   th
50ae0 65 20 63 69 72 63 75 72 6d 66 65 72 65 6e 63 65  e circurmference
50af0 20 28 62 79 20 64 65 66 61 75 6c 74 3a 20 65 76   (by default: ev
50b00 65 72 79 20 31 30 20 64 65 67 73 29 20 0a 2f 20  ery 10 degs) ./ 
50b10 2d 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  - or NULL if any
50b20 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
50b30 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74  tered.*/.    int
50b40 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e   len;.    unsign
50b50 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
50b60 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
50b70 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 61 72  iaGeomCollPtr ar
50b80 63 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  c1 = NULL;.    g
50b90 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 61  aiaGeomCollPtr a
50ba0 72 63 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rc2 = NULL;.    
50bb0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
50bc0 73 74 72 69 70 65 20 3d 20 4e 55 4c 4c 3b 0a 20  stripe = NULL;. 
50bd0 20 20 20 69 6e 74 20 69 76 61 6c 3b 0a 20 20 20     int ival;.   
50be0 20 64 6f 75 62 6c 65 20 63 78 3b 0a 20 20 20 20   double cx;.    
50bf0 64 6f 75 62 6c 65 20 63 79 3b 0a 20 20 20 20 64  double cy;.    d
50c00 6f 75 62 6c 65 20 72 31 3b 0a 20 20 20 20 64 6f  ouble r1;.    do
50c10 75 62 6c 65 20 72 32 3b 0a 20 20 20 20 64 6f 75  uble r2;.    dou
50c20 62 6c 65 20 73 74 61 72 74 3b 0a 20 20 20 20 64  ble start;.    d
50c30 6f 75 62 6c 65 20 73 74 6f 70 3b 0a 20 20 20 20  ouble stop;.    
50c40 69 6e 74 20 73 72 69 64 20 3d 20 30 3b 0a 20 20  int srid = 0;.  
50c50 20 20 64 6f 75 62 6c 65 20 73 74 65 70 20 3d 20    double step = 
50c60 31 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 67 70  10.0;.    int gp
50c70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
50c80 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
50c90 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
50ca0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
50cb0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
50cc0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
50cd0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
50ce0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
50cf0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
50d00 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
50d10 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
50d20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64     {..  gpkg_mod
50d30 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
50d40 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
50d50 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
50d60 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
50d70 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
50d80 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
50d90 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
50da0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
50db0 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d       {..  ival =
50dc0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
50dd0 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  nt (argv[0]);.. 
50de0 20 63 78 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20   cx = ival;.    
50df0 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
50e00 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
50e10 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d  ype (argv[0]) ==
50e20 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
50e30 63 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  cx = sqlite3_val
50e40 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
50e50 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  0]);.    else.  
50e60 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
50e70 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
50e80 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
50e90 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
50ea0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
50eb0 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
50ec0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
50ed0 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 76  R).      {..  iv
50ee0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
50ef0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
50f00 3b 0a 09 20 20 63 79 20 3d 20 69 76 61 6c 3b 0a  ;..  cy = ival;.
50f10 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
50f20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
50f30 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
50f40 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
50f50 54 29 0a 09 63 79 20 3d 20 73 71 6c 69 74 65 33  T)..cy = sqlite3
50f60 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
50f70 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
50f80 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
50f90 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
50fa0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
50fb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
50fc0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
50fd0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
50fe0 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) == SQLITE_IN
50ff0 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
51000 20 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33    ival = sqlite3
51010 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
51020 5b 32 5d 29 3b 0a 09 20 20 72 31 20 3d 20 69 76  [2]);..  r1 = iv
51030 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
51040 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
51050 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
51060 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
51070 46 4c 4f 41 54 29 0a 09 72 31 20 3d 20 73 71 6c  FLOAT)..r1 = sql
51080 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
51090 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  e (argv[2]);.   
510a0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
510b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
510c0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
510d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
510e0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
510f0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
51100 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
51110 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
51120 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71 6c   {..  ival = sql
51130 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
51140 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 72 32 20  argv[3]);..  r2 
51150 3d 20 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  = ival;.      }.
51160 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
51170 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
51180 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
51190 49 54 45 5f 46 4c 4f 41 54 29 0a 09 72 32 20 3d  ITE_FLOAT)..r2 =
511a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
511b0 6f 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b  ouble (argv[3]);
511c0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
511d0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
511e0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
511f0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
51200 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
51210 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
51220 65 20 28 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53  e (argv[4]) == S
51230 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
51240 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d       {..  ival =
51250 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
51260 6e 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20  nt (argv[4]);.. 
51270 20 73 74 61 72 74 20 3d 20 69 76 61 6c 3b 0a 20   start = ival;. 
51280 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20       }.    else 
51290 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
512a0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29  e_type (argv[4])
512b0 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
512c0 29 0a 09 73 74 61 72 74 20 3d 20 73 71 6c 69 74  )..start = sqlit
512d0 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
512e0 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 65  (argv[4]);.    e
512f0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
51300 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
51310 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
51320 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
51330 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
51340 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
51350 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[5]) == SQLITE_
51360 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
51370 0a 09 20 20 69 76 61 6c 20 3d 20 73 71 6c 69 74  ..  ival = sqlit
51380 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
51390 67 76 5b 35 5d 29 3b 0a 09 20 20 73 74 6f 70 20  gv[5]);..  stop 
513a0 3d 20 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  = ival;.      }.
513b0 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
513c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
513d0 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c  (argv[5]) == SQL
513e0 49 54 45 5f 46 4c 4f 41 54 29 0a 09 73 74 6f 70  ITE_FLOAT)..stop
513f0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
51400 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 35 5d  _double (argv[5]
51410 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
51420 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
51430 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
51440 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
51450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
51460 28 61 72 67 63 20 3e 3d 20 37 29 0a 20 20 20 20  (argc >= 7).    
51470 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
51480 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
51490 72 67 76 5b 36 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[6]) == SQLIT
514a0 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
514b0 20 20 73 72 69 64 20 3d 20 73 71 6c 69 74 65 33    srid = sqlite3
514c0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
514d0 5b 36 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  [6]);..  else.. 
514e0 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
514f0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
51500 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
51510 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
51520 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 38     if (argc == 8
51530 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
51540 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
51550 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d  ype (argv[7]) ==
51560 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
51570 0a 09 20 20 20 20 7b 0a 09 09 69 76 61 6c 20 3d  ..    {...ival =
51580 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
51590 6e 74 20 28 61 72 67 76 5b 37 5d 29 3b 0a 09 09  nt (argv[7]);...
515a0 73 74 65 70 20 3d 20 69 76 61 6c 3b 0a 09 20 20  step = ival;..  
515b0 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28    }..  else if (
515c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
515d0 70 65 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d 20  pe (argv[7]) == 
515e0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20  SQLITE_FLOAT).. 
515f0 20 20 20 20 20 73 74 65 70 20 3d 20 73 71 6c 69       step = sqli
51600 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
51610 20 28 61 72 67 76 5b 37 5d 29 3b 0a 09 20 20 65   (argv[7]);..  e
51620 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
51630 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
51640 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
51650 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
51660 20 20 20 7d 0a 0a 20 20 20 20 61 72 63 31 20 3d     }..    arc1 =
51670 20 67 61 69 61 4d 61 6b 65 41 72 63 20 28 63 78   gaiaMakeArc (cx
51680 2c 20 63 79 2c 20 72 31 2c 20 73 74 61 72 74 2c  , cy, r1, start,
51690 20 73 74 6f 70 2c 20 73 74 65 70 29 3b 0a 20 20   stop, step);.  
516a0 20 20 61 72 63 32 20 3d 20 67 61 69 61 4d 61 6b    arc2 = gaiaMak
516b0 65 41 72 63 20 28 63 78 2c 20 63 79 2c 20 72 32  eArc (cx, cy, r2
516c0 2c 20 73 74 61 72 74 2c 20 73 74 6f 70 2c 20 73  , start, stop, s
516d0 74 65 70 29 3b 0a 20 20 20 20 69 66 20 28 61 72  tep);.    if (ar
516e0 63 31 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  c1 == NULL || ar
516f0 63 32 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c  c2 == NULL)..sql
51700 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
51710 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
51720 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
51730 69 6e 74 20 69 69 3b 0a 09 20 20 69 6e 74 20 69  int ii;..  int i
51740 6f 20 3d 20 30 3b 0a 09 20 20 64 6f 75 62 6c 65  o = 0;..  double
51750 20 78 3b 0a 09 20 20 64 6f 75 62 6c 65 20 79 3b   x;..  double y;
51760 0a 09 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69  ..  gaiaLinestri
51770 6e 67 50 74 72 20 69 6e 31 20 3d 20 61 72 63 31  ngPtr in1 = arc1
51780 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e  ->FirstLinestrin
51790 67 3b 0a 09 20 20 67 61 69 61 4c 69 6e 65 73 74  g;..  gaiaLinest
517a0 72 69 6e 67 50 74 72 20 69 6e 32 20 3d 20 61 72  ringPtr in2 = ar
517b0 63 32 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72  c2->FirstLinestr
517c0 69 6e 67 3b 0a 09 20 20 67 61 69 61 50 6f 6c 79  ing;..  gaiaPoly
517d0 67 6f 6e 50 74 72 20 70 67 3b 0a 09 20 20 67 61  gonPtr pg;..  ga
517e0 69 61 52 69 6e 67 50 74 72 20 6f 75 74 3b 0a 09  iaRingPtr out;..
517f0 20 20 73 74 72 69 70 65 20 3d 20 67 61 69 61 41    stripe = gaiaA
51800 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b  llocGeomColl ();
51810 0a 09 20 20 70 67 20 3d 20 67 61 69 61 41 64 64  ..  pg = gaiaAdd
51820 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f 6c  PolygonToGeomCol
51830 6c 20 28 73 74 72 69 70 65 2c 0a 09 09 09 09 09  l (stripe,......
51840 20 69 6e 31 2d 3e 50 6f 69 6e 74 73 20 2b 20 69   in1->Points + i
51850 6e 32 2d 3e 50 6f 69 6e 74 73 20 2b 20 31 2c 20  n2->Points + 1, 
51860 30 29 3b 0a 09 20 20 6f 75 74 20 3d 20 70 67 2d  0);..  out = pg-
51870 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20 66 6f  >Exterior;..  fo
51880 72 20 28 69 69 20 3d 20 30 3b 20 69 69 20 3c 20  r (ii = 0; ii < 
51890 69 6e 31 2d 3e 50 6f 69 6e 74 73 3b 20 69 69 2b  in1->Points; ii+
518a0 2b 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63  +)..    {.../* c
518b0 6f 70 79 69 6e 67 20 74 68 65 20 66 69 72 73 74  opying the first
518c0 20 41 72 63 27 73 20 70 6f 69 6e 74 73 20 2d 20   Arc's points - 
518d0 64 69 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  direct order */.
518e0 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28  ..gaiaGetPoint (
518f0 69 6e 31 2d 3e 43 6f 6f 72 64 73 2c 20 69 69 2c  in1->Coords, ii,
51900 20 26 78 2c 20 26 79 29 3b 0a 09 09 67 61 69 61   &x, &y);...gaia
51910 53 65 74 50 6f 69 6e 74 20 28 6f 75 74 2d 3e 43  SetPoint (out->C
51920 6f 6f 72 64 73 2c 20 69 6f 2c 20 78 2c 20 79 29  oords, io, x, y)
51930 3b 0a 09 09 69 6f 2b 2b 3b 0a 09 20 20 20 20 7d  ;...io++;..    }
51940 0a 09 20 20 66 6f 72 20 28 69 69 20 3d 20 69 6e  ..  for (ii = in
51950 32 2d 3e 50 6f 69 6e 74 73 20 2d 20 31 3b 20 69  2->Points - 1; i
51960 69 20 3e 3d 20 30 3b 20 69 69 2d 2d 29 0a 09 20  i >= 0; ii--).. 
51970 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 70 79 69 6e     {.../* copyin
51980 67 20 74 68 65 20 73 65 63 6f 6e 64 20 41 72 63  g the second Arc
51990 27 73 20 70 6f 69 6e 74 73 20 2d 20 72 65 76 65  's points - reve
519a0 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 09 09 67  rse order */...g
519b0 61 69 61 47 65 74 50 6f 69 6e 74 20 28 69 6e 32  aiaGetPoint (in2
519c0 2d 3e 43 6f 6f 72 64 73 2c 20 69 69 2c 20 26 78  ->Coords, ii, &x
519d0 2c 20 26 79 29 3b 0a 09 09 67 61 69 61 53 65 74  , &y);...gaiaSet
519e0 50 6f 69 6e 74 20 28 6f 75 74 2d 3e 43 6f 6f 72  Point (out->Coor
519f0 64 73 2c 20 69 6f 2c 20 78 2c 20 79 29 3b 0a 09  ds, io, x, y);..
51a00 09 69 6f 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  .io++;..    }.. 
51a10 20 2f 2a 20 63 6c 6f 73 69 6e 67 20 74 68 65 20   /* closing the 
51a20 50 6f 6c 79 67 6f 6e 20 52 69 6e 67 20 2a 2f 0a  Polygon Ring */.
51a30 09 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 20  .  gaiaGetPoint 
51a40 28 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c  (out->Coords, 0,
51a50 20 26 78 2c 20 26 79 29 3b 0a 09 20 20 67 61 69   &x, &y);..  gai
51a60 61 53 65 74 50 6f 69 6e 74 20 28 6f 75 74 2d 3e  aSetPoint (out->
51a70 43 6f 6f 72 64 73 2c 20 69 6f 2c 20 78 2c 20 79  Coords, io, x, y
51a80 29 3b 0a 09 20 20 69 66 20 28 73 72 69 64 20 21  );..  if (srid !
51a90 3d 20 30 29 0a 09 20 20 20 20 20 20 73 74 72 69  = 0)..      stri
51aa0 70 65 2d 3e 53 72 69 64 20 3d 20 73 72 69 64 3b  pe->Srid = srid;
51ab0 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61  ..  gaiaToSpatia
51ac0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
51ad0 73 74 72 69 70 65 2c 20 26 70 5f 72 65 73 75 6c  stripe, &p_resul
51ae0 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f  t, &len, gpkg_mo
51af0 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 74 69  de,.....      ti
51b00 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 73 71  ny_point);..  sq
51b10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
51b20 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
51b30 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
51b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
51b50 20 28 61 72 63 31 29 0a 09 67 61 69 61 46 72 65   (arc1)..gaiaFre
51b60 65 47 65 6f 6d 43 6f 6c 6c 20 28 61 72 63 31 29  eGeomColl (arc1)
51b70 3b 0a 20 20 20 20 69 66 20 28 61 72 63 32 29 0a  ;.    if (arc2).
51b80 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c  .gaiaFreeGeomCol
51b90 6c 20 28 61 72 63 32 29 3b 0a 20 20 20 20 69 66  l (arc2);.    if
51ba0 20 28 73 74 72 69 70 65 29 0a 09 67 61 69 61 46   (stripe)..gaiaF
51bb0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 73 74 72  reeGeomColl (str
51bc0 69 70 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ipe);.}..static 
51bd0 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65 45 6c  void.fnct_MakeEl
51be0 6c 69 70 74 69 63 53 65 63 74 6f 72 20 28 73 71  lipticSector (sq
51bf0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
51c00 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
51c10 63 2c 0a 09 09 09 20 73 71 6c 69 74 65 33 5f 76  c,.... sqlite3_v
51c20 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
51c30 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
51c40 0a 2f 20 4d 61 6b 65 45 6c 6c 69 70 74 69 63 53  ./ MakeEllipticS
51c50 65 63 74 6f 72 28 64 6f 75 62 6c 65 20 63 78 2c  ector(double cx,
51c60 20 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f 75 62   double cy, doub
51c70 6c 65 20 78 5f 61 78 69 73 2c 20 64 6f 75 62 6c  le x_axis, doubl
51c80 65 20 79 5f 61 78 69 73 2c 20 0a 2f 20 20 20 20  e y_axis, ./    
51c90 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
51ca0 62 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c  ble start, doubl
51cb0 65 20 73 74 6f 70 29 0a 2f 20 20 20 20 20 6f 72  e stop)./     or
51cc0 0a 2f 20 4d 61 6b 65 45 6c 6c 69 70 74 69 63 53  ./ MakeEllipticS
51cd0 65 63 74 6f 72 28 64 6f 75 62 6c 65 20 63 78 2c  ector(double cx,
51ce0 20 64 6f 75 62 6c 65 20 63 79 2c 20 64 6f 75 62   double cy, doub
51cf0 6c 65 20 78 5f 61 78 69 73 2c 20 64 6f 75 62 6c  le x_axis, doubl
51d00 65 20 79 5f 61 78 69 73 2c 0a 2f 20 20 20 20 20  e y_axis,./     
51d10 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
51d20 6c 65 20 73 74 61 72 74 2c 20 64 6f 75 62 6c 65  le start, double
51d30 20 73 74 6f 70 2c 20 69 6e 74 20 73 72 69 64 29   stop, int srid)
51d40 0a 2f 20 20 20 20 20 6f 72 0a 2f 20 4d 61 6b 65  ./     or./ Make
51d50 45 6c 6c 69 70 74 69 63 53 65 63 74 6f 72 28 64  EllipticSector(d
51d60 6f 75 62 6c 65 20 63 78 2c 20 64 6f 75 62 6c 65  ouble cx, double
51d70 20 63 79 2c 20 64 6f 75 62 6c 65 20 78 5f 61 78   cy, double x_ax
51d80 69 73 2c 20 64 6f 75 62 6c 65 20 79 5f 61 78 69  is, double y_axi
51d90 73 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s,./            
51da0 20 20 20 20 20 64 6f 75 62 6c 65 20 73 74 61 72       double star
51db0 74 2c 20 64 6f 75 62 6c 65 20 73 74 6f 70 2c 20  t, double stop, 
51dc0 69 6e 74 20 73 72 69 64 2c 20 64 6f 75 62 6c 65  int srid, double
51dd0 20 73 74 65 70 29 0a 2f 0a 2f 20 2d 20 62 75 69   step)././ - bui
51de0 6c 64 73 20 61 20 50 6f 6c 79 67 6f 6e 20 61 70  lds a Polygon ap
51df0 70 72 6f 78 69 6d 61 74 69 6e 67 20 61 6e 20 45  proximating an E
51e00 6c 6c 69 70 74 69 63 20 53 65 63 74 6f 72 0a 2f  lliptic Sector./
51e10 20 2d 20 73 74 61 72 74 20 61 6e 64 20 73 74 6f   - start and sto
51e20 70 20 61 72 65 20 74 68 65 20 69 6e 69 74 69 61  p are the initia
51e30 6c 20 61 6e 64 20 66 69 6e 61 6c 20 61 6e 67 6c  l and final angl
51e40 65 73 20 28 69 6e 20 64 65 67 72 65 65 73 29 0a  es (in degrees).
51e50 2f 20 2d 20 73 74 65 70 20 69 73 20 74 68 65 20  / - step is the 
51e60 61 6e 67 75 6c 61 72 20 64 69 73 74 61 6e 63 65  angular distance
51e70 20 28 69 6e 20 64 65 67 72 65 65 73 29 20 62 65   (in degrees) be
51e80 74 77 65 65 6e 20 70 6f 69 6e 74 73 20 6f 6e 20  tween points on 
51e90 0a 2f 20 20 20 74 68 65 20 65 6c 6c 69 70 73 65  ./   the ellipse
51ea0 20 28 62 79 20 64 65 66 61 75 6c 74 3a 20 65 76   (by default: ev
51eb0 65 72 79 20 31 30 20 64 65 67 73 29 20 0a 2f 20  ery 10 degs) ./ 
51ec0 2d 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  - or NULL if any
51ed0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
51ee0 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74  tered.*/.    int
51ef0 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e   len;.    unsign
51f00 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
51f10 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
51f20 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
51f30 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  om = NULL;.    g
51f40 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 73  aiaGeomCollPtr s
51f50 65 63 74 6f 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ector = NULL;.  
51f60 20 20 69 6e 74 20 69 76 61 6c 3b 0a 20 20 20 20    int ival;.    
51f70 64 6f 75 62 6c 65 20 63 78 3b 0a 20 20 20 20 64  double cx;.    d
51f80 6f 75 62 6c 65 20 63 79 3b 0a 20 20 20 20 64 6f  ouble cy;.    do
51f90 75 62 6c 65 20 78 5f 61 78 69 73 3b 0a 20 20 20  uble x_axis;.   
51fa0 20 64 6f 75 62 6c 65 20 79 5f 61 78 69 73 3b 0a   double y_axis;.
51fb0 20 20 20 20 64 6f 75 62 6c 65 20 73 74 61 72 74      double start
51fc0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 74 6f  ;.    double sto
51fd0 70 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64 20  p;.    int srid 
51fe0 3d 20 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  = 0;.    double 
51ff0 73 74 65 70 20 3d 20 31 30 2e 30 3b 0a 20 20 20  step = 10.0;.   
52000 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
52010 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
52020 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
52030 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
52040 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
52050 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
52060 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
52070 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
52080 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
52090 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
520a0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
520b0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
520c0 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
520d0 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
520e0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
520f0 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
52100 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
52110 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
52120 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
52130 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
52140 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
52150 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   ival = sqlite3_
52160 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
52170 30 5d 29 3b 0a 09 20 20 63 78 20 3d 20 69 76 61  0]);..  cx = iva
52180 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  l;.      }.    e
52190 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
521a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
521b0 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [0]) == SQLITE_F
521c0 4c 4f 41 54 29 0a 09 63 78 20 3d 20 73 71 6c 69  LOAT)..cx = sqli
521d0 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
521e0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
521f0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
52200 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
52210 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
52220 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
52230 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
52240 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
52250 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
52260 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
52270 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71 6c 69  {..  ival = sqli
52280 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
52290 72 67 76 5b 31 5d 29 3b 0a 09 20 20 63 79 20 3d  rgv[1]);..  cy =
522a0 20 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   ival;.      }. 
522b0 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
522c0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
522d0 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
522e0 54 45 5f 46 4c 4f 41 54 29 0a 09 63 79 20 3d 20  TE_FLOAT)..cy = 
522f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
52300 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a  uble (argv[1]);.
52310 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
52320 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
52330 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
52340 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
52350 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
52360 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
52370 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
52380 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
52390 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d 20      {..  ival = 
523a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
523b0 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20  t (argv[2]);..  
523c0 78 5f 61 78 69 73 20 3d 20 69 76 61 6c 3b 0a 20  x_axis = ival;. 
523d0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20       }.    else 
523e0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
523f0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
52400 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
52410 29 0a 09 78 5f 61 78 69 73 20 3d 20 73 71 6c 69  )..x_axis = sqli
52420 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
52430 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20   (argv[2]);.    
52440 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
52450 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
52460 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
52470 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
52480 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
52490 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
524a0 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[3]) == SQLITE
524b0 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
524c0 7b 0a 09 20 20 69 76 61 6c 20 3d 20 73 71 6c 69  {..  ival = sqli
524d0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
524e0 72 67 76 5b 33 5d 29 3b 0a 09 20 20 79 5f 61 78  rgv[3]);..  y_ax
524f0 69 73 20 3d 20 69 76 61 6c 3b 0a 20 20 20 20 20  is = ival;.     
52500 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28   }.    else if (
52510 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
52520 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
52530 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79  SQLITE_FLOAT)..y
52540 5f 61 78 69 73 20 3d 20 73 71 6c 69 74 65 33 5f  _axis = sqlite3_
52550 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
52560 67 76 5b 33 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[3]);.    else
52570 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
52580 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
52590 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
525a0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
525b0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
525c0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34  lue_type (argv[4
525d0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
525e0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
525f0 20 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   ival = sqlite3_
52600 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
52610 34 5d 29 3b 0a 09 20 20 73 74 61 72 74 20 3d 20  4]);..  start = 
52620 69 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ival;.      }.  
52630 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
52640 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
52650 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[4]) == SQLIT
52660 45 5f 46 4c 4f 41 54 29 0a 09 73 74 61 72 74 20  E_FLOAT)..start 
52670 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
52680 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 34 5d 29  double (argv[4])
52690 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
526a0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
526b0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
526c0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
526d0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
526e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
526f0 70 65 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20  pe (argv[5]) == 
52700 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
52710 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20        {..  ival 
52720 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
52730 69 6e 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 09  int (argv[5]);..
52740 20 20 73 74 6f 70 20 3d 20 69 76 61 6c 3b 0a 20    stop = ival;. 
52750 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20       }.    else 
52760 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
52770 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29  e_type (argv[5])
52780 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
52790 29 0a 09 73 74 6f 70 20 3d 20 73 71 6c 69 74 65  )..stop = sqlite
527a0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
527b0 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20 65 6c  argv[5]);.    el
527c0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
527d0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
527e0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
527f0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
52800 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20      if (argc >= 
52810 37 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  7).      {..  if
52820 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
52830 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29 20 3d  type (argv[6]) =
52840 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
52850 29 0a 09 20 20 20 20 20 20 73 72 69 64 20 3d 20  )..      srid = 
52860 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
52870 74 20 28 61 72 67 76 5b 36 5d 29 3b 0a 09 20 20  t (argv[6]);..  
52880 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
52890 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
528a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
528b0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
528c0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
528d0 67 63 20 3d 3d 20 38 29 0a 20 20 20 20 20 20 7b  gc == 8).      {
528e0 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
528f0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
52900 5b 37 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [7]) == SQLITE_I
52910 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
52920 09 69 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  .ival = sqlite3_
52930 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
52940 37 5d 29 3b 0a 09 09 73 74 65 70 20 3d 20 69 76  7]);...step = iv
52950 61 6c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  al;..    }..  el
52960 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
52970 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
52980 37 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  7]) == SQLITE_FL
52990 4f 41 54 29 0a 09 20 20 20 20 20 20 73 74 65 70  OAT)..      step
529a0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
529b0 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 37 5d  _double (argv[7]
529c0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
529d0 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
529e0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
529f0 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
52a00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
52a10 20 67 65 6f 6d 20 3d 20 67 61 69 61 4d 61 6b 65   geom = gaiaMake
52a20 45 6c 6c 69 70 74 69 63 41 72 63 20 28 63 78 2c  EllipticArc (cx,
52a30 20 63 79 2c 20 78 5f 61 78 69 73 2c 20 79 5f 61   cy, x_axis, y_a
52a40 78 69 73 2c 20 73 74 61 72 74 2c 20 73 74 6f 70  xis, start, stop
52a50 2c 20 73 74 65 70 29 3b 0a 20 20 20 20 69 66 20  , step);.    if 
52a60 28 21 67 65 6f 6d 29 0a 09 73 71 6c 69 74 65 33  (!geom)..sqlite3
52a70 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
52a80 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
52a90 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20  .      {..  int 
52aa0 69 69 3b 0a 09 20 20 69 6e 74 20 69 6f 20 3d 20  ii;..  int io = 
52ab0 30 3b 0a 09 20 20 64 6f 75 62 6c 65 20 78 3b 0a  0;..  double x;.
52ac0 09 20 20 64 6f 75 62 6c 65 20 79 3b 0a 09 20 20  .  double y;..  
52ad0 67 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74  gaiaLinestringPt
52ae0 72 20 69 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69 72  r in = geom->Fir
52af0 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09 20  stLinestring;.. 
52b00 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
52b10 70 67 3b 0a 09 20 20 67 61 69 61 52 69 6e 67 50  pg;..  gaiaRingP
52b20 74 72 20 6f 75 74 3b 0a 09 20 20 73 65 63 74 6f  tr out;..  secto
52b30 72 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f  r = gaiaAllocGeo
52b40 6d 43 6f 6c 6c 20 28 29 3b 0a 09 20 20 70 67 20  mColl ();..  pg 
52b50 3d 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f 6e  = gaiaAddPolygon
52b60 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 73 65 63 74  ToGeomColl (sect
52b70 6f 72 2c 20 69 6e 2d 3e 50 6f 69 6e 74 73 20 2b  or, in->Points +
52b80 20 32 2c 20 30 29 3b 0a 09 20 20 6f 75 74 20 3d   2, 0);..  out =
52b90 20 70 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09   pg->Exterior;..
52ba0 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    /* inserting t
52bb0 68 65 20 43 65 6e 74 72 65 20 2d 20 66 69 72 73  he Centre - firs
52bc0 74 20 70 6f 69 6e 74 20 2a 2f 0a 09 20 20 67 61  t point */..  ga
52bd0 69 61 53 65 74 50 6f 69 6e 74 20 28 6f 75 74 2d  iaSetPoint (out-
52be0 3e 43 6f 6f 72 64 73 2c 20 69 6f 2c 20 63 78 2c  >Coords, io, cx,
52bf0 20 63 79 29 3b 0a 09 20 20 69 6f 2b 2b 3b 0a 09   cy);..  io++;..
52c00 20 20 66 6f 72 20 28 69 69 20 3d 20 30 3b 20 69    for (ii = 0; i
52c10 69 20 3c 20 69 6e 2d 3e 50 6f 69 6e 74 73 3b 20  i < in->Points; 
52c20 69 69 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 2f  ii++)..    {.../
52c30 2a 20 63 6f 70 79 69 6e 67 20 74 68 65 20 41 72  * copying the Ar
52c40 63 27 73 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 09  c's points */...
52c50 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28 69 6e  gaiaGetPoint (in
52c60 2d 3e 43 6f 6f 72 64 73 2c 20 69 69 2c 20 26 78  ->Coords, ii, &x
52c70 2c 20 26 79 29 3b 0a 09 09 67 61 69 61 53 65 74  , &y);...gaiaSet
52c80 50 6f 69 6e 74 20 28 6f 75 74 2d 3e 43 6f 6f 72  Point (out->Coor
52c90 64 73 2c 20 69 6f 2c 20 78 2c 20 79 29 3b 0a 09  ds, io, x, y);..
52ca0 09 69 6f 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  .io++;..    }.. 
52cb0 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   /* inserting th
52cc0 65 20 43 65 6e 74 72 65 20 2d 20 6c 61 73 74 20  e Centre - last 
52cd0 70 6f 69 6e 74 20 2a 2f 0a 09 20 20 67 61 69 61  point */..  gaia
52ce0 53 65 74 50 6f 69 6e 74 20 28 6f 75 74 2d 3e 43  SetPoint (out->C
52cf0 6f 6f 72 64 73 2c 20 69 6f 2c 20 63 78 2c 20 63  oords, io, cx, c
52d00 79 29 3b 0a 09 20 20 69 66 20 28 73 72 69 64 20  y);..  if (srid 
52d10 21 3d 20 30 29 0a 09 20 20 20 20 20 20 73 65 63  != 0)..      sec
52d20 74 6f 72 2d 3e 53 72 69 64 20 3d 20 73 72 69 64  tor->Srid = srid
52d30 3b 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69  ;..  gaiaToSpati
52d40 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20  aLiteBlobWkbEx2 
52d50 28 73 65 63 74 6f 72 2c 20 26 70 5f 72 65 73 75  (sector, &p_resu
52d60 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d  lt, &len, gpkg_m
52d70 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 74  ode,.....      t
52d80 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 73  iny_point);..  s
52d90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
52da0 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
52db0 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
52dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  );.      }.    i
52dd0 66 20 28 67 65 6f 6d 29 0a 09 67 61 69 61 46 72  f (geom)..gaiaFr
52de0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
52df0 29 3b 0a 20 20 20 20 69 66 20 28 73 65 63 74 6f  );.    if (secto
52e00 72 29 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d  r)..gaiaFreeGeom
52e10 43 6f 6c 6c 20 28 73 65 63 74 6f 72 29 3b 0a 7d  Coll (sector);.}
52e20 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
52e30 63 74 5f 43 6f 6c 6c 65 63 74 5f 73 74 65 70 20  ct_Collect_step 
52e40 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
52e50 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
52e60 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
52e70 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
52e80 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
52e90 2f 20 43 6f 6c 6c 65 63 74 28 42 4c 4f 42 65 6e  / Collect(BLOBen
52ea0 63 6f 64 65 64 20 67 65 6f 6d 29 0a 2f 0a 2f 20  coded geom)././ 
52eb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
52ec0 6f 6e 20 2d 20 53 54 45 50 0a 2f 0a 2a 2f 0a 20  on - STEP./.*/. 
52ed0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
52ee0 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e   *p_blob;.    in
52ef0 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67  t n_bytes;.    g
52f00 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
52f10 65 6f 6d 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  eom;.    gaiaGeo
52f20 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b  mCollPtr result;
52f30 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
52f40 6c 50 74 72 20 2a 70 3b 0a 20 20 20 20 69 6e 74  lPtr *p;.    int
52f50 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
52f60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
52f70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
52f80 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
52f90 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
52fa0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
52fb0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
52fc0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
52fd0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
52fe0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
52ff0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
53000 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
53010 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
53020 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
53030 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
53040 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
53050 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
53060 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
53070 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
53080 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
53090 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
530a0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
530b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
530c0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
530d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
530e0 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
530f0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
53100 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
53110 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
53120 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
53130 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
53140 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 20 3d 0a 09  ]);.    geom =..
53150 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
53160 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
53170 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
53180 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
53190 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
531a0 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f  s);.    if (!geo
531b0 6d 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  m)..return;.    
531c0 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
531d0 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63  egate_context (c
531e0 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 20 28  ontext, sizeof (
531f0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 29  gaiaGeomCollPtr)
53200 29 3b 0a 20 20 20 20 69 66 20 28 21 28 2a 70 29  );.    if (!(*p)
53210 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
53220 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
53230 74 20 72 6f 77 20 2a 2f 0a 09 20 20 2a 70 20 3d  t row */..  *p =
53240 20 67 65 6f 6d 3b 0a 20 20 20 20 20 20 7d 0a 20   geom;.      }. 
53250 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
53260 09 20 20 2f 2a 20 73 75 62 73 65 71 75 65 6e 74  .  /* subsequent
53270 20 72 6f 77 73 20 2a 2f 0a 09 20 20 76 6f 69 64   rows */..  void
53280 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
53290 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
532a0 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74  ext);..  if (dat
532b0 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
532c0 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 4d    result = gaiaM
532d0 65 72 67 65 47 65 6f 6d 65 74 72 69 65 73 5f 72  ergeGeometries_r
532e0 20 28 64 61 74 61 2c 20 2a 70 2c 20 67 65 6f 6d   (data, *p, geom
532f0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
53300 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 4d    result = gaiaM
53310 65 72 67 65 47 65 6f 6d 65 74 72 69 65 73 20 28  ergeGeometries (
53320 2a 70 2c 20 67 65 6f 6d 29 3b 0a 09 20 20 2a 70  *p, geom);..  *p
53330 20 3d 20 72 65 73 75 6c 74 3b 0a 09 20 20 67 61   = result;..  ga
53340 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
53350 67 65 6f 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 7d  geom);.      }.}
53360 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
53370 63 74 5f 43 6f 6c 6c 65 63 74 5f 66 69 6e 61 6c  ct_Collect_final
53380 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
53390 74 20 2a 20 63 6f 6e 74 65 78 74 29 0a 7b 0a 2f  t * context).{./
533a0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
533b0 2f 20 43 6f 6c 6c 65 63 74 28 42 4c 4f 42 65 6e  / Collect(BLOBen
533c0 63 6f 64 65 64 20 67 65 6f 6d 29 0a 2f 0a 2f 20  coded geom)././ 
533d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
533e0 6f 6e 20 2d 20 46 49 4e 41 4c 0a 2f 0a 2a 2f 0a  on - FINAL./.*/.
533f0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
53400 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20 20  Ptr result;.    
53410 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
53420 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  *p = sqlite3_agg
53430 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28  regate_context (
53440 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  context, 0);.   
53450 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
53460 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
53470 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
53480 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
53490 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
534a0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
534b0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
534c0 29 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  );.    if (cache
534d0 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
534e0 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  {..  gpkg_mode =
534f0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
53500 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
53510 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
53520 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
53530 20 20 7d 0a 20 20 20 20 69 66 20 28 21 70 29 0a    }.    if (!p).
53540 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
53550 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
53560 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
53570 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
53580 20 72 65 73 75 6c 74 20 3d 20 2a 70 3b 0a 20 20   result = *p;.  
53590 20 20 69 66 20 28 21 72 65 73 75 6c 74 29 0a 09    if (!result)..
535a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
535b0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
535c0 20 20 20 65 6c 73 65 20 69 66 20 28 67 61 69 61     else if (gaia
535d0 49 73 45 6d 70 74 79 20 28 72 65 73 75 6c 74 29  IsEmpty (result)
535e0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69  ).      {..  gai
535f0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72  aFreeGeomColl (r
53600 65 73 75 6c 74 29 3b 0a 09 20 20 73 71 6c 69 74  esult);..  sqlit
53610 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
53620 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
53630 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
53640 20 7b 0a 09 20 20 2f 2a 20 62 75 69 6c 64 73 20   {..  /* builds 
53650 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72  the BLOB geometr
53660 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  y to be returned
53670 20 2a 2f 0a 09 20 20 69 6e 74 20 6c 65 6e 3b 0a   */..  int len;.
53680 09 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
53690 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
536a0 4c 3b 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74  L;..  gaiaToSpat
536b0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32  iaLiteBlobWkbEx2
536c0 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73   (result, &p_res
536d0 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f  ult, &len, gpkg_
536e0 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20  mode,.....      
536f0 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20  tiny_point);..  
53700 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
53710 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f  lob (context, p_
53720 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65  result, len, fre
53730 65 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47  e);..  gaiaFreeG
53740 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29  eomColl (result)
53750 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  ;.      }.}..sta
53760 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 6f  tic void.fnct_Co
53770 6c 6c 65 63 74 20 28 73 71 6c 69 74 65 33 5f 63  llect (sqlite3_c
53780 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
53790 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
537a0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
537b0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
537c0 74 69 6f 6e 3a 0a 2f 20 43 6f 6c 6c 65 63 74 28  tion:./ Collect(
537d0 67 65 6f 6d 65 74 72 79 20 67 65 6f 6d 31 2c 20  geometry geom1, 
537e0 67 65 6f 6d 65 74 72 79 20 67 65 6f 6d 32 29 0a  geometry geom2).
537f0 2f 0a 2f 20 6d 65 72 67 65 73 20 74 77 6f 20 67  /./ merges two g
53800 65 6e 65 72 69 63 20 47 45 4f 4d 45 54 52 49 45  eneric GEOMETRIE
53810 53 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  S into a single 
53820 6f 6e 65 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  one ./ or NULL i
53830 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
53840 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
53850 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
53860 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
53870 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61   n_bytes;.    ga
53880 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
53890 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  o1 = NULL;.    g
538a0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
538b0 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  eo2 = NULL;.    
538c0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
538d0 72 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  result;.    int 
538e0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
538f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
53900 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
53910 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
53920 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
53930 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
53940 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
53950 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
53960 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
53970 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
53980 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
53990 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
539a0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
539b0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
539c0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
539d0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
539e0 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
539f0 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
53a00 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
53a10 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
53a20 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
53a30 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
53a40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
53a50 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
53a60 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
53a70 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
53a80 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
53a90 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
53aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
53ab0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
53ac0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
53ad0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
53ae0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
53af0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
53b00 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
53b10 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
53b20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
53b30 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
53b40 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
53b50 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
53b60 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
53b70 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
53b80 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d  [0]);.    geo1 =
53b90 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
53ba0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
53bb0 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
53bc0 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
53bd0 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
53be0 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c 6f 62  ous);.    p_blob
53bf0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
53c00 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
53c10 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d  ue_blob (argv[1]
53c20 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
53c30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
53c40 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a  ytes (argv[1]);.
53c50 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69 61      geo2 =..gaia
53c60 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
53c70 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
53c80 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
53c90 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
53ca0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
53cb0 20 20 20 20 69 66 20 28 21 67 65 6f 31 20 7c 7c      if (!geo1 ||
53cc0 20 21 67 65 6f 32 29 0a 20 20 20 20 20 20 7b 0a   !geo2).      {.
53cd0 09 20 20 69 66 20 28 67 65 6f 31 20 21 3d 20 4e  .  if (geo1 != N
53ce0 55 4c 4c 29 0a 09 20 20 20 20 20 20 67 61 69 61  ULL)..      gaia
53cf0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
53d00 6f 31 29 3b 0a 09 20 20 69 66 20 28 67 65 6f 32  o1);..  if (geo2
53d10 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   != NULL)..     
53d20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
53d30 6c 20 28 67 65 6f 32 29 3b 0a 09 20 20 67 65 6f  l (geo2);..  geo
53d40 31 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 67 65 6f  1 = NULL;..  geo
53d50 32 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 73 71 6c  2 = NULL;..  sql
53d60 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
53d70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
53d80 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
53d90 20 20 20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61     {..  void *da
53da0 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  ta = sqlite3_use
53db0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
53dc0 3b 0a 09 20 20 69 66 20 28 64 61 74 61 20 21 3d  ;..  if (data !=
53dd0 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65   NULL)..      re
53de0 73 75 6c 74 20 3d 20 67 61 69 61 4d 65 72 67 65  sult = gaiaMerge
53df0 47 65 6f 6d 65 74 72 69 65 73 5f 72 20 28 64 61  Geometries_r (da
53e00 74 61 2c 20 67 65 6f 31 2c 20 67 65 6f 32 29 3b  ta, geo1, geo2);
53e10 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
53e20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 4d 65 72  result = gaiaMer
53e30 67 65 47 65 6f 6d 65 74 72 69 65 73 20 28 67 65  geGeometries (ge
53e40 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 69 66  o1, geo2);..  if
53e50 20 28 21 72 65 73 75 6c 74 29 0a 09 20 20 20 20   (!result)..    
53e60 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
53e70 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
53e80 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67 61 69  ..  else if (gai
53e90 61 49 73 45 6d 70 74 79 20 28 72 65 73 75 6c 74  aIsEmpty (result
53ea0 29 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61  ))..    {...gaia
53eb0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65  FreeGeomColl (re
53ec0 73 75 6c 74 29 3b 0a 09 09 73 71 6c 69 74 65 33  sult);...sqlite3
53ed0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
53ee0 6e 74 65 78 74 29 3b 0a 09 20 20 20 20 7d 0a 09  ntext);..    }..
53ef0 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
53f00 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c  /* builds the BL
53f10 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62  OB geometry to b
53f20 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09  e returned */...
53f30 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67  int len;...unsig
53f40 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
53f50 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 67 61 69  lt = NULL;...gai
53f60 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
53f70 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c  bWkbEx2 (result,
53f80 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
53f90 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f  ,......    gpkg_
53fa0 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74  mode, tiny_point
53fb0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
53fc0 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
53fd0 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
53fe0 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46  , free);...gaiaF
53ff0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
54000 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ult);..    }.   
54010 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
54020 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32 29  eGeomColl (geo2)
54030 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
54040 0a 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 31  .geom_from_text1
54050 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
54060 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
54070 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
54080 61 6c 75 65 20 2a 2a 20 61 72 67 76 2c 0a 09 09  alue ** argv,...
54090 20 73 68 6f 72 74 20 74 79 70 65 29 0a 7b 0a 2f   short type).{./
540a0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
540b0 2f 20 47 65 6f 6d 46 72 6f 6d 54 65 78 74 28 57  / GeomFromText(W
540c0 4b 54 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  KT encoded geome
540d0 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  try)././ returns
540e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 65 6f   the current geo
540f0 6d 65 74 72 79 20 62 79 20 70 61 72 73 69 6e 67  metry by parsing
54100 20 57 4b 54 20 65 6e 63 6f 64 65 64 20 73 74 72   WKT encoded str
54110 69 6e 67 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ing ./ or NULL i
54120 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
54130 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 69  ncountered././ i
54140 66 20 2a 74 79 70 65 2a 20 69 73 20 61 20 6e 65  f *type* is a ne
54150 67 61 74 69 76 65 20 76 61 6c 75 65 20 63 61 6e  gative value can
54160 20 61 63 63 65 70 74 20 61 6e 79 20 47 45 4f 4d   accept any GEOM
54170 45 54 52 59 20 43 4c 41 53 53 0a 2f 20 6f 74 68  ETRY CLASS./ oth
54180 65 72 77 69 73 65 20 6f 6e 6c 79 20 72 65 71 75  erwise only requ
54190 65 73 74 73 20 63 6f 6e 66 6f 72 6d 69 6e 67 20  ests conforming 
541a0 77 69 74 68 20 72 65 71 75 69 72 65 64 20 43 4c  with required CL
541b0 41 53 53 20 61 72 65 20 76 61 6c 69 64 0a 2a 2f  ASS are valid.*/
541c0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
541d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
541e0 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
541f0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
54200 67 6e 65 64 20 63 68 61 72 20 2a 74 65 78 74 3b  gned char *text;
54210 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
54220 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
54230 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
54240 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
54250 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
54260 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
54270 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
54280 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
54290 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
542a0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
542b0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
542c0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
542d0 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
542e0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
542f0 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
54300 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
54310 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
54320 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
54330 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
54340 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
54350 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
54360 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
54370 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
54380 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
54390 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
543a0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
543b0 20 20 7d 0a 20 20 20 20 74 65 78 74 20 3d 20 73    }.    text = s
543c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
543d0 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
543e0 20 67 65 6f 20 3d 20 67 61 69 61 50 61 72 73 65   geo = gaiaParse
543f0 57 6b 74 20 28 74 65 78 74 2c 20 74 79 70 65 29  Wkt (text, type)
54400 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d  ;.    if (geo ==
54410 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
54420 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
54430 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
54440 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
54450 20 20 7d 0a 20 20 20 20 67 61 69 61 54 6f 53 70    }.    gaiaToSp
54460 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
54470 78 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75  x2 (geo, &p_resu
54480 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d  lt, &len, gpkg_m
54490 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29  ode, tiny_point)
544a0 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
544b0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20  omColl (geo);.  
544c0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
544d0 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
544e0 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
544f0 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ree);.}..static 
54500 76 6f 69 64 0a 67 65 6f 6d 5f 66 72 6f 6d 5f 74  void.geom_from_t
54510 65 78 74 32 20 28 73 71 6c 69 74 65 33 5f 63 6f  ext2 (sqlite3_co
54520 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
54530 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
54540 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
54550 2c 0a 09 09 20 73 68 6f 72 74 20 74 79 70 65 29  ,... short type)
54560 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
54570 6f 6e 3a 0a 2f 20 47 65 6f 6d 46 72 6f 6d 54 65  on:./ GeomFromTe
54580 78 74 28 57 4b 54 20 65 6e 63 6f 64 65 64 20 67  xt(WKT encoded g
54590 65 6f 6d 65 74 72 79 2c 20 53 52 49 44 29 0a 2f  eometry, SRID)./
545a0 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ./ returns the c
545b0 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20  urrent geometry 
545c0 62 79 20 70 61 72 73 69 6e 67 20 57 4b 54 20 65  by parsing WKT e
545d0 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20 0a 2f  ncoded string ./
545e0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
545f0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
54600 65 72 65 64 0a 2f 0a 2f 20 69 66 20 2a 74 79 70  ered././ if *typ
54610 65 2a 20 69 73 20 61 20 6e 65 67 61 74 69 76 65  e* is a negative
54620 20 76 61 6c 75 65 20 63 61 6e 20 61 63 63 65 70   value can accep
54630 74 20 61 6e 79 20 47 45 4f 4d 45 54 52 59 20 43  t any GEOMETRY C
54640 4c 41 53 53 0a 2f 20 6f 74 68 65 72 77 69 73 65  LASS./ otherwise
54650 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 73 20 63   only requests c
54660 6f 6e 66 6f 72 6d 69 6e 67 20 77 69 74 68 20 72  onforming with r
54670 65 71 75 69 72 65 64 20 43 4c 41 53 53 20 61 72  equired CLASS ar
54680 65 20 76 61 6c 69 64 0a 2a 2f 0a 20 20 20 20 69  e valid.*/.    i
54690 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69  nt len;.    unsi
546a0 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73  gned char *p_res
546b0 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ult = NULL;.    
546c0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
546d0 68 61 72 20 2a 74 65 78 74 3b 0a 20 20 20 20 67  har *text;.    g
546e0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
546f0 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  eo = NULL;.    i
54700 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
54710 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
54720 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
54730 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
54740 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
54750 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
54760 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
54770 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
54780 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
54790 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
547a0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
547b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
547c0 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
547d0 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69  gpkg_mode;..  ti
547e0 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65  ny_point = cache
547f0 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c  ->tinyPointEnabl
54800 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
54810 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
54820 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
54830 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
54840 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
54850 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
54860 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
54870 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
54880 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
54890 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
548a0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) != SQLITE_INT
548b0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
548c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
548d0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
548e0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
548f0 20 7d 0a 20 20 20 20 74 65 78 74 20 3d 20 73 71   }.    text = sq
54900 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
54910 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
54920 67 65 6f 20 3d 20 67 61 69 61 50 61 72 73 65 57  geo = gaiaParseW
54930 6b 74 20 28 74 65 78 74 2c 20 74 79 70 65 29 3b  kt (text, type);
54940 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20  .    if (geo == 
54950 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
54960 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
54970 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
54980 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
54990 20 7d 0a 20 20 20 20 67 65 6f 2d 3e 53 72 69 64   }.    geo->Srid
549a0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
549b0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
549c0 20 20 20 20 67 61 69 61 54 6f 53 70 61 74 69 61      gaiaToSpatia
549d0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
549e0 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  geo, &p_result, 
549f0 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  &len, gpkg_mode,
54a00 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 20 20   tiny_point);.  
54a10 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
54a20 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 73 71  ll (geo);.    sq
54a30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
54a40 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
54a50 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
54a60 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  ;.}..static int.
54a70 63 68 65 63 6b 5f 77 6b 62 20 28 63 6f 6e 73 74  check_wkb (const
54a80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
54a90 77 6b 62 2c 20 69 6e 74 20 73 69 7a 65 2c 20 73  wkb, int size, s
54aa0 68 6f 72 74 20 74 79 70 65 29 0a 7b 0a 2f 2a 20  hort type).{./* 
54ab0 63 68 65 63 6b 69 6e 67 20 74 79 70 65 20 63 6f  checking type co
54ac0 68 65 72 65 6e 63 79 20 66 6f 72 20 57 4b 42 20  herency for WKB 
54ad0 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45 54 52 59  encoded GEOMETRY
54ae0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 74 74   */.    int litt
54af0 6c 65 5f 65 6e 64 69 61 6e 3b 0a 20 20 20 20 69  le_endian;.    i
54b00 6e 74 20 77 6b 62 5f 74 79 70 65 3b 0a 20 20 20  nt wkb_type;.   
54b10 20 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68   int endian_arch
54b20 20 3d 20 67 61 69 61 45 6e 64 69 61 6e 41 72 63   = gaiaEndianArc
54b30 68 20 28 29 3b 0a 20 20 20 20 69 66 20 28 73 69  h ();.    if (si
54b40 7a 65 20 3c 20 35 29 0a 09 72 65 74 75 72 6e 20  ze < 5)..return 
54b50 30 3b 09 09 2f 2a 20 74 6f 6f 20 73 68 6f 72 74  0;../* too short
54b60 20 74 6f 20 62 65 20 61 20 57 4b 42 20 2a 2f 0a   to be a WKB */.
54b70 20 20 20 20 69 66 20 28 2a 28 77 6b 62 20 2b 20      if (*(wkb + 
54b80 30 29 20 3d 3d 20 30 78 30 31 29 0a 09 6c 69 74  0) == 0x01)..lit
54b90 74 6c 65 5f 65 6e 64 69 61 6e 20 3d 20 47 41 49  tle_endian = GAI
54ba0 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b  A_LITTLE_ENDIAN;
54bb0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 2a 28  .    else if (*(
54bc0 77 6b 62 20 2b 20 30 29 20 3d 3d 20 30 78 30 30  wkb + 0) == 0x00
54bd0 29 0a 09 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e  )..little_endian
54be0 20 3d 20 47 41 49 41 5f 42 49 47 5f 45 4e 44 49   = GAIA_BIG_ENDI
54bf0 41 4e 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65  AN;.    else..re
54c00 74 75 72 6e 20 30 3b 09 09 2f 2a 20 69 6c 6c 65  turn 0;../* ille
54c10 67 61 6c 20 62 79 74 65 20 6f 72 64 65 72 69 6e  gal byte orderin
54c20 67 3b 20 6e 65 69 74 68 65 72 20 42 49 47 2d 45  g; neither BIG-E
54c30 4e 44 49 41 4e 20 6e 6f 72 20 4c 49 54 54 4c 45  NDIAN nor LITTLE
54c40 2d 45 4e 44 49 41 4e 20 2a 2f 0a 20 20 20 20 77  -ENDIAN */.    w
54c50 6b 62 5f 74 79 70 65 20 3d 20 67 61 69 61 49 6d  kb_type = gaiaIm
54c60 70 6f 72 74 33 32 20 28 77 6b 62 20 2b 20 31 2c  port32 (wkb + 1,
54c70 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20   little_endian, 
54c80 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20  endian_arch);.  
54c90 20 20 69 66 20 28 77 6b 62 5f 74 79 70 65 20 3d    if (wkb_type =
54ca0 3d 20 47 41 49 41 5f 50 4f 49 4e 54 20 7c 7c 20  = GAIA_POINT || 
54cb0 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41  wkb_type == GAIA
54cc0 5f 4c 49 4e 45 53 54 52 49 4e 47 0a 09 7c 7c 20  _LINESTRING..|| 
54cd0 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41  wkb_type == GAIA
54ce0 5f 50 4f 4c 59 47 4f 4e 20 7c 7c 20 77 6b 62 5f  _POLYGON || wkb_
54cf0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
54d00 54 49 50 4f 49 4e 54 0a 09 7c 7c 20 77 6b 62 5f  TIPOINT..|| wkb_
54d10 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
54d20 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 7c 7c 20  TILINESTRING || 
54d30 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41  wkb_type == GAIA
54d40 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 0a 09 7c  _MULTIPOLYGON..|
54d50 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41  | wkb_type == GA
54d60 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
54d70 43 54 49 4f 4e 20 7c 7c 20 77 6b 62 5f 74 79 70  CTION || wkb_typ
54d80 65 20 3d 3d 20 47 41 49 41 5f 50 4f 49 4e 54 5a  e == GAIA_POINTZ
54d90 0a 09 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d  ..|| wkb_type ==
54da0 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
54db0 5a 20 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d  Z || wkb_type ==
54dc0 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 0a 09   GAIA_POLYGONZ..
54dd0 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47  || wkb_type == G
54de0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 20  AIA_MULTIPOINTZ 
54df0 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47  || wkb_type == G
54e00 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
54e10 49 4e 47 5a 0a 09 7c 7c 20 77 6b 62 5f 74 79 70  INGZ..|| wkb_typ
54e20 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
54e30 4f 4c 59 47 4f 4e 5a 0a 09 7c 7c 20 77 6b 62 5f  OLYGONZ..|| wkb_
54e40 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
54e50 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
54e60 20 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d 20   || wkb_type == 
54e70 47 41 49 41 5f 50 4f 49 4e 54 4d 0a 09 7c 7c 20  GAIA_POINTM..|| 
54e80 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41  wkb_type == GAIA
54e90 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 20 7c 7c 20  _LINESTRINGM || 
54ea0 77 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41  wkb_type == GAIA
54eb0 5f 50 4f 4c 59 47 4f 4e 4d 0a 09 7c 7c 20 77 6b  _POLYGONM..|| wk
54ec0 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  b_type == GAIA_M
54ed0 55 4c 54 49 50 4f 49 4e 54 4d 20 7c 7c 20 77 6b  ULTIPOINTM || wk
54ee0 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  b_type == GAIA_M
54ef0 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 4d 0a  ULTILINESTRINGM.
54f00 09 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d 20  .|| wkb_type == 
54f10 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
54f20 4e 4d 0a 09 7c 7c 20 77 6b 62 5f 74 79 70 65 20  NM..|| wkb_type 
54f30 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  == GAIA_GEOMETRY
54f40 43 4f 4c 4c 45 43 54 49 4f 4e 4d 20 7c 7c 20 77  COLLECTIONM || w
54f50 6b 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  kb_type == GAIA_
54f60 50 4f 49 4e 54 5a 4d 0a 09 7c 7c 20 77 6b 62 5f  POINTZM..|| wkb_
54f70 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4c 49 4e  type == GAIA_LIN
54f80 45 53 54 52 49 4e 47 5a 4d 20 7c 7c 20 77 6b 62  ESTRINGZM || wkb
54f90 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f  _type == GAIA_PO
54fa0 4c 59 47 4f 4e 5a 4d 0a 09 7c 7c 20 77 6b 62 5f  LYGONZM..|| wkb_
54fb0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
54fc0 54 49 50 4f 49 4e 54 5a 4d 20 7c 7c 20 77 6b 62  TIPOINTZM || wkb
54fd0 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55  _type == GAIA_MU
54fe0 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 0a  LTILINESTRINGZM.
54ff0 09 7c 7c 20 77 6b 62 5f 74 79 70 65 20 3d 3d 20  .|| wkb_type == 
55000 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
55010 4e 5a 4d 0a 09 7c 7c 20 77 6b 62 5f 74 79 70 65  NZM..|| wkb_type
55020 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52   == GAIA_GEOMETR
55030 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a 09  YCOLLECTIONZM)..
55040 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75  ;.    else..retu
55050 72 6e 20 30 3b 09 09 2f 2a 20 69 6c 6c 65 67 61  rn 0;../* illega
55060 6c 20 47 45 4f 4d 45 54 52 59 20 43 4c 41 53 53  l GEOMETRY CLASS
55070 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 79 70 65   */.    if (type
55080 20 3c 20 30 29 0a 09 3b 09 09 09 2f 2a 20 6e 6f   < 0)..;.../* no
55090 20 72 65 73 74 72 69 6e 63 74 69 6f 6e 20 61 62   restrinction ab
550a0 6f 75 74 20 47 45 4f 4d 45 54 52 59 20 43 4c 41  out GEOMETRY CLA
550b0 53 53 20 54 59 50 45 20 2a 2f 0a 20 20 20 20 65  SS TYPE */.    e
550c0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  lse.      {..  i
550d0 66 20 28 77 6b 62 5f 74 79 70 65 20 21 3d 20 74  f (wkb_type != t
550e0 79 70 65 29 0a 09 20 20 20 20 20 20 72 65 74 75  ype)..      retu
550f0 72 6e 20 30 3b 09 09 2f 2a 20 69 6e 76 61 6c 69  rn 0;../* invali
55100 64 20 43 4c 41 53 53 20 54 59 50 45 20 66 6f 72  d CLASS TYPE for
55110 20 72 65 71 75 65 73 74 20 2a 2f 0a 20 20 20 20   request */.    
55120 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
55130 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
55140 0a 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 31 20  .geom_from_wkb1 
55150 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
55160 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
55170 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
55180 6c 75 65 20 2a 2a 20 61 72 67 76 2c 0a 09 09 73  lue ** argv,...s
55190 68 6f 72 74 20 74 79 70 65 29 0a 7b 0a 2f 2a 20  hort type).{./* 
551a0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
551b0 47 65 6f 6d 46 72 6f 6d 57 4b 42 28 57 4b 42 20  GeomFromWKB(WKB 
551c0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
551d0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68  )././ returns th
551e0 65 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74  e current geomet
551f0 72 79 20 62 79 20 70 61 72 73 69 6e 67 20 61 20  ry by parsing a 
55200 57 4b 42 20 65 6e 63 6f 64 65 64 20 62 6c 6f 62  WKB encoded blob
55210 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
55220 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
55230 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 69 66 20 2a  untered././ if *
55240 74 79 70 65 2a 20 69 73 20 61 20 6e 65 67 61 74  type* is a negat
55250 69 76 65 20 76 61 6c 75 65 20 63 61 6e 20 61 63  ive value can ac
55260 63 65 70 74 20 61 6e 79 20 47 45 4f 4d 45 54 52  cept any GEOMETR
55270 59 20 43 4c 41 53 53 0a 2f 20 6f 74 68 65 72 77  Y CLASS./ otherw
55280 69 73 65 20 6f 6e 6c 79 20 72 65 71 75 65 73 74  ise only request
55290 73 20 63 6f 6e 66 6f 72 6d 69 6e 67 20 77 69 74  s conforming wit
552a0 68 20 72 65 71 75 69 72 65 64 20 43 4c 41 53 53  h required CLASS
552b0 20 61 72 65 20 76 61 6c 69 64 0a 2a 2f 0a 20 20   are valid.*/.  
552c0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69    int len;.    i
552d0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
552e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
552f0 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
55300 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
55310 65 64 20 63 68 61 72 20 2a 77 6b 62 3b 0a 20 20  ed char *wkb;.  
55320 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
55330 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
55340 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
55350 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
55360 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
55370 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
55380 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
55390 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
553a0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
553b0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
553c0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
553d0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
553e0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
553f0 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
55400 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
55410 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20  e->gpkg_mode;.. 
55420 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61   tiny_point = ca
55430 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e  che->tinyPointEn
55440 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  abled;.      }. 
55450 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
55460 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
55470 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
55480 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
55490 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
554a0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
554b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
554c0 0a 20 20 20 20 77 6b 62 20 3d 20 73 71 6c 69 74  .    wkb = sqlit
554d0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
554e0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
554f0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
55500 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
55510 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 21 63  [0]);.    if (!c
55520 68 65 63 6b 5f 77 6b 62 20 28 77 6b 62 2c 20 6e  heck_wkb (wkb, n
55530 5f 62 79 74 65 73 2c 20 74 79 70 65 29 29 0a 09  _bytes, type))..
55540 72 65 74 75 72 6e 3b 0a 20 20 20 20 67 65 6f 20  return;.    geo 
55550 3d 20 67 61 69 61 46 72 6f 6d 57 6b 62 20 28 77  = gaiaFromWkb (w
55560 6b 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20  kb, n_bytes);.  
55570 20 20 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c    if (geo == NUL
55580 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  L).      {..  sq
55590 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
555a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
555b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
555c0 20 20 20 20 67 61 69 61 54 6f 53 70 61 74 69 61      gaiaToSpatia
555d0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
555e0 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  geo, &p_result, 
555f0 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  &len, gpkg_mode,
55600 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 20 20   tiny_point);.  
55610 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
55620 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 73 71  ll (geo);.    sq
55630 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
55640 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
55650 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
55660 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
55670 0a 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 32 20  .geom_from_wkb2 
55680 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
55690 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
556a0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
556b0 6c 75 65 20 2a 2a 20 61 72 67 76 2c 0a 09 09 73  lue ** argv,...s
556c0 68 6f 72 74 20 74 79 70 65 29 0a 7b 0a 2f 2a 20  hort type).{./* 
556d0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
556e0 47 65 6f 6d 46 72 6f 6d 57 4b 42 28 57 4b 42 20  GeomFromWKB(WKB 
556f0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
55700 2c 20 53 52 49 44 29 0a 2f 0a 2f 20 72 65 74 75  , SRID)././ retu
55710 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rns the current 
55720 67 65 6f 6d 65 74 72 79 20 62 79 20 70 61 72 73  geometry by pars
55730 69 6e 67 20 61 20 57 4b 42 20 65 6e 63 6f 64 65  ing a WKB encode
55740 64 20 62 6c 6f 62 0a 2f 20 6f 72 20 4e 55 4c 4c  d blob./ or NULL
55750 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
55760 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f   encountered././
55770 20 69 66 20 2a 74 79 70 65 2a 20 69 73 20 61 20   if *type* is a 
55780 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 63  negative value c
55790 61 6e 20 61 63 63 65 70 74 20 61 6e 79 20 47 45  an accept any GE
557a0 4f 4d 45 54 52 59 20 43 4c 41 53 53 0a 2f 20 6f  OMETRY CLASS./ o
557b0 74 68 65 72 77 69 73 65 20 6f 6e 6c 79 20 72 65  therwise only re
557c0 71 75 65 73 74 73 20 63 6f 6e 66 6f 72 6d 69 6e  quests conformin
557d0 67 20 77 69 74 68 20 72 65 71 75 69 72 65 64 20  g with required 
557e0 43 4c 41 53 53 20 61 72 65 20 76 61 6c 69 64 0a  CLASS are valid.
557f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  */.    int len;.
55800 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
55810 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
55820 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
55830 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ULL;.    const u
55840 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 77 6b  nsigned char *wk
55850 62 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  b;.    gaiaGeomC
55860 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
55870 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  L;.    int gpkg_
55880 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mode = 0;.    in
55890 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
558a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
558b0 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
558c0 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
558d0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
558e0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
558f0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
55900 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
55910 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
55920 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
55930 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  {..  gpkg_mode =
55940 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
55950 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
55960 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
55970 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
55980 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
55990 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
559a0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
559b0 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
559c0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
559d0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
559e0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
559f0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
55a00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
55a10 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
55a20 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
55a30 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
55a40 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
55a50 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
55a60 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77  n;.      }.    w
55a70 6b 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  kb = sqlite3_val
55a80 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
55a90 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
55aa0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
55ab0 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
55ac0 20 20 20 20 69 66 20 28 21 63 68 65 63 6b 5f 77      if (!check_w
55ad0 6b 62 20 28 77 6b 62 2c 20 6e 5f 62 79 74 65 73  kb (wkb, n_bytes
55ae0 2c 20 74 79 70 65 29 29 0a 09 72 65 74 75 72 6e  , type))..return
55af0 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61  ;.    geo = gaia
55b00 46 72 6f 6d 57 6b 62 20 28 77 6b 62 2c 20 6e 5f  FromWkb (wkb, n_
55b10 62 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28  bytes);.    if (
55b20 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  geo == NULL).   
55b30 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
55b40 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
55b50 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
55b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65  ;.      }.    ge
55b70 6f 2d 3e 53 72 69 64 20 3d 20 73 71 6c 69 74 65  o->Srid = sqlite
55b80 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
55b90 76 5b 31 5d 29 3b 0a 20 20 20 20 67 61 69 61 54  v[1]);.    gaiaT
55ba0 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
55bb0 6b 62 45 78 32 20 28 67 65 6f 2c 20 26 70 5f 72  kbEx2 (geo, &p_r
55bc0 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b  esult, &len, gpk
55bd0 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69  g_mode, tiny_poi
55be0 6e 74 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65  nt);.    gaiaFre
55bf0 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
55c00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
55c10 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
55c20 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
55c30 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74  , free);.}..stat
55c40 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 65 6f  ic void.fnct_Geo
55c50 6d 65 74 72 79 46 72 6f 6d 46 47 46 31 20 28 73  metryFromFGF1 (s
55c60 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
55c70 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
55c80 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c  gc,...       sql
55c90 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
55ca0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
55cb0 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 6d 46 72 6f  ction:./ GeomFro
55cc0 6d 46 47 46 28 46 47 46 20 65 6e 63 6f 64 65 64  mFGF(FGF encoded
55cd0 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72   geometry)././ r
55ce0 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
55cf0 6e 74 20 67 65 6f 6d 65 74 72 79 20 62 79 20 70  nt geometry by p
55d00 61 72 73 69 6e 67 20 61 6e 20 46 47 46 20 65 6e  arsing an FGF en
55d10 63 6f 64 65 64 20 62 6c 6f 62 20 0a 2f 20 6f 72  coded blob ./ or
55d20 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
55d30 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
55d40 64 0a 2f 0a 2f 20 69 66 20 2a 74 79 70 65 2a 20  d././ if *type* 
55d50 69 73 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  is a negative va
55d60 6c 75 65 20 63 61 6e 20 61 63 63 65 70 74 20 61  lue can accept a
55d70 6e 79 20 47 45 4f 4d 45 54 52 59 20 43 4c 41 53  ny GEOMETRY CLAS
55d80 53 0a 2f 20 6f 74 68 65 72 77 69 73 65 20 6f 6e  S./ otherwise on
55d90 6c 79 20 72 65 71 75 65 73 74 73 20 63 6f 6e 66  ly requests conf
55da0 6f 72 6d 69 6e 67 20 77 69 74 68 20 72 65 71 75  orming with requ
55db0 69 72 65 64 20 43 4c 41 53 53 20 61 72 65 20 76  ired CLASS are v
55dc0 61 6c 69 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  alid.*/.    int 
55dd0 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  len;.    int n_b
55de0 79 74 65 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e  ytes;.    unsign
55df0 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
55e00 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  t = NULL;.    co
55e10 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
55e20 72 20 2a 66 67 66 3b 0a 20 20 20 20 67 61 69 61  r *fgf;.    gaia
55e30 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
55e40 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
55e50 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
55e60 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
55e70 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
55e80 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
55e90 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
55ea0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
55eb0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
55ec0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
55ed0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
55ee0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
55ef0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
55f00 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d       {..  gpkg_m
55f10 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
55f20 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f  g_mode;..  tiny_
55f30 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
55f40 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
55f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
55f60 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
55f70 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
55f80 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
55f90 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
55fa0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
55fb0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
55fc0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66  n;.      }.    f
55fd0 67 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  gf = sqlite3_val
55fe0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
55ff0 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
56000 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
56010 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
56020 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 46 72      geo = gaiaFr
56030 6f 6d 46 67 66 20 28 66 67 66 2c 20 6e 5f 62 79  omFgf (fgf, n_by
56040 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65  tes);.    if (ge
56050 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  o == NULL).     
56060 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
56070 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
56080 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
56090 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
560a0 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
560b0 57 6b 62 45 78 32 20 28 67 65 6f 2c 20 26 70 5f  WkbEx2 (geo, &p_
560c0 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70  result, &len, gp
560d0 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f  kg_mode, tiny_po
560e0 69 6e 74 29 3b 0a 20 20 20 20 67 61 69 61 46 72  int);.    gaiaFr
560f0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
56100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
56110 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
56120 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
56130 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61  n, free);.}..sta
56140 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 65  tic void.fnct_Ge
56150 6f 6d 65 74 72 79 46 72 6f 6d 46 47 46 32 20 28  ometryFromFGF2 (
56160 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
56170 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
56180 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71  rgc,...       sq
56190 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
561a0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
561b0 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 6d 46 72  nction:./ GeomFr
561c0 6f 6d 46 47 46 28 46 47 46 20 65 6e 63 6f 64 65  omFGF(FGF encode
561d0 64 20 67 65 6f 6d 65 74 72 79 2c 20 53 52 49 44  d geometry, SRID
561e0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68  )././ returns th
561f0 65 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74  e current geomet
56200 72 79 20 62 79 20 70 61 72 73 69 6e 67 20 61 6e  ry by parsing an
56210 20 46 47 46 20 65 6e 63 6f 64 65 64 20 73 74 72   FGF encoded str
56220 69 6e 67 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ing ./ or NULL i
56230 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
56240 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 69  ncountered././ i
56250 66 20 2a 74 79 70 65 2a 20 69 73 20 61 20 6e 65  f *type* is a ne
56260 67 61 74 69 76 65 20 76 61 6c 75 65 20 63 61 6e  gative value can
56270 20 61 63 63 65 70 74 20 61 6e 79 20 47 45 4f 4d   accept any GEOM
56280 45 54 52 59 20 43 4c 41 53 53 0a 2f 20 6f 74 68  ETRY CLASS./ oth
56290 65 72 77 69 73 65 20 6f 6e 6c 79 20 72 65 71 75  erwise only requ
562a0 65 73 74 73 20 63 6f 6e 66 6f 72 6d 69 6e 67 20  ests conforming 
562b0 77 69 74 68 20 72 65 71 75 69 72 65 64 20 43 4c  with required CL
562c0 41 53 53 20 61 72 65 20 76 61 6c 69 64 0a 2a 2f  ASS are valid.*/
562d0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
562e0 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20    int n_bytes;. 
562f0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
56300 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
56310 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  L;.    const uns
56320 69 67 6e 65 64 20 63 68 61 72 20 2a 66 67 66 3b  igned char *fgf;
56330 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
56340 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
56350 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
56360 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
56370 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
56380 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
56390 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
563a0 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
563b0 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
563c0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
563d0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
563e0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
563f0 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
56400 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
56410 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
56420 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
56430 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
56440 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
56450 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
56460 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
56470 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
56480 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
56490 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
564a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
564b0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
564c0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
564d0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
564e0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
564f0 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
56500 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
56510 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
56520 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
56530 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
56540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66 67 66  .      }.    fgf
56550 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
56560 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
56570 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
56580 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
56590 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
565a0 20 20 67 65 6f 20 3d 20 67 61 69 61 46 72 6f 6d    geo = gaiaFrom
565b0 46 67 66 20 28 66 67 66 2c 20 6e 5f 62 79 74 65  Fgf (fgf, n_byte
565c0 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20  s);.    if (geo 
565d0 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
565e0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
565f0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
56600 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
56610 20 20 20 20 7d 0a 20 20 20 20 67 65 6f 2d 3e 53      }.    geo->S
56620 72 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  rid = sqlite3_va
56630 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
56640 29 3b 0a 20 20 20 20 67 61 69 61 54 6f 53 70 61  );.    gaiaToSpa
56650 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
56660 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c  2 (geo, &p_resul
56670 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f  t, &len, gpkg_mo
56680 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b  de, tiny_point);
56690 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
566a0 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20  mColl (geo);.   
566b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
566c0 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
566d0 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
566e0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2f 20 74 68 65  ee);.}../*./ the
566f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
56700 69 6f 6e 73 20 73 69 6d 70 6c 79 20 72 65 61 64  ions simply read
56710 64 72 65 73 73 20 74 68 65 20 72 65 71 75 65 73  dress the reques
56720 74 20 74 6f 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74  t to geom_from_t
56730 65 78 74 3f 28 29 0a 2f 20 73 65 74 74 69 6e 67  ext?()./ setting
56740 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
56750 20 47 45 4f 4d 45 54 52 59 20 43 4c 41 53 53 20   GEOMETRY CLASS 
56760 54 59 50 45 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  TYPE.*/..static 
56770 76 6f 69 64 0a 66 6e 63 74 5f 47 65 6f 6d 46 72  void.fnct_GeomFr
56780 6f 6d 54 65 78 74 31 20 28 73 71 6c 69 74 65 33  omText1 (sqlite3
56790 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
567a0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
567b0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
567c0 72 67 76 29 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f  rgv).{.    geom_
567d0 66 72 6f 6d 5f 74 65 78 74 31 20 28 63 6f 6e 74  from_text1 (cont
567e0 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ext, argc, argv,
567f0 20 28 73 68 6f 72 74 29 20 2d 31 29 3b 0a 7d 0a   (short) -1);.}.
56800 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
56810 74 5f 47 65 6f 6d 46 72 6f 6d 54 65 78 74 32 20  t_GeomFromText2 
56820 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56830 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
56840 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
56850 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
56860 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78     geom_from_tex
56870 74 32 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  t2 (context, arg
56880 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29  c, argv, (short)
56890 20 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   -1);.}..static 
568a0 76 6f 69 64 0a 66 6e 63 74 5f 47 65 6f 6d 43 6f  void.fnct_GeomCo
568b0 6c 6c 46 72 6f 6d 54 65 78 74 31 20 28 73 71 6c  llFromText1 (sql
568c0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
568d0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
568e0 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  ,....sqlite3_val
568f0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
56900 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74    geom_from_text
56910 31 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  1 (context, argc
56920 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20  , argv, (short) 
56930 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
56940 4c 45 43 54 49 4f 4e 29 3b 0a 7d 0a 0a 73 74 61  LECTION);.}..sta
56950 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 65  tic void.fnct_Ge
56960 6f 6d 43 6f 6c 6c 46 72 6f 6d 54 65 78 74 32 20  omCollFromText2 
56970 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56980 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
56990 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65 33  argc,....sqlite3
569a0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
569b0 7b 0a 20 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f  {.    geom_from_
569c0 74 65 78 74 32 20 28 63 6f 6e 74 65 78 74 2c 20  text2 (context, 
569d0 61 72 67 63 2c 20 61 72 67 76 2c 20 28 73 68 6f  argc, argv, (sho
569e0 72 74 29 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  rt) GAIA_GEOMETR
569f0 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 3b 0a 7d 0a  YCOLLECTION);.}.
56a00 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
56a10 74 5f 4c 69 6e 65 46 72 6f 6d 54 65 78 74 31 20  t_LineFromText1 
56a20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56a30 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
56a40 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
56a50 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
56a60 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78     geom_from_tex
56a70 74 31 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  t1 (context, arg
56a80 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29  c, argv, (short)
56a90 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
56aa0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
56ab0 64 0a 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 54  d.fnct_LineFromT
56ac0 65 78 74 32 20 28 73 71 6c 69 74 65 33 5f 63 6f  ext2 (sqlite3_co
56ad0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
56ae0 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
56af0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
56b00 29 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f 66 72 6f  ).{.    geom_fro
56b10 6d 5f 74 65 78 74 32 20 28 63 6f 6e 74 65 78 74  m_text2 (context
56b20 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 28 73  , argc, argv, (s
56b30 68 6f 72 74 29 20 47 41 49 41 5f 4c 49 4e 45 53  hort) GAIA_LINES
56b40 54 52 49 4e 47 29 3b 0a 7d 0a 0a 73 74 61 74 69  TRING);.}..stati
56b50 63 20 76 6f 69 64 0a 66 6e 63 74 5f 50 6f 69 6e  c void.fnct_Poin
56b60 74 46 72 6f 6d 54 65 78 74 31 20 28 73 71 6c 69  tFromText1 (sqli
56b70 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
56b80 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
56b90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
56ba0 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 67 65  * argv).{.    ge
56bb0 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 31 20 28 63  om_from_text1 (c
56bc0 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
56bd0 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41 49 41  gv, (short) GAIA
56be0 5f 50 4f 49 4e 54 29 3b 0a 7d 0a 0a 73 74 61 74  _POINT);.}..stat
56bf0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 50 6f 69  ic void.fnct_Poi
56c00 6e 74 46 72 6f 6d 54 65 78 74 32 20 28 73 71 6c  ntFromText2 (sql
56c10 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
56c20 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
56c30 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
56c40 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 67  ** argv).{.    g
56c50 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 32 20 28  eom_from_text2 (
56c60 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
56c70 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41 49  rgv, (short) GAI
56c80 41 5f 50 4f 49 4e 54 29 3b 0a 7d 0a 0a 73 74 61  A_POINT);.}..sta
56c90 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 50 6f  tic void.fnct_Po
56ca0 6c 79 46 72 6f 6d 54 65 78 74 31 20 28 73 71 6c  lyFromText1 (sql
56cb0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
56cc0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
56cd0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
56ce0 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 67  ** argv).{.    g
56cf0 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 31 20 28  eom_from_text1 (
56d00 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
56d10 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41 49  rgv, (short) GAI
56d20 41 5f 50 4f 4c 59 47 4f 4e 29 3b 0a 7d 0a 0a 73  A_POLYGON);.}..s
56d30 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
56d40 50 6f 6c 79 46 72 6f 6d 54 65 78 74 32 20 28 73  PolyFromText2 (s
56d50 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
56d60 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
56d70 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
56d80 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
56d90 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 32   geom_from_text2
56da0 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
56db0 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47   argv, (short) G
56dc0 41 49 41 5f 50 4f 4c 59 47 4f 4e 29 3b 0a 7d 0a  AIA_POLYGON);.}.
56dd0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
56de0 74 5f 4d 4c 69 6e 65 46 72 6f 6d 54 65 78 74 31  t_MLineFromText1
56df0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
56e00 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
56e10 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
56e20 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
56e30 20 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65      geom_from_te
56e40 78 74 31 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  xt1 (context, ar
56e50 67 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74  gc, argv, (short
56e60 29 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  ) GAIA_MULTILINE
56e70 53 54 52 49 4e 47 29 3b 0a 7d 0a 0a 73 74 61 74  STRING);.}..stat
56e80 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 4c 69  ic void.fnct_MLi
56e90 6e 65 46 72 6f 6d 54 65 78 74 32 20 28 73 71 6c  neFromText2 (sql
56ea0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
56eb0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
56ec0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
56ed0 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 67  ** argv).{.    g
56ee0 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 32 20 28  eom_from_text2 (
56ef0 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
56f00 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41 49  rgv, (short) GAI
56f10 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
56f20 47 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  G);.}..static vo
56f30 69 64 0a 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72  id.fnct_MPointFr
56f40 6f 6d 54 65 78 74 31 20 28 73 71 6c 69 74 65 33  omText1 (sqlite3
56f50 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
56f60 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
56f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
56f80 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
56f90 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78     geom_from_tex
56fa0 74 31 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  t1 (context, arg
56fb0 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29  c, argv, (short)
56fc0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
56fd0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
56fe0 64 0a 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72 6f  d.fnct_MPointFro
56ff0 6d 54 65 78 74 32 20 28 73 71 6c 69 74 65 33 5f  mText2 (sqlite3_
57000 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
57010 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20  t, int argc,... 
57020 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
57030 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
57040 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74    geom_from_text
57050 32 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  2 (context, argc
57060 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20  , argv, (short) 
57070 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 29  GAIA_MULTIPOINT)
57080 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
57090 0a 66 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 54  .fnct_MPolyFromT
570a0 65 78 74 31 20 28 73 71 6c 69 74 65 33 5f 63 6f  ext1 (sqlite3_co
570b0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
570c0 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
570d0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
570e0 29 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f 66 72 6f  ).{.    geom_fro
570f0 6d 5f 74 65 78 74 31 20 28 63 6f 6e 74 65 78 74  m_text1 (context
57100 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 28 73  , argc, argv, (s
57110 68 6f 72 74 29 20 47 41 49 41 5f 4d 55 4c 54 49  hort) GAIA_MULTI
57120 50 4f 4c 59 47 4f 4e 29 3b 0a 7d 0a 0a 73 74 61  POLYGON);.}..sta
57130 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 50  tic void.fnct_MP
57140 6f 6c 79 46 72 6f 6d 54 65 78 74 32 20 28 73 71  olyFromText2 (sq
57150 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
57160 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
57170 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
57180 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
57190 67 65 6f 6d 5f 66 72 6f 6d 5f 74 65 78 74 32 20  geom_from_text2 
571a0 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
571b0 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41  argv, (short) GA
571c0 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 29  IA_MULTIPOLYGON)
571d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
571e0 0a 66 6e 63 74 5f 57 6b 74 54 6f 53 71 6c 20 28  .fnct_WktToSql (
571f0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
57200 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
57210 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
57220 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
57230 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
57240 20 53 54 5f 57 4b 54 54 6f 53 51 4c 28 57 4b 54   ST_WKTToSQL(WKT
57250 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
57260 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74  y)././ returns t
57270 68 65 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65  he current geome
57280 74 72 79 20 62 79 20 70 61 72 73 69 6e 67 20 57  try by parsing W
57290 4b 54 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  KT encoded strin
572a0 67 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  g ./ or NULL if 
572b0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
572c0 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 74 68 65  ountered././ the
572d0 20 53 52 49 44 20 69 73 20 61 6c 77 61 79 73 20   SRID is always 
572e0 30 20 5b 53 51 4c 2f 4d 4d 20 66 75 6e 63 74 69  0 [SQL/MM functi
572f0 6f 6e 5d 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  on].*/.    int l
57300 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
57310 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20   char *p_result 
57320 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73  = NULL;.    cons
57330 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
57340 2a 74 65 78 74 3b 0a 20 20 20 20 67 61 69 61 47  *text;.    gaiaG
57350 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
57360 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67   NULL;.    int g
57370 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
57380 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
57390 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
573a0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
573b0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
573c0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
573d0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
573e0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
573f0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
57400 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
57410 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
57420 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f      {..  gpkg_mo
57430 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
57440 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
57450 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
57460 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
57470 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
57480 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
57490 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
574a0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
574b0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
574c0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
574d0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
574e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 65  ;.      }.    te
574f0 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  xt = sqlite3_val
57500 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
57510 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69  );.    geo = gai
57520 61 50 61 72 73 65 57 6b 74 20 28 74 65 78 74 2c  aParseWkt (text,
57530 20 2d 31 29 3b 0a 20 20 20 20 69 66 20 28 67 65   -1);.    if (ge
57540 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  o == NULL).     
57550 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
57560 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
57570 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
57580 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f 2d        }.    geo-
57590 3e 53 72 69 64 20 3d 20 30 3b 0a 20 20 20 20 67  >Srid = 0;.    g
575a0 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
575b0 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 2c 20  lobWkbEx2 (geo, 
575c0 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
575d0 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79   gpkg_mode, tiny
575e0 5f 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69  _point);.    gai
575f0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
57600 65 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eo);.    sqlite3
57610 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
57620 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
57630 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a   len, free);.}..
57640 2f 2a 0a 2f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  /*./ the followi
57650 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 73 69 6d  ng functions sim
57660 70 6c 79 20 72 65 61 64 64 72 65 73 73 20 74 68  ply readdress th
57670 65 20 72 65 71 75 65 73 74 20 74 6f 20 67 65 6f  e request to geo
57680 6d 5f 66 72 6f 6d 5f 77 6b 62 3f 28 29 0a 2f 20  m_from_wkb?()./ 
57690 73 65 74 74 69 6e 67 20 74 68 65 20 61 70 70 72  setting the appr
576a0 6f 70 72 69 61 74 65 20 47 45 4f 4d 45 54 52 59  opriate GEOMETRY
576b0 20 43 4c 41 53 53 20 54 59 50 45 0a 2a 2f 0a 0a   CLASS TYPE.*/..
576c0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
576d0 5f 47 65 6f 6d 46 72 6f 6d 57 6b 62 31 20 28 73  _GeomFromWkb1 (s
576e0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
576f0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
57700 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
57710 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
57720 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 31 20   geom_from_wkb1 
57730 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
57740 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 2d 31  argv, (short) -1
57750 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
57760 64 0a 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d 57  d.fnct_GeomFromW
57770 6b 62 32 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  kb2 (sqlite3_con
57780 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
57790 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
577a0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
577b0 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f 66 72 6f 6d  .{.    geom_from
577c0 5f 77 6b 62 32 20 28 63 6f 6e 74 65 78 74 2c 20  _wkb2 (context, 
577d0 61 72 67 63 2c 20 61 72 67 76 2c 20 28 73 68 6f  argc, argv, (sho
577e0 72 74 29 20 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74  rt) -1);.}..stat
577f0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 65 6f  ic void.fnct_Geo
57800 6d 43 6f 6c 6c 46 72 6f 6d 57 6b 62 31 20 28 73  mCollFromWkb1 (s
57810 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
57820 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
57830 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c  gc,...       sql
57840 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
57850 67 76 29 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f 66  gv).{.    geom_f
57860 72 6f 6d 5f 77 6b 62 31 20 28 63 6f 6e 74 65 78  rom_wkb1 (contex
57870 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 28  t, argc, argv, (
57880 73 68 6f 72 74 29 20 47 41 49 41 5f 47 45 4f 4d  short) GAIA_GEOM
57890 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 3b  ETRYCOLLECTION);
578a0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
578b0 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72 6f  fnct_GeomCollFro
578c0 6d 57 6b 62 32 20 28 73 71 6c 69 74 65 33 5f 63  mWkb2 (sqlite3_c
578d0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
578e0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20  , int argc,...  
578f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
57900 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
57910 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 32    geom_from_wkb2
57920 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
57930 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47   argv, (short) G
57940 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
57950 45 43 54 49 4f 4e 29 3b 0a 7d 0a 0a 73 74 61 74  ECTION);.}..stat
57960 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4c 69 6e  ic void.fnct_Lin
57970 65 46 72 6f 6d 57 6b 62 31 20 28 73 71 6c 69 74  eFromWkb1 (sqlit
57980 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
57990 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
579a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
579b0 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 67 65 6f   argv).{.    geo
579c0 6d 5f 66 72 6f 6d 5f 77 6b 62 31 20 28 63 6f 6e  m_from_wkb1 (con
579d0 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
579e0 2c 20 28 73 68 6f 72 74 29 20 47 41 49 41 5f 4c  , (short) GAIA_L
579f0 49 4e 45 53 54 52 49 4e 47 29 3b 0a 7d 0a 0a 73  INESTRING);.}..s
57a00 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
57a10 4c 69 6e 65 46 72 6f 6d 57 6b 62 32 20 28 73 71  LineFromWkb2 (sq
57a20 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
57a30 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
57a40 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
57a50 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
57a60 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 32 20 28  geom_from_wkb2 (
57a70 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
57a80 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41 49  rgv, (short) GAI
57a90 41 5f 4c 49 4e 45 53 54 52 49 4e 47 29 3b 0a 7d  A_LINESTRING);.}
57aa0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
57ab0 63 74 5f 50 6f 69 6e 74 46 72 6f 6d 57 6b 62 31  ct_PointFromWkb1
57ac0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
57ad0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
57ae0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
57af0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
57b00 20 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b      geom_from_wk
57b10 62 31 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  b1 (context, arg
57b20 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29  c, argv, (short)
57b30 20 47 41 49 41 5f 50 4f 49 4e 54 29 3b 0a 7d 0a   GAIA_POINT);.}.
57b40 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
57b50 74 5f 50 6f 69 6e 74 46 72 6f 6d 57 6b 62 32 20  t_PointFromWkb2 
57b60 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
57b70 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
57b80 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
57b90 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
57ba0 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62     geom_from_wkb
57bb0 32 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  2 (context, argc
57bc0 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20  , argv, (short) 
57bd0 47 41 49 41 5f 50 4f 49 4e 54 29 3b 0a 7d 0a 0a  GAIA_POINT);.}..
57be0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
57bf0 5f 50 6f 6c 79 46 72 6f 6d 57 6b 62 31 20 28 73  _PolyFromWkb1 (s
57c00 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
57c10 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
57c20 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
57c30 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
57c40 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 31 20   geom_from_wkb1 
57c50 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
57c60 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41  argv, (short) GA
57c70 49 41 5f 50 4f 4c 59 47 4f 4e 29 3b 0a 7d 0a 0a  IA_POLYGON);.}..
57c80 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
57c90 5f 50 6f 6c 79 46 72 6f 6d 57 6b 62 32 20 28 73  _PolyFromWkb2 (s
57ca0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
57cb0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
57cc0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
57cd0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
57ce0 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 32 20   geom_from_wkb2 
57cf0 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
57d00 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47 41  argv, (short) GA
57d10 49 41 5f 50 4f 4c 59 47 4f 4e 29 3b 0a 7d 0a 0a  IA_POLYGON);.}..
57d20 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
57d30 5f 4d 4c 69 6e 65 46 72 6f 6d 57 6b 62 31 20 28  _MLineFromWkb1 (
57d40 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
57d50 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
57d60 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
57d70 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
57d80 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 31    geom_from_wkb1
57d90 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
57da0 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29 20 47   argv, (short) G
57db0 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
57dc0 49 4e 47 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ING);.}..static 
57dd0 76 6f 69 64 0a 66 6e 63 74 5f 4d 4c 69 6e 65 46  void.fnct_MLineF
57de0 72 6f 6d 57 6b 62 32 20 28 73 71 6c 69 74 65 33  romWkb2 (sqlite3
57df0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
57e00 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
57e10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
57e20 72 67 76 29 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f  rgv).{.    geom_
57e30 66 72 6f 6d 5f 77 6b 62 32 20 28 63 6f 6e 74 65  from_wkb2 (conte
57e40 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
57e50 28 73 68 6f 72 74 29 20 47 41 49 41 5f 4d 55 4c  (short) GAIA_MUL
57e60 54 49 4c 49 4e 45 53 54 52 49 4e 47 29 3b 0a 7d  TILINESTRING);.}
57e70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
57e80 63 74 5f 4d 50 6f 69 6e 74 46 72 6f 6d 57 6b 62  ct_MPointFromWkb
57e90 31 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  1 (sqlite3_conte
57ea0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
57eb0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
57ec0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
57ed0 0a 20 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77  .    geom_from_w
57ee0 6b 62 31 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  kb1 (context, ar
57ef0 67 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74  gc, argv, (short
57f00 29 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  ) GAIA_MULTIPOIN
57f10 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  T);.}..static vo
57f20 69 64 0a 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72  id.fnct_MPointFr
57f30 6f 6d 57 6b 62 32 20 28 73 71 6c 69 74 65 33 5f  omWkb2 (sqlite3_
57f40 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
57f50 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
57f60 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
57f70 67 76 29 0a 7b 0a 20 20 20 20 67 65 6f 6d 5f 66  gv).{.    geom_f
57f80 72 6f 6d 5f 77 6b 62 32 20 28 63 6f 6e 74 65 78  rom_wkb2 (contex
57f90 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 28  t, argc, argv, (
57fa0 73 68 6f 72 74 29 20 47 41 49 41 5f 4d 55 4c 54  short) GAIA_MULT
57fb0 49 50 4f 49 4e 54 29 3b 0a 7d 0a 0a 73 74 61 74  IPOINT);.}..stat
57fc0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 50 6f  ic void.fnct_MPo
57fd0 6c 79 46 72 6f 6d 57 6b 62 31 20 28 73 71 6c 69  lyFromWkb1 (sqli
57fe0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
57ff0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
58000 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
58010 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 67 65  * argv).{.    ge
58020 6f 6d 5f 66 72 6f 6d 5f 77 6b 62 31 20 28 63 6f  om_from_wkb1 (co
58030 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
58040 76 2c 20 28 73 68 6f 72 74 29 20 47 41 49 41 5f  v, (short) GAIA_
58050 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 29 3b 0a 7d  MULTIPOLYGON);.}
58060 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
58070 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b 62 32  ct_MPolyFromWkb2
58080 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
58090 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
580a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
580b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
580c0 20 20 20 20 67 65 6f 6d 5f 66 72 6f 6d 5f 77 6b      geom_from_wk
580d0 62 32 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  b2 (context, arg
580e0 63 2c 20 61 72 67 76 2c 20 28 73 68 6f 72 74 29  c, argv, (short)
580f0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
58100 4f 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ON);.}..static v
58110 6f 69 64 0a 66 6e 63 74 5f 57 6b 62 54 6f 53 71  oid.fnct_WkbToSq
58120 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l (sqlite3_conte
58130 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
58140 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
58150 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
58160 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
58170 3a 0a 2f 20 53 54 5f 57 4b 42 54 6f 53 51 4c 28  :./ ST_WKBToSQL(
58180 57 4b 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d  WKB encoded geom
58190 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  etry)././ return
581a0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 65  s the current ge
581b0 6f 6d 65 74 72 79 20 62 79 20 70 61 72 73 69 6e  ometry by parsin
581c0 67 20 61 20 57 4b 42 20 65 6e 63 6f 64 65 64 20  g a WKB encoded 
581d0 62 6c 6f 62 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20  blob ./ or NULL 
581e0 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
581f0 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20  encountered././ 
58200 74 68 65 20 53 52 49 44 20 69 73 20 61 6c 77 61  the SRID is alwa
58210 79 73 20 30 20 5b 53 51 4c 2f 4d 4d 20 66 75 6e  ys 0 [SQL/MM fun
58220 63 74 69 6f 6e 5d 0a 2a 2f 0a 20 20 20 20 69 6e  ction].*/.    in
58230 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  t len;.    int n
58240 5f 62 79 74 65 73 3b 0a 20 20 20 20 75 6e 73 69  _bytes;.    unsi
58250 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73  gned char *p_res
58260 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ult = NULL;.    
58270 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
58280 68 61 72 20 2a 77 6b 62 3b 0a 20 20 20 20 67 61  har *wkb;.    ga
58290 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
582a0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
582b0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
582c0 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
582d0 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
582e0 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
582f0 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
58300 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
58310 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
58320 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
58330 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
58340 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
58350 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
58360 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
58370 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
58380 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
58390 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
583a0 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
583b0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
583c0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
583d0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
583e0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
583f0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
58400 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
58410 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
58420 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
58430 20 77 6b 62 20 3d 20 73 71 6c 69 74 65 33 5f 76   wkb = sqlite3_v
58440 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
58450 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
58460 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
58470 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
58480 3b 0a 20 20 20 20 69 66 20 28 21 63 68 65 63 6b  ;.    if (!check
58490 5f 77 6b 62 20 28 77 6b 62 2c 20 6e 5f 62 79 74  _wkb (wkb, n_byt
584a0 65 73 2c 20 2d 31 29 29 0a 09 72 65 74 75 72 6e  es, -1))..return
584b0 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61  ;.    geo = gaia
584c0 46 72 6f 6d 57 6b 62 20 28 77 6b 62 2c 20 6e 5f  FromWkb (wkb, n_
584d0 62 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28  bytes);.    if (
584e0 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  geo == NULL).   
584f0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
58500 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
58510 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
58520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65  ;.      }.    ge
58530 6f 2d 3e 53 72 69 64 20 3d 20 30 3b 0a 20 20 20  o->Srid = 0;.   
58540 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74   gaiaToSpatiaLit
58550 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f  eBlobWkbEx2 (geo
58560 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
58570 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69  n, gpkg_mode, ti
58580 6e 79 5f 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67  ny_point);.    g
58590 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
585a0 28 67 65 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  (geo);.    sqlit
585b0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
585c0 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
585d0 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d  t, len, free);.}
585e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
585f0 63 74 5f 43 6f 6d 70 72 65 73 73 47 65 6f 6d 65  ct_CompressGeome
58600 74 72 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  try (sqlite3_con
58610 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
58620 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20  int argc,...    
58630 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
58640 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
58650 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43  QL function:./ C
58660 6f 6d 70 72 65 73 73 47 65 6f 6d 65 74 72 79 28  ompressGeometry(
58670 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f  BLOB encoded geo
58680 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72  metry)././ retur
58690 6e 73 20 61 20 43 4f 4d 50 52 45 53 53 45 44 20  ns a COMPRESSED 
586a0 67 65 6f 6d 65 74 72 79 20 5b 69 66 20 61 20 76  geometry [if a v
586b0 61 6c 69 64 20 47 65 6f 6d 65 74 72 79 20 77 61  alid Geometry wa
586c0 73 20 73 75 70 70 6c 69 65 64 5d 0a 2f 20 6f 72  s supplied]./ or
586d0 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68   NULL in any oth
586e0 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75  er case.*/.    u
586f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
58700 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
58710 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c  bytes;.    int l
58720 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
58730 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20   char *p_result 
58740 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
58750 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
58760 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
58770 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
58780 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
58790 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
587a0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
587b0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
587c0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
587d0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
587e0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
587f0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
58800 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
58810 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
58820 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
58830 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
58840 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
58850 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
58860 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
58870 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20  he->gpkg_mode;. 
58880 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
58890 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
588a0 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
588b0 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
588c0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
588d0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
588e0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
588f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
58900 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
58910 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
58920 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
58930 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
58940 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
58950 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
58960 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61  );.    geo =..ga
58970 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
58980 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
58990 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
589a0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
589b0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
589c0 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a  ;.    if (!geo).
589d0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
589e0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
589f0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
58a00 0a 09 20 20 67 61 69 61 54 6f 43 6f 6d 70 72 65  ..  gaiaToCompre
58a10 73 73 65 64 42 6c 6f 62 57 6b 62 20 28 67 65 6f  ssedBlobWkb (geo
58a20 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
58a30 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  n);..  sqlite3_r
58a40 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
58a50 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
58a60 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20  en, free);.     
58a70 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
58a80 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d  eomColl (geo);.}
58a90 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
58aa0 63 74 5f 55 6e 63 6f 6d 70 72 65 73 73 47 65 6f  ct_UncompressGeo
58ab0 6d 65 74 72 79 20 28 73 71 6c 69 74 65 33 5f 63  metry (sqlite3_c
58ac0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
58ad0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
58ae0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
58af0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
58b00 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 63 6f  function:./ Unco
58b10 6d 70 72 65 73 73 47 65 6f 6d 65 74 72 79 28 42  mpressGeometry(B
58b20 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d  LOB encoded geom
58b30 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  etry)././ return
58b40 73 20 61 6e 20 55 4e 43 4f 4d 50 52 45 53 53 45  s an UNCOMPRESSE
58b50 44 20 67 65 6f 6d 65 74 72 79 20 5b 69 66 20 61  D geometry [if a
58b60 20 76 61 6c 69 64 20 47 65 6f 6d 65 74 72 79 20   valid Geometry 
58b70 77 61 73 20 73 75 70 70 6c 69 65 64 5d 20 0a 2f  was supplied] ./
58b80 20 6f 72 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20   or NULL in any 
58b90 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
58ba0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
58bb0 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
58bc0 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
58bd0 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67  t len;.    unsig
58be0 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
58bf0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  lt = NULL;.    g
58c00 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
58c10 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  eo = NULL;.    i
58c20 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
58c30 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
58c40 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
58c50 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
58c60 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
58c70 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
58c80 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
58c90 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
58ca0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
58cb0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
58cc0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
58cd0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
58ce0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
58cf0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
58d00 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
58d10 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
58d20 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
58d30 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
58d40 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
58d50 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
58d60 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
58d70 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
58d80 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
58d90 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
58da0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
58db0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
58dc0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
58dd0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
58de0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
58df0 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
58e00 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
58e10 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
58e20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
58e30 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
58e40 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
58e50 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
58e60 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
58e70 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
58e80 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
58e90 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
58ea0 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
58eb0 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
58ec0 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
58ed0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
58ee0 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
58ef0 20 20 20 7b 0a 09 20 20 67 61 69 61 54 6f 53 70     {..  gaiaToSp
58f00 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
58f10 78 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75  x2 (geo, &p_resu
58f20 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d  lt, &len, gpkg_m
58f30 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 74  ode,.....      t
58f40 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 73  iny_point);..  s
58f50 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
58f60 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
58f70 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
58f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
58f90 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
58fa0 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
58fb0 20 76 6f 69 64 0a 66 6e 63 74 5f 53 61 6e 69 74   void.fnct_Sanit
58fc0 69 7a 65 47 65 6f 6d 65 74 72 79 20 28 73 71 6c  izeGeometry (sql
58fd0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
58fe0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
58ff0 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c 69 74  ,...       sqlit
59000 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
59010 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
59020 69 6f 6e 3a 0a 2f 20 53 61 6e 69 74 69 7a 65 47  ion:./ SanitizeG
59030 65 6f 6d 65 74 72 79 28 42 4c 4f 42 20 65 6e 63  eometry(BLOB enc
59040 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f  oded geometry)./
59050 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 53 41 4e  ./ returns a SAN
59060 49 54 49 5a 45 44 20 67 65 6f 6d 65 74 72 79 20  ITIZED geometry 
59070 5b 69 66 20 61 20 76 61 6c 69 64 20 47 65 6f 6d  [if a valid Geom
59080 65 74 72 79 20 77 61 73 20 73 75 70 70 6c 69 65  etry was supplie
59090 64 5d 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 6e 20  d]./ or NULL in 
590a0 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a 2f  any other case./
590b0 0a 2f 20 53 61 6e 69 74 69 7a 69 6e 67 20 69 6e  ./ Sanitizing in
590c0 63 6c 75 64 65 73 3a 0a 2f 20 2d 20 72 65 70 65  cludes:./ - repe
590d0 61 74 65 64 20 76 65 72 74 69 63 65 73 20 73 75  ated vertices su
590e0 70 70 72 65 73 73 69 6f 6e 0a 2f 20 2d 20 65 6e  ppression./ - en
590f0 66 6f 72 63 69 6e 67 20 72 69 6e 67 20 63 6c 6f  forcing ring clo
59100 73 75 72 65 0a 2f 0a 2a 2f 0a 20 20 20 20 75 6e  sure./.*/.    un
59110 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
59120 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
59130 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
59140 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
59150 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
59160 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
59170 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
59180 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
59190 65 6f 6d 43 6f 6c 6c 50 74 72 20 73 61 6e 69 74  eomCollPtr sanit
591a0 69 7a 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ized = NULL;.   
591b0 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
591c0 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
591d0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
591e0 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
591f0 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
59200 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
59210 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
59220 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
59230 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
59240 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
59250 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
59260 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
59270 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
59280 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
59290 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
592a0 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
592b0 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
592c0 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
592d0 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
592e0 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
592f0 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
59300 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
59310 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
59320 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
59330 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
59340 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
59350 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
59360 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
59370 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
59380 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
59390 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
593a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
593b0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
593c0 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
593d0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
593e0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
593f0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
59400 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
59410 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
59420 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
59430 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
59440 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
59450 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
59460 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
59470 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
59480 20 20 20 20 20 7b 0a 09 20 20 73 61 6e 69 74 69       {..  saniti
59490 7a 65 64 20 3d 20 67 61 69 61 53 61 6e 69 74 69  zed = gaiaSaniti
594a0 7a 65 20 28 67 65 6f 29 3b 0a 09 20 20 67 61 69  ze (geo);..  gai
594b0 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
594c0 62 57 6b 62 45 78 32 20 28 73 61 6e 69 74 69 7a  bWkbEx2 (sanitiz
594d0 65 64 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  ed, &p_result, &
594e0 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  len, gpkg_mode,.
594f0 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70  ....      tiny_p
59500 6f 69 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65  oint);..  sqlite
59510 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
59520 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
59530 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20  , len, free);.  
59540 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
59550 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
59560 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
59570 6f 6d 43 6f 6c 6c 20 28 73 61 6e 69 74 69 7a 65  omColl (sanitize
59580 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  d);.}..static vo
59590 69 64 0a 66 6e 63 74 5f 45 6e 73 75 72 65 43 6c  id.fnct_EnsureCl
595a0 6f 73 65 64 52 69 6e 67 73 20 28 73 71 6c 69 74  osedRings (sqlit
595b0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
595c0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
595d0 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ...sqlite3_value
595e0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
595f0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45  QL function:./ E
59600 6e 73 75 72 65 43 6c 6f 73 65 64 52 69 6e 67 73  nsureClosedRings
59610 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
59620 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
59630 72 6e 73 20 61 20 53 41 4e 49 54 49 5a 45 44 20  rns a SANITIZED 
59640 67 65 6f 6d 65 74 72 79 20 5b 69 66 20 61 20 76  geometry [if a v
59650 61 6c 69 64 20 47 65 6f 6d 65 74 72 79 20 77 61  alid Geometry wa
59660 73 20 73 75 70 70 6c 69 65 64 5d 0a 2f 20 6f 72  s supplied]./ or
59670 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68   NULL in any oth
59680 65 72 20 63 61 73 65 0a 2f 0a 2f 20 53 61 6e 69  er case././ Sani
59690 74 69 7a 69 6e 67 20 69 6e 63 6c 75 64 65 73 20  tizing includes 
596a0 6f 6e 6c 79 20 65 6e 66 6f 72 63 69 6e 67 20 72  only enforcing r
596b0 69 6e 67 20 63 6c 6f 73 75 72 65 20 0a 2f 0a 2a  ing closure ./.*
596c0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
596d0 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
596e0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
596f0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
59700 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
59710 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
59720 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
59730 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
59740 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
59750 74 72 20 73 61 6e 69 74 69 7a 65 64 20 3d 20 4e  tr sanitized = N
59760 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ULL;.    int gpk
59770 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
59780 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
59790 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ode = 0;.    int
597a0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b   tiny_point = 0;
597b0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
597c0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
597d0 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
597e0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
597f0 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
59800 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
59810 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
59820 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
59830 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
59840 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
59850 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
59860 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
59870 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
59880 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
59890 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
598a0 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
598b0 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
598c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
598d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
598e0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
598f0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
59900 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
59910 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
59920 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
59930 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
59940 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
59950 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
59960 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
59970 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
59980 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
59990 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
599a0 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
599b0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
599c0 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
599d0 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
599e0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
599f0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
59a00 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
59a10 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
59a20 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
59a30 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
59a40 20 20 73 61 6e 69 74 69 7a 65 64 20 3d 20 67 61    sanitized = ga
59a50 69 61 45 6e 73 75 72 65 43 6c 6f 73 65 64 52 69  iaEnsureClosedRi
59a60 6e 67 73 20 28 67 65 6f 29 3b 0a 09 20 20 67 61  ngs (geo);..  ga
59a70 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
59a80 6f 62 57 6b 62 45 78 32 20 28 73 61 6e 69 74 69  obWkbEx2 (saniti
59a90 7a 65 64 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  zed, &p_result, 
59aa0 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  &len, gpkg_mode,
59ab0 0a 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f  .....      tiny_
59ac0 70 6f 69 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74  point);..  sqlit
59ad0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
59ae0 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
59af0 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20  t, len, free);. 
59b00 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
59b10 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
59b20 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  );.    gaiaFreeG
59b30 65 6f 6d 43 6f 6c 6c 20 28 73 61 6e 69 74 69 7a  eomColl (sanitiz
59b40 65 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ed);.}..static v
59b50 6f 69 64 0a 66 6e 63 74 5f 52 65 6d 6f 76 65 52  oid.fnct_RemoveR
59b60 65 70 65 61 74 65 64 50 6f 69 6e 74 73 20 28 73  epeatedPoints (s
59b70 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
59b80 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
59b90 67 63 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65  gc,....   sqlite
59ba0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
59bb0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
59bc0 6f 6e 3a 0a 2f 20 52 65 6d 6f 76 65 52 65 70 65  on:./ RemoveRepe
59bd0 61 74 65 64 50 6f 69 6e 74 73 28 42 4c 4f 42 20  atedPoints(BLOB 
59be0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
59bf0 29 0a 2f 20 52 65 6d 6f 76 65 52 65 70 65 61 74  )./ RemoveRepeat
59c00 65 64 50 6f 69 6e 74 73 28 42 4c 4f 42 20 65 6e  edPoints(BLOB en
59c10 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20  coded geometry, 
59c20 64 6f 75 62 6c 65 20 74 6f 6c 65 72 61 6e 63 65  double tolerance
59c30 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20  )././ returns a 
59c40 53 41 4e 49 54 49 5a 45 44 20 67 65 6f 6d 65 74  SANITIZED geomet
59c50 72 79 20 5b 69 66 20 61 20 76 61 6c 69 64 20 47  ry [if a valid G
59c60 65 6f 6d 65 74 72 79 20 77 61 73 20 73 75 70 70  eometry was supp
59c70 6c 69 65 64 5d 0a 2f 20 6f 72 20 4e 55 4c 4c 20  lied]./ or NULL 
59c80 69 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73  in any other cas
59c90 65 0a 2f 0a 2f 20 53 61 6e 69 74 69 7a 69 6e 67  e././ Sanitizing
59ca0 20 69 6e 63 6c 75 64 65 73 20 6f 6e 6c 79 20 72   includes only r
59cb0 65 70 65 61 74 65 64 20 76 65 72 74 69 63 65 73  epeated vertices
59cc0 20 73 75 70 70 72 65 73 73 69 6f 6e 0a 2f 0a 2a   suppression./.*
59cd0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
59ce0 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
59cf0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
59d00 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
59d10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
59d20 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
59d30 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
59d40 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
59d50 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
59d60 74 72 20 73 61 6e 69 74 69 7a 65 64 20 3d 20 4e  tr sanitized = N
59d70 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ULL;.    double 
59d80 74 6f 6c 65 72 61 6e 63 65 20 3d 20 30 2e 30 3b  tolerance = 0.0;
59d90 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
59da0 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
59db0 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
59dc0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
59dd0 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
59de0 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
59df0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
59e00 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
59e10 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
59e20 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
59e30 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
59e40 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
59e50 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
59e60 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
59e70 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
59e80 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
59e90 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
59ea0 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
59eb0 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
59ec0 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
59ed0 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
59ee0 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
59ef0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
59f00 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
59f10 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
59f20 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
59f30 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
59f40 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
59f50 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
59f60 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
59f70 3e 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  >= 2).      {.. 
59f80 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
59f90 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
59fa0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
59fb0 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e  GER)..    {...in
59fc0 74 20 74 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  t tol = sqlite3_
59fd0 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
59fe0 31 5d 29 3b 0a 09 09 74 6f 6c 65 72 61 6e 63 65  1]);...tolerance
59ff0 20 3d 20 74 6f 6c 3b 0a 09 20 20 20 20 7d 0a 09   = tol;..    }..
5a000 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
5a010 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
5a020 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
5a030 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
5a040 74 6f 6c 65 72 61 6e 63 65 20 3d 20 73 71 6c 69  tolerance = sqli
5a050 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
5a060 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 65   (argv[1]);..  e
5a070 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
5a080 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
5a090 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
5a0a0 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
5a0b0 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
5a0c0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5a0d0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
5a0e0 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
5a0f0 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
5a100 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5a110 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
5a120 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72     geo =..gaiaFr
5a130 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
5a140 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
5a150 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
5a160 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
5a170 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
5a180 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c    if (!geo)..sql
5a190 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
5a1a0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
5a1b0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
5a1c0 73 61 6e 69 74 69 7a 65 64 20 3d 20 67 61 69 61  sanitized = gaia
5a1d0 52 65 6d 6f 76 65 52 65 70 65 61 74 65 64 50 6f  RemoveRepeatedPo
5a1e0 69 6e 74 73 20 28 67 65 6f 2c 20 74 6f 6c 65 72  ints (geo, toler
5a1f0 61 6e 63 65 29 3b 0a 09 20 20 67 61 69 61 54 6f  ance);..  gaiaTo
5a200 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
5a210 62 45 78 32 20 28 73 61 6e 69 74 69 7a 65 64 2c  bEx2 (sanitized,
5a220 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
5a230 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
5a240 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e  .      tiny_poin
5a250 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  t);..  sqlite3_r
5a260 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
5a270 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
5a280 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20  en, free);.     
5a290 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
5a2a0 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20  eomColl (geo);. 
5a2b0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
5a2c0 6f 6c 6c 20 28 73 61 6e 69 74 69 7a 65 64 29 3b  oll (sanitized);
5a2d0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
5a2e0 63 61 73 74 5f 63 6f 75 6e 74 20 28 67 61 69 61  cast_count (gaia
5a2f0 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
5a300 2c 20 69 6e 74 20 2a 70 74 73 2c 20 69 6e 74 20  , int *pts, int 
5a310 2a 6c 6e 73 2c 20 69 6e 74 20 2a 70 67 73 29 0a  *lns, int *pgs).
5a320 7b 0a 2f 2a 20 63 6f 75 6e 74 69 6e 67 20 65 6c  {./* counting el
5a330 65 6d 65 6e 74 61 72 79 20 67 65 6f 6d 65 74 72  ementary geometr
5a340 69 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ies */.    int n
5a350 5f 70 74 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  _pts = 0;.    in
5a360 74 20 6e 5f 6c 6e 73 20 3d 20 30 3b 0a 20 20 20  t n_lns = 0;.   
5a370 20 69 6e 74 20 6e 5f 70 67 73 20 3d 20 30 3b 0a   int n_pgs = 0;.
5a380 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72      gaiaPointPtr
5a390 20 70 74 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e   pt;.    gaiaLin
5a3a0 65 73 74 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20  estringPtr ln;. 
5a3b0 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74     gaiaPolygonPt
5a3c0 72 20 70 67 3b 0a 20 20 20 20 69 66 20 28 67 65  r pg;.    if (ge
5a3d0 6f 6d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70  om).      {..  p
5a3e0 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  t = geom->FirstP
5a3f0 6f 69 6e 74 3b 0a 09 20 20 77 68 69 6c 65 20 28  oint;..  while (
5a400 70 74 29 0a 09 20 20 20 20 7b 0a 09 09 6e 5f 70  pt)..    {...n_p
5a410 74 73 2b 2b 3b 0a 09 09 70 74 20 3d 20 70 74 2d  ts++;...pt = pt-
5a420 3e 4e 65 78 74 3b 0a 09 20 20 20 20 7d 0a 09 20  >Next;..    }.. 
5a430 20 6c 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73   ln = geom->Firs
5a440 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09 20 20  tLinestring;..  
5a450 77 68 69 6c 65 20 28 6c 6e 29 0a 09 20 20 20 20  while (ln)..    
5a460 7b 0a 09 09 6e 5f 6c 6e 73 2b 2b 3b 0a 09 09 6c  {...n_lns++;...l
5a470 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74 3b 0a 09 20  n = ln->Next;.. 
5a480 20 20 20 7d 0a 09 20 20 70 67 20 3d 20 67 65 6f     }..  pg = geo
5a490 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b  m->FirstPolygon;
5a4a0 0a 09 20 20 77 68 69 6c 65 20 28 70 67 29 0a 09  ..  while (pg)..
5a4b0 20 20 20 20 7b 0a 09 09 6e 5f 70 67 73 2b 2b 3b      {...n_pgs++;
5a4c0 0a 09 09 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74  ...pg = pg->Next
5a4d0 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
5a4e0 0a 20 20 20 20 2a 70 74 73 20 3d 20 6e 5f 70 74  .    *pts = n_pt
5a4f0 73 3b 0a 20 20 20 20 2a 6c 6e 73 20 3d 20 6e 5f  s;.    *lns = n_
5a500 6c 6e 73 3b 0a 20 20 20 20 2a 70 67 73 20 3d 20  lns;.    *pgs = 
5a510 6e 5f 70 67 73 3b 0a 7d 0a 0a 73 74 61 74 69 63  n_pgs;.}..static
5a520 20 76 6f 69 64 0a 66 6e 63 74 5f 43 61 73 74 41   void.fnct_CastA
5a530 75 74 6f 6d 61 67 69 63 20 28 73 71 6c 69 74 65  utomagic (sqlite
5a540 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
5a550 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
5a560 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
5a570 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
5a580 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 61 73 74 41  unction:./ CastA
5a590 75 74 6f 6d 61 67 69 63 28 42 4c 4f 42 20 65 6e  utomagic(BLOB en
5a5a0 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
5a5b0 2f 0a 2f 20 61 63 63 65 70 74 73 20 6f 6e 20 69  /./ accepts on i
5a5c0 6e 70 75 74 20 62 6f 74 68 20 61 20 76 61 6c 69  nput both a vali
5a5d0 64 20 53 70 61 74 69 61 4c 69 74 65 20 42 4c 4f  d SpatiaLite BLO
5a5e0 42 20 67 65 6f 6d 65 74 72 79 0a 2f 20 6f 72 20  B geometry./ or 
5a5f0 61 20 76 61 6c 69 64 20 47 50 4b 47 20 42 4c 4f  a valid GPKG BLO
5a600 42 20 67 65 6f 6d 65 74 72 79 2c 20 74 68 75 73  B geometry, thus
5a610 20 72 65 74 75 72 6e 69 6e 67 20 61 20 53 70 61   returning a Spa
5a620 74 69 61 4c 69 74 65 0a 2f 20 42 4c 4f 42 20 67  tiaLite./ BLOB g
5a630 65 6f 6d 65 74 72 79 20 0a 2f 20 77 69 6c 6c 20  eometry ./ will 
5a640 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 6e 20 61  return NULL in a
5a650 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f  ny other case.*/
5a660 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
5a670 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
5a680 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
5a690 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e   int len;.    un
5a6a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72  signed char *p_r
5a6b0 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  esult = NULL;.  
5a6c0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
5a6d0 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
5a6e0 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
5a6f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
5a700 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
5a710 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
5a720 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
5a730 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
5a740 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
5a750 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
5a760 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
5a770 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
5a780 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
5a790 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
5a7a0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
5a7b0 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20  e->gpkg_mode;.. 
5a7c0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61   tiny_point = ca
5a7d0 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e  che->tinyPointEn
5a7e0 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  abled;.      }. 
5a7f0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
5a800 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
5a810 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
5a820 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
5a830 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
5a840 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
5a850 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
5a860 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
5a870 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
5a880 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5a890 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
5a8a0 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
5a8b0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
5a8c0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
5a8d0 65 6f 20 3d 20 67 61 69 61 46 72 6f 6d 53 70 61  eo = gaiaFromSpa
5a8e0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 20 28  tiaLiteBlobWkb (
5a8f0 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29  p_blob, n_bytes)
5a900 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a  ;.    if (!geo).
5a910 20 20 20 20 20 20 7b 0a 23 69 66 64 65 66 20 45        {.#ifdef E
5a920 4e 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45  NABLE_GEOPACKAGE
5a930 09 2f 2a 20 47 45 4f 50 41 43 4b 41 47 45 20 65  ./* GEOPACKAGE e
5a940 6e 61 62 6c 65 64 3a 20 73 75 70 70 6f 72 74 69  nabled: supporti
5a950 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69  ng GPKG geometri
5a960 65 73 20 2a 2f 0a 09 20 20 69 66 20 28 67 61 69  es */..  if (gai
5a970 61 49 73 56 61 6c 69 64 47 50 42 20 28 70 5f 62  aIsValidGPB (p_b
5a980 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 29 0a 09  lob, n_bytes))..
5a990 20 20 20 20 7b 0a 09 09 67 65 6f 20 3d 20 67 61      {...geo = ga
5a9a0 69 61 46 72 6f 6d 47 65 6f 50 61 63 6b 61 67 65  iaFromGeoPackage
5a9b0 47 65 6f 6d 65 74 72 79 42 6c 6f 62 20 28 70 5f  GeometryBlob (p_
5a9c0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a  blob, n_bytes);.
5a9d0 09 09 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c  ..if (geo == NUL
5a9e0 4c 29 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33  L)...    sqlite3
5a9f0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
5aa00 6e 74 65 78 74 29 3b 0a 09 09 65 6c 73 65 0a 09  ntext);...else..
5aa10 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69  .  {...      gai
5aa20 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
5aa30 62 57 6b 62 45 78 32 20 28 67 65 6f 2c 20 26 70  bWkbEx2 (geo, &p
5aa40 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09  _result, &len,..
5aa50 09 09 09 09 09 20 20 67 70 6b 67 5f 6d 6f 64 65  .....  gpkg_mode
5aa60 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09  , tiny_point);..
5aa70 09 20 20 20 20 20 20 67 61 69 61 46 72 65 65 47  .      gaiaFreeG
5aa80 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09  eomColl (geo);..
5aa90 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5aaa0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
5aab0 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
5aac0 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 20 20 7d  en, free);...  }
5aad0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
5aae0 7d 0a 09 20 20 65 6c 73 65 0a 23 65 6e 64 69 66  }..  else.#endif
5aaf0 20 2f 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b 41   /* end GEOPACKA
5ab00 47 45 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47  GE: supporting G
5ab10 50 4b 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a  PKG geometries *
5ab20 2f 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  /..      sqlite3
5ab30 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
5ab40 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
5ab50 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
5ab60 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61  ..  gaiaToSpatia
5ab70 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
5ab80 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  geo, &p_result, 
5ab90 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  &len, gpkg_mode,
5aba0 0a 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f  .....      tiny_
5abb0 70 6f 69 6e 74 29 3b 0a 09 20 20 67 61 69 61 46  point);..  gaiaF
5abc0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
5abd0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
5abe0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
5abf0 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
5ac00 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20  n, free);.      
5ac10 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
5ac20 0a 66 6e 63 74 5f 43 61 73 74 54 6f 50 6f 69 6e  .fnct_CastToPoin
5ac30 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  t (sqlite3_conte
5ac40 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
5ac50 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
5ac60 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
5ac70 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
5ac80 3a 0a 2f 20 43 61 73 74 54 6f 50 6f 69 6e 74 28  :./ CastToPoint(
5ac90 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f  BLOB encoded geo
5aca0 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72  metry)././ retur
5acb0 6e 73 20 61 20 50 4f 49 4e 54 2d 74 79 70 65 20  ns a POINT-type 
5acc0 67 65 6f 6d 65 74 72 79 20 5b 69 66 20 63 6f 6e  geometry [if con
5acd0 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69  version is possi
5ace0 62 6c 65 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20  ble] ./ or NULL 
5acf0 69 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73  in any other cas
5ad00 65 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  e.*/.    unsigne
5ad10 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
5ad20 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
5ad30 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
5ad40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5ad50 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
5ad60 3b 0a 20 20 20 20 69 6e 74 20 70 74 73 3b 0a 20  ;.    int pts;. 
5ad70 20 20 20 69 6e 74 20 6c 6e 73 3b 0a 20 20 20 20     int lns;.    
5ad80 69 6e 74 20 70 67 73 3b 0a 20 20 20 20 67 61 69  int pgs;.    gai
5ad90 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
5ada0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
5adb0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
5adc0 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  m2 = NULL;.    i
5add0 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
5ade0 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
5adf0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
5ae00 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
5ae10 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
5ae20 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
5ae30 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
5ae40 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
5ae50 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
5ae60 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
5ae70 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
5ae80 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
5ae90 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
5aea0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
5aeb0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
5aec0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
5aed0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
5aee0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
5aef0 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
5af00 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
5af10 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
5af20 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
5af30 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
5af40 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
5af50 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
5af60 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
5af70 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
5af80 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
5af90 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
5afa0 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
5afb0 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
5afc0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
5afd0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
5afe0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5aff0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
5b000 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
5b010 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
5b020 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
5b030 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
5b040 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
5b050 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
5b060 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
5b070 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
5b080 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
5b090 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
5b0a0 20 20 20 7b 0a 09 20 20 63 61 73 74 5f 63 6f 75     {..  cast_cou
5b0b0 6e 74 20 28 67 65 6f 2c 20 26 70 74 73 2c 20 26  nt (geo, &pts, &
5b0c0 6c 6e 73 2c 20 26 70 67 73 29 3b 0a 09 20 20 69  lns, &pgs);..  i
5b0d0 66 20 28 70 74 73 20 3d 3d 20 31 20 26 26 20 6c  f (pts == 1 && l
5b0e0 6e 73 20 3d 3d 20 30 20 26 26 20 70 67 73 20 3d  ns == 0 && pgs =
5b0f0 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 67 65  = 0)..    {...ge
5b100 6f 6d 32 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47  om2 = gaiaCloneG
5b110 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09  eomColl (geo);..
5b120 09 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d 20 67  .geom2->Srid = g
5b130 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 65 6f 6d  eo->Srid;...geom
5b140 32 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20  2->DeclaredType 
5b150 3d 20 47 41 49 41 5f 50 4f 49 4e 54 3b 0a 09 09  = GAIA_POINT;...
5b160 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
5b170 42 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d  BlobWkbEx2 (geom
5b180 32 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c  2, &p_result, &l
5b190 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  en, gpkg_mode,..
5b1a0 09 09 09 09 20 20 20 20 74 69 6e 79 5f 70 6f 69  ....    tiny_poi
5b1b0 6e 74 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47  nt);...gaiaFreeG
5b1c0 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b  eomColl (geom2);
5b1d0 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
5b1e0 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
5b1f0 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
5b200 66 72 65 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20  free);..    }.. 
5b210 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c   else..      sql
5b220 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
5b230 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
5b240 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
5b250 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
5b260 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
5b270 6e 63 74 5f 43 61 73 74 54 6f 4c 69 6e 65 73 74  nct_CastToLinest
5b280 72 69 6e 67 20 28 73 71 6c 69 74 65 33 5f 63 6f  ring (sqlite3_co
5b290 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
5b2a0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
5b2b0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5b2c0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
5b2d0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
5b2e0 43 61 73 74 54 6f 4c 69 6e 65 73 74 72 69 6e 67  CastToLinestring
5b2f0 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
5b300 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
5b310 72 6e 73 20 61 20 4c 49 4e 45 53 54 52 49 4e 47  rns a LINESTRING
5b320 2d 74 79 70 65 20 67 65 6f 6d 65 74 72 79 20 5b  -type geometry [
5b330 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  if conversion is
5b340 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72   possible] ./ or
5b350 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68   NULL in any oth
5b360 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75  er case.*/.    u
5b370 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
5b380 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
5b390 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c  bytes;.    int l
5b3a0 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
5b3b0 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20   char *p_result 
5b3c0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
5b3d0 70 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73  pts;.    int lns
5b3e0 3b 0a 20 20 20 20 69 6e 74 20 70 67 73 3b 0a 20  ;.    int pgs;. 
5b3f0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
5b400 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
5b410 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
5b420 74 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b  tr geom2 = NULL;
5b430 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
5b440 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
5b450 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
5b460 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
5b470 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
5b480 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
5b490 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
5b4a0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
5b4b0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
5b4c0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
5b4d0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
5b4e0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
5b4f0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
5b500 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
5b510 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
5b520 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
5b530 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
5b540 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
5b550 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
5b560 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
5b570 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
5b580 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
5b590 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
5b5a0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
5b5b0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
5b5c0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
5b5d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5b5e0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
5b5f0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
5b600 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
5b610 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5b620 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
5b630 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
5b640 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
5b650 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5b660 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
5b670 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
5b680 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
5b690 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
5b6a0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
5b6b0 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
5b6c0 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
5b6d0 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74  if (!geo)..sqlit
5b6e0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
5b6f0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
5b700 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 61  se.      {..  ca
5b710 73 74 5f 63 6f 75 6e 74 20 28 67 65 6f 2c 20 26  st_count (geo, &
5b720 70 74 73 2c 20 26 6c 6e 73 2c 20 26 70 67 73 29  pts, &lns, &pgs)
5b730 3b 0a 09 20 20 69 66 20 28 70 74 73 20 3d 3d 20  ;..  if (pts == 
5b740 30 20 26 26 20 6c 6e 73 20 3d 3d 20 31 20 26 26  0 && lns == 1 &&
5b750 20 70 67 73 20 3d 3d 20 30 29 0a 09 20 20 20 20   pgs == 0)..    
5b760 7b 0a 09 09 67 65 6f 6d 32 20 3d 20 67 61 69 61  {...geom2 = gaia
5b770 43 6c 6f 6e 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  CloneGeomColl (g
5b780 65 6f 29 3b 0a 09 09 67 65 6f 6d 32 2d 3e 53 72  eo);...geom2->Sr
5b790 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a  id = geo->Srid;.
5b7a0 09 09 67 65 6f 6d 32 2d 3e 44 65 63 6c 61 72 65  ..geom2->Declare
5b7b0 64 54 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e  dType = GAIA_LIN
5b7c0 45 53 54 52 49 4e 47 3b 0a 09 09 67 61 69 61 54  ESTRING;...gaiaT
5b7d0 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
5b7e0 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c 20 26 70  kbEx2 (geom2, &p
5b7f0 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67  _result, &len, g
5b800 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 20  pkg_mode,...... 
5b810 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a     tiny_point);.
5b820 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
5b830 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 09 09 73 71  ll (geom2);...sq
5b840 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
5b850 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
5b860 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
5b870 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
5b880 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
5b890 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
5b8a0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
5b8b0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
5b8c0 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
5b8d0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43  atic void.fnct_C
5b8e0 61 73 74 54 6f 50 6f 6c 79 67 6f 6e 20 28 73 71  astToPolygon (sq
5b8f0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
5b900 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
5b910 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5b920 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
5b930 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43  QL function:./ C
5b940 61 73 74 54 6f 50 6f 6c 79 67 6f 6e 28 42 4c 4f  astToPolygon(BLO
5b950 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  B encoded geomet
5b960 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  ry)././ returns 
5b970 61 20 50 4f 4c 59 47 4f 4e 2d 74 79 70 65 20 67  a POLYGON-type g
5b980 65 6f 6d 65 74 72 79 20 5b 69 66 20 63 6f 6e 76  eometry [if conv
5b990 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  ersion is possib
5b9a0 6c 65 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  le] ./ or NULL i
5b9b0 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65  n any other case
5b9c0 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
5b9d0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
5b9e0 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
5b9f0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
5ba00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5ba10 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
5ba20 0a 20 20 20 20 69 6e 74 20 70 74 73 3b 0a 20 20  .    int pts;.  
5ba30 20 20 69 6e 74 20 6c 6e 73 3b 0a 20 20 20 20 69    int lns;.    i
5ba40 6e 74 20 70 67 73 3b 0a 20 20 20 20 67 61 69 61  nt pgs;.    gaia
5ba50 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
5ba60 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
5ba70 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
5ba80 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  2 = NULL;.    in
5ba90 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
5baa0 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
5bab0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
5bac0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
5bad0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
5bae0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
5baf0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
5bb00 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
5bb10 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
5bb20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
5bb30 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
5bb40 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
5bb50 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
5bb60 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
5bb70 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
5bb80 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
5bb90 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
5bba0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
5bbb0 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
5bbc0 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
5bbd0 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
5bbe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
5bbf0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
5bc00 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
5bc10 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
5bc20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
5bc30 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
5bc40 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
5bc50 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5bc60 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
5bc70 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
5bc80 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
5bc90 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
5bca0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
5bcb0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
5bcc0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
5bcd0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
5bce0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
5bcf0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
5bd00 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
5bd10 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
5bd20 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
5bd30 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
5bd40 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
5bd50 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
5bd60 20 20 7b 0a 09 20 20 63 61 73 74 5f 63 6f 75 6e    {..  cast_coun
5bd70 74 20 28 67 65 6f 2c 20 26 70 74 73 2c 20 26 6c  t (geo, &pts, &l
5bd80 6e 73 2c 20 26 70 67 73 29 3b 0a 09 20 20 69 66  ns, &pgs);..  if
5bd90 20 28 70 74 73 20 3d 3d 20 30 20 26 26 20 6c 6e   (pts == 0 && ln
5bda0 73 20 3d 3d 20 30 20 26 26 20 70 67 73 20 3d 3d  s == 0 && pgs ==
5bdb0 20 31 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f   1)..    {...geo
5bdc0 6d 32 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47 65  m2 = gaiaCloneGe
5bdd0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 09  omColl (geo);...
5bde0 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d 20 67 65  geom2->Srid = ge
5bdf0 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 65 6f 6d 32  o->Srid;...geom2
5be00 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
5be10 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 09   GAIA_POLYGON;..
5be20 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74  .gaiaToSpatiaLit
5be30 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f  eBlobWkbEx2 (geo
5be40 6d 32 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  m2, &p_result, &
5be50 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  len, gpkg_mode,.
5be60 09 09 09 09 09 20 20 20 20 74 69 6e 79 5f 70 6f  .....    tiny_po
5be70 69 6e 74 29 3b 0a 09 09 67 61 69 61 46 72 65 65  int);...gaiaFree
5be80 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29  GeomColl (geom2)
5be90 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
5bea0 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
5beb0 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c  , p_result, len,
5bec0 20 66 72 65 65 29 3b 0a 09 20 20 20 20 7d 0a 09   free);..    }..
5bed0 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71    else..      sq
5bee0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
5bef0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
5bf00 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
5bf10 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
5bf20 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
5bf30 66 6e 63 74 5f 43 61 73 74 54 6f 4d 75 6c 74 69  fnct_CastToMulti
5bf40 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33 5f 63  Point (sqlite3_c
5bf50 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
5bf60 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20  , int argc,...  
5bf70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
5bf80 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
5bf90 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
5bfa0 20 43 61 73 74 54 6f 4d 75 6c 74 69 50 6f 69 6e   CastToMultiPoin
5bfb0 74 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67  t(BLOB encoded g
5bfc0 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74  eometry)././ ret
5bfd0 75 72 6e 73 20 61 20 4d 55 4c 54 49 50 4f 49 4e  urns a MULTIPOIN
5bfe0 54 2d 74 79 70 65 20 67 65 6f 6d 65 74 72 79 20  T-type geometry 
5bff0 5b 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  [if conversion i
5c000 73 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f  s possible] ./ o
5c010 72 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74  r NULL in any ot
5c020 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20  her case.*/.    
5c030 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
5c040 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
5c050 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
5c060 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  len;.    unsigne
5c070 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
5c080 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
5c090 20 70 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6e   pts;.    int ln
5c0a0 73 3b 0a 20 20 20 20 69 6e 74 20 70 67 73 3b 0a  s;.    int pgs;.
5c0b0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
5c0c0 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a  Ptr geo = NULL;.
5c0d0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
5c0e0 50 74 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c  Ptr geom2 = NULL
5c0f0 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
5c100 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
5c110 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
5c120 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69   = 0;.    int ti
5c130 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  ny_point = 0;.  
5c140 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
5c150 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
5c160 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
5c170 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
5c180 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
5c190 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
5c1a0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
5c1b0 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
5c1c0 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
5c1d0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
5c1e0 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
5c1f0 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
5c200 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
5c210 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
5c220 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
5c230 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
5c240 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
5c250 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
5c260 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
5c270 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
5c280 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
5c290 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5c2a0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
5c2b0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
5c2c0 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
5c2d0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
5c2e0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
5c2f0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
5c300 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
5c310 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
5c320 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
5c330 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f    geo =..gaiaFro
5c340 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
5c350 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
5c360 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
5c370 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
5c380 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
5c390 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69   if (!geo)..sqli
5c3a0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
5c3b0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
5c3c0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63  lse.      {..  c
5c3d0 61 73 74 5f 63 6f 75 6e 74 20 28 67 65 6f 2c 20  ast_count (geo, 
5c3e0 26 70 74 73 2c 20 26 6c 6e 73 2c 20 26 70 67 73  &pts, &lns, &pgs
5c3f0 29 3b 0a 09 20 20 69 66 20 28 70 74 73 20 3e 3d  );..  if (pts >=
5c400 20 31 20 26 26 20 6c 6e 73 20 3d 3d 20 30 20 26   1 && lns == 0 &
5c410 26 20 70 67 73 20 3d 3d 20 30 29 0a 09 20 20 20  & pgs == 0)..   
5c420 20 7b 0a 09 09 67 65 6f 6d 32 20 3d 20 67 61 69   {...geom2 = gai
5c430 61 43 6c 6f 6e 65 47 65 6f 6d 43 6f 6c 6c 20 28  aCloneGeomColl (
5c440 67 65 6f 29 3b 0a 09 09 67 65 6f 6d 32 2d 3e 53  geo);...geom2->S
5c450 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b  rid = geo->Srid;
5c460 0a 09 09 67 65 6f 6d 32 2d 3e 44 65 63 6c 61 72  ...geom2->Declar
5c470 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f 4d 55  edType = GAIA_MU
5c480 4c 54 49 50 4f 49 4e 54 3b 0a 09 09 67 61 69 61  LTIPOINT;...gaia
5c490 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
5c4a0 57 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c 20 26  WkbEx2 (geom2, &
5c4b0 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20  p_result, &len, 
5c4c0 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 09  gpkg_mode,......
5c4d0 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b      tiny_point);
5c4e0 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43  ...gaiaFreeGeomC
5c4f0 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 09 09 73  oll (geom2);...s
5c500 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
5c510 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
5c520 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
5c530 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
5c540 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  e..      sqlite3
5c550 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
5c560 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
5c570 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
5c580 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73  Coll (geo);.}..s
5c590 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
5c5a0 43 61 73 74 54 6f 4d 75 6c 74 69 4c 69 6e 65 73  CastToMultiLines
5c5b0 74 72 69 6e 67 20 28 73 71 6c 69 74 65 33 5f 63  tring (sqlite3_c
5c5c0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
5c5d0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
5c5e0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5c5f0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
5c600 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43  QL function:./ C
5c610 61 73 74 54 6f 4d 75 6c 74 69 4c 69 6e 65 73 74  astToMultiLinest
5c620 72 69 6e 67 28 42 4c 4f 42 20 65 6e 63 6f 64 65  ring(BLOB encode
5c630 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20  d geometry)././ 
5c640 72 65 74 75 72 6e 73 20 61 20 4d 55 4c 54 49 4c  returns a MULTIL
5c650 49 4e 45 53 54 52 49 4e 47 2d 74 79 70 65 20 67  INESTRING-type g
5c660 65 6f 6d 65 74 72 79 20 5b 69 66 20 63 6f 6e 76  eometry [if conv
5c670 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  ersion is possib
5c680 6c 65 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  le] ./ or NULL i
5c690 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65  n any other case
5c6a0 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
5c6b0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
5c6c0 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
5c6d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
5c6e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5c6f0 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
5c700 0a 20 20 20 20 69 6e 74 20 70 74 73 3b 0a 20 20  .    int pts;.  
5c710 20 20 69 6e 74 20 6c 6e 73 3b 0a 20 20 20 20 69    int lns;.    i
5c720 6e 74 20 70 67 73 3b 0a 20 20 20 20 67 61 69 61  nt pgs;.    gaia
5c730 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
5c740 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
5c750 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
5c760 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  2 = NULL;.    in
5c770 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
5c780 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
5c790 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
5c7a0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
5c7b0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
5c7c0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
5c7d0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
5c7e0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
5c7f0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
5c800 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
5c810 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
5c820 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
5c830 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
5c840 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
5c850 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
5c860 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
5c870 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
5c880 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
5c890 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
5c8a0 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
5c8b0 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
5c8c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
5c8d0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
5c8e0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
5c8f0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
5c900 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
5c910 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
5c920 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
5c930 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5c940 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
5c950 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
5c960 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
5c970 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
5c980 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
5c990 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
5c9a0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
5c9b0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
5c9c0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
5c9d0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
5c9e0 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
5c9f0 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
5ca00 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
5ca10 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
5ca20 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
5ca30 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
5ca40 20 20 7b 0a 09 20 20 63 61 73 74 5f 63 6f 75 6e    {..  cast_coun
5ca50 74 20 28 67 65 6f 2c 20 26 70 74 73 2c 20 26 6c  t (geo, &pts, &l
5ca60 6e 73 2c 20 26 70 67 73 29 3b 0a 09 20 20 69 66  ns, &pgs);..  if
5ca70 20 28 70 74 73 20 3d 3d 20 30 20 26 26 20 6c 6e   (pts == 0 && ln
5ca80 73 20 3e 3d 20 31 20 26 26 20 70 67 73 20 3d 3d  s >= 1 && pgs ==
5ca90 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f   0)..    {...geo
5caa0 6d 32 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47 65  m2 = gaiaCloneGe
5cab0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 09  omColl (geo);...
5cac0 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d 20 67 65  geom2->Srid = ge
5cad0 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 65 6f 6d 32  o->Srid;...geom2
5cae0 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
5caf0 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
5cb00 54 52 49 4e 47 3b 0a 09 09 67 61 69 61 54 6f 53  TRING;...gaiaToS
5cb10 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
5cb20 45 78 32 20 28 67 65 6f 6d 32 2c 20 26 70 5f 72  Ex2 (geom2, &p_r
5cb30 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b  esult, &len, gpk
5cb40 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 20  g_mode,......   
5cb50 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09   tiny_point);...
5cb60 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
5cb70 20 28 67 65 6f 6d 32 29 3b 0a 09 09 73 71 6c 69   (geom2);...sqli
5cb80 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
5cb90 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
5cba0 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
5cbb0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
5cbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5cbd0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
5cbe0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
5cbf0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
5cc00 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74  l (geo);.}..stat
5cc10 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 61 73  ic void.fnct_Cas
5cc20 74 54 6f 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 20  tToMultiPolygon 
5cc30 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5cc40 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
5cc50 61 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65  argc,.... sqlite
5cc60 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
5cc70 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
5cc80 6f 6e 3a 0a 2f 20 43 61 73 74 54 6f 4d 75 6c 74  on:./ CastToMult
5cc90 69 50 6f 6c 79 67 6f 6e 28 42 4c 4f 42 20 65 6e  iPolygon(BLOB en
5cca0 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
5ccb0 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 4d 55  /./ returns a MU
5ccc0 4c 54 49 50 4f 4c 59 47 4f 4e 2d 74 79 70 65 20  LTIPOLYGON-type 
5ccd0 67 65 6f 6d 65 74 72 79 20 5b 69 66 20 63 6f 6e  geometry [if con
5cce0 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69  version is possi
5ccf0 62 6c 65 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20  ble] ./ or NULL 
5cd00 69 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73  in any other cas
5cd10 65 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  e.*/.    unsigne
5cd20 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
5cd30 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
5cd40 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
5cd50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5cd60 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
5cd70 3b 0a 20 20 20 20 69 6e 74 20 70 74 73 3b 0a 20  ;.    int pts;. 
5cd80 20 20 20 69 6e 74 20 6c 6e 73 3b 0a 20 20 20 20     int lns;.    
5cd90 69 6e 74 20 70 67 73 3b 0a 20 20 20 20 67 61 69  int pgs;.    gai
5cda0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
5cdb0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
5cdc0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
5cdd0 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  m2 = NULL;.    i
5cde0 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
5cdf0 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
5ce00 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
5ce10 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
5ce20 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
5ce30 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
5ce40 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
5ce50 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
5ce60 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
5ce70 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
5ce80 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
5ce90 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
5cea0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
5ceb0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
5cec0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
5ced0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
5cee0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
5cef0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
5cf00 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
5cf10 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
5cf20 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
5cf30 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
5cf40 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
5cf50 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
5cf60 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
5cf70 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
5cf80 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
5cf90 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
5cfa0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
5cfb0 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
5cfc0 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
5cfd0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
5cfe0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
5cff0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5d000 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
5d010 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
5d020 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
5d030 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
5d040 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
5d050 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
5d060 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
5d070 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
5d080 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
5d090 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
5d0a0 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
5d0b0 20 20 20 7b 0a 09 20 20 63 61 73 74 5f 63 6f 75     {..  cast_cou
5d0c0 6e 74 20 28 67 65 6f 2c 20 26 70 74 73 2c 20 26  nt (geo, &pts, &
5d0d0 6c 6e 73 2c 20 26 70 67 73 29 3b 0a 09 20 20 69  lns, &pgs);..  i
5d0e0 66 20 28 70 74 73 20 3d 3d 20 30 20 26 26 20 6c  f (pts == 0 && l
5d0f0 6e 73 20 3d 3d 20 30 20 26 26 20 70 67 73 20 3e  ns == 0 && pgs >
5d100 3d 20 31 29 0a 09 20 20 20 20 7b 0a 09 09 67 65  = 1)..    {...ge
5d110 6f 6d 32 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47  om2 = gaiaCloneG
5d120 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09  eomColl (geo);..
5d130 09 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d 20 67  .geom2->Srid = g
5d140 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 65 6f 6d  eo->Srid;...geom
5d150 32 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20  2->DeclaredType 
5d160 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
5d170 47 4f 4e 3b 0a 09 09 67 61 69 61 54 6f 53 70 61  GON;...gaiaToSpa
5d180 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
5d190 32 20 28 67 65 6f 6d 32 2c 20 26 70 5f 72 65 73  2 (geom2, &p_res
5d1a0 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f  ult, &len, gpkg_
5d1b0 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 20 20 74  mode,......    t
5d1c0 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 67 61  iny_point);...ga
5d1d0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
5d1e0 67 65 6f 6d 32 29 3b 0a 09 09 73 71 6c 69 74 65  geom2);...sqlite
5d1f0 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
5d200 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
5d210 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20  , len, free);.. 
5d220 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
5d230 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5d240 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
5d250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
5d260 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
5d270 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
5d280 20 76 6f 69 64 0a 66 6e 63 74 5f 43 61 73 74 54   void.fnct_CastT
5d290 6f 47 65 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74  oGeometryCollect
5d2a0 69 6f 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ion (sqlite3_con
5d2b0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
5d2c0 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  int argc,....   
5d2d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5d2e0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
5d2f0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
5d300 43 61 73 74 54 6f 47 65 6f 6d 65 74 72 79 43 6f  CastToGeometryCo
5d310 6c 6c 65 63 74 69 6f 6e 28 42 4c 4f 42 20 65 6e  llection(BLOB en
5d320 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
5d330 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 47 45  /./ returns a GE
5d340 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
5d350 2d 74 79 70 65 20 67 65 6f 6d 65 74 72 79 20 5b  -type geometry [
5d360 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  if conversion is
5d370 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72   possible] ./ or
5d380 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68   NULL in any oth
5d390 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75  er case.*/.    u
5d3a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
5d3b0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
5d3c0 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c  bytes;.    int l
5d3d0 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
5d3e0 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20   char *p_result 
5d3f0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
5d400 70 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73  pts;.    int lns
5d410 3b 0a 20 20 20 20 69 6e 74 20 70 67 73 3b 0a 20  ;.    int pgs;. 
5d420 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
5d430 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
5d440 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
5d450 74 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b  tr geom2 = NULL;
5d460 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
5d470 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
5d480 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
5d490 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
5d4a0 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
5d4b0 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
5d4c0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
5d4d0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
5d4e0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
5d4f0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
5d500 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
5d510 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
5d520 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
5d530 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
5d540 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
5d550 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
5d560 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
5d570 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
5d580 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
5d590 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
5d5a0 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
5d5b0 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
5d5c0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
5d5d0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
5d5e0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
5d5f0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
5d600 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5d610 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
5d620 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
5d630 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
5d640 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5d650 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
5d660 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
5d670 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
5d680 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5d690 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
5d6a0 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
5d6b0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
5d6c0 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
5d6d0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
5d6e0 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
5d6f0 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
5d700 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74  if (!geo)..sqlit
5d710 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
5d720 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
5d730 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 61  se.      {..  ca
5d740 73 74 5f 63 6f 75 6e 74 20 28 67 65 6f 2c 20 26  st_count (geo, &
5d750 70 74 73 2c 20 26 6c 6e 73 2c 20 26 70 67 73 29  pts, &lns, &pgs)
5d760 3b 0a 09 20 20 69 66 20 28 70 74 73 20 3e 3d 20  ;..  if (pts >= 
5d770 31 20 7c 7c 20 6c 6e 73 20 3e 3d 20 31 20 7c 7c  1 || lns >= 1 ||
5d780 20 70 67 73 20 3e 3d 20 31 29 0a 09 20 20 20 20   pgs >= 1)..    
5d790 7b 0a 09 09 67 65 6f 6d 32 20 3d 20 67 61 69 61  {...geom2 = gaia
5d7a0 43 6c 6f 6e 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  CloneGeomColl (g
5d7b0 65 6f 29 3b 0a 09 09 67 65 6f 6d 32 2d 3e 53 72  eo);...geom2->Sr
5d7c0 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a  id = geo->Srid;.
5d7d0 09 09 67 65 6f 6d 32 2d 3e 44 65 63 6c 61 72 65  ..geom2->Declare
5d7e0 64 54 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f  dType = GAIA_GEO
5d7f0 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b  METRYCOLLECTION;
5d800 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c  ...gaiaToSpatiaL
5d810 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67  iteBlobWkbEx2 (g
5d820 65 6f 6d 32 2c 20 26 70 5f 72 65 73 75 6c 74 2c  eom2, &p_result,
5d830 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
5d840 2c 0a 09 09 09 09 09 20 20 20 20 74 69 6e 79 5f  ,......    tiny_
5d850 70 6f 69 6e 74 29 3b 0a 09 09 67 61 69 61 46 72  point);...gaiaFr
5d860 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
5d870 32 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  2);...sqlite3_re
5d880 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
5d890 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
5d8a0 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 20 20 7d  n, free);..    }
5d8b0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
5d8c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
5d8d0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
5d8e0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
5d8f0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
5d900 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
5d910 64 0a 66 6e 63 74 5f 43 61 73 74 54 6f 4d 75 6c  d.fnct_CastToMul
5d920 74 69 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ti (sqlite3_cont
5d930 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
5d940 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
5d950 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
5d960 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
5d970 6e 3a 0a 2f 20 43 61 73 74 54 6f 4d 75 6c 74 69  n:./ CastToMulti
5d980 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
5d990 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
5d9a0 72 6e 73 20 61 20 4d 55 4c 54 49 50 4f 49 4e 54  rns a MULTIPOINT
5d9b0 2c 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  , MULTILINESTRIN
5d9c0 47 2c 20 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 20  G, MULTIPOLYGON 
5d9d0 6f 72 0a 2f 20 47 45 4f 4d 45 54 52 59 43 4f 4c  or./ GEOMETRYCOL
5d9e0 4c 45 43 54 49 4f 4e 2d 74 79 70 65 20 67 65 6f  LECTION-type geo
5d9f0 6d 65 74 72 79 20 5b 69 66 20 63 6f 6e 76 65 72  metry [if conver
5da00 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  sion is possible
5da10 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 6e 20  ] ./ or NULL in 
5da20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a 2a  any other case.*
5da30 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
5da40 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
5da50 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
5da60 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
5da70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
5da80 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
5da90 20 20 20 69 6e 74 20 70 74 73 3b 0a 20 20 20 20     int pts;.    
5daa0 69 6e 74 20 6c 6e 73 3b 0a 20 20 20 20 69 6e 74  int lns;.    int
5dab0 20 70 67 73 3b 0a 20 20 20 20 67 61 69 61 47 65   pgs;.    gaiaGe
5dac0 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
5dad0 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
5dae0 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 32 20  omCollPtr geom2 
5daf0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
5db00 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
5db10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
5db20 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
5db30 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
5db40 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
5db50 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
5db60 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
5db70 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
5db80 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
5db90 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
5dba0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
5dbb0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
5dbc0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
5dbd0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
5dbe0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
5dbf0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
5dc00 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
5dc10 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
5dc20 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
5dc30 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
5dc40 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
5dc50 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
5dc60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5dc70 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
5dc80 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
5dc90 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
5dca0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
5dcb0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
5dcc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
5dcd0 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
5dce0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
5dcf0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
5dd00 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
5dd10 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
5dd20 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
5dd30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
5dd40 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
5dd50 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
5dd60 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
5dd70 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
5dd80 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
5dd90 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
5dda0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
5ddb0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
5ddc0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
5ddd0 7b 0a 09 20 20 63 61 73 74 5f 63 6f 75 6e 74 20  {..  cast_count 
5dde0 28 67 65 6f 2c 20 26 70 74 73 2c 20 26 6c 6e 73  (geo, &pts, &lns
5ddf0 2c 20 26 70 67 73 29 3b 0a 09 20 20 69 66 20 28  , &pgs);..  if (
5de00 70 74 73 20 3e 3d 20 31 20 7c 7c 20 6c 6e 73 20  pts >= 1 || lns 
5de10 3e 3d 20 31 20 7c 7c 20 70 67 73 20 3e 3d 20 31  >= 1 || pgs >= 1
5de20 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f 6d 32  )..    {...geom2
5de30 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47 65 6f 6d   = gaiaCloneGeom
5de40 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 09 67 65  Coll (geo);...ge
5de50 6f 6d 32 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d  om2->Srid = geo-
5de60 3e 53 72 69 64 3b 0a 09 09 69 66 20 28 70 74 73  >Srid;...if (pts
5de70 20 3e 3d 20 31 20 26 26 20 6c 6e 73 20 3d 3d 20   >= 1 && lns == 
5de80 30 20 26 26 20 70 67 73 20 3d 3d 20 30 29 0a 09  0 && pgs == 0)..
5de90 09 20 20 20 20 67 65 6f 6d 32 2d 3e 44 65 63 6c  .    geom2->Decl
5dea0 61 72 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f  aredType = GAIA_
5deb0 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 09 09 65 6c  MULTIPOINT;...el
5dec0 73 65 20 69 66 20 28 70 74 73 20 3d 3d 20 30 20  se if (pts == 0 
5ded0 26 26 20 6c 6e 73 20 3e 3d 20 31 20 26 26 20 70  && lns >= 1 && p
5dee0 67 73 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 67  gs == 0)...    g
5def0 65 6f 6d 32 2d 3e 44 65 63 6c 61 72 65 64 54 79  eom2->DeclaredTy
5df00 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
5df10 49 4e 45 53 54 52 49 4e 47 3b 0a 09 09 65 6c 73  INESTRING;...els
5df20 65 20 69 66 20 28 70 74 73 20 3d 3d 20 30 20 26  e if (pts == 0 &
5df30 26 20 6c 6e 73 20 3d 3d 20 30 20 26 26 20 70 67  & lns == 0 && pg
5df40 73 20 3e 3d 20 31 29 0a 09 09 20 20 20 20 67 65  s >= 1)...    ge
5df50 6f 6d 32 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  om2->DeclaredTyp
5df60 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
5df70 4c 59 47 4f 4e 3b 0a 09 09 65 6c 73 65 0a 09 09  LYGON;...else...
5df80 20 20 20 20 67 65 6f 6d 32 2d 3e 44 65 63 6c 61      geom2->Decla
5df90 72 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f 47  redType = GAIA_G
5dfa0 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
5dfb0 4e 3b 0a 09 09 69 66 20 28 67 65 6f 2d 3e 44 65  N;...if (geo->De
5dfc0 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41  claredType == GA
5dfd0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
5dfe0 43 54 49 4f 4e 29 0a 09 09 20 20 20 20 67 65 6f  CTION)...    geo
5dff0 6d 32 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  m2->DeclaredType
5e000 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
5e010 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 09 67 61  COLLECTION;...ga
5e020 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
5e030 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c  obWkbEx2 (geom2,
5e040 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
5e050 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
5e060 09 09 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74  ..    tiny_point
5e070 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f  );...gaiaFreeGeo
5e080 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 09  mColl (geom2);..
5e090 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
5e0a0 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
5e0b0 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
5e0c0 65 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ee);..    }..  e
5e0d0 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lse..      sqlit
5e0e0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
5e0f0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
5e100 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
5e110 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a  omColl (geo);.}.
5e120 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
5e130 74 5f 43 61 73 74 54 6f 53 69 6e 67 6c 65 20 28  t_CastToSingle (
5e140 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5e150 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
5e160 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
5e170 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
5e180 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
5e190 20 43 61 73 74 54 6f 53 69 6e 67 6c 65 28 42 4c   CastToSingle(BL
5e1a0 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  OB encoded geome
5e1b0 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  try)././ returns
5e1c0 20 61 20 50 4f 49 4e 54 2c 20 4c 49 4e 45 53 54   a POINT, LINEST
5e1d0 52 49 4e 47 20 6f 72 20 50 4f 4c 59 47 4f 4e 2d  RING or POLYGON-
5e1e0 74 79 70 65 20 67 65 6f 6d 65 74 72 79 20 5b 69  type geometry [i
5e1f0 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20  f conversion is 
5e200 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72 20  possible] ./ or 
5e210 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68 65  NULL in any othe
5e220 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75 6e  r case.*/.    un
5e230 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
5e240 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
5e250 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
5e260 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
5e270 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
5e280 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 70   NULL;.    int p
5e290 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73 3b  ts;.    int lns;
5e2a0 0a 20 20 20 20 69 6e 74 20 70 67 73 3b 0a 20 20  .    int pgs;.  
5e2b0 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 67 61    int ok;.    ga
5e2c0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
5e2d0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  o = NULL;.    ga
5e2e0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
5e2f0 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  om2 = NULL;.    
5e300 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
5e310 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
5e320 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
5e330 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
5e340 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nt = 0;.    stru
5e350 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
5e360 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
5e370 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
5e380 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
5e390 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
5e3a0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
5e3b0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
5e3c0 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
5e3d0 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
5e3e0 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
5e3f0 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
5e400 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
5e410 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
5e420 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69  gpkg_mode;..  ti
5e430 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65  ny_point = cache
5e440 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c  ->tinyPointEnabl
5e450 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
5e460 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
5e470 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
5e480 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
5e490 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
5e4a0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
5e4b0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
5e4c0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
5e4d0 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
5e4e0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
5e4f0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
5e500 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
5e510 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
5e520 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
5e530 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20  gv[0]);.    geo 
5e540 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
5e550 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
5e560 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
5e570 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
5e580 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
5e590 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
5e5a0 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  geo)..sqlite3_re
5e5b0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
5e5c0 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
5e5d0 20 20 20 20 7b 0a 09 20 20 63 61 73 74 5f 63 6f      {..  cast_co
5e5e0 75 6e 74 20 28 67 65 6f 2c 20 26 70 74 73 2c 20  unt (geo, &pts, 
5e5f0 26 6c 6e 73 2c 20 26 70 67 73 29 3b 0a 09 20 20  &lns, &pgs);..  
5e600 6f 6b 20 3d 20 30 3b 0a 09 20 20 69 66 20 28 70  ok = 0;..  if (p
5e610 74 73 20 3d 3d 20 31 20 26 26 20 6c 6e 73 20 3d  ts == 1 && lns =
5e620 3d 20 30 20 26 26 20 70 67 73 20 3d 3d 20 30 29  = 0 && pgs == 0)
5e630 0a 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a  ..      ok = 1;.
5e640 09 20 20 69 66 20 28 70 74 73 20 3d 3d 20 30 20  .  if (pts == 0 
5e650 26 26 20 6c 6e 73 20 3d 3d 20 31 20 26 26 20 70  && lns == 1 && p
5e660 67 73 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20  gs == 0)..      
5e670 6f 6b 20 3d 20 31 3b 0a 09 20 20 69 66 20 28 70  ok = 1;..  if (p
5e680 74 73 20 3d 3d 20 30 20 26 26 20 6c 6e 73 20 3d  ts == 0 && lns =
5e690 3d 20 30 20 26 26 20 70 67 73 20 3d 3d 20 31 29  = 0 && pgs == 1)
5e6a0 0a 09 20 20 20 20 20 20 6f 6b 20 3d 20 31 3b 0a  ..      ok = 1;.
5e6b0 09 20 20 69 66 20 28 6f 6b 29 0a 09 20 20 20 20  .  if (ok)..    
5e6c0 7b 0a 09 09 67 65 6f 6d 32 20 3d 20 67 61 69 61  {...geom2 = gaia
5e6d0 43 6c 6f 6e 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  CloneGeomColl (g
5e6e0 65 6f 29 3b 0a 09 09 67 65 6f 6d 32 2d 3e 53 72  eo);...geom2->Sr
5e6f0 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a  id = geo->Srid;.
5e700 09 09 69 66 20 28 70 74 73 20 3d 3d 20 31 29 0a  ..if (pts == 1).
5e710 09 09 20 20 20 20 67 65 6f 6d 32 2d 3e 44 65 63  ..    geom2->Dec
5e720 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41 49 41  laredType = GAIA
5e730 5f 50 4f 49 4e 54 3b 0a 09 09 65 6c 73 65 20 69  _POINT;...else i
5e740 66 20 28 6c 6e 73 20 3d 3d 20 31 29 0a 09 09 20  f (lns == 1)... 
5e750 20 20 20 67 65 6f 6d 32 2d 3e 44 65 63 6c 61 72     geom2->Declar
5e760 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f 4c 49  edType = GAIA_LI
5e770 4e 45 53 54 52 49 4e 47 3b 0a 09 09 65 6c 73 65  NESTRING;...else
5e780 0a 09 09 20 20 20 20 67 65 6f 6d 32 2d 3e 44 65  ...    geom2->De
5e790 63 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41 49  claredType = GAI
5e7a0 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 09 09 67 61 69  A_POLYGON;...gai
5e7b0 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
5e7c0 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c 20  bWkbEx2 (geom2, 
5e7d0 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
5e7e0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
5e7f0 09 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29  .    tiny_point)
5e800 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d  ;...gaiaFreeGeom
5e810 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 09 09  Coll (geom2);...
5e820 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
5e830 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f  lob (context, p_
5e840 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65  result, len, fre
5e850 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  e);..    }..  el
5e860 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
5e870 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
5e880 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
5e890 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
5e8a0 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
5e8b0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
5e8c0 5f 43 61 73 74 54 6f 58 59 20 28 73 71 6c 69 74  _CastToXY (sqlit
5e8d0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
5e8e0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
5e8f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5e900 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
5e910 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 61 73 74  function:./ Cast
5e920 54 6f 58 59 28 42 4c 4f 42 20 65 6e 63 6f 64 65  ToXY(BLOB encode
5e930 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20  d geometry)././ 
5e940 72 65 74 75 72 6e 73 20 61 6e 20 58 59 2d 64 69  returns an XY-di
5e950 6d 65 6e 73 69 6f 6e 20 47 65 6f 6d 65 74 72 79  mension Geometry
5e960 20 5b 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20   [if conversion 
5e970 69 73 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20  is possible] ./ 
5e980 6f 72 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f  or NULL in any o
5e990 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20  ther case.*/.   
5e9a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5e9b0 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
5e9c0 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74  n_bytes;.    int
5e9d0 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e   len;.    unsign
5e9e0 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
5e9f0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
5ea00 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
5ea10 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  o = NULL;.    ga
5ea20 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
5ea30 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  om2 = NULL;.    
5ea40 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
5ea50 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
5ea60 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
5ea70 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
5ea80 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nt = 0;.    stru
5ea90 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
5eaa0 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
5eab0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
5eac0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
5ead0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
5eae0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
5eaf0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
5eb00 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
5eb10 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
5eb20 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
5eb30 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
5eb40 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
5eb50 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
5eb60 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69  gpkg_mode;..  ti
5eb70 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65  ny_point = cache
5eb80 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c  ->tinyPointEnabl
5eb90 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
5eba0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
5ebb0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
5ebc0 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
5ebd0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
5ebe0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
5ebf0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
5ec00 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
5ec10 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
5ec20 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
5ec30 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
5ec40 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
5ec50 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
5ec60 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
5ec70 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20  gv[0]);.    geo 
5ec80 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
5ec90 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
5eca0 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
5ecb0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
5ecc0 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
5ecd0 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
5ece0 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  geo)..sqlite3_re
5ecf0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
5ed00 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
5ed10 20 20 20 20 7b 0a 09 20 20 67 65 6f 6d 32 20 3d      {..  geom2 =
5ed20 20 67 61 69 61 43 61 73 74 47 65 6f 6d 43 6f 6c   gaiaCastGeomCol
5ed30 6c 54 6f 58 59 20 28 67 65 6f 29 3b 0a 09 20 20  lToXY (geo);..  
5ed40 69 66 20 28 67 65 6f 6d 32 29 0a 09 20 20 20 20  if (geom2)..    
5ed50 7b 0a 09 09 67 65 6f 6d 32 2d 3e 53 72 69 64 20  {...geom2->Srid 
5ed60 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67  = geo->Srid;...g
5ed70 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
5ed80 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 32  lobWkbEx2 (geom2
5ed90 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
5eda0 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  n, gpkg_mode,...
5edb0 09 09 09 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e  ...    tiny_poin
5edc0 74 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65  t);...gaiaFreeGe
5edd0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a  omColl (geom2);.
5ede0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
5edf0 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
5ee00 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
5ee10 72 65 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  ree);..    }..  
5ee20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69  else..      sqli
5ee30 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
5ee40 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
5ee50 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
5ee60 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d  eomColl (geo);.}
5ee70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
5ee80 63 74 5f 43 61 73 74 54 6f 58 59 5a 20 28 73 71  ct_CastToXYZ (sq
5ee90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
5eea0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
5eeb0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5eec0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
5eed0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43  QL function:./ C
5eee0 61 73 74 54 6f 58 59 5a 28 42 4c 4f 42 20 65 6e  astToXYZ(BLOB en
5eef0 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
5ef00 2f 20 20 20 20 6f 72 0a 2f 20 43 61 73 74 54 6f  /    or./ CastTo
5ef10 58 59 5a 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  XYZ(BLOB encoded
5ef20 20 67 65 6f 6d 65 74 72 79 2c 20 6e 6f 64 61 74   geometry, nodat
5ef30 61 20 64 6f 75 62 6c 65 29 0a 2f 0a 2f 20 72 65  a double)././ re
5ef40 74 75 72 6e 73 20 61 6e 20 58 59 2d 64 69 6d 65  turns an XY-dime
5ef50 6e 73 69 6f 6e 20 47 65 6f 6d 65 74 72 79 20 5b  nsion Geometry [
5ef60 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  if conversion is
5ef70 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72   possible] ./ or
5ef80 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68   NULL in any oth
5ef90 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75  er case.*/.    u
5efa0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
5efb0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
5efc0 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c  bytes;.    int l
5efd0 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
5efe0 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20   char *p_result 
5eff0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62  = NULL;.    doub
5f000 6c 65 20 6e 6f 5f 64 61 74 61 3b 0a 20 20 20 20  le no_data;.    
5f010 69 6e 74 20 68 61 73 5f 6e 6f 5f 64 61 74 61 20  int has_no_data 
5f020 3d 20 30 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  = 0;.    gaiaGeo
5f030 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
5f040 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
5f050 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 32 20 3d  mCollPtr geom2 =
5f060 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67   NULL;.    int g
5f070 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
5f080 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
5f090 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
5f0a0 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
5f0b0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
5f0c0 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
5f0d0 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
5f0e0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
5f0f0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
5f100 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
5f110 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
5f120 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
5f130 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
5f140 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
5f150 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
5f160 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
5f170 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
5f180 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
5f190 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
5f1a0 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
5f1b0 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
5f1c0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
5f1d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5f1e0 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
5f1f0 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
5f200 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
5f210 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
5f220 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
5f230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
5f240 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
5f250 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
5f260 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
5f270 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
5f280 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
5f290 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
5f2a0 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  );.    if (argc 
5f2b0 3e 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  >= 2).      {.. 
5f2c0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
5f2d0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
5f2e0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
5f2f0 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e  GER)..    {...in
5f300 74 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  t val = sqlite3_
5f310 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
5f320 31 5d 29 3b 0a 09 09 6e 6f 5f 64 61 74 61 20 3d  1]);...no_data =
5f330 20 76 61 6c 3b 0a 09 09 68 61 73 5f 6e 6f 5f 64   val;...has_no_d
5f340 61 74 61 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a  ata = 1;..    }.
5f350 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69  .  else if (sqli
5f360 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
5f370 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
5f380 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 7b  TE_FLOAT)..    {
5f390 0a 09 09 6e 6f 5f 64 61 74 61 20 3d 20 73 71 6c  ...no_data = sql
5f3a0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
5f3b0 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 68  e (argv[1]);...h
5f3c0 61 73 5f 6e 6f 5f 64 61 74 61 20 3d 20 31 3b 0a  as_no_data = 1;.
5f3d0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
5f3e0 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
5f3f0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
5f400 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
5f410 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
5f420 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46      geo =..gaiaF
5f430 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
5f440 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
5f450 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
5f460 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
5f470 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
5f480 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71     if (!geo)..sq
5f490 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
5f4a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
5f4b0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
5f4c0 20 69 66 20 28 68 61 73 5f 6e 6f 5f 64 61 74 61   if (has_no_data
5f4d0 29 0a 09 20 20 20 20 20 20 67 65 6f 6d 32 20 3d  )..      geom2 =
5f4e0 20 67 61 69 61 43 61 73 74 47 65 6f 6d 43 6f 6c   gaiaCastGeomCol
5f4f0 6c 54 6f 58 59 5a 6e 6f 44 61 74 61 20 28 67 65  lToXYZnoData (ge
5f500 6f 2c 20 6e 6f 5f 64 61 74 61 29 3b 0a 09 20 20  o, no_data);..  
5f510 65 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f 6d  else..      geom
5f520 32 20 3d 20 67 61 69 61 43 61 73 74 47 65 6f 6d  2 = gaiaCastGeom
5f530 43 6f 6c 6c 54 6f 58 59 5a 20 28 67 65 6f 29 3b  CollToXYZ (geo);
5f540 0a 09 20 20 69 66 20 28 67 65 6f 6d 32 29 0a 09  ..  if (geom2)..
5f550 20 20 20 20 7b 0a 09 09 67 65 6f 6d 32 2d 3e 53      {...geom2->S
5f560 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b  rid = geo->Srid;
5f570 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c  ...gaiaToSpatiaL
5f580 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67  iteBlobWkbEx2 (g
5f590 65 6f 6d 32 2c 20 26 70 5f 72 65 73 75 6c 74 2c  eom2, &p_result,
5f5a0 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
5f5b0 2c 0a 09 09 09 09 09 20 20 20 20 74 69 6e 79 5f  ,......    tiny_
5f5c0 70 6f 69 6e 74 29 3b 0a 09 09 67 61 69 61 46 72  point);...gaiaFr
5f5d0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
5f5e0 32 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  2);...sqlite3_re
5f5f0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
5f600 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
5f610 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 20 20 7d  n, free);..    }
5f620 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
5f630 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
5f640 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
5f650 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
5f660 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
5f670 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
5f680 64 0a 66 6e 63 74 5f 43 61 73 74 54 6f 58 59 4d  d.fnct_CastToXYM
5f690 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
5f6a0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
5f6b0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5f6c0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
5f6d0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
5f6e0 0a 2f 20 43 61 73 74 54 6f 58 59 4d 28 42 4c 4f  ./ CastToXYM(BLO
5f6f0 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  B encoded geomet
5f700 72 79 29 0a 2f 20 20 20 20 6f 72 0a 2f 20 43 61  ry)./    or./ Ca
5f710 73 74 54 6f 58 59 4d 28 42 4c 4f 42 20 65 6e 63  stToXYM(BLOB enc
5f720 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2e 20 6e  oded geometry. n
5f730 6f 64 61 74 61 20 64 6f 75 62 6c 65 29 0a 2f 0a  odata double)./.
5f740 2f 20 72 65 74 75 72 6e 73 20 61 6e 20 58 59 4d  / returns an XYM
5f750 2d 64 69 6d 65 6e 73 69 6f 6e 20 47 65 6f 6d 65  -dimension Geome
5f760 74 72 79 20 5b 69 66 20 63 6f 6e 76 65 72 73 69  try [if conversi
5f770 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 5d 20  on is possible] 
5f780 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 6e 20 61 6e  ./ or NULL in an
5f790 79 20 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a  y other case.*/.
5f7a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
5f7b0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
5f7c0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
5f7d0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73  int len;.    uns
5f7e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65  igned char *p_re
5f7f0 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  sult = NULL;.   
5f800 20 64 6f 75 62 6c 65 20 6e 6f 5f 64 61 74 61 3b   double no_data;
5f810 0a 20 20 20 20 69 6e 74 20 68 61 73 5f 6e 6f 5f  .    int has_no_
5f820 64 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 67 61  data = 0;.    ga
5f830 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
5f840 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  o = NULL;.    ga
5f850 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
5f860 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  om2 = NULL;.    
5f870 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
5f880 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
5f890 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
5f8a0 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
5f8b0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nt = 0;.    stru
5f8c0 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
5f8d0 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
5f8e0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
5f8f0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
5f900 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
5f910 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
5f920 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
5f930 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
5f940 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
5f950 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
5f960 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
5f970 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
5f980 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
5f990 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69  gpkg_mode;..  ti
5f9a0 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65  ny_point = cache
5f9b0 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c  ->tinyPointEnabl
5f9c0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
5f9d0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
5f9e0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
5f9f0 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
5fa00 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
5fa10 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
5fa20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
5fa30 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
5fa40 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
5fa50 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
5fa60 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
5fa70 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
5fa80 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
5fa90 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
5faa0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
5fab0 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20 20 20  argc >= 2).     
5fac0 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
5fad0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
5fae0 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
5faf0 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
5fb00 0a 09 09 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c  ...int val = sql
5fb10 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
5fb20 61 72 67 76 5b 31 5d 29 3b 0a 09 09 6e 6f 5f 64  argv[1]);...no_d
5fb30 61 74 61 20 3d 20 76 61 6c 3b 0a 09 09 68 61 73  ata = val;...has
5fb40 5f 6e 6f 5f 64 61 74 61 20 3d 20 31 3b 0a 09 20  _no_data = 1;.. 
5fb50 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20     }..  else if 
5fb60 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
5fb70 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
5fb80 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
5fb90 20 20 20 20 7b 0a 09 09 6e 6f 5f 64 61 74 61 20      {...no_data 
5fba0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5fbb0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29  double (argv[1])
5fbc0 3b 0a 09 09 68 61 73 5f 6e 6f 5f 64 61 74 61 20  ;...has_no_data 
5fbd0 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  = 1;..    }..  e
5fbe0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
5fbf0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
5fc00 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
5fc10 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
5fc20 20 20 20 7d 0a 20 20 20 20 67 65 6f 20 3d 0a 09     }.    geo =..
5fc30 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
5fc40 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
5fc50 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
5fc60 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
5fc70 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
5fc80 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f  s);.    if (!geo
5fc90 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
5fca0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
5fcb0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
5fcc0 20 7b 0a 09 20 20 69 66 20 28 68 61 73 5f 6e 6f   {..  if (has_no
5fcd0 5f 64 61 74 61 29 0a 09 20 20 20 20 20 20 67 65  _data)..      ge
5fce0 6f 6d 32 20 3d 20 67 61 69 61 43 61 73 74 47 65  om2 = gaiaCastGe
5fcf0 6f 6d 43 6f 6c 6c 54 6f 58 59 4d 6e 6f 44 61 74  omCollToXYMnoDat
5fd00 61 20 28 67 65 6f 2c 20 6e 6f 5f 64 61 74 61 29  a (geo, no_data)
5fd10 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
5fd20 20 67 65 6f 6d 32 20 3d 20 67 61 69 61 43 61 73   geom2 = gaiaCas
5fd30 74 47 65 6f 6d 43 6f 6c 6c 54 6f 58 59 4d 20 28  tGeomCollToXYM (
5fd40 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 67 65 6f  geo);..  if (geo
5fd50 6d 32 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f  m2)..    {...geo
5fd60 6d 32 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d 3e  m2->Srid = geo->
5fd70 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f 53 70  Srid;...gaiaToSp
5fd80 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
5fd90 78 32 20 28 67 65 6f 6d 32 2c 20 26 70 5f 72 65  x2 (geom2, &p_re
5fda0 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67  sult, &len, gpkg
5fdb0 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 20 20  _mode,......    
5fdc0 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 67  tiny_point);...g
5fdd0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
5fde0 28 67 65 6f 6d 32 29 3b 0a 09 09 73 71 6c 69 74  (geom2);...sqlit
5fdf0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
5fe00 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
5fe10 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  t, len, free);..
5fe20 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
5fe30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5fe40 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
5fe50 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
5fe60 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
5fe70 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
5fe80 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 61 73 74  c void.fnct_Cast
5fe90 54 6f 58 59 5a 4d 20 28 73 71 6c 69 74 65 33 5f  ToXYZM (sqlite3_
5fea0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
5feb0 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
5fec0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
5fed0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
5fee0 63 74 69 6f 6e 3a 0a 2f 20 43 61 73 74 54 6f 58  ction:./ CastToX
5fef0 59 5a 4d 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  YZM(BLOB encoded
5ff00 20 67 65 6f 6d 65 74 72 79 29 0a 2f 20 20 20 20   geometry)./    
5ff10 6f 72 0a 2f 20 43 61 73 74 54 6f 58 59 5a 4d 28  or./ CastToXYZM(
5ff20 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f  BLOB encoded geo
5ff30 6d 65 74 72 79 2c 20 6e 6f 64 61 74 61 5f 7a 20  metry, nodata_z 
5ff40 64 6f 75 62 6c 65 2c 20 6e 6f 64 61 74 61 5f 6d  double, nodata_m
5ff50 20 64 6f 75 62 6c 65 29 0a 2f 0a 2f 20 72 65 74   double)././ ret
5ff60 75 72 6e 73 20 61 6e 20 58 59 5a 4d 2d 64 69 6d  urns an XYZM-dim
5ff70 65 6e 73 69 6f 6e 20 47 65 6f 6d 65 74 72 79 20  ension Geometry 
5ff80 5b 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  [if conversion i
5ff90 73 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f  s possible] ./ o
5ffa0 72 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74  r NULL in any ot
5ffb0 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20  her case.*/.    
5ffc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
5ffd0 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
5ffe0 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
5fff0 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  len;.    unsigne
60000 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
60010 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75   = NULL;.    dou
60020 62 6c 65 20 7a 5f 6e 6f 5f 64 61 74 61 3b 0a 20  ble z_no_data;. 
60030 20 20 20 64 6f 75 62 6c 65 20 6d 5f 6e 6f 5f 64     double m_no_d
60040 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 68 61 73  ata;.    int has
60050 5f 6e 6f 5f 64 61 74 61 20 3d 20 30 3b 0a 20 20  _no_data = 0;.  
60060 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
60070 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
60080 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
60090 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
600a0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
600b0 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
600c0 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
600d0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
600e0 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
600f0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
60100 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
60110 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
60120 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
60130 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
60140 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
60150 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
60160 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
60170 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
60180 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
60190 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
601a0 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
601b0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
601c0 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
601d0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
601e0 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
601f0 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
60200 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
60210 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
60220 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
60230 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
60240 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
60250 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
60260 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
60270 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
60280 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
60290 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
602a0 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
602b0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
602c0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
602d0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
602e0 69 66 20 28 61 72 67 63 20 3e 3d 20 33 29 0a 20  if (argc >= 3). 
602f0 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
60300 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
60310 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
60320 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
60330 20 20 20 7b 0a 09 09 69 6e 74 20 76 61 6c 20 3d     {...int val =
60340 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
60350 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09  nt (argv[1]);...
60360 7a 5f 6e 6f 5f 64 61 74 61 20 3d 20 76 61 6c 3b  z_no_data = val;
60370 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20  ..    }..  else 
60380 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
60390 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
603a0 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
603b0 29 0a 09 20 20 20 20 20 20 7a 5f 6e 6f 5f 64 61  )..      z_no_da
603c0 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ta = sqlite3_val
603d0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
603e0 31 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  1]);..  else..  
603f0 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
60400 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
60410 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
60420 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c      }..  if (sql
60430 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
60440 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c  (argv[2]) == SQL
60450 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
60460 20 20 7b 0a 09 09 69 6e 74 20 76 61 6c 20 3d 20    {...int val = 
60470 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
60480 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 09 6d  t (argv[2]);...m
60490 5f 6e 6f 5f 64 61 74 61 20 3d 20 76 61 6c 3b 0a  _no_data = val;.
604a0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69  .    }..  else i
604b0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
604c0 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
604d0 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
604e0 0a 09 20 20 20 20 20 20 6d 5f 6e 6f 5f 64 61 74  ..      m_no_dat
604f0 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  a = sqlite3_valu
60500 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
60510 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  ]);..  else..   
60520 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
60530 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
60540 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
60550 20 20 20 7d 0a 09 20 20 68 61 73 5f 6e 6f 5f 64     }..  has_no_d
60560 61 74 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ata = 1;.      }
60570 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
60580 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
60590 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
605a0 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
605b0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
605c0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
605d0 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
605e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
605f0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
60600 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
60610 20 20 69 66 20 28 68 61 73 5f 6e 6f 5f 64 61 74    if (has_no_dat
60620 61 29 0a 09 20 20 20 20 20 20 67 65 6f 6d 32 20  a)..      geom2 
60630 3d 20 67 61 69 61 43 61 73 74 47 65 6f 6d 43 6f  = gaiaCastGeomCo
60640 6c 6c 54 6f 58 59 5a 4d 6e 6f 44 61 74 61 20 28  llToXYZMnoData (
60650 67 65 6f 2c 20 7a 5f 6e 6f 5f 64 61 74 61 2c 20  geo, z_no_data, 
60660 6d 5f 6e 6f 5f 64 61 74 61 29 3b 0a 09 20 20 65  m_no_data);..  e
60670 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f 6d 32  lse..      geom2
60680 20 3d 20 67 61 69 61 43 61 73 74 47 65 6f 6d 43   = gaiaCastGeomC
60690 6f 6c 6c 54 6f 58 59 5a 4d 20 28 67 65 6f 29 3b  ollToXYZM (geo);
606a0 0a 09 20 20 69 66 20 28 67 65 6f 6d 32 29 0a 09  ..  if (geom2)..
606b0 20 20 20 20 7b 0a 09 09 67 65 6f 6d 32 2d 3e 53      {...geom2->S
606c0 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b  rid = geo->Srid;
606d0 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c  ...gaiaToSpatiaL
606e0 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67  iteBlobWkbEx2 (g
606f0 65 6f 6d 32 2c 20 26 70 5f 72 65 73 75 6c 74 2c  eom2, &p_result,
60700 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
60710 2c 0a 09 09 09 09 09 20 20 20 20 74 69 6e 79 5f  ,......    tiny_
60720 70 6f 69 6e 74 29 3b 0a 09 09 67 61 69 61 46 72  point);...gaiaFr
60730 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
60740 32 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  2);...sqlite3_re
60750 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
60760 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
60770 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 20 20 7d  n, free);..    }
60780 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
60790 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
607a0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
607b0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
607c0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
607d0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
607e0 64 0a 66 6e 63 74 5f 45 78 74 72 61 63 74 4d 75  d.fnct_ExtractMu
607f0 6c 74 69 50 6f 69 6e 74 20 28 73 71 6c 69 74 65  ltiPoint (sqlite
60800 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
60810 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
60820 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  ..sqlite3_value 
60830 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
60840 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45 78  L function:./ Ex
60850 74 72 61 63 74 4d 75 6c 74 69 50 6f 69 6e 74 28  tractMultiPoint(
60860 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f  BLOB encoded geo
60870 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72  metry)././ retur
60880 6e 73 20 61 20 4d 55 4c 54 49 50 4f 49 4e 54 2d  ns a MULTIPOINT-
60890 74 79 70 65 20 67 65 6f 6d 65 74 72 79 20 5b 69  type geometry [i
608a0 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20  f conversion is 
608b0 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72 20  possible] ./ or 
608c0 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68 65  NULL in any othe
608d0 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75 6e  r case.*/.    un
608e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
608f0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
60900 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
60910 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
60920 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
60930 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 70   NULL;.    int p
60940 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73 3b  ts;.    int lns;
60950 0a 20 20 20 20 69 6e 74 20 70 67 73 3b 0a 20 20  .    int pgs;.  
60960 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
60970 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
60980 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
60990 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
609a0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
609b0 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
609c0 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
609d0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
609e0 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
609f0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
60a00 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
60a10 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
60a20 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
60a30 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
60a40 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
60a50 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
60a60 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
60a70 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
60a80 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
60a90 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
60aa0 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
60ab0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
60ac0 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
60ad0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
60ae0 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
60af0 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
60b00 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
60b10 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
60b20 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
60b30 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
60b40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
60b50 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
60b60 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
60b70 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
60b80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
60b90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
60ba0 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
60bb0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
60bc0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
60bd0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
60be0 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
60bf0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
60c00 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
60c10 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
60c20 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
60c30 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
60c40 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
60c50 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
60c60 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
60c70 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 61 73  e.      {..  cas
60c80 74 5f 63 6f 75 6e 74 20 28 67 65 6f 2c 20 26 70  t_count (geo, &p
60c90 74 73 2c 20 26 6c 6e 73 2c 20 26 70 67 73 29 3b  ts, &lns, &pgs);
60ca0 0a 09 20 20 69 66 20 28 70 74 73 20 3e 3d 20 31  ..  if (pts >= 1
60cb0 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f 6d 32  )..    {...geom2
60cc0 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47 65 6f 6d   = gaiaCloneGeom
60cd0 43 6f 6c 6c 50 6f 69 6e 74 73 20 28 67 65 6f 29  CollPoints (geo)
60ce0 3b 0a 09 09 67 65 6f 6d 32 2d 3e 53 72 69 64 20  ;...geom2->Srid 
60cf0 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67  = geo->Srid;...g
60d00 65 6f 6d 32 2d 3e 44 65 63 6c 61 72 65 64 54 79  eom2->DeclaredTy
60d10 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
60d20 4f 49 4e 54 3b 0a 09 09 67 61 69 61 54 6f 53 70  OINT;...gaiaToSp
60d30 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
60d40 78 32 20 28 67 65 6f 6d 32 2c 20 26 70 5f 72 65  x2 (geom2, &p_re
60d50 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67  sult, &len, gpkg
60d60 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 20 20  _mode,......    
60d70 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 67  tiny_point);...g
60d80 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
60d90 28 67 65 6f 6d 32 29 3b 0a 09 09 73 71 6c 69 74  (geom2);...sqlit
60da0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
60db0 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
60dc0 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  t, len, free);..
60dd0 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
60de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
60df0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
60e00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
60e10 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
60e20 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
60e30 63 20 76 6f 69 64 0a 66 6e 63 74 5f 45 78 74 72  c void.fnct_Extr
60e40 61 63 74 4d 75 6c 74 69 4c 69 6e 65 73 74 72 69  actMultiLinestri
60e50 6e 67 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ng (sqlite3_cont
60e60 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
60e70 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20  nt argc,....    
60e80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
60e90 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
60ea0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45 78 74   function:./ Ext
60eb0 72 61 63 74 4d 75 6c 74 69 4c 69 6e 65 73 74 72  ractMultiLinestr
60ec0 69 6e 67 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  ing(BLOB encoded
60ed0 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72   geometry)././ r
60ee0 65 74 75 72 6e 73 20 61 20 4d 55 4c 54 49 4c 49  eturns a MULTILI
60ef0 4e 45 53 54 52 49 4e 47 2d 74 79 70 65 20 67 65  NESTRING-type ge
60f00 6f 6d 65 74 72 79 20 5b 69 66 20 63 6f 6e 76 65  ometry [if conve
60f10 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  rsion is possibl
60f20 65 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 6e  e] ./ or NULL in
60f30 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a   any other case.
60f40 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
60f50 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20  char *p_blob;.  
60f60 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20    int n_bytes;. 
60f70 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
60f80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
60f90 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
60fa0 20 20 20 20 69 6e 74 20 70 74 73 3b 0a 20 20 20      int pts;.   
60fb0 20 69 6e 74 20 6c 6e 73 3b 0a 20 20 20 20 69 6e   int lns;.    in
60fc0 74 20 70 67 73 3b 0a 20 20 20 20 67 61 69 61 47  t pgs;.    gaiaG
60fd0 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
60fe0 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
60ff0 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 32  eomCollPtr geom2
61000 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
61010 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
61020 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
61030 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
61040 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
61050 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
61060 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
61070 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
61080 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
61090 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
610a0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
610b0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
610c0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
610d0 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
610e0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
610f0 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
61100 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
61110 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
61120 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
61130 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f  g_mode;..  tiny_
61140 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
61150 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
61160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
61170 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
61180 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
61190 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
611a0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
611b0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
611c0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
611d0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
611e0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
611f0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
61200 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
61210 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
61220 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
61230 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
61240 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09  0]);.    geo =..
61250 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
61260 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
61270 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
61280 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
61290 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
612a0 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f  s);.    if (!geo
612b0 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
612c0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
612d0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
612e0 20 7b 0a 09 20 20 63 61 73 74 5f 63 6f 75 6e 74   {..  cast_count
612f0 20 28 67 65 6f 2c 20 26 70 74 73 2c 20 26 6c 6e   (geo, &pts, &ln
61300 73 2c 20 26 70 67 73 29 3b 0a 09 20 20 69 66 20  s, &pgs);..  if 
61310 28 6c 6e 73 20 3e 3d 20 31 29 0a 09 20 20 20 20  (lns >= 1)..    
61320 7b 0a 09 09 67 65 6f 6d 32 20 3d 20 67 61 69 61  {...geom2 = gaia
61330 43 6c 6f 6e 65 47 65 6f 6d 43 6f 6c 6c 4c 69 6e  CloneGeomCollLin
61340 65 73 74 72 69 6e 67 73 20 28 67 65 6f 29 3b 0a  estrings (geo);.
61350 09 09 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d 20  ..geom2->Srid = 
61360 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 65 6f  geo->Srid;...geo
61370 6d 32 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  m2->DeclaredType
61380 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e   = GAIA_MULTILIN
61390 45 53 54 52 49 4e 47 3b 0a 09 09 67 61 69 61 54  ESTRING;...gaiaT
613a0 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
613b0 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c 20 26 70  kbEx2 (geom2, &p
613c0 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67  _result, &len, g
613d0 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 20  pkg_mode,...... 
613e0 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a     tiny_point);.
613f0 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
61400 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 09 09 73 71  ll (geom2);...sq
61410 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
61420 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
61430 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
61440 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
61450 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
61460 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
61470 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
61480 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
61490 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
614a0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 45  atic void.fnct_E
614b0 78 74 72 61 63 74 4d 75 6c 74 69 50 6f 6c 79 67  xtractMultiPolyg
614c0 6f 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  on (sqlite3_cont
614d0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
614e0 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71  nt argc,....  sq
614f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
61500 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
61510 6e 63 74 69 6f 6e 3a 0a 2f 20 45 78 74 72 61 63  nction:./ Extrac
61520 74 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 28 42 4c  tMultiPolygon(BL
61530 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  OB encoded geome
61540 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  try)././ returns
61550 20 61 20 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 2d   a MULTIPOLYGON-
61560 74 79 70 65 20 67 65 6f 6d 65 74 72 79 20 5b 69  type geometry [i
61570 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20  f conversion is 
61580 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72 20  possible] ./ or 
61590 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68 65  NULL in any othe
615a0 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75 6e  r case.*/.    un
615b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
615c0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
615d0 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
615e0 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
615f0 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
61600 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 70   NULL;.    int p
61610 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73 3b  ts;.    int lns;
61620 0a 20 20 20 20 69 6e 74 20 70 67 73 3b 0a 20 20  .    int pgs;.  
61630 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
61640 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
61650 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
61660 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
61670 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
61680 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
61690 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
616a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
616b0 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
616c0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
616d0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
616e0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
616f0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
61700 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
61710 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
61720 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
61730 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
61740 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
61750 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
61760 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
61770 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
61780 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
61790 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
617a0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
617b0 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
617c0 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
617d0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
617e0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
617f0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
61800 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
61810 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
61820 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
61830 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
61840 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
61850 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
61860 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
61870 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
61880 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
61890 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
618a0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
618b0 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
618c0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
618d0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
618e0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
618f0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
61900 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
61910 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
61920 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
61930 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
61940 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 61 73  e.      {..  cas
61950 74 5f 63 6f 75 6e 74 20 28 67 65 6f 2c 20 26 70  t_count (geo, &p
61960 74 73 2c 20 26 6c 6e 73 2c 20 26 70 67 73 29 3b  ts, &lns, &pgs);
61970 0a 09 20 20 69 66 20 28 70 67 73 20 3e 3d 20 31  ..  if (pgs >= 1
61980 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f 6d 32  )..    {...geom2
61990 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47 65 6f 6d   = gaiaCloneGeom
619a0 43 6f 6c 6c 50 6f 6c 79 67 6f 6e 73 20 28 67 65  CollPolygons (ge
619b0 6f 29 3b 0a 09 09 67 65 6f 6d 32 2d 3e 53 72 69  o);...geom2->Sri
619c0 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09  d = geo->Srid;..
619d0 09 67 65 6f 6d 32 2d 3e 44 65 63 6c 61 72 65 64  .geom2->Declared
619e0 54 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  Type = GAIA_MULT
619f0 49 50 4f 4c 59 47 4f 4e 3b 0a 09 09 67 61 69 61  IPOLYGON;...gaia
61a00 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
61a10 57 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c 20 26  WkbEx2 (geom2, &
61a20 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20  p_result, &len, 
61a30 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 09  gpkg_mode,......
61a40 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b      tiny_point);
61a50 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43  ...gaiaFreeGeomC
61a60 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 09 09 73  oll (geom2);...s
61a70 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
61a80 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
61a90 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
61aa0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
61ab0 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  e..      sqlite3
61ac0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
61ad0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
61ae0 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
61af0 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73  Coll (geo);.}..s
61b00 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
61b10 52 65 76 65 72 73 65 20 28 73 71 6c 69 74 65 33  Reverse (sqlite3
61b20 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
61b30 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
61b40 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
61b50 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
61b60 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f 52 65 76  nction:./ ST_Rev
61b70 65 72 73 65 28 42 4c 4f 42 20 65 6e 63 6f 64 65  erse(BLOB encode
61b80 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20  d geometry)././ 
61b90 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 47 65  returns a new Ge
61ba0 6f 6d 65 74 72 79 3a 20 61 6e 79 20 4c 69 6e 65  ometry: any Line
61bb0 73 74 72 69 6e 67 20 6f 72 20 52 69 6e 67 20 77  string or Ring w
61bc0 69 6c 6c 20 62 65 20 69 6e 20 72 65 76 65 72 73  ill be in revers
61bd0 65 20 6f 72 64 65 72 0a 2f 20 6f 72 20 4e 55 4c  e order./ or NUL
61be0 4c 20 69 6e 20 61 6e 79 20 6f 74 68 65 72 20 63  L in any other c
61bf0 61 73 65 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  ase.*/.    unsig
61c00 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
61c10 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
61c20 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  s;.    int len;.
61c30 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
61c40 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
61c50 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
61c60 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
61c70 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
61c80 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 32 20 3d 20  CollPtr geom2 = 
61c90 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70  NULL;.    int gp
61ca0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
61cb0 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
61cc0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mode = 0;.    in
61cd0 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
61ce0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
61cf0 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
61d00 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
61d10 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
61d20 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
61d30 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
61d40 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
61d50 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
61d60 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
61d70 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
61d80 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
61d90 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
61da0 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
61db0 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
61dc0 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69  ode;..  tiny_poi
61dd0 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79  nt = cache->tiny
61de0 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20  PointEnabled;.  
61df0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
61e00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
61e10 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
61e20 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
61e30 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
61e40 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
61e50 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
61e60 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
61e70 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
61e80 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
61e90 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
61ea0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
61eb0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
61ec0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
61ed0 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
61ee0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
61ef0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
61f00 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
61f10 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
61f20 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
61f30 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
61f40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
61f50 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
61f60 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
61f70 09 20 20 67 65 6f 6d 32 20 3d 20 67 61 69 61 43  .  geom2 = gaiaC
61f80 6c 6f 6e 65 47 65 6f 6d 43 6f 6c 6c 53 70 65 63  loneGeomCollSpec
61f90 69 61 6c 20 28 67 65 6f 2c 20 47 41 49 41 5f 52  ial (geo, GAIA_R
61fa0 45 56 45 52 53 45 5f 4f 52 44 45 52 29 3b 0a 09  EVERSE_ORDER);..
61fb0 20 20 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d 20    geom2->Srid = 
61fc0 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 20 20 67 61  geo->Srid;..  ga
61fd0 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
61fe0 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 32 2c  obWkbEx2 (geom2,
61ff0 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
62000 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
62010 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e  .      tiny_poin
62020 74 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47  t);..  gaiaFreeG
62030 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b  eomColl (geom2);
62040 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
62050 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
62060 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c  , p_result, len,
62070 20 66 72 65 65 29 3b 0a 09 20 20 67 61 69 61 46   free);..  gaiaF
62080 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
62090 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74  );.      }.}..st
620a0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 46  atic void.fnct_F
620b0 6f 72 63 65 50 6f 6c 79 67 6f 6e 43 57 20 28 73  orcePolygonCW (s
620c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
620d0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
620e0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
620f0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
62100 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
62110 53 54 5f 46 6f 72 63 65 50 6f 6c 79 67 6f 6e 43  ST_ForcePolygonC
62120 57 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67  W(BLOB encoded g
62130 65 6f 6d 65 74 72 79 29 0a 2f 20 20 20 20 6f 72  eometry)./    or
62140 0a 2f 20 53 54 5f 46 6f 72 63 65 4c 48 52 28 42  ./ ST_ForceLHR(B
62150 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d  LOB encoded geom
62160 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  etry)././ return
62170 73 20 61 20 6e 65 77 20 47 65 6f 6d 65 74 72 79  s a new Geometry
62180 3a 20 61 6e 79 20 45 78 74 65 72 69 6f 72 20 52  : any Exterior R
62190 69 6e 67 20 77 69 6c 6c 20 62 65 20 69 6e 20 63  ing will be in c
621a0 6c 6f 63 6b 77 69 73 65 20 6f 72 69 65 6e 74 61  lockwise orienta
621b0 74 69 6f 6e 0a 2f 20 20 20 20 20 20 20 20 20 61  tion./         a
621c0 6e 64 20 61 6e 79 20 49 6e 74 65 72 69 6f 72 20  nd any Interior 
621d0 52 69 6e 67 20 77 69 6c 6c 20 62 65 20 69 6e 20  Ring will be in 
621e0 63 6f 75 6e 74 65 72 2d 63 6c 6f 63 6b 77 69 73  counter-clockwis
621f0 65 20 6f 72 69 65 6e 74 61 74 69 6f 6e 0a 2f 20  e orientation./ 
62200 6f 72 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c  or NULL on inval
62210 69 64 20 67 65 6f 6d 65 74 72 69 65 73 0a 2a 2f  id geometries.*/
62220 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
62230 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
62240 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
62250 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e   int len;.    un
62260 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72  signed char *p_r
62270 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  esult = NULL;.  
62280 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
62290 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
622a0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
622b0 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
622c0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
622d0 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
622e0 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
622f0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
62300 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
62310 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
62320 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
62330 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
62340 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
62350 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
62360 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
62370 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
62380 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
62390 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
623a0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
623b0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
623c0 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
623d0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
623e0 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
623f0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
62400 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
62410 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
62420 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
62430 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
62440 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
62450 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
62460 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
62470 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
62480 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
62490 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
624a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
624b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
624c0 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
624d0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
624e0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
624f0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
62500 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
62510 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
62520 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
62530 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
62540 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
62550 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
62560 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
62570 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
62580 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
62590 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 65 6f  e.      {..  geo
625a0 6d 32 20 3d 20 67 61 69 61 43 6c 6f 6e 65 47 65  m2 = gaiaCloneGe
625b0 6f 6d 43 6f 6c 6c 53 70 65 63 69 61 6c 20 28 67  omCollSpecial (g
625c0 65 6f 2c 20 47 41 49 41 5f 43 57 5f 4f 52 44 45  eo, GAIA_CW_ORDE
625d0 52 29 3b 0a 09 20 20 67 65 6f 6d 32 2d 3e 53 72  R);..  geom2->Sr
625e0 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a  id = geo->Srid;.
625f0 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c  .  gaiaToSpatiaL
62600 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67  iteBlobWkbEx2 (g
62610 65 6f 6d 32 2c 20 26 70 5f 72 65 73 75 6c 74 2c  eom2, &p_result,
62620 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
62630 2c 0a 09 09 09 09 20 20 20 20 20 20 74 69 6e 79  ,.....      tiny
62640 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 67 61 69 61  _point);..  gaia
62650 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
62660 6f 6d 32 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  om2);..  sqlite3
62670 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
62680 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
62690 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20   len, free);..  
626a0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
626b0 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   (geo);.      }.
626c0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
626d0 6e 63 74 5f 46 6f 72 63 65 50 6f 6c 79 67 6f 6e  nct_ForcePolygon
626e0 43 43 57 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  CCW (sqlite3_con
626f0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
62700 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20  int argc,...    
62710 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
62720 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
62730 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54  L function:./ ST
62740 5f 46 6f 72 63 65 50 6f 6c 79 67 6f 6e 43 43 57  _ForcePolygonCCW
62750 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
62760 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
62770 72 6e 73 20 61 20 6e 65 77 20 47 65 6f 6d 65 74  rns a new Geomet
62780 72 79 3a 20 61 6e 79 20 45 78 74 65 72 69 6f 72  ry: any Exterior
62790 20 52 69 6e 67 20 77 69 6c 6c 20 62 65 20 69 6e   Ring will be in
627a0 20 63 6f 75 6e 74 65 72 2d 63 6c 6f 63 6b 77 69   counter-clockwi
627b0 73 65 20 0a 2f 20 6f 72 69 65 6e 74 61 74 69 6f  se ./ orientatio
627c0 6e 20 61 6e 64 20 61 6e 79 20 49 6e 74 65 72 69  n and any Interi
627d0 6f 72 20 52 69 6e 67 20 77 69 6c 6c 20 62 65 20  or Ring will be 
627e0 69 6e 20 63 6c 6f 63 6b 77 69 73 65 20 6f 72 69  in clockwise ori
627f0 65 6e 74 61 74 69 6f 6e 0a 2f 20 6f 72 20 4e 55  entation./ or NU
62800 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64 20 67 65  LL on invalid ge
62810 6f 6d 65 74 72 69 65 73 0a 2a 2f 0a 20 20 20 20  ometries.*/.    
62820 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
62830 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
62840 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
62850 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  len;.    unsigne
62860 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
62870 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
62880 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
62890 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
628a0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
628b0 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  m2 = NULL;.    i
628c0 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
628d0 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
628e0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
628f0 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
62900 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
62910 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
62920 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
62930 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
62940 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
62950 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
62960 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
62970 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
62980 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
62990 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
629a0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
629b0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
629c0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
629d0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
629e0 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
629f0 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
62a00 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
62a10 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
62a20 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
62a30 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
62a40 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
62a50 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
62a60 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
62a70 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
62a80 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
62a90 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
62aa0 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
62ab0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
62ac0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
62ad0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
62ae0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
62af0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
62b00 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
62b10 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
62b20 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
62b30 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
62b40 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
62b50 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
62b60 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
62b70 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
62b80 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
62b90 20 20 20 7b 0a 09 20 20 67 65 6f 6d 32 20 3d 20     {..  geom2 = 
62ba0 67 61 69 61 43 6c 6f 6e 65 47 65 6f 6d 43 6f 6c  gaiaCloneGeomCol
62bb0 6c 53 70 65 63 69 61 6c 20 28 67 65 6f 2c 20 47  lSpecial (geo, G
62bc0 41 49 41 5f 43 43 57 5f 4f 52 44 45 52 29 3b 0a  AIA_CCW_ORDER);.
62bd0 09 20 20 67 65 6f 6d 32 2d 3e 53 72 69 64 20 3d  .  geom2->Srid =
62be0 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 20 20 67   geo->Srid;..  g
62bf0 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
62c00 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 32  lobWkbEx2 (geom2
62c10 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
62c20 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  n, gpkg_mode,...
62c30 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69  ..      tiny_poi
62c40 6e 74 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65  nt);..  gaiaFree
62c50 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29  GeomColl (geom2)
62c60 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
62c70 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
62c80 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
62c90 2c 20 66 72 65 65 29 3b 0a 09 20 20 67 61 69 61  , free);..  gaia
62ca0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
62cb0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73  o);.      }.}..s
62cc0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
62cd0 49 73 50 6f 6c 79 67 6f 6e 43 57 20 28 73 71 6c  IsPolygonCW (sql
62ce0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
62cf0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
62d00 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
62d10 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
62d20 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54  L function:./ ST
62d30 5f 49 73 50 6f 6c 79 67 6f 6e 43 57 28 42 4c 4f  _IsPolygonCW(BLO
62d40 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  B encoded geomet
62d50 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  ry)././ returns 
62d60 54 52 55 45 20 69 66 20 61 6c 6c 20 45 78 74 65  TRUE if all Exte
62d70 72 69 6f 72 20 52 69 6e 67 73 20 61 72 65 20 69  rior Rings are i
62d80 6e 20 63 6c 6f 63 6b 77 69 73 65 20 6f 72 69 65  n clockwise orie
62d90 6e 74 61 74 69 6f 6e 20 0a 2f 20 61 6e 64 20 61  ntation ./ and a
62da0 6c 6c 20 49 6e 74 65 72 69 6f 72 20 52 69 6e 67  ll Interior Ring
62db0 20 61 72 65 20 69 6e 20 63 6f 75 6e 74 65 72 2d   are in counter-
62dc0 63 6c 6f 63 6b 77 69 73 65 20 6f 72 69 65 6e 74  clockwise orient
62dd0 61 74 69 6f 6e 2c 0a 2f 20 46 41 4c 53 45 20 69  ation,./ FALSE i
62de0 66 20 6e 6f 74 0a 2f 20 61 6e 64 20 2d 31 20 6f  f not./ and -1 o
62df0 6e 20 69 6e 76 61 6c 69 64 20 67 65 6f 6d 65 74  n invalid geomet
62e00 72 69 65 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ries.*/.    unsi
62e10 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
62e20 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
62e30 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
62e40 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
62e50 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  LL;.    int gpkg
62e60 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
62e70 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
62e80 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  de = 0;.    stru
62e90 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
62ea0 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
62eb0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
62ec0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
62ed0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
62ee0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
62ef0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
62f00 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
62f10 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
62f20 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
62f30 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
62f40 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
62f50 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
62f60 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20  gpkg_mode;.     
62f70 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
62f80 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
62f90 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
62fa0 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
62fb0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
62fc0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
62fd0 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  -1);..  return;.
62fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
62ff0 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
63000 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
63010 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
63020 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
63030 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
63040 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
63050 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
63060 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
63070 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
63080 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
63090 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
630a0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
630b0 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
630c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
630d0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
630e0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
630f0 20 7b 0a 09 20 20 69 6e 74 20 72 65 74 76 61 6c   {..  int retval
63100 20 3d 20 67 61 69 61 43 68 65 63 6b 43 6c 6f 63   = gaiaCheckCloc
63110 6b 77 69 73 65 20 28 67 65 6f 29 3b 0a 09 20 20  kwise (geo);..  
63120 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
63130 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
63140 76 61 6c 29 3b 0a 09 20 20 67 61 69 61 46 72 65  val);..  gaiaFre
63150 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
63160 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74  .      }.}..stat
63170 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 50  ic void.fnct_IsP
63180 6f 6c 79 67 6f 6e 43 43 57 20 28 73 71 6c 69 74  olygonCCW (sqlit
63190 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
631a0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
631b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
631c0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
631d0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f 49  function:./ ST_I
631e0 73 50 6f 6c 79 67 6f 6e 43 43 57 28 42 4c 4f 42  sPolygonCCW(BLOB
631f0 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
63200 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 54  y)././ returns T
63210 52 55 45 20 69 66 20 61 6c 6c 20 45 78 74 65 72  RUE if all Exter
63220 69 6f 72 20 52 69 6e 67 73 20 61 72 65 20 69 6e  ior Rings are in
63230 20 63 6f 75 6e 74 65 72 2d 63 6c 6f 63 6b 77 69   counter-clockwi
63240 73 65 20 0a 2f 20 6f 72 69 65 6e 74 61 74 69 6f  se ./ orientatio
63250 6e 20 61 6e 64 20 61 6c 6c 20 49 6e 74 65 72 69  n and all Interi
63260 6f 72 20 52 69 6e 67 20 61 72 65 20 69 6e 20 63  or Ring are in c
63270 6c 6f 63 6b 77 69 73 65 20 6f 72 69 65 6e 74 61  lockwise orienta
63280 74 69 6f 6e 2c 0a 2f 20 46 41 4c 53 45 20 69 66  tion,./ FALSE if
63290 20 6e 6f 74 0a 2f 20 61 6e 64 20 4e 55 4c 4c 20   not./ and NULL 
632a0 6f 6e 20 69 6e 76 61 6c 69 64 20 67 65 6f 6d 65  on invalid geome
632b0 74 72 69 65 73 0a 2a 2f 0a 20 20 20 20 75 6e 73  tries.*/.    uns
632c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
632d0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
632e0 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  tes;.    gaiaGeo
632f0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
63300 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ULL;.    int gpk
63310 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
63320 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
63330 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  ode = 0;.    str
63340 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
63350 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
63360 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
63370 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
63380 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
63390 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
633a0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
633b0 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
633c0 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
633d0 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
633e0 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
633f0 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
63400 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
63410 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20  >gpkg_mode;.    
63420 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
63430 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
63440 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
63450 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
63460 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
63470 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
63480 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
63490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
634a0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
634b0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
634c0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
634d0 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
634e0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
634f0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
63500 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61  );.    geo =..ga
63510 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
63520 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
63530 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
63540 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
63550 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
63560 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a  ;.    if (!geo).
63570 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
63580 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
63590 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
635a0 20 20 7b 0a 09 20 20 69 6e 74 20 72 65 74 76 61    {..  int retva
635b0 6c 20 3d 20 67 61 69 61 43 68 65 63 6b 43 6f 75  l = gaiaCheckCou
635c0 6e 74 65 72 43 6c 6f 63 6b 77 69 73 65 20 28 67  nterClockwise (g
635d0 65 6f 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  eo);..  sqlite3_
635e0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
635f0 65 78 74 2c 20 72 65 74 76 61 6c 29 3b 0a 09 20  ext, retval);.. 
63600 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
63610 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20 7d  l (geo);.      }
63620 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
63630 66 6e 63 74 5f 44 69 6d 65 6e 73 69 6f 6e 20 28  fnct_Dimension (
63640 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
63650 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
63660 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
63670 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
63680 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
63690 20 44 69 6d 65 6e 73 69 6f 6e 28 42 4c 4f 42 20   Dimension(BLOB 
636a0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
636b0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f  )././ returns:./
636c0 20 30 20 69 66 20 67 65 6f 6d 65 74 72 79 20 69   0 if geometry i
636d0 73 20 61 20 50 4f 49 4e 54 20 6f 72 20 4d 55 4c  s a POINT or MUL
636e0 54 49 50 4f 49 4e 54 0a 2f 20 31 20 69 66 20 67  TIPOINT./ 1 if g
636f0 65 6f 6d 65 74 72 79 20 69 73 20 61 20 4c 49 4e  eometry is a LIN
63700 45 53 54 52 49 4e 47 20 6f 72 20 4d 55 4c 54 49  ESTRING or MULTI
63710 4c 49 4e 45 53 54 52 49 4e 47 0a 2f 20 32 20 69  LINESTRING./ 2 i
63720 66 20 67 65 6f 6d 65 74 72 79 20 69 73 20 61 20  f geometry is a 
63730 50 4f 4c 59 47 4f 4e 20 6f 72 20 4d 55 4c 54 49  POLYGON or MULTI
63740 50 4f 4c 59 47 4f 4e 0a 2f 20 30 2c 20 31 2c 20  POLYGON./ 0, 1, 
63750 32 2c 20 66 6f 72 20 47 45 4f 4d 45 54 52 59 43  2, for GEOMETRYC
63760 4f 4c 4c 45 43 54 49 4f 4e 53 20 61 63 63 6f 72  OLLECTIONS accor
63770 64 69 6e 67 20 74 6f 20 67 65 6f 6d 65 74 72 69  ding to geometri
63780 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73  es contained ins
63790 69 64 65 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ide./ or NULL if
637a0 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
637b0 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
637c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
637d0 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
637e0 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74  n_bytes;.    int
637f0 20 64 69 6d 3b 0a 20 20 20 20 67 61 69 61 47 65   dim;.    gaiaGe
63800 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
63810 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70  NULL;.    int gp
63820 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
63830 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
63840 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74  mode = 0;.    st
63850 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
63860 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
63870 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
63880 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
63890 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
638a0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
638b0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
638c0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
638d0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
638e0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
638f0 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
63900 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
63910 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
63920 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20  ->gpkg_mode;.   
63930 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
63940 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
63950 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
63960 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
63970 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
63980 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
63990 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
639a0 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
639b0 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
639c0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
639d0 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
639e0 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
639f0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
63a00 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
63a10 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
63a20 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
63a30 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
63a40 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
63a50 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
63a60 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
63a70 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
63a80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
63a90 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
63aa0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
63ab0 20 20 64 69 6d 20 3d 20 67 61 69 61 44 69 6d 65    dim = gaiaDime
63ac0 6e 73 69 6f 6e 20 28 67 65 6f 29 3b 0a 09 20 20  nsion (geo);..  
63ad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
63ae0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 64 69 6d  nt (context, dim
63af0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
63b00 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
63b10 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
63b20 20 76 6f 69 64 0a 66 6e 63 74 5f 43 6f 6f 72 64   void.fnct_Coord
63b30 44 69 6d 65 6e 73 69 6f 6e 20 28 73 71 6c 69 74  Dimension (sqlit
63b40 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
63b50 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
63b60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
63b70 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
63b80 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 6f 6f 72  function:./ Coor
63b90 64 44 69 6d 65 6e 73 69 6f 6e 28 42 4c 4f 42 20  dDimension(BLOB 
63ba0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
63bb0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f  )././ returns:./
63bc0 20 27 58 59 27 2c 20 27 58 59 4d 27 2c 20 27 58   'XY', 'XYM', 'X
63bd0 59 5a 27 2c 20 27 58 59 5a 4d 27 0a 2f 20 6f 72  YZ', 'XYZM'./ or
63be0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
63bf0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
63c00 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
63c10 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
63c20 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
63c30 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
63c40 20 20 63 68 61 72 20 2a 70 5f 64 69 6d 20 3d 20    char *p_dim = 
63c50 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
63c60 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
63c70 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
63c80 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
63c90 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
63ca0 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
63cb0 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
63cc0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
63cd0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
63ce0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
63cf0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
63d00 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
63d10 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
63d20 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
63d30 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
63d40 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
63d50 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
63d60 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
63d70 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
63d80 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
63d90 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
63da0 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
63db0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
63dc0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
63dd0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
63de0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
63df0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
63e00 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
63e10 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
63e20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
63e30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
63e40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
63e50 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
63e60 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
63e70 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
63e80 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
63e90 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
63ea0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
63eb0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
63ec0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
63ed0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
63ee0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
63ef0 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
63f00 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
63f10 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
63f20 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  e.      {..  if 
63f30 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  (geo->DimensionM
63f40 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 29  odel == GAIA_XY)
63f50 0a 09 20 20 20 20 20 20 70 5f 64 69 6d 20 3d 20  ..      p_dim = 
63f60 22 58 59 22 3b 0a 09 20 20 65 6c 73 65 20 69 66  "XY";..  else if
63f70 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e   (geo->Dimension
63f80 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
63f90 5f 5a 29 0a 09 20 20 20 20 20 20 70 5f 64 69 6d  _Z)..      p_dim
63fa0 20 3d 20 22 58 59 5a 22 3b 0a 09 20 20 65 6c 73   = "XYZ";..  els
63fb0 65 20 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e  e if (geo->Dimen
63fc0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
63fd0 41 5f 58 59 5f 4d 29 0a 09 20 20 20 20 20 20 70  A_XY_M)..      p
63fe0 5f 64 69 6d 20 3d 20 22 58 59 4d 22 3b 0a 09 20  _dim = "XYM";.. 
63ff0 20 65 6c 73 65 20 69 66 20 28 67 65 6f 2d 3e 44   else if (geo->D
64000 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
64010 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20   GAIA_XY_Z_M).. 
64020 20 20 20 20 20 70 5f 64 69 6d 20 3d 20 22 58 59       p_dim = "XY
64030 5a 4d 22 3b 0a 09 20 20 69 66 20 28 70 5f 64 69  ZM";..  if (p_di
64040 6d 29 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e 20  m)..    {...len 
64050 3d 20 73 74 72 6c 65 6e 20 28 70 5f 64 69 6d 29  = strlen (p_dim)
64060 3b 0a 09 09 70 5f 72 65 73 75 6c 74 20 3d 20 6d  ;...p_result = m
64070 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b  alloc (len + 1);
64080 0a 09 09 73 74 72 63 70 79 20 28 70 5f 72 65 73  ...strcpy (p_res
64090 75 6c 74 2c 20 70 5f 64 69 6d 29 3b 0a 09 20 20  ult, p_dim);..  
640a0 20 20 7d 0a 09 20 20 69 66 20 28 21 70 5f 72 65    }..  if (!p_re
640b0 73 75 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c  sult)..      sql
640c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
640d0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65   (context);..  e
640e0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e  lse..    {...len
640f0 20 3d 20 73 74 72 6c 65 6e 20 28 70 5f 72 65 73   = strlen (p_res
64100 75 6c 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  ult);...sqlite3_
64110 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e  result_text (con
64120 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
64130 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 20  len, free);..   
64140 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
64150 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
64160 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
64170 20 76 6f 69 64 0a 66 6e 63 74 5f 4e 44 69 6d 73   void.fnct_NDims
64180 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
64190 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
641a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
641b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
641c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
641d0 0a 2f 20 53 54 5f 4e 44 69 6d 73 28 42 4c 4f 42  ./ ST_NDims(BLOB
641e0 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
641f0 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a  y)././ returns:.
64200 2f 20 32 2c 20 33 20 6f 72 20 34 0a 2f 20 6f 72  / 2, 3 or 4./ or
64210 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
64220 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
64230 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
64240 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
64250 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
64260 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20  .    int result 
64270 3d 20 30 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  = 0;.    gaiaGeo
64280 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
64290 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ULL;.    int gpk
642a0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
642b0 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
642c0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  ode = 0;.    str
642d0 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
642e0 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
642f0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
64300 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
64310 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
64320 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
64330 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
64340 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
64350 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
64360 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
64370 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
64380 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
64390 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
643a0 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20  >gpkg_mode;.    
643b0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
643c0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
643d0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
643e0 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
643f0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
64400 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
64410 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
64420 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
64430 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
64440 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
64450 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
64460 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
64470 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
64480 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
64490 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46      geo =..gaiaF
644a0 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
644b0 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
644c0 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
644d0 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
644e0 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
644f0 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71     if (!geo)..sq
64500 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
64510 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
64520 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
64530 20 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73   if (geo->Dimens
64540 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
64550 5f 58 59 29 0a 09 20 20 20 20 20 20 72 65 73 75  _XY)..      resu
64560 6c 74 20 3d 20 32 3b 0a 09 20 20 65 6c 73 65 20  lt = 2;..  else 
64570 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69  if (geo->Dimensi
64580 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
64590 58 59 5f 5a 29 0a 09 20 20 20 20 20 20 72 65 73  XY_Z)..      res
645a0 75 6c 74 20 3d 20 33 3b 0a 09 20 20 65 6c 73 65  ult = 3;..  else
645b0 20 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73   if (geo->Dimens
645c0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
645d0 5f 58 59 5f 4d 29 0a 09 20 20 20 20 20 20 72 65  _XY_M)..      re
645e0 73 75 6c 74 20 3d 20 33 3b 0a 09 20 20 65 6c 73  sult = 3;..  els
645f0 65 20 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e  e if (geo->Dimen
64600 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
64610 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 20  A_XY_Z_M)..     
64620 20 72 65 73 75 6c 74 20 3d 20 34 3b 0a 09 20 20   result = 4;..  
64630 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
64640 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 73  nt (context, res
64650 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
64660 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
64670 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61  ll (geo);.}..sta
64680 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 65  tic void.fnct_Ge
64690 6f 6d 65 74 72 79 54 79 70 65 20 28 73 71 6c 69  ometryType (sqli
646a0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
646b0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
646c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
646d0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
646e0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f   function:./ Geo
646f0 6d 65 74 72 79 54 79 70 65 28 42 4c 4f 42 20 65  metryType(BLOB e
64700 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29  ncoded geometry)
64710 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65  ././ returns the
64720 20 63 6c 61 73 73 20 66 6f 72 20 63 75 72 72 65   class for curre
64730 6e 74 20 67 65 6f 6d 65 74 72 79 3a 0a 2f 20 27  nt geometry:./ '
64740 50 4f 49 4e 54 27 20 6f 72 20 27 4d 55 4c 54 49  POINT' or 'MULTI
64750 50 4f 49 4e 54 27 20 5b 5a 2c 20 4d 2c 20 5a 4d  POINT' [Z, M, ZM
64760 5d 0a 2f 20 27 4c 49 4e 45 53 54 52 49 4e 47 27  ]./ 'LINESTRING'
64770 20 6f 72 20 27 4d 55 4c 54 49 4c 49 4e 45 53 54   or 'MULTILINEST
64780 52 49 4e 47 27 20 5b 5a 2c 20 4d 2c 20 5a 4d 5d  RING' [Z, M, ZM]
64790 0a 2f 20 27 50 4f 4c 59 47 4f 4e 27 20 6f 72 20  ./ 'POLYGON' or 
647a0 27 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 27 20 5b  'MULTIPOLYGON' [
647b0 5a 2c 20 4d 2c 20 5a 4d 5d 0a 2f 20 27 47 45 4f  Z, M, ZM]./ 'GEO
647c0 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 27  METRYCOLLECTION'
647d0 20 20 5b 5a 2c 20 4d 2c 20 5a 4d 5d 0a 2f 20 6f    [Z, M, ZM]./ o
647e0 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
647f0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
64800 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ed.*/.    unsign
64810 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
64820 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
64830 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
64840 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20     int type;.   
64850 20 63 68 61 72 20 2a 70 5f 74 79 70 65 20 3d 20   char *p_type = 
64860 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
64870 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
64880 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
64890 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
648a0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
648b0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
648c0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
648d0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
648e0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
648f0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
64900 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
64910 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
64920 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
64930 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
64940 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
64950 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
64960 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
64970 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
64980 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
64990 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
649a0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
649b0 20 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c   gaiaFromSpatiaL
649c0 69 74 65 42 6c 6f 62 57 6b 62 20 28 70 5f 62 6c  iteBlobWkb (p_bl
649d0 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20  ob, n_bytes);.  
649e0 20 20 69 66 20 28 21 67 65 6f 29 0a 20 20 20 20    if (!geo).    
649f0 20 20 7b 0a 23 69 66 64 65 66 20 45 4e 41 42 4c    {.#ifdef ENABL
64a00 45 5f 47 45 4f 50 41 43 4b 41 47 45 09 2f 2a 20  E_GEOPACKAGE./* 
64a10 47 45 4f 50 41 43 4b 41 47 45 20 65 6e 61 62 6c  GEOPACKAGE enabl
64a20 65 64 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47  ed: supporting G
64a30 50 4b 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a  PKG geometries *
64a40 2f 0a 09 20 20 69 66 20 28 67 61 69 61 49 73 56  /..  if (gaiaIsV
64a50 61 6c 69 64 47 50 42 20 28 70 5f 62 6c 6f 62 2c  alidGPB (p_blob,
64a60 20 6e 5f 62 79 74 65 73 29 29 0a 09 20 20 20 20   n_bytes))..    
64a70 7b 0a 09 09 63 68 61 72 20 2a 67 70 62 5f 74 79  {...char *gpb_ty
64a80 70 65 20 3d 20 67 61 69 61 47 65 74 47 65 6f 6d  pe = gaiaGetGeom
64a90 65 74 72 79 54 79 70 65 46 72 6f 6d 47 50 42 20  etryTypeFromGPB 
64aa0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
64ab0 29 3b 0a 09 09 69 66 20 28 67 70 62 5f 74 79 70  );...if (gpb_typ
64ac0 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 20  e == NULL)...   
64ad0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
64ae0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
64af0 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20  ..else...  {... 
64b00 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
64b10 6e 20 28 67 70 62 5f 74 79 70 65 29 3b 0a 09 09  n (gpb_type);...
64b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
64b30 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
64b40 78 74 2c 20 67 70 62 5f 74 79 70 65 2c 20 6c 65  xt, gpb_type, le
64b50 6e 2c 20 66 72 65 65 29 3b 0a 09 09 20 20 7d 0a  n, free);...  }.
64b60 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
64b70 0a 09 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20  ..  else.#endif 
64b80 2f 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b 41 47  /* end GEOPACKAG
64b90 45 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50  E: supporting GP
64ba0 4b 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f  KG geometries */
64bb0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
64bc0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
64bd0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
64be0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
64bf0 09 20 20 74 79 70 65 20 3d 20 67 61 69 61 47 65  .  type = gaiaGe
64c00 6f 6d 65 74 72 79 54 79 70 65 20 28 67 65 6f 29  ometryType (geo)
64c10 3b 0a 09 20 20 73 77 69 74 63 68 20 28 74 79 70  ;..  switch (typ
64c20 65 29 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63  e)..    {..    c
64c30 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a  ase GAIA_POINT:.
64c40 09 09 70 5f 74 79 70 65 20 3d 20 22 50 4f 49 4e  ..p_type = "POIN
64c50 54 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  T";...break;..  
64c60 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e    case GAIA_POIN
64c70 54 5a 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22  TZ:...p_type = "
64c80 50 4f 49 4e 54 20 5a 22 3b 0a 09 09 62 72 65 61  POINT Z";...brea
64c90 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
64ca0 41 5f 50 4f 49 4e 54 4d 3a 0a 09 09 70 5f 74 79  A_POINTM:...p_ty
64cb0 70 65 20 3d 20 22 50 4f 49 4e 54 20 4d 22 3b 0a  pe = "POINT M";.
64cc0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
64cd0 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a  se GAIA_POINTZM:
64ce0 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 50 4f 49  ...p_type = "POI
64cf0 4e 54 20 5a 4d 22 3b 0a 09 09 62 72 65 61 6b 3b  NT ZM";...break;
64d00 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
64d10 4d 55 4c 54 49 50 4f 49 4e 54 3a 0a 09 09 70 5f  MULTIPOINT:...p_
64d20 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49  type = "MULTIPOI
64d30 4e 54 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  NT";...break;.. 
64d40 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
64d50 54 49 50 4f 49 4e 54 5a 3a 0a 09 09 70 5f 74 79  TIPOINTZ:...p_ty
64d60 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e 54  pe = "MULTIPOINT
64d70 20 5a 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20   Z";...break;.. 
64d80 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
64d90 54 49 50 4f 49 4e 54 4d 3a 0a 09 09 70 5f 74 79  TIPOINTM:...p_ty
64da0 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e 54  pe = "MULTIPOINT
64db0 20 4d 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20   M";...break;.. 
64dc0 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
64dd0 54 49 50 4f 49 4e 54 5a 4d 3a 0a 09 09 70 5f 74  TIPOINTZM:...p_t
64de0 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 49 4e  ype = "MULTIPOIN
64df0 54 20 5a 4d 22 3b 0a 09 09 62 72 65 61 6b 3b 0a  T ZM";...break;.
64e00 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c  .    case GAIA_L
64e10 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20 20 20 20  INESTRING:..    
64e20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45  case GAIA_COMPRE
64e30 53 53 45 44 5f 4c 49 4e 45 53 54 52 49 4e 47 3a  SSED_LINESTRING:
64e40 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 4c 49 4e  ...p_type = "LIN
64e50 45 53 54 52 49 4e 47 22 3b 0a 09 09 62 72 65 61  ESTRING";...brea
64e60 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
64e70 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09  A_LINESTRINGZ:..
64e80 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f      case GAIA_CO
64e90 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52  MPRESSED_LINESTR
64ea0 49 4e 47 5a 3a 0a 09 09 70 5f 74 79 70 65 20 3d  INGZ:...p_type =
64eb0 20 22 4c 49 4e 45 53 54 52 49 4e 47 20 5a 22 3b   "LINESTRING Z";
64ec0 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
64ed0 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  ase GAIA_LINESTR
64ee0 49 4e 47 4d 3a 0a 09 20 20 20 20 63 61 73 65 20  INGM:..    case 
64ef0 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f  GAIA_COMPRESSED_
64f00 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 09 09 70  LINESTRINGM:...p
64f10 5f 74 79 70 65 20 3d 20 22 4c 49 4e 45 53 54 52  _type = "LINESTR
64f20 49 4e 47 20 4d 22 3b 0a 09 09 62 72 65 61 6b 3b  ING M";...break;
64f30 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
64f40 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 09 20  LINESTRINGZM:.. 
64f50 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d     case GAIA_COM
64f60 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52 49  PRESSED_LINESTRI
64f70 4e 47 5a 4d 3a 0a 09 09 70 5f 74 79 70 65 20 3d  NGZM:...p_type =
64f80 20 22 4c 49 4e 45 53 54 52 49 4e 47 20 5a 4d 22   "LINESTRING ZM"
64f90 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
64fa0 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c  case GAIA_MULTIL
64fb0 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 70 5f 74  INESTRING:...p_t
64fc0 79 70 65 20 3d 20 22 4d 55 4c 54 49 4c 49 4e 45  ype = "MULTILINE
64fd0 53 54 52 49 4e 47 22 3b 0a 09 09 62 72 65 61 6b  STRING";...break
64fe0 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
64ff0 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
65000 5a 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 4d  Z:...p_type = "M
65010 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 5a  ULTILINESTRING Z
65020 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  ";...break;..   
65030 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
65040 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 09 09 70  LINESTRINGM:...p
65050 5f 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 4c 49  _type = "MULTILI
65060 4e 45 53 54 52 49 4e 47 20 4d 22 3b 0a 09 09 62  NESTRING M";...b
65070 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
65080 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
65090 52 49 4e 47 5a 4d 3a 0a 09 09 70 5f 74 79 70 65  RINGZM:...p_type
650a0 20 3d 20 22 4d 55 4c 54 49 4c 49 4e 45 53 54 52   = "MULTILINESTR
650b0 49 4e 47 20 5a 4d 22 3b 0a 09 09 62 72 65 61 6b  ING ZM";...break
650c0 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
650d0 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 20 20 63  _POLYGON:..    c
650e0 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53  ase GAIA_COMPRES
650f0 53 45 44 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 09 70  SED_POLYGON:...p
65100 5f 74 79 70 65 20 3d 20 22 50 4f 4c 59 47 4f 4e  _type = "POLYGON
65110 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  ";...break;..   
65120 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47   case GAIA_POLYG
65130 4f 4e 5a 3a 0a 09 20 20 20 20 63 61 73 65 20 47  ONZ:..    case G
65140 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 50  AIA_COMPRESSED_P
65150 4f 4c 59 47 4f 4e 5a 3a 0a 09 09 70 5f 74 79 70  OLYGONZ:...p_typ
65160 65 20 3d 20 22 50 4f 4c 59 47 4f 4e 20 5a 22 3b  e = "POLYGON Z";
65170 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
65180 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  ase GAIA_POLYGON
65190 4d 3a 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  M:..    case GAI
651a0 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 50 4f 4c  A_COMPRESSED_POL
651b0 59 47 4f 4e 4d 3a 0a 09 09 70 5f 74 79 70 65 20  YGONM:...p_type 
651c0 3d 20 22 50 4f 4c 59 47 4f 4e 20 4d 22 3b 0a 09  = "POLYGON M";..
651d0 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
651e0 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d  e GAIA_POLYGONZM
651f0 3a 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  :..    case GAIA
65200 5f 43 4f 4d 50 52 45 53 53 45 44 5f 50 4f 4c 59  _COMPRESSED_POLY
65210 47 4f 4e 5a 4d 3a 0a 09 09 70 5f 74 79 70 65 20  GONZM:...p_type 
65220 3d 20 22 50 4f 4c 59 47 4f 4e 20 5a 4d 22 3b 0a  = "POLYGON ZM";.
65230 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
65240 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
65250 59 47 4f 4e 3a 0a 09 09 70 5f 74 79 70 65 20 3d  YGON:...p_type =
65260 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 22 3b   "MULTIPOLYGON";
65270 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
65280 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
65290 4c 59 47 4f 4e 5a 3a 0a 09 09 70 5f 74 79 70 65  LYGONZ:...p_type
652a0 20 3d 20 22 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e   = "MULTIPOLYGON
652b0 20 5a 22 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20   Z";...break;.. 
652c0 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
652d0 54 49 50 4f 4c 59 47 4f 4e 4d 3a 0a 09 09 70 5f  TIPOLYGONM:...p_
652e0 74 79 70 65 20 3d 20 22 4d 55 4c 54 49 50 4f 4c  type = "MULTIPOL
652f0 59 47 4f 4e 20 4d 22 3b 0a 09 09 62 72 65 61 6b  YGON M";...break
65300 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
65310 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3a  _MULTIPOLYGONZM:
65320 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 4d 55 4c  ...p_type = "MUL
65330 54 49 50 4f 4c 59 47 4f 4e 20 5a 4d 22 3b 0a 09  TIPOLYGON ZM";..
65340 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
65350 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  e GAIA_GEOMETRYC
65360 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 09 70 5f 74  OLLECTION:...p_t
65370 79 70 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43  ype = "GEOMETRYC
65380 4f 4c 4c 45 43 54 49 4f 4e 22 3b 0a 09 09 62 72  OLLECTION";...br
65390 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
653a0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
653b0 45 43 54 49 4f 4e 5a 3a 0a 09 09 70 5f 74 79 70  ECTIONZ:...p_typ
653c0 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c  e = "GEOMETRYCOL
653d0 4c 45 43 54 49 4f 4e 20 5a 22 3b 0a 09 09 62 72  LECTION Z";...br
653e0 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
653f0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
65400 45 43 54 49 4f 4e 4d 3a 0a 09 09 70 5f 74 79 70  ECTIONM:...p_typ
65410 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c  e = "GEOMETRYCOL
65420 4c 45 43 54 49 4f 4e 20 4d 22 3b 0a 09 09 62 72  LECTION M";...br
65430 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
65440 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
65450 45 43 54 49 4f 4e 5a 4d 3a 0a 09 09 70 5f 74 79  ECTIONZM:...p_ty
65460 70 65 20 3d 20 22 47 45 4f 4d 45 54 52 59 43 4f  pe = "GEOMETRYCO
65470 4c 4c 45 43 54 49 4f 4e 20 5a 4d 22 3b 0a 09 09  LLECTION ZM";...
65480 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 09  break;..    };..
65490 20 20 69 66 20 28 70 5f 74 79 70 65 29 0a 09 20    if (p_type).. 
654a0 20 20 20 7b 0a 09 09 6c 65 6e 20 3d 20 73 74 72     {...len = str
654b0 6c 65 6e 20 28 70 5f 74 79 70 65 29 3b 0a 09 09  len (p_type);...
654c0 70 5f 72 65 73 75 6c 74 20 3d 20 6d 61 6c 6c 6f  p_result = mallo
654d0 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 09 09 73  c (len + 1);...s
654e0 74 72 63 70 79 20 28 70 5f 72 65 73 75 6c 74 2c  trcpy (p_result,
654f0 20 70 5f 74 79 70 65 29 3b 0a 09 20 20 20 20 7d   p_type);..    }
65500 0a 09 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c  ..  if (!p_resul
65510 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  t)..      sqlite
65520 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
65530 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65  ontext);..  else
65540 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e 20 3d 20  ..    {...len = 
65550 73 74 72 6c 65 6e 20 28 70 5f 72 65 73 75 6c 74  strlen (p_result
65560 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
65570 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
65580 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
65590 2c 20 66 72 65 65 29 3b 0a 09 20 20 20 20 7d 0a  , free);..    }.
655a0 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
655b0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
655c0 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  o);.}..static vo
655d0 69 64 0a 66 6e 63 74 5f 47 65 6f 6d 65 74 72 79  id.fnct_Geometry
655e0 41 6c 69 61 73 54 79 70 65 20 28 73 71 6c 69 74  AliasType (sqlit
655f0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
65600 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
65610 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ...sqlite3_value
65620 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
65630 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47  QL function:./ G
65640 65 6f 6d 65 74 72 79 41 6c 69 61 73 54 79 70 65  eometryAliasType
65650 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
65660 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
65670 72 6e 73 20 74 68 65 20 61 6c 69 61 73 2d 63 6c  rns the alias-cl
65680 61 73 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ass for current 
65690 67 65 6f 6d 65 74 72 79 3a 0a 2f 20 27 50 4f 49  geometry:./ 'POI
656a0 4e 54 27 0a 2f 20 27 4c 49 4e 45 53 54 52 49 4e  NT'./ 'LINESTRIN
656b0 47 27 0a 2f 20 27 50 4f 4c 59 47 4f 4e 27 0a 2f  G'./ 'POLYGON'./
656c0 20 27 4d 55 4c 54 49 50 4f 49 4e 54 27 0a 2f 20   'MULTIPOINT'./ 
656d0 27 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  'MULTILINESTRING
656e0 27 0a 2f 20 27 4d 55 4c 54 49 50 4f 4c 59 47 4f  './ 'MULTIPOLYGO
656f0 4e 27 0a 2f 20 27 47 45 4f 4d 45 54 52 59 43 4f  N'./ 'GEOMETRYCO
65700 4c 4c 45 43 54 49 4f 4e 27 20 0a 2f 20 6f 72 20  LLECTION' ./ or 
65710 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
65720 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
65730 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
65740 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
65750 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
65760 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
65770 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 63   int type;.    c
65780 68 61 72 20 2a 70 5f 74 79 70 65 20 3d 20 4e 55  har *p_type = NU
65790 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 5f  LL;.    char *p_
657a0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
657b0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
657c0 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
657d0 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
657e0 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
657f0 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
65800 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
65810 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
65820 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
65830 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
65840 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
65850 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
65860 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
65870 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
65880 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
65890 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
658a0 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
658b0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
658c0 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
658d0 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
658e0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
658f0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
65900 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
65910 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
65920 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
65930 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
65940 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
65950 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
65960 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
65970 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
65980 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
65990 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
659a0 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
659b0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
659c0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
659d0 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  o =..gaiaFromSpa
659e0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
659f0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
65a00 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
65a10 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
65a20 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
65a30 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f  (!geo)..sqlite3_
65a40 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
65a50 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
65a60 20 20 20 20 20 20 7b 0a 09 20 20 74 79 70 65 20        {..  type 
65a70 3d 20 67 61 69 61 47 65 6f 6d 65 74 72 79 41 6c  = gaiaGeometryAl
65a80 69 61 73 54 79 70 65 20 28 67 65 6f 29 3b 0a 09  iasType (geo);..
65a90 20 20 73 77 69 74 63 68 20 28 74 79 70 65 29 0a    switch (type).
65aa0 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65  .    {..    case
65ab0 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 09 70   GAIA_POINT:...p
65ac0 5f 74 79 70 65 20 3d 20 22 50 4f 49 4e 54 22 3b  _type = "POINT";
65ad0 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
65ae0 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
65af0 49 4e 54 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20  INT:...p_type = 
65b00 22 4d 55 4c 54 49 50 4f 49 4e 54 22 3b 0a 09 09  "MULTIPOINT";...
65b10 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
65b20 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
65b30 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 4c 49  :...p_type = "LI
65b40 4e 45 53 54 52 49 4e 47 22 3b 0a 09 09 62 72 65  NESTRING";...bre
65b50 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
65b60 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
65b70 4e 47 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22  NG:...p_type = "
65b80 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 22  MULTILINESTRING"
65b90 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
65ba0 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
65bb0 4e 3a 0a 09 09 70 5f 74 79 70 65 20 3d 20 22 50  N:...p_type = "P
65bc0 4f 4c 59 47 4f 4e 22 3b 0a 09 09 62 72 65 61 6b  OLYGON";...break
65bd0 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
65be0 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09  _MULTIPOLYGON:..
65bf0 09 70 5f 74 79 70 65 20 3d 20 22 4d 55 4c 54 49  .p_type = "MULTI
65c00 50 4f 4c 59 47 4f 4e 22 3b 0a 09 09 62 72 65 61  POLYGON";...brea
65c10 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
65c20 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
65c30 54 49 4f 4e 3a 0a 09 09 70 5f 74 79 70 65 20 3d  TION:...p_type =
65c40 20 22 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43   "GEOMETRYCOLLEC
65c50 54 49 4f 4e 22 3b 0a 09 09 62 72 65 61 6b 3b 0a  TION";...break;.
65c60 09 20 20 20 20 7d 3b 0a 09 20 20 69 66 20 28 70  .    };..  if (p
65c70 5f 74 79 70 65 29 0a 09 20 20 20 20 7b 0a 09 09  _type)..    {...
65c80 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 70 5f  len = strlen (p_
65c90 74 79 70 65 29 3b 0a 09 09 70 5f 72 65 73 75 6c  type);...p_resul
65ca0 74 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20  t = malloc (len 
65cb0 2b 20 31 29 3b 0a 09 09 73 74 72 63 70 79 20 28  + 1);...strcpy (
65cc0 70 5f 72 65 73 75 6c 74 2c 20 70 5f 74 79 70 65  p_result, p_type
65cd0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  );..    }..  if 
65ce0 28 21 70 5f 72 65 73 75 6c 74 29 0a 09 20 20 20  (!p_result)..   
65cf0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
65d00 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
65d10 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
65d20 0a 09 09 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20  ...len = strlen 
65d30 28 70 5f 72 65 73 75 6c 74 29 3b 0a 09 09 73 71  (p_result);...sq
65d40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
65d50 74 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  t (context, p_re
65d60 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
65d70 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
65d80 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
65d90 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
65da0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
65db0 5f 53 72 69 64 46 72 6f 6d 41 75 74 68 43 52 53  _SridFromAuthCRS
65dc0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
65dd0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
65de0 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 73   argc,...      s
65df0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
65e00 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
65e10 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 72 69 64 46  unction:./ SridF
65e20 72 6f 6d 41 75 74 68 43 52 53 28 61 75 74 68 5f  romAuthCRS(auth_
65e30 6e 61 6d 65 2c 20 61 75 74 68 5f 73 72 69 64 29  name, auth_srid)
65e40 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65  ././ returns the
65e50 20 53 52 49 44 0a 2f 20 6f 72 20 4e 55 4c 4c 20   SRID./ or NULL 
65e60 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
65e70 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
65e80 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
65e90 64 20 63 68 61 72 20 2a 61 75 74 68 5f 6e 61 6d  d char *auth_nam
65ea0 65 3b 0a 20 20 20 20 69 6e 74 20 61 75 74 68 5f  e;.    int auth_
65eb0 73 72 69 64 3b 0a 20 20 20 20 69 6e 74 20 73 72  srid;.    int sr
65ec0 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63 68 61  id = -1;.    cha
65ed0 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 61 72  r *sql;.    char
65ee0 20 2a 2a 72 65 73 75 6c 74 73 3b 0a 20 20 20 20   **results;.    
65ef0 69 6e 74 20 6e 5f 72 6f 77 73 3b 0a 20 20 20 20  int n_rows;.    
65f00 69 6e 74 20 6e 5f 63 6f 6c 75 6d 6e 73 3b 0a 20  int n_columns;. 
65f10 20 20 20 63 68 61 72 20 2a 65 72 72 5f 6d 73 67     char *err_msg
65f20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
65f30 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b   ret;.    int i;
65f40 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
65f50 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
65f60 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
65f70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
65f80 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
65f90 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
65fa0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
65fb0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
65fc0 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
65fd0 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
65fe0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
65ff0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
66000 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
66010 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
66020 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
66030 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
66040 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
66050 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
66060 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
66070 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
66080 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
66090 20 61 75 74 68 5f 6e 61 6d 65 20 3d 20 73 71 6c   auth_name = sql
660a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
660b0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 61  (argv[0]);.    a
660c0 75 74 68 5f 73 72 69 64 20 3d 20 73 71 6c 69 74  uth_srid = sqlit
660d0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
660e0 67 76 5b 31 5d 29 3b 0a 0a 20 20 20 20 73 71 6c  gv[1]);..    sql
660f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
66100 74 66 20 28 22 53 45 4c 45 43 54 20 73 72 69 64  tf ("SELECT srid
66110 20 46 52 4f 4d 20 73 70 61 74 69 61 6c 5f 72 65   FROM spatial_re
66120 66 5f 73 79 73 20 22 0a 09 09 09 20 20 20 22 57  f_sys "....   "W
66130 48 45 52 45 20 55 70 70 65 72 28 61 75 74 68 5f  HERE Upper(auth_
66140 6e 61 6d 65 29 20 3d 20 55 70 70 65 72 28 25 51  name) = Upper(%Q
66150 29 20 41 4e 44 20 61 75 74 68 5f 73 72 69 64 20  ) AND auth_srid 
66160 3d 20 25 64 22 2c 0a 09 09 09 20 20 20 61 75 74  = %d",....   aut
66170 68 5f 6e 61 6d 65 2c 20 61 75 74 68 5f 73 72 69  h_name, auth_sri
66180 64 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  d);.    ret = sq
66190 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 20  lite3_get_table 
661a0 28 73 71 6c 69 74 65 2c 20 73 71 6c 2c 20 26 72  (sqlite, sql, &r
661b0 65 73 75 6c 74 73 2c 20 26 6e 5f 72 6f 77 73 2c  esults, &n_rows,
661c0 20 26 6e 5f 63 6f 6c 75 6d 6e 73 2c 0a 09 09 09   &n_columns,....
661d0 20 20 20 20 20 26 65 72 72 5f 6d 73 67 29 3b 0a       &err_msg);.
661e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
661f0 20 28 73 71 6c 29 3b 0a 20 20 20 20 69 66 20 28   (sql);.    if (
66200 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ret != SQLITE_OK
66210 29 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20  )..goto done;.  
66220 20 20 69 66 20 28 6e 5f 72 6f 77 73 20 3e 3d 20    if (n_rows >= 
66230 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 66 6f  1).      {..  fo
66240 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 3d 20 6e  r (i = 1; i <= n
66250 5f 72 6f 77 73 3b 20 69 2b 2b 29 0a 09 20 20 20  _rows; i++)..   
66260 20 20 20 73 72 69 64 20 3d 20 61 74 6f 69 20 28     srid = atoi (
66270 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 6e 5f 63  results[(i * n_c
66280 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 29 3b 0a 20  olumns) + 0]);. 
66290 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74       }.    sqlit
662a0 65 33 5f 66 72 65 65 5f 74 61 62 6c 65 20 28 72  e3_free_table (r
662b0 65 73 75 6c 74 73 29 3b 0a 20 20 64 6f 6e 65 3a  esults);.  done:
662c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
662d0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
662e0 2c 20 73 72 69 64 29 3b 0a 7d 0a 0a 73 74 61 74  , srid);.}..stat
662f0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 52 49  ic void.fnct_SRI
66300 44 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  D (sqlite3_conte
66310 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
66320 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
66330 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
66340 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
66350 3a 0a 2f 20 53 72 69 64 28 42 4c 4f 42 20 65 6e  :./ Srid(BLOB en
66360 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a  coded geometry).
66370 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20  /./ returns the 
66380 53 52 49 44 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  SRID./ or NULL i
66390 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
663a0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
663b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
663c0 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
663d0 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61   n_bytes;.    ga
663e0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
663f0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41  o = NULL;.    GA
66400 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
66410 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
66420 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
66430 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
66440 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
66450 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
66460 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
66470 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
66480 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
66490 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
664a0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
664b0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
664c0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
664d0 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
664e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
664f0 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
66500 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 46 72      geo = gaiaFr
66510 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
66520 57 6b 62 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  Wkb (p_blob, n_b
66530 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ytes);.    if (!
66540 67 65 6f 29 0a 20 20 20 20 20 20 7b 0a 23 69 66  geo).      {.#if
66550 64 65 66 20 45 4e 41 42 4c 45 5f 47 45 4f 50 41  def ENABLE_GEOPA
66560 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50 41 43 4b  CKAGE./* GEOPACK
66570 41 47 45 20 65 6e 61 62 6c 65 64 3a 20 73 75 70  AGE enabled: sup
66580 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65 6f  porting GPKG geo
66590 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20 20 69 66  metries */..  if
665a0 20 28 67 61 69 61 49 73 56 61 6c 69 64 47 50 42   (gaiaIsValidGPB
665b0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
665c0 73 29 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74  s))..    {...int
665d0 20 73 72 69 64 20 3d 20 67 61 69 61 47 65 74 53   srid = gaiaGetS
665e0 72 69 64 46 72 6f 6d 47 50 42 20 28 70 5f 62 6c  ridFromGPB (p_bl
665f0 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 09 09  ob, n_bytes);...
66600 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
66610 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 73 72 69  nt (context, sri
66620 64 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  d);..    }..  el
66630 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
66640 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
66650 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
66660 72 6e 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e  rn;.#endif /* en
66670 64 20 47 45 4f 50 41 43 4b 41 47 45 3a 20 73 75  d GEOPACKAGE: su
66680 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65  pporting GPKG ge
66690 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20 20 73  ometries */..  s
666a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
666b0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
666c0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09      }.    else..
666d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
666e0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 67 65 6f  nt (context, geo
666f0 2d 3e 53 72 69 64 29 3b 0a 20 20 20 20 67 61 69  ->Srid);.    gai
66700 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
66710 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  eo);.}..static v
66720 6f 69 64 0a 66 6e 63 74 5f 53 65 74 53 52 49 44  oid.fnct_SetSRID
66730 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
66740 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
66750 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
66760 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
66770 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
66780 0a 2f 20 53 65 74 53 72 69 64 28 42 4c 4f 42 65  ./ SetSrid(BLOBe
66790 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c  ncoded geometry,
667a0 20 73 72 69 64 29 0a 2f 0a 2f 20 72 65 74 75 72   srid)././ retur
667b0 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65 74 72  ns a new geometr
667c0 79 20 74 68 61 74 20 69 73 20 74 68 65 20 6f 72  y that is the or
667d0 69 67 69 6e 61 6c 20 6f 6e 65 20 72 65 63 65 69  iginal one recei
667e0 76 65 64 2c 20 62 75 74 20 77 69 74 68 20 74 68  ved, but with th
667f0 65 20 6e 65 77 20 53 52 49 44 20 5b 6e 6f 20 63  e new SRID [no c
66800 6f 6f 72 64 69 6e 61 74 65 73 20 74 72 61 6e 73  oordinates trans
66810 6c 61 74 69 6f 6e 20 69 73 20 61 70 70 6c 69 65  lation is applie
66820 64 5d 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  d]./ or NULL if 
66830 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
66840 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
66850 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
66860 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
66870 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61  _bytes;.    gaia
66880 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
66890 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
668a0 73 72 69 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  srid;.    unsign
668b0 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
668c0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  t = NULL;.    in
668d0 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
668e0 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
668f0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
66900 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
66910 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
66920 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
66930 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
66940 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
66950 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
66960 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
66970 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
66980 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
66990 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
669a0 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
669b0 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
669c0 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
669d0 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
669e0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
669f0 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
66a00 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
66a10 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
66a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
66a30 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
66a40 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
66a50 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
66a60 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
66a70 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
66a80 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
66a90 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
66aa0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
66ab0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
66ac0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
66ad0 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69  ER)..srid = sqli
66ae0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
66af0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
66b00 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
66b10 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
66b20 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
66b30 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
66b40 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
66b50 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
66b60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
66b70 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
66b80 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
66b90 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
66ba0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
66bb0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
66bc0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
66bd0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
66be0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
66bf0 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
66c00 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
66c10 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
66c20 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
66c30 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
66c40 20 20 20 20 20 7b 0a 09 20 20 67 65 6f 2d 3e 53       {..  geo->S
66c50 72 69 64 20 3d 20 73 72 69 64 3b 0a 09 20 20 67  rid = srid;..  g
66c60 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
66c70 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 2c 20  lobWkbEx2 (geo, 
66c80 26 70 5f 72 65 73 75 6c 74 2c 20 26 6e 5f 62 79  &p_result, &n_by
66c90 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
66ca0 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70  ....      tiny_p
66cb0 6f 69 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65  oint);..  sqlite
66cc0 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
66cd0 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
66ce0 2c 20 6e 5f 62 79 74 65 73 2c 20 66 72 65 65 29  , n_bytes, free)
66cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
66d00 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
66d10 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  geo);.}..static 
66d20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 45 6d 70 74  void.fnct_IsEmpt
66d30 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  y (sqlite3_conte
66d40 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
66d50 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
66d60 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
66d70 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
66d80 3a 0a 2f 20 49 73 45 6d 70 74 79 28 42 4c 4f 42  :./ IsEmpty(BLOB
66d90 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
66da0 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a  y)././ returns:.
66db0 2f 20 31 20 69 66 20 74 68 69 73 20 67 65 6f 6d  / 1 if this geom
66dc0 65 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  etry contains no
66dd0 20 65 6c 65 6d 65 6e 74 61 72 79 20 67 65 6f 6d   elementary geom
66de0 65 74 72 69 65 73 0a 2f 20 30 20 6f 74 68 65 72  etries./ 0 other
66df0 77 69 73 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20  wise./ or -1 if 
66e00 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
66e10 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
66e20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
66e30 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
66e40 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61  _bytes;.    gaia
66e50 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
66e60 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49 41  = NULL;.    GAIA
66e70 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
66e80 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
66e90 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
66ea0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
66eb0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
66ec0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
66ed0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
66ee0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
66ef0 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
66f00 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
66f10 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
66f20 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
66f30 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
66f40 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
66f50 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
66f60 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
66f70 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 46  .    geo = gaiaF
66f80 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
66f90 62 57 6b 62 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  bWkb (p_blob, n_
66fa0 62 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28  bytes);.    if (
66fb0 21 67 65 6f 29 0a 20 20 20 20 20 20 7b 0a 23 69  !geo).      {.#i
66fc0 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 45 4f 50  fdef ENABLE_GEOP
66fd0 41 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50 41 43  ACKAGE./* GEOPAC
66fe0 4b 41 47 45 20 65 6e 61 62 6c 65 64 3a 20 73 75  KAGE enabled: su
66ff0 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65  pporting GPKG ge
67000 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20 20 69  ometries */..  i
67010 66 20 28 67 61 69 61 49 73 56 61 6c 69 64 47 50  f (gaiaIsValidGP
67020 42 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  B (p_blob, n_byt
67030 65 73 29 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e  es))..    {...in
67040 74 20 69 73 5f 65 6d 70 74 79 20 3d 20 67 61 69  t is_empty = gai
67050 61 49 73 45 6d 70 74 79 47 50 42 20 28 70 5f 62  aIsEmptyGPB (p_b
67060 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 09  lob, n_bytes);..
67070 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
67080 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 69 73  int (context, is
67090 5f 65 6d 70 74 79 29 3b 0a 09 20 20 20 20 7d 0a  _empty);..    }.
670a0 09 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f  .  else.#endif /
670b0 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b 41 47 45  * end GEOPACKAGE
670c0 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b  : supporting GPK
670d0 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a  G geometries */.
670e0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
670f0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
67100 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  xt, -1);.      }
67110 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
67120 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
67130 6f 6e 74 65 78 74 2c 20 67 61 69 61 49 73 45 6d  ontext, gaiaIsEm
67140 70 74 79 20 28 67 65 6f 29 29 3b 0a 20 20 20 20  pty (geo));.    
67150 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
67160 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
67170 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 33 44  c void.fnct_Is3D
67180 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
67190 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
671a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
671b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
671c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
671d0 0a 2f 20 49 73 33 44 28 42 4c 4f 42 20 65 6e 63  ./ Is3D(BLOB enc
671e0 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f  oded geometry)./
671f0 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 31 20  ./ returns:./ 1 
67200 69 66 20 74 68 69 73 20 67 65 6f 6d 65 74 72 79  if this geometry
67210 20 68 61 73 20 5a 20 63 6f 6f 72 64 73 0a 2f 20   has Z coords./ 
67220 30 20 6f 74 68 65 72 77 69 73 65 0a 2f 20 6f 72  0 otherwise./ or
67230 20 2d 31 20 69 66 20 61 6e 79 20 65 72 72 6f 72   -1 if any error
67240 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
67250 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
67260 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20  char *p_blob;.  
67270 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20    int n_bytes;. 
67280 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
67290 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
672a0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
672b0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
672c0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
672d0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
672e0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
672f0 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
67300 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
67310 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
67320 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
67330 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
67340 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
67350 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
67360 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
67370 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
67380 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
67390 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
673a0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20  gv[0]);.    geo 
673b0 3d 20 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  = gaiaFromSpatia
673c0 4c 69 74 65 42 6c 6f 62 57 6b 62 20 28 70 5f 62  LiteBlobWkb (p_b
673d0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20  lob, n_bytes);. 
673e0 20 20 20 69 66 20 28 21 67 65 6f 29 0a 20 20 20     if (!geo).   
673f0 20 20 20 7b 0a 23 69 66 64 65 66 20 45 4e 41 42     {.#ifdef ENAB
67400 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45 09 2f 2a  LE_GEOPACKAGE./*
67410 20 47 45 4f 50 41 43 4b 41 47 45 20 65 6e 61 62   GEOPACKAGE enab
67420 6c 65 64 3a 20 73 75 70 70 6f 72 74 69 6e 67 20  led: supporting 
67430 47 50 4b 47 20 67 65 6f 6d 65 74 72 69 65 73 20  GPKG geometries 
67440 2a 2f 0a 09 20 20 69 66 20 28 67 61 69 61 49 73  */..  if (gaiaIs
67450 56 61 6c 69 64 47 50 42 20 28 70 5f 62 6c 6f 62  ValidGPB (p_blob
67460 2c 20 6e 5f 62 79 74 65 73 29 29 0a 09 20 20 20  , n_bytes))..   
67470 20 7b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f   {...double min_
67480 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f  x;...double max_
67490 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f  x;...double min_
674a0 79 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f  y;...double max_
674b0 79 3b 0a 09 09 69 6e 74 20 68 61 73 5f 7a 3b 0a  y;...int has_z;.
674c0 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 7a 3b 0a  ..double min_z;.
674d0 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 7a 3b 0a  ..double max_z;.
674e0 09 09 69 6e 74 20 68 61 73 5f 6d 3b 0a 09 09 64  ..int has_m;...d
674f0 6f 75 62 6c 65 20 6d 69 6e 5f 6d 3b 0a 09 09 64  ouble min_m;...d
67500 6f 75 62 6c 65 20 6d 61 78 5f 6d 3b 0a 09 09 69  ouble max_m;...i
67510 66 20 28 67 61 69 61 47 65 74 45 6e 76 65 6c 6f  f (gaiaGetEnvelo
67520 70 65 46 72 6f 6d 47 50 42 0a 09 09 20 20 20 20  peFromGPB...    
67530 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
67540 2c 20 26 6d 69 6e 5f 78 2c 20 26 6d 61 78 5f 78  , &min_x, &max_x
67550 2c 20 26 6d 69 6e 5f 79 2c 20 26 6d 61 78 5f 79  , &min_y, &max_y
67560 2c 20 26 68 61 73 5f 7a 2c 0a 09 09 20 20 20 20  , &has_z,...    
67570 20 26 6d 69 6e 5f 7a 2c 20 26 6d 61 78 5f 7a 2c   &min_z, &max_z,
67580 20 26 68 61 73 5f 6d 2c 20 26 6d 69 6e 5f 6d 2c   &has_m, &min_m,
67590 20 26 6d 61 78 5f 6d 29 29 0a 09 09 20 20 7b 0a   &max_m))...  {.
675a0 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
675b0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
675c0 65 78 74 2c 20 68 61 73 5f 7a 29 3b 0a 09 09 20  ext, has_z);... 
675d0 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73   }..    }..  els
675e0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  e.#endif /* end 
675f0 47 45 4f 50 41 43 4b 41 47 45 3a 20 73 75 70 70  GEOPACKAGE: supp
67600 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65 6f 6d  orting GPKG geom
67610 65 74 72 69 65 73 20 2a 2f 0a 09 20 20 20 20 20  etries */..     
67620 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
67630 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
67640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  );.      }.    e
67650 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  lse.      {..  i
67660 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f  f (geo->Dimensio
67670 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
67680 59 5f 5a 0a 09 20 20 20 20 20 20 7c 7c 20 67 65  Y_Z..      || ge
67690 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  o->DimensionMode
676a0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
676b0 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
676c0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
676d0 74 65 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73  text, 1);..  els
676e0 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  e..      sqlite3
676f0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
67700 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  text, 0);.      
67710 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
67720 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a  omColl (geo);.}.
67730 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
67740 74 5f 49 73 4d 65 61 73 75 72 65 64 20 28 73 71  t_IsMeasured (sq
67750 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
67760 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
67770 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
67780 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
67790 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49  QL function:./ I
677a0 73 4d 65 61 73 75 72 65 64 28 42 4c 4f 42 20 65  sMeasured(BLOB e
677b0 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29  ncoded geometry)
677c0 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20  ././ returns:./ 
677d0 31 20 69 66 20 74 68 69 73 20 67 65 6f 6d 65 74  1 if this geomet
677e0 72 79 20 68 61 73 20 4d 20 63 6f 6f 72 64 73 0a  ry has M coords.
677f0 2f 20 30 20 6f 74 68 65 72 77 69 73 65 0a 2f 20  / 0 otherwise./ 
67800 6f 72 20 2d 31 20 69 66 20 61 6e 79 20 65 72 72  or -1 if any err
67810 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
67820 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
67830 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
67840 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
67850 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
67860 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
67870 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
67880 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
67890 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
678a0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
678b0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
678c0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
678d0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
678e0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
678f0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
67900 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
67910 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
67920 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
67930 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
67940 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
67950 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
67960 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
67970 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
67980 6f 20 3d 20 67 61 69 61 46 72 6f 6d 53 70 61 74  o = gaiaFromSpat
67990 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 20 28 70  iaLiteBlobWkb (p
679a0 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b  _blob, n_bytes);
679b0 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 20  .    if (!geo). 
679c0 20 20 20 20 20 7b 0a 23 69 66 64 65 66 20 45 4e       {.#ifdef EN
679d0 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45 09  ABLE_GEOPACKAGE.
679e0 2f 2a 20 47 45 4f 50 41 43 4b 41 47 45 20 65 6e  /* GEOPACKAGE en
679f0 61 62 6c 65 64 3a 20 73 75 70 70 6f 72 74 69 6e  abled: supportin
67a00 67 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69 65  g GPKG geometrie
67a10 73 20 2a 2f 0a 09 20 20 69 66 20 28 67 61 69 61  s */..  if (gaia
67a20 49 73 56 61 6c 69 64 47 50 42 20 28 70 5f 62 6c  IsValidGPB (p_bl
67a30 6f 62 2c 20 6e 5f 62 79 74 65 73 29 29 0a 09 20  ob, n_bytes)).. 
67a40 20 20 20 7b 0a 09 09 64 6f 75 62 6c 65 20 6d 69     {...double mi
67a50 6e 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61  n_x;...double ma
67a60 78 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69  x_x;...double mi
67a70 6e 5f 79 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61  n_y;...double ma
67a80 78 5f 79 3b 0a 09 09 69 6e 74 20 68 61 73 5f 7a  x_y;...int has_z
67a90 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 7a  ;...double min_z
67aa0 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 7a  ;...double max_z
67ab0 3b 0a 09 09 69 6e 74 20 68 61 73 5f 6d 3b 0a 09  ;...int has_m;..
67ac0 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 6d 3b 0a 09  .double min_m;..
67ad0 09 64 6f 75 62 6c 65 20 6d 61 78 5f 6d 3b 0a 09  .double max_m;..
67ae0 09 69 66 20 28 67 61 69 61 47 65 74 45 6e 76 65  .if (gaiaGetEnve
67af0 6c 6f 70 65 46 72 6f 6d 47 50 42 0a 09 09 20 20  lopeFromGPB...  
67b00 20 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74    (p_blob, n_byt
67b10 65 73 2c 20 26 6d 69 6e 5f 78 2c 20 26 6d 61 78  es, &min_x, &max
67b20 5f 78 2c 20 26 6d 69 6e 5f 79 2c 20 26 6d 61 78  _x, &min_y, &max
67b30 5f 79 2c 20 26 68 61 73 5f 7a 2c 0a 09 09 20 20  _y, &has_z,...  
67b40 20 20 20 26 6d 69 6e 5f 7a 2c 20 26 6d 61 78 5f     &min_z, &max_
67b50 7a 2c 20 26 68 61 73 5f 6d 2c 20 26 6d 69 6e 5f  z, &has_m, &min_
67b60 6d 2c 20 26 6d 61 78 5f 6d 29 29 0a 09 09 20 20  m, &max_m))...  
67b70 7b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  {...      sqlite
67b80 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
67b90 6e 74 65 78 74 2c 20 68 61 73 5f 6d 29 3b 0a 09  ntext, has_m);..
67ba0 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 65  .  }..    }..  e
67bb0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e  lse.#endif /* en
67bc0 64 20 47 45 4f 50 41 43 4b 41 47 45 3a 20 73 75  d GEOPACKAGE: su
67bd0 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65  pporting GPKG ge
67be0 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20 20 20  ometries */..   
67bf0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
67c00 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
67c10 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
67c20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
67c30 20 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73   if (geo->Dimens
67c40 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
67c50 5f 58 59 5f 4d 0a 09 20 20 20 20 20 20 7c 7c 20  _XY_M..      || 
67c60 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  geo->DimensionMo
67c70 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
67c80 5f 4d 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  _M)..      sqlit
67c90 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
67ca0 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 09 20 20 65  ontext, 1);..  e
67cb0 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lse..      sqlit
67cc0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
67cd0 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20  ontext, 0);.    
67ce0 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
67cf0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
67d00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
67d10 6e 63 74 5f 4d 69 6e 5a 20 28 73 71 6c 69 74 65  nct_MinZ (sqlite
67d20 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
67d30 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
67d40 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
67d50 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
67d60 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f 4d 69  unction:./ ST_Mi
67d70 6e 5a 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20  nZ(BLOB encoded 
67d80 47 45 4d 45 54 52 59 29 0a 2f 0a 2f 20 72 65 74  GEMETRY)././ ret
67d90 75 72 6e 73 20 74 68 65 20 4d 69 6e 5a 20 63 6f  urns the MinZ co
67da0 6f 72 64 69 6e 61 74 65 20 66 6f 72 20 63 75 72  ordinate for cur
67db0 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 0a 2f  rent geometry ./
67dc0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
67dd0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
67de0 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ered.*/.    unsi
67df0 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
67e00 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
67e10 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  es;.    double m
67e20 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  in;.    double m
67e30 61 78 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  ax;.    gaiaGeom
67e40 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
67e50 4c 4c 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  LL;.    GAIA_UNU
67e60 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
67e70 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
67e80 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
67e90 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
67ea0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
67eb0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
67ec0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
67ed0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
67ee0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
67ef0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
67f00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
67f10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
67f20 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
67f30 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
67f40 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
67f50 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
67f60 6f 20 3d 20 67 61 69 61 46 72 6f 6d 53 70 61 74  o = gaiaFromSpat
67f70 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 20 28 70  iaLiteBlobWkb (p
67f80 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b  _blob, n_bytes);
67f90 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 20  .    if (!geo). 
67fa0 20 20 20 20 20 7b 0a 23 69 66 64 65 66 20 45 4e       {.#ifdef EN
67fb0 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45 09  ABLE_GEOPACKAGE.
67fc0 2f 2a 20 47 45 4f 50 41 43 4b 41 47 45 20 65 6e  /* GEOPACKAGE en
67fd0 61 62 6c 65 64 3a 20 73 75 70 70 6f 72 74 69 6e  abled: supportin
67fe0 67 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69 65  g GPKG geometrie
67ff0 73 20 2a 2f 0a 09 20 20 69 66 20 28 67 61 69 61  s */..  if (gaia
68000 49 73 56 61 6c 69 64 47 50 42 20 28 70 5f 62 6c  IsValidGPB (p_bl
68010 6f 62 2c 20 6e 5f 62 79 74 65 73 29 29 0a 09 20  ob, n_bytes)).. 
68020 20 20 20 7b 0a 09 09 64 6f 75 62 6c 65 20 6d 69     {...double mi
68030 6e 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61  n_x;...double ma
68040 78 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69  x_x;...double mi
68050 6e 5f 79 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61  n_y;...double ma
68060 78 5f 79 3b 0a 09 09 69 6e 74 20 68 61 73 5f 7a  x_y;...int has_z
68070 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 7a  ;...double min_z
68080 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 7a  ;...double max_z
68090 3b 0a 09 09 69 6e 74 20 68 61 73 5f 6d 3b 0a 09  ;...int has_m;..
680a0 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 6d 3b 0a 09  .double min_m;..
680b0 09 64 6f 75 62 6c 65 20 6d 61 78 5f 6d 3b 0a 09  .double max_m;..
680c0 09 69 66 20 28 67 61 69 61 47 65 74 45 6e 76 65  .if (gaiaGetEnve
680d0 6c 6f 70 65 46 72 6f 6d 47 50 42 0a 09 09 20 20  lopeFromGPB...  
680e0 20 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74    (p_blob, n_byt
680f0 65 73 2c 20 26 6d 69 6e 5f 78 2c 20 26 6d 61 78  es, &min_x, &max
68100 5f 78 2c 20 26 6d 69 6e 5f 79 2c 20 26 6d 61 78  _x, &min_y, &max
68110 5f 79 2c 20 26 68 61 73 5f 7a 2c 0a 09 09 20 20  _y, &has_z,...  
68120 20 20 20 26 6d 69 6e 5f 7a 2c 20 26 6d 61 78 5f     &min_z, &max_
68130 7a 2c 20 26 68 61 73 5f 6d 2c 20 26 6d 69 6e 5f  z, &has_m, &min_
68140 6d 2c 20 26 6d 61 78 5f 6d 29 29 0a 09 09 20 20  m, &max_m))...  
68150 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 68 61  {...      if (ha
68160 73 5f 7a 29 0a 09 09 09 20 20 73 71 6c 69 74 65  s_z)....  sqlite
68170 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
68180 28 63 6f 6e 74 65 78 74 2c 20 6d 69 6e 5f 7a 29  (context, min_z)
68190 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09  ;...      else..
681a0 09 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
681b0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
681c0 29 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a  );...  }..    }.
681d0 09 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f  .  else.#endif /
681e0 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b 41 47 45  * end GEOPACKAGE
681f0 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b  : supporting GPK
68200 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a  G geometries */.
68210 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
68220 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
68230 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
68240 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
68250 20 20 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e    if (geo->Dimen
68260 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
68270 41 5f 58 59 5f 5a 0a 09 20 20 20 20 20 20 7c 7c  A_XY_Z..      ||
68280 20 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d   geo->DimensionM
68290 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
682a0 5a 5f 4d 29 0a 09 20 20 20 20 7b 0a 09 09 67 61  Z_M)..    {...ga
682b0 69 61 5a 52 61 6e 67 65 47 65 6f 6d 65 74 72 79  iaZRangeGeometry
682c0 20 28 67 65 6f 2c 20 26 6d 69 6e 2c 20 26 6d 61   (geo, &min, &ma
682d0 78 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  x);...sqlite3_re
682e0 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e  sult_double (con
682f0 74 65 78 74 2c 20 6d 69 6e 29 3b 0a 09 20 20 20  text, min);..   
68300 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
68310 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
68320 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
68330 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d  ..  gaiaFreeGeom
68340 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20  Coll (geo);.    
68350 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
68360 69 64 0a 66 6e 63 74 5f 4d 61 78 5a 20 28 73 71  id.fnct_MaxZ (sq
68370 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
68380 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
68390 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
683a0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
683b0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
683c0 54 5f 4d 61 78 5a 28 42 4c 4f 42 20 65 6e 63 6f  T_MaxZ(BLOB enco
683d0 64 65 64 20 47 45 4d 45 54 52 59 29 0a 2f 0a 2f  ded GEMETRY)././
683e0 20 72 65 74 75 72 6e 73 20 74 68 65 20 4d 61 78   returns the Max
683f0 5a 20 63 6f 6f 72 64 69 6e 61 74 65 20 66 6f 72  Z coordinate for
68400 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72   current geometr
68410 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  y ./ or NULL if 
68420 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
68430 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
68440 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
68450 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
68460 5f 62 79 74 65 73 3b 0a 20 20 20 20 64 6f 75 62  _bytes;.    doub
68470 6c 65 20 6d 69 6e 3b 0a 20 20 20 20 64 6f 75 62  le min;.    doub
68480 6c 65 20 6d 61 78 3b 0a 20 20 20 20 67 61 69 61  le max;.    gaia
68490 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
684a0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49 41  = NULL;.    GAIA
684b0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
684c0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
684d0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
684e0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
684f0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
68500 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
68510 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
68520 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
68530 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
68540 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
68550 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
68560 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
68570 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
68580 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
68590 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
685a0 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
685b0 20 20 67 65 6f 20 3d 20 67 61 69 61 46 72 6f 6d    geo = gaiaFrom
685c0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
685d0 62 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  b (p_blob, n_byt
685e0 65 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  es);.    if (!ge
685f0 6f 29 0a 20 20 20 20 20 20 7b 0a 23 69 66 64 65  o).      {.#ifde
68600 66 20 45 4e 41 42 4c 45 5f 47 45 4f 50 41 43 4b  f ENABLE_GEOPACK
68610 41 47 45 09 2f 2a 20 47 45 4f 50 41 43 4b 41 47  AGE./* GEOPACKAG
68620 45 20 65 6e 61 62 6c 65 64 3a 20 73 75 70 70 6f  E enabled: suppo
68630 72 74 69 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65  rting GPKG geome
68640 74 72 69 65 73 20 2a 2f 0a 09 20 20 69 66 20 28  tries */..  if (
68650 67 61 69 61 49 73 56 61 6c 69 64 47 50 42 20 28  gaiaIsValidGPB (
68660 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29  p_blob, n_bytes)
68670 29 0a 09 20 20 20 20 7b 0a 09 09 64 6f 75 62 6c  )..    {...doubl
68680 65 20 6d 69 6e 5f 78 3b 0a 09 09 64 6f 75 62 6c  e min_x;...doubl
68690 65 20 6d 61 78 5f 78 3b 0a 09 09 64 6f 75 62 6c  e max_x;...doubl
686a0 65 20 6d 69 6e 5f 79 3b 0a 09 09 64 6f 75 62 6c  e min_y;...doubl
686b0 65 20 6d 61 78 5f 79 3b 0a 09 09 69 6e 74 20 68  e max_y;...int h
686c0 61 73 5f 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  as_z;...double m
686d0 69 6e 5f 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  in_z;...double m
686e0 61 78 5f 7a 3b 0a 09 09 69 6e 74 20 68 61 73 5f  ax_z;...int has_
686f0 6d 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f  m;...double min_
68700 6d 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f  m;...double max_
68710 6d 3b 0a 09 09 69 66 20 28 67 61 69 61 47 65 74  m;...if (gaiaGet
68720 45 6e 76 65 6c 6f 70 65 46 72 6f 6d 47 50 42 0a  EnvelopeFromGPB.
68730 09 09 20 20 20 20 28 70 5f 62 6c 6f 62 2c 20 6e  ..    (p_blob, n
68740 5f 62 79 74 65 73 2c 20 26 6d 69 6e 5f 78 2c 20  _bytes, &min_x, 
68750 26 6d 61 78 5f 78 2c 20 26 6d 69 6e 5f 79 2c 20  &max_x, &min_y, 
68760 26 6d 61 78 5f 79 2c 20 26 68 61 73 5f 7a 2c 0a  &max_y, &has_z,.
68770 09 09 20 20 20 20 20 26 6d 69 6e 5f 7a 2c 20 26  ..     &min_z, &
68780 6d 61 78 5f 7a 2c 20 26 68 61 73 5f 6d 2c 20 26  max_z, &has_m, &
68790 6d 69 6e 5f 6d 2c 20 26 6d 61 78 5f 6d 29 29 0a  min_m, &max_m)).
687a0 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66  ..  {...      if
687b0 20 28 68 61 73 5f 7a 29 0a 09 09 09 20 20 73 71   (has_z)....  sq
687c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
687d0 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 6d 61  ble (context, ma
687e0 78 5f 7a 29 3b 0a 09 09 20 20 20 20 20 20 65 6c  x_z);...      el
687f0 73 65 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f  se....  sqlite3_
68800 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
68810 74 65 78 74 29 3b 0a 09 09 20 20 7d 0a 09 20 20  text);...  }..  
68820 20 20 7d 0a 09 20 20 65 6c 73 65 0a 23 65 6e 64    }..  else.#end
68830 69 66 20 2f 2a 20 65 6e 64 20 47 45 4f 50 41 43  if /* end GEOPAC
68840 4b 41 47 45 3a 20 73 75 70 70 6f 72 74 69 6e 67  KAGE: supporting
68850 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69 65 73   GPKG geometries
68860 20 2a 2f 0a 09 20 20 20 20 20 20 73 71 6c 69 74   */..      sqlit
68870 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
68880 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
68890 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
688a0 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e 44   {..  if (geo->D
688b0 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
688c0 20 47 41 49 41 5f 58 59 5f 5a 0a 09 20 20 20 20   GAIA_XY_Z..    
688d0 20 20 7c 7c 20 67 65 6f 2d 3e 44 69 6d 65 6e 73    || geo->Dimens
688e0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
688f0 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b 0a  _XY_Z_M)..    {.
68900 09 09 67 61 69 61 5a 52 61 6e 67 65 47 65 6f 6d  ..gaiaZRangeGeom
68910 65 74 72 79 20 28 67 65 6f 2c 20 26 6d 69 6e 2c  etry (geo, &min,
68920 20 26 6d 61 78 29 3b 0a 09 09 73 71 6c 69 74 65   &max);...sqlite
68930 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
68940 28 63 6f 6e 74 65 78 74 2c 20 6d 61 78 29 3b 0a  (context, max);.
68950 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
68960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
68970 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
68980 78 74 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65  xt);..  gaiaFree
68990 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
689a0 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69        }.}..stati
689b0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 69 6e 4d  c void.fnct_MinM
689c0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
689d0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
689e0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
689f0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
68a00 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
68a10 0a 2f 20 53 54 5f 4d 69 6e 4d 28 42 4c 4f 42 20  ./ ST_MinM(BLOB 
68a20 65 6e 63 6f 64 65 64 20 47 45 4d 45 54 52 59 29  encoded GEMETRY)
68a30 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65  ././ returns the
68a40 20 4d 69 6e 4d 20 63 6f 6f 72 64 69 6e 61 74 65   MinM coordinate
68a50 20 66 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f   for current geo
68a60 6d 65 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c  metry ./ or NULL
68a70 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
68a80 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
68a90 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
68aa0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
68ab0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
68ac0 64 6f 75 62 6c 65 20 6d 69 6e 3b 0a 20 20 20 20  double min;.    
68ad0 64 6f 75 62 6c 65 20 6d 61 78 3b 0a 20 20 20 20  double max;.    
68ae0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
68af0 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
68b00 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
68b10 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
68b20 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
68b30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
68b40 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
68b50 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
68b60 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
68b70 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
68b80 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
68b90 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
68ba0 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
68bb0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
68bc0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
68bd0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
68be0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
68bf0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
68c00 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61  ;.    geo = gaia
68c10 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
68c20 6f 62 57 6b 62 20 28 70 5f 62 6c 6f 62 2c 20 6e  obWkb (p_blob, n
68c30 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20  _bytes);.    if 
68c40 28 21 67 65 6f 29 0a 20 20 20 20 20 20 7b 0a 23  (!geo).      {.#
68c50 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 45 4f  ifdef ENABLE_GEO
68c60 50 41 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50 41  PACKAGE./* GEOPA
68c70 43 4b 41 47 45 20 65 6e 61 62 6c 65 64 3a 20 73  CKAGE enabled: s
68c80 75 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67  upporting GPKG g
68c90 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20 20  eometries */..  
68ca0 69 66 20 28 67 61 69 61 49 73 56 61 6c 69 64 47  if (gaiaIsValidG
68cb0 50 42 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  PB (p_blob, n_by
68cc0 74 65 73 29 29 0a 09 20 20 20 20 7b 0a 09 09 64  tes))..    {...d
68cd0 6f 75 62 6c 65 20 6d 69 6e 5f 78 3b 0a 09 09 64  ouble min_x;...d
68ce0 6f 75 62 6c 65 20 6d 61 78 5f 78 3b 0a 09 09 64  ouble max_x;...d
68cf0 6f 75 62 6c 65 20 6d 69 6e 5f 79 3b 0a 09 09 64  ouble min_y;...d
68d00 6f 75 62 6c 65 20 6d 61 78 5f 79 3b 0a 09 09 69  ouble max_y;...i
68d10 6e 74 20 68 61 73 5f 7a 3b 0a 09 09 64 6f 75 62  nt has_z;...doub
68d20 6c 65 20 6d 69 6e 5f 7a 3b 0a 09 09 64 6f 75 62  le min_z;...doub
68d30 6c 65 20 6d 61 78 5f 7a 3b 0a 09 09 69 6e 74 20  le max_z;...int 
68d40 68 61 73 5f 6d 3b 0a 09 09 64 6f 75 62 6c 65 20  has_m;...double 
68d50 6d 69 6e 5f 6d 3b 0a 09 09 64 6f 75 62 6c 65 20  min_m;...double 
68d60 6d 61 78 5f 6d 3b 0a 09 09 69 66 20 28 67 61 69  max_m;...if (gai
68d70 61 47 65 74 45 6e 76 65 6c 6f 70 65 46 72 6f 6d  aGetEnvelopeFrom
68d80 47 50 42 0a 09 09 20 20 20 20 28 70 5f 62 6c 6f  GPB...    (p_blo
68d90 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26 6d 69 6e  b, n_bytes, &min
68da0 5f 78 2c 20 26 6d 61 78 5f 78 2c 20 26 6d 69 6e  _x, &max_x, &min
68db0 5f 79 2c 20 26 6d 61 78 5f 79 2c 20 26 68 61 73  _y, &max_y, &has
68dc0 5f 7a 2c 0a 09 09 20 20 20 20 20 26 6d 69 6e 5f  _z,...     &min_
68dd0 7a 2c 20 26 6d 61 78 5f 7a 2c 20 26 68 61 73 5f  z, &max_z, &has_
68de0 6d 2c 20 26 6d 69 6e 5f 6d 2c 20 26 6d 61 78 5f  m, &min_m, &max_
68df0 6d 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  m))...  {...    
68e00 20 20 69 66 20 28 68 61 73 5f 6d 29 0a 09 09 09    if (has_m)....
68e10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
68e20 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74  _double (context
68e30 2c 20 6d 69 6e 5f 6d 29 3b 0a 09 09 20 20 20 20  , min_m);...    
68e40 20 20 65 6c 73 65 0a 09 09 09 20 20 73 71 6c 69    else....  sqli
68e50 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
68e60 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 20 20 7d  (context);...  }
68e70 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
68e80 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 47 45  #endif /* end GE
68e90 4f 50 41 43 4b 41 47 45 3a 20 73 75 70 70 6f 72  OPACKAGE: suppor
68ea0 74 69 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65 74  ting GPKG geomet
68eb0 72 69 65 73 20 2a 2f 0a 09 20 20 20 20 20 20 73  ries */..      s
68ec0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
68ed0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
68ee0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
68ef0 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65       {..  if (ge
68f00 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  o->DimensionMode
68f10 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 0a 09  l == GAIA_XY_M..
68f20 20 20 20 20 20 20 7c 7c 20 67 65 6f 2d 3e 44 69        || geo->Di
68f30 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
68f40 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20  GAIA_XY_Z_M)..  
68f50 20 20 7b 0a 09 09 67 61 69 61 4d 52 61 6e 67 65    {...gaiaMRange
68f60 47 65 6f 6d 65 74 72 79 20 28 67 65 6f 2c 20 26  Geometry (geo, &
68f70 6d 69 6e 2c 20 26 6d 61 78 29 3b 0a 09 09 73 71  min, &max);...sq
68f80 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
68f90 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 6d 69  ble (context, mi
68fa0 6e 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  n);..    }..  el
68fb0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
68fc0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
68fd0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 61 69 61  ontext);..  gaia
68fe0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
68ff0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73  o);.      }.}..s
69000 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
69010 4d 61 78 4d 20 28 73 71 6c 69 74 65 33 5f 63 6f  MaxM (sqlite3_co
69020 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
69030 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
69040 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
69050 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
69060 69 6f 6e 3a 0a 2f 20 53 54 5f 4d 61 78 4d 28 42  ion:./ ST_MaxM(B
69070 4c 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4d 45  LOB encoded GEME
69080 54 52 59 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  TRY)././ returns
69090 20 74 68 65 20 4d 61 78 4d 20 63 6f 6f 72 64 69   the MaxM coordi
690a0 6e 61 74 65 20 66 6f 72 20 63 75 72 72 65 6e 74  nate for current
690b0 20 67 65 6f 6d 65 74 72 79 20 0a 2f 20 6f 72 20   geometry ./ or 
690c0 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
690d0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
690e0 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
690f0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
69100 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
69110 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e 3b 0a      double min;.
69120 20 20 20 20 64 6f 75 62 6c 65 20 6d 61 78 3b 0a      double max;.
69130 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
69140 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a  Ptr geo = NULL;.
69150 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
69160 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
69170 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
69180 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
69190 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
691a0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
691b0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
691c0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
691d0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
691e0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
691f0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
69200 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
69210 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
69220 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
69230 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
69240 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
69250 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20  [0]);.    geo = 
69260 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
69270 74 65 42 6c 6f 62 57 6b 62 20 28 70 5f 62 6c 6f  teBlobWkb (p_blo
69280 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20  b, n_bytes);.   
69290 20 69 66 20 28 21 67 65 6f 29 0a 20 20 20 20 20   if (!geo).     
692a0 20 7b 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45   {.#ifdef ENABLE
692b0 5f 47 45 4f 50 41 43 4b 41 47 45 09 2f 2a 20 47  _GEOPACKAGE./* G
692c0 45 4f 50 41 43 4b 41 47 45 20 65 6e 61 62 6c 65  EOPACKAGE enable
692d0 64 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50  d: supporting GP
692e0 4b 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f  KG geometries */
692f0 0a 09 20 20 69 66 20 28 67 61 69 61 49 73 56 61  ..  if (gaiaIsVa
69300 6c 69 64 47 50 42 20 28 70 5f 62 6c 6f 62 2c 20  lidGPB (p_blob, 
69310 6e 5f 62 79 74 65 73 29 29 0a 09 20 20 20 20 7b  n_bytes))..    {
69320 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 78 3b  ...double min_x;
69330 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 78 3b  ...double max_x;
69340 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 79 3b  ...double min_y;
69350 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 79 3b  ...double max_y;
69360 0a 09 09 69 6e 74 20 68 61 73 5f 7a 3b 0a 09 09  ...int has_z;...
69370 64 6f 75 62 6c 65 20 6d 69 6e 5f 7a 3b 0a 09 09  double min_z;...
69380 64 6f 75 62 6c 65 20 6d 61 78 5f 7a 3b 0a 09 09  double max_z;...
69390 69 6e 74 20 68 61 73 5f 6d 3b 0a 09 09 64 6f 75  int has_m;...dou
693a0 62 6c 65 20 6d 69 6e 5f 6d 3b 0a 09 09 64 6f 75  ble min_m;...dou
693b0 62 6c 65 20 6d 61 78 5f 6d 3b 0a 09 09 69 66 20  ble max_m;...if 
693c0 28 67 61 69 61 47 65 74 45 6e 76 65 6c 6f 70 65  (gaiaGetEnvelope
693d0 46 72 6f 6d 47 50 42 0a 09 09 20 20 20 20 28 70  FromGPB...    (p
693e0 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
693f0 26 6d 69 6e 5f 78 2c 20 26 6d 61 78 5f 78 2c 20  &min_x, &max_x, 
69400 26 6d 69 6e 5f 79 2c 20 26 6d 61 78 5f 79 2c 20  &min_y, &max_y, 
69410 26 68 61 73 5f 7a 2c 0a 09 09 20 20 20 20 20 26  &has_z,...     &
69420 6d 69 6e 5f 7a 2c 20 26 6d 61 78 5f 7a 2c 20 26  min_z, &max_z, &
69430 68 61 73 5f 6d 2c 20 26 6d 69 6e 5f 6d 2c 20 26  has_m, &min_m, &
69440 6d 61 78 5f 6d 29 29 0a 09 09 20 20 7b 0a 09 09  max_m))...  {...
69450 20 20 20 20 20 20 69 66 20 28 68 61 73 5f 6d 29        if (has_m)
69460 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f 72 65  ....  sqlite3_re
69470 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e  sult_double (con
69480 74 65 78 74 2c 20 6d 61 78 5f 6d 29 3b 0a 09 09  text, max_m);...
69490 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20        else....  
694a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
694b0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
694c0 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 65  .  }..    }..  e
694d0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e  lse.#endif /* en
694e0 64 20 47 45 4f 50 41 43 4b 41 47 45 3a 20 73 75  d GEOPACKAGE: su
694f0 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65  pporting GPKG ge
69500 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20 20 20  ometries */..   
69510 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
69520 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
69530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
69540 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  se.      {..  if
69550 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e   (geo->Dimension
69560 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
69570 5f 4d 0a 09 20 20 20 20 20 20 7c 7c 20 67 65 6f  _M..      || geo
69580 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
69590 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
695a0 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 4d 52  ..    {...gaiaMR
695b0 61 6e 67 65 47 65 6f 6d 65 74 72 79 20 28 67 65  angeGeometry (ge
695c0 6f 2c 20 26 6d 69 6e 2c 20 26 6d 61 78 29 3b 0a  o, &min, &max);.
695d0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
695e0 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74  _double (context
695f0 2c 20 6d 61 78 29 3b 0a 09 20 20 20 20 7d 0a 09  , max);..    }..
69600 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71    else..      sq
69610 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
69620 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
69630 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
69640 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   (geo);.      }.
69650 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
69660 6e 63 74 5f 45 6e 76 65 6c 6f 70 65 20 28 73 71  nct_Envelope (sq
69670 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
69680 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
69690 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
696a0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
696b0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45  QL function:./ E
696c0 6e 76 65 6c 6f 70 65 28 42 4c 4f 42 20 65 6e 63  nvelope(BLOB enc
696d0 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f  oded geometry)./
696e0 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 4d  ./ returns the M
696f0 42 52 20 66 6f 72 20 63 75 72 72 65 6e 74 20 67  BR for current g
69700 65 6f 6d 65 74 72 79 20 0a 2f 20 6f 72 20 4e 55  eometry ./ or NU
69710 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
69720 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
69730 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
69740 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
69750 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
69760 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
69770 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
69780 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
69790 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
697a0 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
697b0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
697c0 74 72 20 62 62 6f 78 3b 0a 20 20 20 20 67 61 69  tr bbox;.    gai
697d0 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79  aPolygonPtr poly
697e0 67 3b 0a 20 20 20 20 67 61 69 61 52 69 6e 67 50  g;.    gaiaRingP
697f0 74 72 20 72 65 63 74 3b 0a 20 20 20 20 69 6e 74  tr rect;.    int
69800 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
69810 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
69820 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
69830 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
69840 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
69850 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
69860 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
69870 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
69880 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
69890 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
698a0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
698b0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
698c0 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
698d0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
698e0 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
698f0 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
69900 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
69910 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
69920 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f  g_mode;..  tiny_
69930 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
69940 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
69950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
69960 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
69970 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
69980 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
69990 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
699a0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
699b0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
699c0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
699d0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
699e0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
699f0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
69a00 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
69a10 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
69a20 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
69a30 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09  0]);.    geo =..
69a40 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
69a50 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
69a60 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
69a70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
69a80 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
69a90 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f  s);.    if (!geo
69aa0 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
69ab0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
69ac0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
69ad0 20 7b 0a 09 20 20 67 61 69 61 4d 62 72 47 65 6f   {..  gaiaMbrGeo
69ae0 6d 65 74 72 79 20 28 67 65 6f 29 3b 0a 09 20 20  metry (geo);..  
69af0 62 62 6f 78 20 3d 20 67 61 69 61 41 6c 6c 6f 63  bbox = gaiaAlloc
69b00 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 20 20  GeomColl ();..  
69b10 62 62 6f 78 2d 3e 53 72 69 64 20 3d 20 67 65 6f  bbox->Srid = geo
69b20 2d 3e 53 72 69 64 3b 0a 09 20 20 70 6f 6c 79 67  ->Srid;..  polyg
69b30 20 3d 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f   = gaiaAddPolygo
69b40 6e 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 62 62 6f  nToGeomColl (bbo
69b50 78 2c 20 35 2c 20 30 29 3b 0a 09 20 20 72 65 63  x, 5, 0);..  rec
69b60 74 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72  t = polyg->Exter
69b70 69 6f 72 3b 0a 09 20 20 67 61 69 61 53 65 74 50  ior;..  gaiaSetP
69b80 6f 69 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72  oint (rect->Coor
69b90 64 73 2c 20 30 2c 20 67 65 6f 2d 3e 4d 69 6e 58  ds, 0, geo->MinX
69ba0 2c 20 67 65 6f 2d 3e 4d 69 6e 59 29 3b 09 2f 2a  , geo->MinY);./*
69bb0 20 76 65 72 74 65 78 20 23 20 31 20 2a 2f 0a 09   vertex # 1 */..
69bc0 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28    gaiaSetPoint (
69bd0 72 65 63 74 2d 3e 43 6f 6f 72 64 73 2c 20 31 2c  rect->Coords, 1,
69be0 20 67 65 6f 2d 3e 4d 61 78 58 2c 20 67 65 6f 2d   geo->MaxX, geo-
69bf0 3e 4d 69 6e 59 29 3b 09 2f 2a 20 76 65 72 74 65  >MinY);./* verte
69c00 78 20 23 20 32 20 2a 2f 0a 09 20 20 67 61 69 61  x # 2 */..  gaia
69c10 53 65 74 50 6f 69 6e 74 20 28 72 65 63 74 2d 3e  SetPoint (rect->
69c20 43 6f 6f 72 64 73 2c 20 32 2c 20 67 65 6f 2d 3e  Coords, 2, geo->
69c30 4d 61 78 58 2c 20 67 65 6f 2d 3e 4d 61 78 59 29  MaxX, geo->MaxY)
69c40 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 33 20  ;./* vertex # 3 
69c50 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69  */..  gaiaSetPoi
69c60 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73  nt (rect->Coords
69c70 2c 20 33 2c 20 67 65 6f 2d 3e 4d 69 6e 58 2c 20  , 3, geo->MinX, 
69c80 67 65 6f 2d 3e 4d 61 78 59 29 3b 09 2f 2a 20 76  geo->MaxY);./* v
69c90 65 72 74 65 78 20 23 20 34 20 2a 2f 0a 09 20 20  ertex # 4 */..  
69ca0 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72 65  gaiaSetPoint (re
69cb0 63 74 2d 3e 43 6f 6f 72 64 73 2c 20 34 2c 20 67  ct->Coords, 4, g
69cc0 65 6f 2d 3e 4d 69 6e 58 2c 20 67 65 6f 2d 3e 4d  eo->MinX, geo->M
69cd0 69 6e 59 29 3b 09 2f 2a 20 76 65 72 74 65 78 20  inY);./* vertex 
69ce0 23 20 35 20 5b 73 61 6d 65 20 61 73 20 76 65 72  # 5 [same as ver
69cf0 74 65 78 20 23 20 31 20 74 6f 20 63 6c 6f 73 65  tex # 1 to close
69d00 20 74 68 65 20 70 6f 6c 79 67 6f 6e 5d 20 2a 2f   the polygon] */
69d10 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61  ..  gaiaToSpatia
69d20 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
69d30 62 62 6f 78 2c 20 26 70 5f 72 65 73 75 6c 74 2c  bbox, &p_result,
69d40 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
69d50 2c 0a 09 09 09 09 20 20 20 20 20 20 74 69 6e 79  ,.....      tiny
69d60 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 67 61 69 61  _point);..  gaia
69d70 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 62 62  FreeGeomColl (bb
69d80 6f 78 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  ox);..  sqlite3_
69d90 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
69da0 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
69db0 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20  len, free);.    
69dc0 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
69dd0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
69de0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
69df0 6e 63 74 5f 45 78 70 61 6e 64 20 28 73 71 6c 69  nct_Expand (sqli
69e00 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
69e10 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
69e20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
69e30 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
69e40 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f   function:./ ST_
69e50 45 78 70 61 6e 64 28 42 4c 4f 42 20 65 6e 63 6f  Expand(BLOB enco
69e60 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20 64 6f  ded geometry, do
69e70 75 62 6c 65 20 61 6d 6f 75 6e 74 29 0a 2f 0a 2f  uble amount)././
69e80 20 72 65 74 75 72 6e 73 20 74 68 65 20 4d 42 52   returns the MBR
69e90 20 66 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f   for current geo
69ea0 6d 65 74 72 79 20 65 78 70 61 6e 64 65 64 20 62  metry expanded b
69eb0 79 20 22 61 6d 6f 75 6e 74 22 20 69 6e 20 65 61  y "amount" in ea
69ec0 63 68 20 64 69 72 65 63 74 69 6f 6e 0a 2f 20 6f  ch direction./ o
69ed0 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
69ee0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
69ef0 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ed.*/.    unsign
69f00 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
69f10 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
69f20 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
69f30 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
69f40 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
69f50 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
69f60 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
69f70 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
69f80 6f 6c 6c 50 74 72 20 62 62 6f 78 3b 0a 20 20 20  ollPtr bbox;.   
69f90 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
69fa0 70 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69 61 52  polyg;.    gaiaR
69fb0 69 6e 67 50 74 72 20 72 65 63 74 3b 0a 20 20 20  ingPtr rect;.   
69fc0 20 64 6f 75 62 6c 65 20 74 69 63 3b 0a 20 20 20   double tic;.   
69fd0 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
69fe0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
69ff0 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
6a000 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
6a010 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
6a020 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
6a030 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
6a040 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
6a050 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
6a060 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
6a070 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
6a080 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
6a090 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
6a0a0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
6a0b0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
6a0c0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
6a0d0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
6a0e0 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
6a0f0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
6a100 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
6a110 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
6a120 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
6a130 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
6a140 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
6a150 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
6a160 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
6a170 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
6a180 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
6a190 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
6a1a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6a1b0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
6a1c0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
6a1d0 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
6a1e0 5f 46 4c 4f 41 54 29 0a 09 74 69 63 20 3d 20 73  _FLOAT)..tic = s
6a1f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
6a200 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ble (argv[1]);. 
6a210 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
6a220 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
6a230 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
6a240 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
6a250 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65    {..  int_value
6a260 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6a270 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
6a280 09 20 20 74 69 63 20 3d 20 69 6e 74 5f 76 61 6c  .  tic = int_val
6a290 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
6a2a0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
6a2b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
6a2c0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
6a2d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6a2e0 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
6a2f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6a300 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6a310 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
6a320 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
6a330 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
6a340 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
6a350 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
6a360 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
6a370 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
6a380 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
6a390 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
6a3a0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
6a3b0 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
6a3c0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
6a3d0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
6a3e0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69  e.      {..  gai
6a3f0 61 4d 62 72 47 65 6f 6d 65 74 72 79 20 28 67 65  aMbrGeometry (ge
6a400 6f 29 3b 0a 09 20 20 62 62 6f 78 20 3d 20 67 61  o);..  bbox = ga
6a410 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20  iaAllocGeomColl 
6a420 28 29 3b 0a 09 20 20 62 62 6f 78 2d 3e 53 72 69  ();..  bbox->Sri
6a430 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09  d = geo->Srid;..
6a440 20 20 70 6f 6c 79 67 20 3d 20 67 61 69 61 41 64    polyg = gaiaAd
6a450 64 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f  dPolygonToGeomCo
6a460 6c 6c 20 28 62 62 6f 78 2c 20 35 2c 20 30 29 3b  ll (bbox, 5, 0);
6a470 0a 09 20 20 72 65 63 74 20 3d 20 70 6f 6c 79 67  ..  rect = polyg
6a480 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20 67  ->Exterior;..  g
6a490 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72 65 63  aiaSetPoint (rec
6a4a0 74 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 67 65  t->Coords, 0, ge
6a4b0 6f 2d 3e 4d 69 6e 58 20 2d 20 74 69 63 2c 20 67  o->MinX - tic, g
6a4c0 65 6f 2d 3e 4d 69 6e 59 20 2d 20 74 69 63 29 3b  eo->MinY - tic);
6a4d0 09 2f 2a 20 76 65 72 74 65 78 20 23 20 31 20 2a  ./* vertex # 1 *
6a4e0 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69 6e  /..  gaiaSetPoin
6a4f0 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73 2c  t (rect->Coords,
6a500 20 31 2c 20 67 65 6f 2d 3e 4d 61 78 58 20 2b 20   1, geo->MaxX + 
6a510 74 69 63 2c 20 67 65 6f 2d 3e 4d 69 6e 59 20 2d  tic, geo->MinY -
6a520 20 74 69 63 29 3b 09 2f 2a 20 76 65 72 74 65 78   tic);./* vertex
6a530 20 23 20 32 20 2a 2f 0a 09 20 20 67 61 69 61 53   # 2 */..  gaiaS
6a540 65 74 50 6f 69 6e 74 20 28 72 65 63 74 2d 3e 43  etPoint (rect->C
6a550 6f 6f 72 64 73 2c 20 32 2c 20 67 65 6f 2d 3e 4d  oords, 2, geo->M
6a560 61 78 58 20 2b 20 74 69 63 2c 20 67 65 6f 2d 3e  axX + tic, geo->
6a570 4d 61 78 59 20 2b 20 74 69 63 29 3b 09 2f 2a 20  MaxY + tic);./* 
6a580 76 65 72 74 65 78 20 23 20 33 20 2a 2f 0a 09 20  vertex # 3 */.. 
6a590 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72   gaiaSetPoint (r
6a5a0 65 63 74 2d 3e 43 6f 6f 72 64 73 2c 20 33 2c 20  ect->Coords, 3, 
6a5b0 67 65 6f 2d 3e 4d 69 6e 58 20 2d 20 74 69 63 2c  geo->MinX - tic,
6a5c0 20 67 65 6f 2d 3e 4d 61 78 59 20 2b 20 74 69 63   geo->MaxY + tic
6a5d0 29 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 34  );./* vertex # 4
6a5e0 20 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f   */..  gaiaSetPo
6a5f0 69 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64  int (rect->Coord
6a600 73 2c 20 34 2c 20 67 65 6f 2d 3e 4d 69 6e 58 20  s, 4, geo->MinX 
6a610 2d 20 74 69 63 2c 20 67 65 6f 2d 3e 4d 69 6e 59  - tic, geo->MinY
6a620 20 2d 20 74 69 63 29 3b 09 2f 2a 20 76 65 72 74   - tic);./* vert
6a630 65 78 20 23 20 35 20 5b 73 61 6d 65 20 61 73 20  ex # 5 [same as 
6a640 76 65 72 74 65 78 20 23 20 31 20 74 6f 20 63 6c  vertex # 1 to cl
6a650 6f 73 65 20 74 68 65 20 70 6f 6c 79 67 6f 6e 5d  ose the polygon]
6a660 20 2a 2f 0a 09 20 20 67 61 69 61 54 6f 53 70 61   */..  gaiaToSpa
6a670 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
6a680 32 20 28 62 62 6f 78 2c 20 26 70 5f 72 65 73 75  2 (bbox, &p_resu
6a690 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d  lt, &len, gpkg_m
6a6a0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 74  ode,.....      t
6a6b0 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 67  iny_point);..  g
6a6c0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
6a6d0 28 62 62 6f 78 29 3b 0a 09 20 20 73 71 6c 69 74  (bbox);..  sqlit
6a6e0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
6a6f0 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
6a700 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20  t, len, free);. 
6a710 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
6a720 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
6a730 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
6a740 64 0a 62 75 69 6c 64 5f 66 69 6c 74 65 72 5f 6d  d.build_filter_m
6a750 62 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  br (sqlite3_cont
6a760 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
6a770 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 73 71 6c  nt argc,...  sql
6a780 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
6a790 67 76 2c 20 69 6e 74 20 6d 6f 64 65 29 0a 7b 0a  gv, int mode).{.
6a7a0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  /* SQL functions
6a7b0 3a 0a 2f 20 42 75 69 6c 64 4d 62 72 46 69 6c 74  :./ BuildMbrFilt
6a7c0 65 72 28 64 6f 75 62 6c 65 20 58 31 2c 20 64 6f  er(double X1, do
6a7d0 75 62 6c 65 20 59 31 2c 20 64 6f 75 62 6c 65 20  uble Y1, double 
6a7e0 58 32 2c 20 64 6f 75 62 6c 65 20 59 32 29 0a 2f  X2, double Y2)./
6a7f0 20 46 69 6c 74 65 72 4d 42 52 57 69 74 68 69 6e   FilterMBRWithin
6a800 28 64 6f 75 62 6c 65 20 58 31 2c 20 64 6f 75 62  (double X1, doub
6a810 6c 65 20 59 31 2c 20 64 6f 75 62 6c 65 20 58 32  le Y1, double X2
6a820 2c 20 64 6f 75 62 6c 65 20 59 32 29 0a 2f 20 46  , double Y2)./ F
6a830 69 6c 74 65 72 4d 42 52 43 6f 6e 74 61 69 6e 28  ilterMBRContain(
6a840 64 6f 75 62 6c 65 20 58 31 2c 20 64 6f 75 62 6c  double X1, doubl
6a850 65 20 59 31 2c 20 64 6f 75 62 6c 65 20 58 32 2c  e Y1, double X2,
6a860 20 64 6f 75 62 6c 65 20 59 32 29 0a 2f 20 46 69   double Y2)./ Fi
6a870 6c 74 65 72 4d 42 52 49 6e 74 65 72 73 65 63 74  lterMBRIntersect
6a880 73 28 64 6f 75 62 6c 65 20 58 31 2c 20 64 6f 75  s(double X1, dou
6a890 62 6c 65 20 59 31 2c 20 64 6f 75 62 6c 65 20 58  ble Y1, double X
6a8a0 32 2c 20 64 6f 75 62 6c 65 20 59 32 29 0a 2f 0a  2, double Y2)./.
6a8b0 2f 20 62 75 69 6c 64 73 20 61 20 67 65 6e 65 72  / builds a gener
6a8c0 69 63 20 66 69 6c 74 65 72 20 66 6f 72 20 4d 42  ic filter for MB
6a8d0 52 20 66 72 6f 6d 20 74 77 6f 20 70 6f 69 6e 74  R from two point
6a8e0 73 20 28 69 64 65 6e 74 69 66 79 69 6e 67 20 61  s (identifying a
6a8f0 20 72 65 63 74 61 6e 67 6c 65 27 73 20 64 69 61   rectangle's dia
6a900 67 6f 6e 61 6c 29 20 0a 2f 20 6f 72 20 4e 55 4c  gonal) ./ or NUL
6a910 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
6a920 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
6a930 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
6a940 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6a950 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
6a960 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 31 3b  ;.    double x1;
6a970 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 31 3b 0a  .    double y1;.
6a980 20 20 20 20 64 6f 75 62 6c 65 20 78 32 3b 0a 20      double x2;. 
6a990 20 20 20 64 6f 75 62 6c 65 20 79 32 3b 0a 20 20     double y2;.  
6a9a0 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b    int int_value;
6a9b0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
6a9c0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
6a9d0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
6a9e0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
6a9f0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
6aa00 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
6aa10 0a 09 78 31 20 3d 20 73 71 6c 69 74 65 33 5f 76  ..x1 = sqlite3_v
6aa20 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
6aa30 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[0]);.    else 
6aa40 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
6aa50 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
6aa60 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
6aa70 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
6aa80 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
6aa90 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
6aaa0 67 76 5b 30 5d 29 3b 0a 09 20 20 78 31 20 3d 20  gv[0]);..  x1 = 
6aab0 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
6aac0 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
6aad0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
6aae0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6aaf0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
6ab00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
6ab10 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6ab20 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
6ab30 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
6ab40 79 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  y1 = sqlite3_val
6ab50 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
6ab60 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  1]);.    else if
6ab70 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
6ab80 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
6ab90 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
6aba0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
6abb0 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
6abc0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
6abd0 5b 31 5d 29 3b 0a 09 20 20 79 31 20 3d 20 69 6e  [1]);..  y1 = in
6abe0 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  t_value;.      }
6abf0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
6ac00 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
6ac10 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
6ac20 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
6ac30 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
6ac40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6ac50 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
6ac60 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 78 32  QLITE_FLOAT)..x2
6ac70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6ac80 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d  _double (argv[2]
6ac90 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
6aca0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
6acb0 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
6acc0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
6acd0 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76        {..  int_v
6ace0 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
6acf0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32  alue_int (argv[2
6ad00 5d 29 3b 0a 09 20 20 78 32 20 3d 20 69 6e 74 5f  ]);..  x2 = int_
6ad10 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  value;.      }. 
6ad20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
6ad30 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6ad40 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
6ad50 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
6ad60 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
6ad70 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
6ad80 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
6ad90 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79 32 20 3d  ITE_FLOAT)..y2 =
6ada0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
6adb0 6f 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b  ouble (argv[3]);
6adc0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
6add0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6ade0 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51   (argv[3]) == SQ
6adf0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
6ae00 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
6ae10 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
6ae20 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29  ue_int (argv[3])
6ae30 3b 0a 09 20 20 79 32 20 3d 20 69 6e 74 5f 76 61  ;..  y2 = int_va
6ae40 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lue;.      }.   
6ae50 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
6ae60 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6ae70 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
6ae80 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
6ae90 20 7d 0a 20 20 20 20 67 61 69 61 42 75 69 6c 64   }.    gaiaBuild
6aea0 46 69 6c 74 65 72 4d 62 72 20 28 78 31 2c 20 79  FilterMbr (x1, y
6aeb0 31 2c 20 78 32 2c 20 79 32 2c 20 6d 6f 64 65 2c  1, x2, y2, mode,
6aec0 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
6aed0 29 3b 0a 20 20 20 20 69 66 20 28 21 70 5f 72 65  );.    if (!p_re
6aee0 73 75 6c 74 29 0a 09 73 71 6c 69 74 65 33 5f 72  sult)..sqlite3_r
6aef0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6af00 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  ext);.    else..
6af10 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
6af20 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f  lob (context, p_
6af30 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65  result, len, fre
6af40 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2f 20 74 68 65 20  e);.}../*./ the 
6af50 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
6af60 6f 6e 73 20 73 69 6d 70 6c 79 20 72 65 61 64 64  ons simply readd
6af70 72 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  ress the request
6af80 20 74 6f 20 62 75 69 6c 64 5f 66 69 6c 74 65 72   to build_filter
6af90 5f 6d 62 72 28 29 0a 2f 20 73 65 74 74 69 6e 67  _mbr()./ setting
6afa0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6afb0 20 4d 4f 44 65 0a 2a 2f 0a 0a 73 74 61 74 69 63   MODe.*/..static
6afc0 20 76 6f 69 64 0a 66 6e 63 74 5f 42 75 69 6c 64   void.fnct_Build
6afd0 4d 62 72 46 69 6c 74 65 72 20 28 73 71 6c 69 74  MbrFilter (sqlit
6afe0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
6aff0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
6b000 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6b010 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 62 75 69   argv).{.    bui
6b020 6c 64 5f 66 69 6c 74 65 72 5f 6d 62 72 20 28 63  ld_filter_mbr (c
6b030 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
6b040 67 76 2c 20 47 41 49 41 5f 46 49 4c 54 45 52 5f  gv, GAIA_FILTER_
6b050 4d 42 52 5f 44 45 43 4c 41 52 45 29 3b 0a 7d 0a  MBR_DECLARE);.}.
6b060 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
6b070 74 5f 46 69 6c 74 65 72 4d 62 72 57 69 74 68 69  t_FilterMbrWithi
6b080 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  n (sqlite3_conte
6b090 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
6b0a0 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20  t argc,...      
6b0b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6b0c0 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 62 75 69   argv).{.    bui
6b0d0 6c 64 5f 66 69 6c 74 65 72 5f 6d 62 72 20 28 63  ld_filter_mbr (c
6b0e0 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
6b0f0 67 76 2c 20 47 41 49 41 5f 46 49 4c 54 45 52 5f  gv, GAIA_FILTER_
6b100 4d 42 52 5f 57 49 54 48 49 4e 29 3b 0a 7d 0a 0a  MBR_WITHIN);.}..
6b110 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
6b120 5f 46 69 6c 74 65 72 4d 62 72 43 6f 6e 74 61 69  _FilterMbrContai
6b130 6e 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ns (sqlite3_cont
6b140 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
6b150 6e 74 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69  nt argc,....sqli
6b160 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
6b170 76 29 0a 7b 0a 20 20 20 20 62 75 69 6c 64 5f 66  v).{.    build_f
6b180 69 6c 74 65 72 5f 6d 62 72 20 28 63 6f 6e 74 65  ilter_mbr (conte
6b190 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
6b1a0 47 41 49 41 5f 46 49 4c 54 45 52 5f 4d 42 52 5f  GAIA_FILTER_MBR_
6b1b0 43 4f 4e 54 41 49 4e 53 29 3b 0a 7d 0a 0a 73 74  CONTAINS);.}..st
6b1c0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 46  atic void.fnct_F
6b1d0 69 6c 74 65 72 4d 62 72 49 6e 74 65 72 73 65 63  ilterMbrIntersec
6b1e0 74 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ts (sqlite3_cont
6b1f0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
6b200 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71  nt argc,....  sq
6b210 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
6b220 72 67 76 29 0a 7b 0a 20 20 20 20 62 75 69 6c 64  rgv).{.    build
6b230 5f 66 69 6c 74 65 72 5f 6d 62 72 20 28 63 6f 6e  _filter_mbr (con
6b240 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
6b250 2c 20 47 41 49 41 5f 46 49 4c 54 45 52 5f 4d 42  , GAIA_FILTER_MB
6b260 52 5f 49 4e 54 45 52 53 45 43 54 53 29 3b 0a 7d  R_INTERSECTS);.}
6b270 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
6b280 63 74 5f 42 75 69 6c 64 4d 62 72 31 20 28 73 71  ct_BuildMbr1 (sq
6b290 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
6b2a0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
6b2b0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
6b2c0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
6b2d0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 42  QL function:./ B
6b2e0 75 69 6c 64 4d 42 52 28 64 6f 75 62 6c 65 20 58  uildMBR(double X
6b2f0 31 2c 20 64 6f 75 62 6c 65 20 59 31 2c 20 64 6f  1, double Y1, do
6b300 75 62 6c 65 20 58 32 2c 20 64 6f 75 62 6c 65 20  uble X2, double 
6b310 59 32 29 0a 2f 0a 2f 20 62 75 69 6c 64 73 20 61  Y2)././ builds a
6b320 6e 20 4d 42 52 20 66 72 6f 6d 20 74 77 6f 20 70  n MBR from two p
6b330 6f 69 6e 74 73 20 28 69 64 65 6e 74 69 66 79 69  oints (identifyi
6b340 6e 67 20 61 20 72 65 63 74 61 6e 67 6c 65 27 73  ng a rectangle's
6b350 20 64 69 61 67 6f 6e 61 6c 29 20 0a 2f 20 6f 72   diagonal) ./ or
6b360 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
6b370 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
6b380 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e  d.*/.    int len
6b390 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
6b3a0 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
6b3b0 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65  NULL;.    double
6b3c0 20 78 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20   x1;.    double 
6b3d0 79 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  y1;.    double x
6b3e0 32 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 32  2;.    double y2
6b3f0 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  ;.    int int_va
6b400 6c 75 65 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  lue;.    GAIA_UN
6b410 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
6b420 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
6b430 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
6b440 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
6b450 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  0]) == SQLITE_FL
6b460 4f 41 54 29 0a 09 78 31 20 3d 20 73 71 6c 69 74  OAT)..x1 = sqlit
6b470 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
6b480 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65  (argv[0]);.    e
6b490 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
6b4a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
6b4b0 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [0]) == SQLITE_I
6b4c0 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
6b4d0 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  .  int_value = s
6b4e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6b4f0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78   (argv[0]);..  x
6b500 31 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  1 = int_value;. 
6b510 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
6b520 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
6b530 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
6b540 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
6b550 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
6b560 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
6b570 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
6b580 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
6b590 54 29 0a 09 79 31 20 3d 20 73 71 6c 69 74 65 33  T)..y1 = sqlite3
6b5a0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
6b5b0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
6b5c0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
6b5d0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
6b5e0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
6b5f0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
6b600 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
6b610 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
6b620 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 79 31 20  argv[1]);..  y1 
6b630 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  = int_value;.   
6b640 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
6b650 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
6b660 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
6b670 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
6b680 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
6b690 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
6b6a0 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
6b6b0 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
6b6c0 0a 09 78 32 20 3d 20 73 71 6c 69 74 65 33 5f 76  ..x2 = sqlite3_v
6b6d0 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
6b6e0 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[2]);.    else 
6b6f0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
6b700 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
6b710 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
6b720 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
6b730 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
6b740 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
6b750 67 76 5b 32 5d 29 3b 0a 09 20 20 78 32 20 3d 20  gv[2]);..  x2 = 
6b760 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
6b770 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
6b780 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
6b790 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6b7a0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
6b7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
6b7c0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6b7d0 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d  ype (argv[3]) ==
6b7e0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
6b7f0 79 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  y2 = sqlite3_val
6b800 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
6b810 33 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  3]);.    else if
6b820 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
6b830 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d  type (argv[3]) =
6b840 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
6b850 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
6b860 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
6b870 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
6b880 5b 33 5d 29 3b 0a 09 20 20 79 32 20 3d 20 69 6e  [3]);..  y2 = in
6b890 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  t_value;.      }
6b8a0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
6b8b0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
6b8c0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
6b8d0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
6b8e0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 42       }.    gaiaB
6b8f0 75 69 6c 64 4d 62 72 20 28 78 31 2c 20 79 31 2c  uildMbr (x1, y1,
6b900 20 78 32 2c 20 79 32 2c 20 2d 31 2c 20 26 70 5f   x2, y2, -1, &p_
6b910 72 65 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20  result, &len);. 
6b920 20 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74     if (!p_result
6b930 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
6b940 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
6b950 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
6b960 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
6b970 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
6b980 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
6b990 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
6b9a0 6e 63 74 5f 42 75 69 6c 64 4d 62 72 32 20 28 73  nct_BuildMbr2 (s
6b9b0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6b9c0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
6b9d0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
6b9e0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
6b9f0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
6ba00 42 75 69 6c 64 4d 42 52 28 64 6f 75 62 6c 65 20  BuildMBR(double 
6ba10 58 31 2c 20 64 6f 75 62 6c 65 20 59 31 2c 20 64  X1, double Y1, d
6ba20 6f 75 62 6c 65 20 58 32 2c 20 64 6f 75 62 6c 65  ouble X2, double
6ba30 20 59 32 2c 20 69 6e 74 20 53 52 49 44 29 0a 2f   Y2, int SRID)./
6ba40 0a 2f 20 62 75 69 6c 64 73 20 61 6e 20 4d 42 52  ./ builds an MBR
6ba50 20 66 72 6f 6d 20 74 77 6f 20 70 6f 69 6e 74 73   from two points
6ba60 20 28 69 64 65 6e 74 69 66 79 69 6e 67 20 61 20   (identifying a 
6ba70 72 65 63 74 61 6e 67 6c 65 27 73 20 64 69 61 67  rectangle's diag
6ba80 6f 6e 61 6c 29 20 0a 2f 20 6f 72 20 4e 55 4c 4c  onal) ./ or NULL
6ba90 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
6baa0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
6bab0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
6bac0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6bad0 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
6bae0 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 31 3b 0a  .    double x1;.
6baf0 20 20 20 20 64 6f 75 62 6c 65 20 79 31 3b 0a 20      double y1;. 
6bb00 20 20 20 64 6f 75 62 6c 65 20 78 32 3b 0a 20 20     double x2;.  
6bb10 20 20 64 6f 75 62 6c 65 20 79 32 3b 0a 20 20 20    double y2;.   
6bb20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
6bb30 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a 20 20      int srid;.  
6bb40 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
6bb50 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
6bb60 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
6bb70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
6bb80 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
6bb90 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 78  SQLITE_FLOAT)..x
6bba0 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
6bbb0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30  e_double (argv[0
6bbc0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
6bbd0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6bbe0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d  ype (argv[0]) ==
6bbf0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
6bc00 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f  .      {..  int_
6bc10 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
6bc20 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
6bc30 30 5d 29 3b 0a 09 20 20 78 31 20 3d 20 69 6e 74  0]);..  x1 = int
6bc40 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
6bc50 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
6bc60 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
6bc70 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
6bc80 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
6bc90 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
6bca0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6bcb0 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
6bcc0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79 31 20  LITE_FLOAT)..y1 
6bcd0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6bce0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29  double (argv[1])
6bcf0 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
6bd00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6bd10 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
6bd20 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
6bd30 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61       {..  int_va
6bd40 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
6bd50 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
6bd60 29 3b 0a 09 20 20 79 31 20 3d 20 69 6e 74 5f 76  );..  y1 = int_v
6bd70 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alue;.      }.  
6bd80 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
6bd90 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6bda0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
6bdb0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
6bdc0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
6bdd0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
6bde0 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
6bdf0 54 45 5f 46 4c 4f 41 54 29 0a 09 78 32 20 3d 20  TE_FLOAT)..x2 = 
6be00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6be10 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a  uble (argv[2]);.
6be20 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
6be30 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
6be40 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c  (argv[2]) == SQL
6be50 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
6be60 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75     {..  int_valu
6be70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
6be80 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b  e_int (argv[2]);
6be90 0a 09 20 20 78 32 20 3d 20 69 6e 74 5f 76 61 6c  ..  x2 = int_val
6bea0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
6beb0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
6bec0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
6bed0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
6bee0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6bef0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
6bf00 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
6bf10 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[3]) == SQLITE
6bf20 5f 46 4c 4f 41 54 29 0a 09 79 32 20 3d 20 73 71  _FLOAT)..y2 = sq
6bf30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
6bf40 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20  le (argv[3]);.  
6bf50 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
6bf60 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
6bf70 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
6bf80 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
6bf90 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20   {..  int_value 
6bfa0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6bfb0 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09  int (argv[3]);..
6bfc0 20 20 79 32 20 3d 20 69 6e 74 5f 76 61 6c 75 65    y2 = int_value
6bfd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
6bfe0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
6bff0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
6c000 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
6c010 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
6c020 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
6c030 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
6c040 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [4]) == SQLITE_I
6c050 4e 54 45 47 45 52 29 0a 09 73 72 69 64 20 3d 20  NTEGER)..srid = 
6c060 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6c070 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20  t (argv[4]);.   
6c080 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
6c090 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6c0a0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
6c0b0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
6c0c0 20 7d 0a 20 20 20 20 67 61 69 61 42 75 69 6c 64   }.    gaiaBuild
6c0d0 4d 62 72 20 28 78 31 2c 20 79 31 2c 20 78 32 2c  Mbr (x1, y1, x2,
6c0e0 20 79 32 2c 20 73 72 69 64 2c 20 26 70 5f 72 65   y2, srid, &p_re
6c0f0 73 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  sult, &len);.   
6c100 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29 0a   if (!p_result).
6c110 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
6c120 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
6c130 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65      else..sqlite
6c140 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
6c150 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
6c160 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a  , len, free);.}.
6c170 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
6c180 74 5f 42 75 69 6c 64 43 69 72 63 6c 65 4d 62 72  t_BuildCircleMbr
6c190 31 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  1 (sqlite3_conte
6c1a0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
6c1b0 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20  t argc,...      
6c1c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6c1d0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
6c1e0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 42 75 69 6c  function:./ Buil
6c1f0 64 43 69 72 63 6c 65 4d 42 52 28 64 6f 75 62 6c  dCircleMBR(doubl
6c200 65 20 58 2c 20 64 6f 75 62 6c 65 20 59 2c 20 64  e X, double Y, d
6c210 6f 75 62 6c 65 20 72 61 64 69 75 73 29 0a 2f 0a  ouble radius)./.
6c220 2f 20 62 75 69 6c 64 73 20 61 6e 20 4d 42 52 20  / builds an MBR 
6c230 66 72 6f 6d 20 74 77 6f 20 70 6f 69 6e 74 73 20  from two points 
6c240 28 69 64 65 6e 74 69 66 79 69 6e 67 20 61 20 72  (identifying a r
6c250 65 63 74 61 6e 67 6c 65 27 73 20 64 69 61 67 6f  ectangle's diago
6c260 6e 61 6c 29 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20  nal) ./ or NULL 
6c270 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
6c280 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
6c290 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
6c2a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
6c2b0 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
6c2c0 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
6c2d0 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
6c2e0 64 6f 75 62 6c 65 20 72 61 64 69 75 73 3b 0a 20  double radius;. 
6c2f0 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65     int int_value
6c300 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
6c310 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
6c320 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
6c330 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
6c340 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
6c350 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
6c360 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33 5f 76  )..x = sqlite3_v
6c370 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
6c380 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[0]);.    else 
6c390 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
6c3a0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
6c3b0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
6c3c0 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
6c3d0 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
6c3e0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
6c3f0 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69  gv[0]);..  x = i
6c400 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  nt_value;.      
6c410 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
6c420 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
6c430 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
6c440 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
6c450 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
6c460 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
6c470 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
6c480 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 79  SQLITE_FLOAT)..y
6c490 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6c4a0 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d  _double (argv[1]
6c4b0 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
6c4c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
6c4d0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
6c4e0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
6c4f0 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76        {..  int_v
6c500 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
6c510 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
6c520 5d 29 3b 0a 09 20 20 79 20 3d 20 69 6e 74 5f 76  ]);..  y = int_v
6c530 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alue;.      }.  
6c540 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
6c550 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6c560 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
6c570 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
6c580 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
6c590 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
6c5a0 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
6c5b0 54 45 5f 46 4c 4f 41 54 29 0a 09 72 61 64 69 75  TE_FLOAT)..radiu
6c5c0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
6c5d0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
6c5e0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
6c5f0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6c600 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d  ype (argv[2]) ==
6c610 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
6c620 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f  .      {..  int_
6c630 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
6c640 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
6c650 32 5d 29 3b 0a 09 20 20 72 61 64 69 75 73 20 3d  2]);..  radius =
6c660 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
6c670 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
6c680 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
6c690 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
6c6a0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
6c6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
6c6c0 69 61 42 75 69 6c 64 43 69 72 63 6c 65 4d 62 72  iaBuildCircleMbr
6c6d0 20 28 78 2c 20 79 2c 20 72 61 64 69 75 73 2c 20   (x, y, radius, 
6c6e0 2d 31 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  -1, &p_result, &
6c6f0 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 21 70  len);.    if (!p
6c700 5f 72 65 73 75 6c 74 29 0a 09 73 71 6c 69 74 65  _result)..sqlite
6c710 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
6c720 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
6c730 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
6c740 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
6c750 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
6c760 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  free);.}..static
6c770 20 76 6f 69 64 0a 66 6e 63 74 5f 42 75 69 6c 64   void.fnct_Build
6c780 43 69 72 63 6c 65 4d 62 72 32 20 28 73 71 6c 69  CircleMbr2 (sqli
6c790 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
6c7a0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
6c7b0 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
6c7c0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
6c7d0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
6c7e0 6e 3a 0a 2f 20 42 75 69 6c 64 43 69 72 63 6c 65  n:./ BuildCircle
6c7f0 4d 42 52 28 64 6f 75 62 6c 65 20 58 2c 20 64 6f  MBR(double X, do
6c800 75 62 6c 65 20 59 2c 20 64 6f 75 62 6c 65 20 72  uble Y, double r
6c810 61 64 69 75 73 2c 20 69 6e 74 20 53 52 49 44 29  adius, int SRID)
6c820 0a 2f 0a 2f 20 62 75 69 6c 64 73 20 61 6e 20 4d  ././ builds an M
6c830 42 52 20 66 72 6f 6d 20 74 77 6f 20 70 6f 69 6e  BR from two poin
6c840 74 73 20 28 69 64 65 6e 74 69 66 79 69 6e 67 20  ts (identifying 
6c850 61 20 72 65 63 74 61 6e 67 6c 65 27 73 20 64 69  a rectangle's di
6c860 61 67 6f 6e 61 6c 29 20 0a 2f 20 6f 72 20 4e 55  agonal) ./ or NU
6c870 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
6c880 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
6c890 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  /.    int len;. 
6c8a0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
6c8b0 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
6c8c0 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b  L;.    double x;
6c8d0 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20  .    double y;. 
6c8e0 20 20 20 64 6f 75 62 6c 65 20 72 61 64 69 75 73     double radius
6c8f0 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  ;.    int int_va
6c900 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20 73 72 69  lue;.    int sri
6c910 64 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  d;.    GAIA_UNUS
6c920 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
6c930 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
6c940 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
6c950 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
6c960 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
6c970 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33 5f  T)..x = sqlite3_
6c980 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
6c990 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[0]);.    else
6c9a0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
6c9b0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
6c9c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
6c9d0 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
6c9e0 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
6c9f0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
6ca00 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20  rgv[0]);..  x = 
6ca10 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
6ca20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
6ca30 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
6ca40 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6ca50 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
6ca60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
6ca70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6ca80 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
6ca90 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
6caa0 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  y = sqlite3_valu
6cab0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31  e_double (argv[1
6cac0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
6cad0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6cae0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
6caf0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
6cb00 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f  .      {..  int_
6cb10 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
6cb20 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
6cb30 31 5d 29 3b 0a 09 20 20 79 20 3d 20 69 6e 74 5f  1]);..  y = int_
6cb40 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  value;.      }. 
6cb50 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
6cb60 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6cb70 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
6cb80 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
6cb90 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
6cba0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
6cbb0 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c  (argv[2]) == SQL
6cbc0 49 54 45 5f 46 4c 4f 41 54 29 0a 09 72 61 64 69  ITE_FLOAT)..radi
6cbd0 75 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  us = sqlite3_val
6cbe0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
6cbf0 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  2]);.    else if
6cc00 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
6cc10 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
6cc20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
6cc30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
6cc40 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
6cc50 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
6cc60 5b 32 5d 29 3b 0a 09 20 20 72 61 64 69 75 73 20  [2]);..  radius 
6cc70 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  = int_value;.   
6cc80 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
6cc90 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
6cca0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
6ccb0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
6ccc0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
6ccd0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
6cce0 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20  _type (argv[3]) 
6ccf0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
6cd00 52 29 0a 09 73 72 69 64 20 3d 20 73 71 6c 69 74  R)..srid = sqlit
6cd10 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
6cd20 67 76 5b 33 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[3]);.    else
6cd30 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
6cd40 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
6cd50 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
6cd60 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
6cd70 20 20 67 61 69 61 42 75 69 6c 64 43 69 72 63 6c    gaiaBuildCircl
6cd80 65 4d 62 72 20 28 78 2c 20 79 2c 20 72 61 64 69  eMbr (x, y, radi
6cd90 75 73 2c 20 73 72 69 64 2c 20 26 70 5f 72 65 73  us, srid, &p_res
6cda0 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  ult, &len);.    
6cdb0 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29 0a 09  if (!p_result)..
6cdc0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
6cdd0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
6cde0 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
6cdf0 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
6ce00 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
6ce10 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a   len, free);.}..
6ce20 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
6ce30 5f 45 78 74 65 6e 74 5f 73 74 65 70 20 28 73 71  _Extent_step (sq
6ce40 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
6ce50 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
6ce60 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
6ce70 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
6ce80 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45  QL function:./ E
6ce90 78 74 65 6e 74 28 42 4c 4f 42 65 6e 63 6f 64 65  xtent(BLOBencode
6cea0 64 20 67 65 6f 6d 29 0a 2f 0a 2f 20 61 67 67 72  d geom)././ aggr
6ceb0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d  egate function -
6cec0 20 53 54 45 50 0a 2f 0a 2a 2f 0a 20 20 20 20 75   STEP./.*/.    u
6ced0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
6cee0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
6cef0 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47  bytes;.    gaiaG
6cf00 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 3b  eomCollPtr geom;
6cf10 0a 20 20 20 20 64 6f 75 62 6c 65 20 2a 2a 70 3b  .    double **p;
6cf20 0a 20 20 20 20 64 6f 75 62 6c 65 20 2a 6d 61 78  .    double *max
6cf30 5f 6d 69 6e 3b 0a 20 20 20 20 69 6e 74 20 2a 73  _min;.    int *s
6cf40 72 69 64 5f 63 68 65 63 6b 3b 0a 20 20 20 20 69  rid_check;.    i
6cf50 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
6cf60 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
6cf70 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
6cf80 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
6cf90 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
6cfa0 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
6cfb0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
6cfc0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
6cfd0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
6cfe0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
6cff0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
6d000 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
6d010 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
6d020 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
6d030 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
6d040 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
6d050 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
6d060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
6d070 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
6d080 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
6d090 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
6d0a0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
6d0b0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
6d0c0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
6d0d0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
6d0e0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
6d0f0 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
6d100 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
6d110 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
6d120 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
6d130 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
6d140 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 20 3d  [0]);.    geom =
6d150 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
6d160 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
6d170 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
6d180 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
6d190 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
6d1a0 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
6d1b0 65 6f 6d 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20  eom)..return;.  
6d1c0 20 20 67 61 69 61 4d 62 72 47 65 6f 6d 65 74 72    gaiaMbrGeometr
6d1d0 79 20 28 67 65 6f 6d 29 3b 0a 20 20 20 20 70 20  y (geom);.    p 
6d1e0 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
6d1f0 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63 6f 6e  ate_context (con
6d200 74 65 78 74 2c 20 73 69 7a 65 6f 66 20 28 64 6f  text, sizeof (do
6d210 75 62 6c 65 20 2a 2a 29 29 3b 0a 20 20 20 20 69  uble **));.    i
6d220 66 20 28 21 28 2a 70 29 29 0a 20 20 20 20 20 20  f (!(*p)).      
6d230 7b 0a 09 20 20 2f 2a 20 74 68 69 73 20 69 73 20  {..  /* this is 
6d240 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 2a 2f  the first row */
6d250 0a 09 20 20 6d 61 78 5f 6d 69 6e 20 3d 20 6d 61  ..  max_min = ma
6d260 6c 6c 6f 63 20 28 28 73 69 7a 65 6f 66 20 28 64  lloc ((sizeof (d
6d270 6f 75 62 6c 65 29 20 2a 20 35 29 29 3b 0a 09 20  ouble) * 5));.. 
6d280 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 30 29 20   *(max_min + 0) 
6d290 3d 20 67 65 6f 6d 2d 3e 4d 69 6e 58 3b 0a 09 20  = geom->MinX;.. 
6d2a0 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 31 29 20   *(max_min + 1) 
6d2b0 3d 20 67 65 6f 6d 2d 3e 4d 69 6e 59 3b 0a 09 20  = geom->MinY;.. 
6d2c0 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 32 29 20   *(max_min + 2) 
6d2d0 3d 20 67 65 6f 6d 2d 3e 4d 61 78 58 3b 0a 09 20  = geom->MaxX;.. 
6d2e0 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 33 29 20   *(max_min + 3) 
6d2f0 3d 20 67 65 6f 6d 2d 3e 4d 61 78 59 3b 0a 09 20  = geom->MaxY;.. 
6d300 20 73 72 69 64 5f 63 68 65 63 6b 20 3d 20 28 69   srid_check = (i
6d310 6e 74 20 2a 29 20 28 6d 61 78 5f 6d 69 6e 20 2b  nt *) (max_min +
6d320 20 34 29 3b 0a 09 20 20 2a 28 73 72 69 64 5f 63   4);..  *(srid_c
6d330 68 65 63 6b 20 2b 20 30 29 20 3d 20 67 65 6f 6d  heck + 0) = geom
6d340 2d 3e 53 72 69 64 3b 0a 09 20 20 2a 28 73 72 69  ->Srid;..  *(sri
6d350 64 5f 63 68 65 63 6b 20 2b 20 31 29 20 3d 20 67  d_check + 1) = g
6d360 65 6f 6d 2d 3e 53 72 69 64 3b 0a 09 20 20 2a 70  eom->Srid;..  *p
6d370 20 3d 20 6d 61 78 5f 6d 69 6e 3b 0a 20 20 20 20   = max_min;.    
6d380 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
6d390 20 20 20 7b 0a 09 20 20 2f 2a 20 73 75 62 73 65     {..  /* subse
6d3a0 71 75 65 6e 74 20 72 6f 77 73 20 2a 2f 0a 09 20  quent rows */.. 
6d3b0 20 6d 61 78 5f 6d 69 6e 20 3d 20 2a 70 3b 0a 09   max_min = *p;..
6d3c0 20 20 69 66 20 28 67 65 6f 6d 2d 3e 4d 69 6e 58    if (geom->MinX
6d3d0 20 3c 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 30   < *(max_min + 0
6d3e0 29 29 0a 09 20 20 20 20 20 20 2a 28 6d 61 78 5f  ))..      *(max_
6d3f0 6d 69 6e 20 2b 20 30 29 20 3d 20 67 65 6f 6d 2d  min + 0) = geom-
6d400 3e 4d 69 6e 58 3b 0a 09 20 20 69 66 20 28 67 65  >MinX;..  if (ge
6d410 6f 6d 2d 3e 4d 69 6e 59 20 3c 20 2a 28 6d 61 78  om->MinY < *(max
6d420 5f 6d 69 6e 20 2b 20 31 29 29 0a 09 20 20 20 20  _min + 1))..    
6d430 20 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 31 29    *(max_min + 1)
6d440 20 3d 20 67 65 6f 6d 2d 3e 4d 69 6e 59 3b 0a 09   = geom->MinY;..
6d450 20 20 69 66 20 28 67 65 6f 6d 2d 3e 4d 61 78 58    if (geom->MaxX
6d460 20 3e 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 32   > *(max_min + 2
6d470 29 29 0a 09 20 20 20 20 20 20 2a 28 6d 61 78 5f  ))..      *(max_
6d480 6d 69 6e 20 2b 20 32 29 20 3d 20 67 65 6f 6d 2d  min + 2) = geom-
6d490 3e 4d 61 78 58 3b 0a 09 20 20 69 66 20 28 67 65  >MaxX;..  if (ge
6d4a0 6f 6d 2d 3e 4d 61 78 59 20 3e 20 2a 28 6d 61 78  om->MaxY > *(max
6d4b0 5f 6d 69 6e 20 2b 20 33 29 29 0a 09 20 20 20 20  _min + 3))..    
6d4c0 20 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 33 29    *(max_min + 3)
6d4d0 20 3d 20 67 65 6f 6d 2d 3e 4d 61 78 59 3b 0a 09   = geom->MaxY;..
6d4e0 20 20 73 72 69 64 5f 63 68 65 63 6b 20 3d 20 28    srid_check = (
6d4f0 69 6e 74 20 2a 29 20 28 6d 61 78 5f 6d 69 6e 20  int *) (max_min 
6d500 2b 20 34 29 3b 0a 09 20 20 69 66 20 28 2a 28 73  + 4);..  if (*(s
6d510 72 69 64 5f 63 68 65 63 6b 20 2b 20 31 29 20 21  rid_check + 1) !
6d520 3d 20 67 65 6f 6d 2d 3e 53 72 69 64 29 0a 09 20  = geom->Srid).. 
6d530 20 20 20 20 20 2a 28 73 72 69 64 5f 63 68 65 63       *(srid_chec
6d540 6b 20 2b 20 31 29 20 3d 20 67 65 6f 6d 2d 3e 53  k + 1) = geom->S
6d550 72 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rid;.      }.   
6d560 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
6d570 6c 20 28 67 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61  l (geom);.}..sta
6d580 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 45 78  tic void.fnct_Ex
6d590 74 65 6e 74 5f 66 69 6e 61 6c 20 28 73 71 6c 69  tent_final (sqli
6d5a0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
6d5b0 6e 74 65 78 74 29 0a 7b 0a 2f 2a 20 53 51 4c 20  ntext).{./* SQL 
6d5c0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45 78 74 65  function:./ Exte
6d5d0 6e 74 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  nt(BLOBencoded g
6d5e0 65 6f 6d 29 0a 2f 0a 2f 20 61 67 67 72 65 67 61  eom)././ aggrega
6d5f0 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20 46 49  te function - FI
6d600 4e 41 4c 0a 2f 0a 2a 2f 0a 20 20 20 20 67 61 69  NAL./.*/.    gai
6d610 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73  aGeomCollPtr res
6d620 75 6c 74 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c  ult;.    gaiaPol
6d630 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 3b 0a 20  ygonPtr polyg;. 
6d640 20 20 20 67 61 69 61 52 69 6e 67 50 74 72 20 72     gaiaRingPtr r
6d650 65 63 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ect;.    double 
6d660 2a 6d 61 78 5f 6d 69 6e 3b 0a 20 20 20 20 64 6f  *max_min;.    do
6d670 75 62 6c 65 20 6d 69 6e 78 3b 0a 20 20 20 20 64  uble minx;.    d
6d680 6f 75 62 6c 65 20 6d 69 6e 79 3b 0a 20 20 20 20  ouble miny;.    
6d690 64 6f 75 62 6c 65 20 6d 61 78 78 3b 0a 20 20 20  double maxx;.   
6d6a0 20 64 6f 75 62 6c 65 20 6d 61 78 79 3b 0a 20 20   double maxy;.  
6d6b0 20 20 69 6e 74 20 2a 73 72 69 64 5f 63 68 65 63    int *srid_chec
6d6c0 6b 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 2a 2a  k;.    double **
6d6d0 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
6d6e0 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63  egate_context (c
6d6f0 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20  ontext, 0);.    
6d700 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
6d710 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  0;.    int tiny_
6d720 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
6d730 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
6d740 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
6d750 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
6d760 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
6d770 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  ;.    if (cache 
6d780 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
6d790 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
6d7a0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
6d7b0 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20  ;..  tiny_point 
6d7c0 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69  = cache->tinyPoi
6d7d0 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20  ntEnabled;.     
6d7e0 20 7d 0a 20 20 20 20 69 66 20 28 21 70 29 0a 20   }.    if (!p). 
6d7f0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
6d800 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
6d810 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
6d820 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
6d830 6d 61 78 5f 6d 69 6e 20 3d 20 2a 70 3b 0a 20 20  max_min = *p;.  
6d840 20 20 69 66 20 28 21 6d 61 78 5f 6d 69 6e 29 0a    if (!max_min).
6d850 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
6d860 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
6d870 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
6d880 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
6d890 20 73 72 69 64 5f 63 68 65 63 6b 20 3d 20 28 69   srid_check = (i
6d8a0 6e 74 20 2a 29 20 28 6d 61 78 5f 6d 69 6e 20 2b  nt *) (max_min +
6d8b0 20 34 29 3b 0a 20 20 20 20 69 66 20 28 2a 28 73   4);.    if (*(s
6d8c0 72 69 64 5f 63 68 65 63 6b 20 2b 20 30 29 20 21  rid_check + 0) !
6d8d0 3d 20 2a 28 73 72 69 64 5f 63 68 65 63 6b 20 2b  = *(srid_check +
6d8e0 20 31 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20   1)).      {..  
6d8f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
6d900 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
6d910 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6d920 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67  }.    result = g
6d930 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c  aiaAllocGeomColl
6d940 20 28 29 3b 0a 20 20 20 20 69 66 20 28 21 72 65   ();.    if (!re
6d950 73 75 6c 74 29 0a 09 73 71 6c 69 74 65 33 5f 72  sult)..sqlite3_r
6d960 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6d970 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
6d980 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 62 75 69       {..  /* bui
6d990 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f  lds the BLOB geo
6d9a0 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75  metry to be retu
6d9b0 72 6e 65 64 20 2a 2f 0a 09 20 20 69 6e 74 20 6c  rned */..  int l
6d9c0 65 6e 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20  en;..  unsigned 
6d9d0 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
6d9e0 20 4e 55 4c 4c 3b 0a 09 20 20 72 65 73 75 6c 74   NULL;..  result
6d9f0 2d 3e 53 72 69 64 20 3d 20 2a 28 73 72 69 64 5f  ->Srid = *(srid_
6da00 63 68 65 63 6b 20 2b 20 30 29 3b 0a 09 20 20 70  check + 0);..  p
6da10 6f 6c 79 67 20 3d 20 67 61 69 61 41 64 64 50 6f  olyg = gaiaAddPo
6da20 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f 6c 6c 20  lygonToGeomColl 
6da30 28 72 65 73 75 6c 74 2c 20 35 2c 20 30 29 3b 0a  (result, 5, 0);.
6da40 09 20 20 72 65 63 74 20 3d 20 70 6f 6c 79 67 2d  .  rect = polyg-
6da50 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20 6d 69  >Exterior;..  mi
6da60 6e 78 20 3d 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b  nx = *(max_min +
6da70 20 30 29 3b 0a 09 20 20 6d 69 6e 79 20 3d 20 2a   0);..  miny = *
6da80 28 6d 61 78 5f 6d 69 6e 20 2b 20 31 29 3b 0a 09  (max_min + 1);..
6da90 20 20 6d 61 78 78 20 3d 20 2a 28 6d 61 78 5f 6d    maxx = *(max_m
6daa0 69 6e 20 2b 20 32 29 3b 0a 09 20 20 6d 61 78 79  in + 2);..  maxy
6dab0 20 3d 20 2a 28 6d 61 78 5f 6d 69 6e 20 2b 20 33   = *(max_min + 3
6dac0 29 3b 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69  );..  gaiaSetPoi
6dad0 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73  nt (rect->Coords
6dae0 2c 20 30 2c 20 6d 69 6e 78 2c 20 6d 69 6e 79 29  , 0, minx, miny)
6daf0 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 31 20  ;./* vertex # 1 
6db00 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69  */..  gaiaSetPoi
6db10 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73  nt (rect->Coords
6db20 2c 20 31 2c 20 6d 61 78 78 2c 20 6d 69 6e 79 29  , 1, maxx, miny)
6db30 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 32 20  ;./* vertex # 2 
6db40 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69  */..  gaiaSetPoi
6db50 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73  nt (rect->Coords
6db60 2c 20 32 2c 20 6d 61 78 78 2c 20 6d 61 78 79 29  , 2, maxx, maxy)
6db70 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 33 20  ;./* vertex # 3 
6db80 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69  */..  gaiaSetPoi
6db90 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73  nt (rect->Coords
6dba0 2c 20 33 2c 20 6d 69 6e 78 2c 20 6d 61 78 79 29  , 3, minx, maxy)
6dbb0 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 34 20  ;./* vertex # 4 
6dbc0 2a 2f 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69  */..  gaiaSetPoi
6dbd0 6e 74 20 28 72 65 63 74 2d 3e 43 6f 6f 72 64 73  nt (rect->Coords
6dbe0 2c 20 34 2c 20 6d 69 6e 78 2c 20 6d 69 6e 79 29  , 4, minx, miny)
6dbf0 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 35 20  ;./* vertex # 5 
6dc00 5b 73 61 6d 65 20 61 73 20 76 65 72 74 65 78 20  [same as vertex 
6dc10 23 20 31 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  # 1 to close the
6dc20 20 70 6f 6c 79 67 6f 6e 5d 20 2a 2f 0a 09 20 20   polygon] */..  
6dc30 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
6dc40 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75  BlobWkbEx2 (resu
6dc50 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  lt, &p_result, &
6dc60 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  len, gpkg_mode,.
6dc70 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70  ....      tiny_p
6dc80 6f 69 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65  oint);..  sqlite
6dc90 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
6dca0 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
6dcb0 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20  , len, free);.. 
6dcc0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
6dcd0 6c 20 28 72 65 73 75 6c 74 29 3b 0a 20 20 20 20  l (result);.    
6dce0 20 20 7d 0a 20 20 20 20 66 72 65 65 20 28 6d 61    }.    free (ma
6dcf0 78 5f 6d 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69  x_min);.}..stati
6dd00 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 62 72 4d  c void.fnct_MbrM
6dd10 69 6e 58 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  inX (sqlite3_con
6dd20 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
6dd30 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
6dd40 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
6dd50 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
6dd60 6f 6e 3a 0a 2f 20 4d 62 72 4d 69 6e 58 28 42 4c  on:./ MbrMinX(BL
6dd70 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4d 45 54  OB encoded GEMET
6dd80 52 59 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  RY)././ returns 
6dd90 74 68 65 20 4d 69 6e 58 20 63 6f 6f 72 64 69 6e  the MinX coordin
6dda0 61 74 65 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ate for current 
6ddb0 67 65 6f 6d 65 74 72 79 27 73 20 4d 42 52 20 0a  geometry's MBR .
6ddc0 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
6ddd0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
6dde0 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
6ddf0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
6de00 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
6de10 74 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  tes;.    double 
6de20 63 6f 6f 72 64 3b 0a 20 20 20 20 47 41 49 41 5f  coord;.    GAIA_
6de30 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
6de40 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
6de50 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
6de60 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
6de70 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
6de80 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
6de90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6dea0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
6deb0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
6dec0 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
6ded0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6dee0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
6def0 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
6df00 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
6df10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6df20 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
6df30 20 69 66 20 28 21 67 61 69 61 47 65 74 4d 62 72   if (!gaiaGetMbr
6df40 4d 69 6e 58 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  MinX (p_blob, n_
6df50 62 79 74 65 73 2c 20 26 63 6f 6f 72 64 29 29 0a  bytes, &coord)).
6df60 20 20 20 20 20 20 7b 0a 23 69 66 64 65 66 20 45        {.#ifdef E
6df70 4e 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45  NABLE_GEOPACKAGE
6df80 09 2f 2a 20 47 45 4f 50 41 43 4b 41 47 45 20 65  ./* GEOPACKAGE e
6df90 6e 61 62 6c 65 64 3a 20 73 75 70 70 6f 72 74 69  nabled: supporti
6dfa0 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69  ng GPKG geometri
6dfb0 65 73 20 2a 2f 0a 09 20 20 69 66 20 28 67 61 69  es */..  if (gai
6dfc0 61 49 73 56 61 6c 69 64 47 50 42 20 28 70 5f 62  aIsValidGPB (p_b
6dfd0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 29 0a 09  lob, n_bytes))..
6dfe0 20 20 20 20 7b 0a 09 09 64 6f 75 62 6c 65 20 6d      {...double m
6dff0 69 6e 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  in_x;...double m
6e000 61 78 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  ax_x;...double m
6e010 69 6e 5f 79 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  in_y;...double m
6e020 61 78 5f 79 3b 0a 09 09 69 6e 74 20 68 61 73 5f  ax_y;...int has_
6e030 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f  z;...double min_
6e040 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f  z;...double max_
6e050 7a 3b 0a 09 09 69 6e 74 20 68 61 73 5f 6d 3b 0a  z;...int has_m;.
6e060 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 6d 3b 0a  ..double min_m;.
6e070 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 6d 3b 0a  ..double max_m;.
6e080 09 09 69 66 20 28 67 61 69 61 47 65 74 45 6e 76  ..if (gaiaGetEnv
6e090 65 6c 6f 70 65 46 72 6f 6d 47 50 42 0a 09 09 20  elopeFromGPB... 
6e0a0 20 20 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79     (p_blob, n_by
6e0b0 74 65 73 2c 20 26 6d 69 6e 5f 78 2c 20 26 6d 61  tes, &min_x, &ma
6e0c0 78 5f 78 2c 20 26 6d 69 6e 5f 79 2c 20 26 6d 61  x_x, &min_y, &ma
6e0d0 78 5f 79 2c 20 26 68 61 73 5f 7a 2c 0a 09 09 20  x_y, &has_z,... 
6e0e0 20 20 20 20 26 6d 69 6e 5f 7a 2c 20 26 6d 61 78      &min_z, &max
6e0f0 5f 7a 2c 20 26 68 61 73 5f 6d 2c 20 26 6d 69 6e  _z, &has_m, &min
6e100 5f 6d 2c 20 26 6d 61 78 5f 6d 29 29 0a 09 09 20  _m, &max_m))... 
6e110 20 7b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74   {...      sqlit
6e120 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6e130 20 28 63 6f 6e 74 65 78 74 2c 20 6d 69 6e 5f 78   (context, min_x
6e140 29 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a  );...  }..    }.
6e150 09 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f  .  else.#endif /
6e160 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b 41 47 45  * end GEOPACKAGE
6e170 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b  : supporting GPK
6e180 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a  G geometries */.
6e190 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6e1a0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6e1b0 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
6e1c0 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
6e1d0 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63  result_double (c
6e1e0 6f 6e 74 65 78 74 2c 20 63 6f 6f 72 64 29 3b 0a  ontext, coord);.
6e1f0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
6e200 6e 63 74 5f 4d 62 72 4d 61 78 58 20 28 73 71 6c  nct_MbrMaxX (sql
6e210 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
6e220 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
6e230 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
6e240 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
6e250 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 62  L function:./ Mb
6e260 72 4d 61 78 58 28 42 4c 4f 42 20 65 6e 63 6f 64  rMaxX(BLOB encod
6e270 65 64 20 47 45 4d 45 54 52 59 29 0a 2f 0a 2f 20  ed GEMETRY)././ 
6e280 72 65 74 75 72 6e 73 20 74 68 65 20 4d 61 78 58  returns the MaxX
6e290 20 63 6f 6f 72 64 69 6e 61 74 65 20 66 6f 72 20   coordinate for 
6e2a0 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
6e2b0 27 73 20 4d 42 52 20 0a 2f 20 6f 72 20 4e 55 4c  's MBR ./ or NUL
6e2c0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
6e2d0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
6e2e0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
6e2f0 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
6e300 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
6e310 20 64 6f 75 62 6c 65 20 63 6f 6f 72 64 3b 0a 20   double coord;. 
6e320 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
6e330 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
6e340 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
6e350 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6e360 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
6e370 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
6e380 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
6e390 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
6e3a0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
6e3b0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
6e3c0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
6e3d0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
6e3e0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
6e3f0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
6e400 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
6e410 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
6e420 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 21 67 61  0]);.    if (!ga
6e430 69 61 47 65 74 4d 62 72 4d 61 78 58 20 28 70 5f  iaGetMbrMaxX (p_
6e440 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26  blob, n_bytes, &
6e450 63 6f 6f 72 64 29 29 0a 20 20 20 20 20 20 7b 0a  coord)).      {.
6e460 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 45  #ifdef ENABLE_GE
6e470 4f 50 41 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50  OPACKAGE./* GEOP
6e480 41 43 4b 41 47 45 20 65 6e 61 62 6c 65 64 3a 20  ACKAGE enabled: 
6e490 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20  supporting GPKG 
6e4a0 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20  geometries */.. 
6e4b0 20 69 66 20 28 67 61 69 61 49 73 56 61 6c 69 64   if (gaiaIsValid
6e4c0 47 50 42 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  GPB (p_blob, n_b
6e4d0 79 74 65 73 29 29 0a 09 20 20 20 20 7b 0a 09 09  ytes))..    {...
6e4e0 64 6f 75 62 6c 65 20 6d 69 6e 5f 78 3b 0a 09 09  double min_x;...
6e4f0 64 6f 75 62 6c 65 20 6d 61 78 5f 78 3b 0a 09 09  double max_x;...
6e500 64 6f 75 62 6c 65 20 6d 69 6e 5f 79 3b 0a 09 09  double min_y;...
6e510 64 6f 75 62 6c 65 20 6d 61 78 5f 79 3b 0a 09 09  double max_y;...
6e520 69 6e 74 20 68 61 73 5f 7a 3b 0a 09 09 64 6f 75  int has_z;...dou
6e530 62 6c 65 20 6d 69 6e 5f 7a 3b 0a 09 09 64 6f 75  ble min_z;...dou
6e540 62 6c 65 20 6d 61 78 5f 7a 3b 0a 09 09 69 6e 74  ble max_z;...int
6e550 20 68 61 73 5f 6d 3b 0a 09 09 64 6f 75 62 6c 65   has_m;...double
6e560 20 6d 69 6e 5f 6d 3b 0a 09 09 64 6f 75 62 6c 65   min_m;...double
6e570 20 6d 61 78 5f 6d 3b 0a 09 09 69 66 20 28 67 61   max_m;...if (ga
6e580 69 61 47 65 74 45 6e 76 65 6c 6f 70 65 46 72 6f  iaGetEnvelopeFro
6e590 6d 47 50 42 0a 09 09 20 20 20 20 28 70 5f 62 6c  mGPB...    (p_bl
6e5a0 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26 6d 69  ob, n_bytes, &mi
6e5b0 6e 5f 78 2c 20 26 6d 61 78 5f 78 2c 20 26 6d 69  n_x, &max_x, &mi
6e5c0 6e 5f 79 2c 20 26 6d 61 78 5f 79 2c 20 26 68 61  n_y, &max_y, &ha
6e5d0 73 5f 7a 2c 0a 09 09 20 20 20 20 20 26 6d 69 6e  s_z,...     &min
6e5e0 5f 7a 2c 20 26 6d 61 78 5f 7a 2c 20 26 68 61 73  _z, &max_z, &has
6e5f0 5f 6d 2c 20 26 6d 69 6e 5f 6d 2c 20 26 6d 61 78  _m, &min_m, &max
6e600 5f 6d 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  _m))...  {...   
6e610 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6e620 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
6e630 74 2c 20 6d 61 78 5f 78 29 3b 0a 09 09 20 20 7d  t, max_x);...  }
6e640 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
6e650 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 47 45  #endif /* end GE
6e660 4f 50 41 43 4b 41 47 45 3a 20 73 75 70 70 6f 72  OPACKAGE: suppor
6e670 74 69 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65 74  ting GPKG geomet
6e680 72 69 65 73 20 2a 2f 0a 09 20 20 20 20 20 20 73  ries */..      s
6e690 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
6e6a0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
6e6b0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09      }.    else..
6e6c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
6e6d0 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
6e6e0 63 6f 6f 72 64 29 3b 0a 7d 0a 0a 73 74 61 74 69  coord);.}..stati
6e6f0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 62 72 4d  c void.fnct_MbrM
6e700 69 6e 59 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  inY (sqlite3_con
6e710 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
6e720 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
6e730 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
6e740 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
6e750 6f 6e 3a 0a 2f 20 4d 62 72 4d 69 6e 59 28 42 4c  on:./ MbrMinY(BL
6e760 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4d 45 54  OB encoded GEMET
6e770 52 59 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  RY)././ returns 
6e780 74 68 65 20 4d 69 6e 59 20 63 6f 6f 72 64 69 6e  the MinY coordin
6e790 61 74 65 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ate for current 
6e7a0 67 65 6f 6d 65 74 72 79 27 73 20 4d 42 52 20 0a  geometry's MBR .
6e7b0 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
6e7c0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
6e7d0 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
6e7e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
6e7f0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
6e800 74 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  tes;.    double 
6e810 63 6f 6f 72 64 3b 0a 20 20 20 20 47 41 49 41 5f  coord;.    GAIA_
6e820 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
6e830 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
6e840 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
6e850 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
6e860 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
6e870 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
6e880 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6e890 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
6e8a0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
6e8b0 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
6e8c0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6e8d0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
6e8e0 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
6e8f0 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
6e900 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6e910 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
6e920 20 69 66 20 28 21 67 61 69 61 47 65 74 4d 62 72   if (!gaiaGetMbr
6e930 4d 69 6e 59 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  MinY (p_blob, n_
6e940 62 79 74 65 73 2c 20 26 63 6f 6f 72 64 29 29 0a  bytes, &coord)).
6e950 20 20 20 20 20 20 7b 0a 23 69 66 64 65 66 20 45        {.#ifdef E
6e960 4e 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45  NABLE_GEOPACKAGE
6e970 09 2f 2a 20 47 45 4f 50 41 43 4b 41 47 45 20 65  ./* GEOPACKAGE e
6e980 6e 61 62 6c 65 64 3a 20 73 75 70 70 6f 72 74 69  nabled: supporti
6e990 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69  ng GPKG geometri
6e9a0 65 73 20 2a 2f 0a 09 20 20 69 66 20 28 67 61 69  es */..  if (gai
6e9b0 61 49 73 56 61 6c 69 64 47 50 42 20 28 70 5f 62  aIsValidGPB (p_b
6e9c0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 29 0a 09  lob, n_bytes))..
6e9d0 20 20 20 20 7b 0a 09 09 64 6f 75 62 6c 65 20 6d      {...double m
6e9e0 69 6e 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  in_x;...double m
6e9f0 61 78 5f 78 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  ax_x;...double m
6ea00 69 6e 5f 79 3b 0a 09 09 64 6f 75 62 6c 65 20 6d  in_y;...double m
6ea10 61 78 5f 79 3b 0a 09 09 69 6e 74 20 68 61 73 5f  ax_y;...int has_
6ea20 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f  z;...double min_
6ea30 7a 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f  z;...double max_
6ea40 7a 3b 0a 09 09 69 6e 74 20 68 61 73 5f 6d 3b 0a  z;...int has_m;.
6ea50 09 09 64 6f 75 62 6c 65 20 6d 69 6e 5f 6d 3b 0a  ..double min_m;.
6ea60 09 09 64 6f 75 62 6c 65 20 6d 61 78 5f 6d 3b 0a  ..double max_m;.
6ea70 09 09 69 66 20 28 67 61 69 61 47 65 74 45 6e 76  ..if (gaiaGetEnv
6ea80 65 6c 6f 70 65 46 72 6f 6d 47 50 42 0a 09 09 20  elopeFromGPB... 
6ea90 20 20 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79     (p_blob, n_by
6eaa0 74 65 73 2c 20 26 6d 69 6e 5f 78 2c 20 26 6d 61  tes, &min_x, &ma
6eab0 78 5f 78 2c 20 26 6d 69 6e 5f 79 2c 20 26 6d 61  x_x, &min_y, &ma
6eac0 78 5f 79 2c 20 26 68 61 73 5f 7a 2c 0a 09 09 20  x_y, &has_z,... 
6ead0 20 20 20 20 26 6d 69 6e 5f 7a 2c 20 26 6d 61 78      &min_z, &max
6eae0 5f 7a 2c 20 26 68 61 73 5f 6d 2c 20 26 6d 69 6e  _z, &has_m, &min
6eaf0 5f 6d 2c 20 26 6d 61 78 5f 6d 29 29 0a 09 09 20  _m, &max_m))... 
6eb00 20 7b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74   {...      sqlit
6eb10 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6eb20 20 28 63 6f 6e 74 65 78 74 2c 20 6d 69 6e 5f 79   (context, min_y
6eb30 29 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a  );...  }..    }.
6eb40 09 20 20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f  .  else.#endif /
6eb50 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b 41 47 45  * end GEOPACKAGE
6eb60 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b  : supporting GPK
6eb70 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a  G geometries */.
6eb80 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6eb90 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
6eba0 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
6ebb0 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
6ebc0 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63  result_double (c
6ebd0 6f 6e 74 65 78 74 2c 20 63 6f 6f 72 64 29 3b 0a  ontext, coord);.
6ebe0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
6ebf0 6e 63 74 5f 4d 62 72 4d 61 78 59 20 28 73 71 6c  nct_MbrMaxY (sql
6ec00 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
6ec10 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
6ec20 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
6ec30 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
6ec40 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 62  L function:./ Mb
6ec50 72 4d 61 78 59 28 42 4c 4f 42 20 65 6e 63 6f 64  rMaxY(BLOB encod
6ec60 65 64 20 47 45 4d 45 54 52 59 29 0a 2f 0a 2f 20  ed GEMETRY)././ 
6ec70 72 65 74 75 72 6e 73 20 74 68 65 20 4d 61 78 59  returns the MaxY
6ec80 20 63 6f 6f 72 64 69 6e 61 74 65 20 66 6f 72 20   coordinate for 
6ec90 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
6eca0 27 73 20 4d 42 52 20 0a 2f 20 6f 72 20 4e 55 4c  's MBR ./ or NUL
6ecb0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
6ecc0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
6ecd0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
6ece0 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
6ecf0 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
6ed00 20 64 6f 75 62 6c 65 20 63 6f 6f 72 64 3b 0a 20   double coord;. 
6ed10 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
6ed20 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
6ed30 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
6ed40 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
6ed50 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
6ed60 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
6ed70 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
6ed80 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
6ed90 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
6eda0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
6edb0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
6edc0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
6edd0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
6ede0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
6edf0 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
6ee00 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
6ee10 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 21 67 61  0]);.    if (!ga
6ee20 69 61 47 65 74 4d 62 72 4d 61 78 59 20 28 70 5f  iaGetMbrMaxY (p_
6ee30 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26  blob, n_bytes, &
6ee40 63 6f 6f 72 64 29 29 0a 20 20 20 20 20 20 7b 0a  coord)).      {.
6ee50 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 45  #ifdef ENABLE_GE
6ee60 4f 50 41 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50  OPACKAGE./* GEOP
6ee70 41 43 4b 41 47 45 20 65 6e 61 62 6c 65 64 3a 20  ACKAGE enabled: 
6ee80 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20  supporting GPKG 
6ee90 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 09 20  geometries */.. 
6eea0 20 69 66 20 28 67 61 69 61 49 73 56 61 6c 69 64   if (gaiaIsValid
6eeb0 47 50 42 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  GPB (p_blob, n_b
6eec0 79 74 65 73 29 29 0a 09 20 20 20 20 7b 0a 09 09  ytes))..    {...
6eed0 64 6f 75 62 6c 65 20 6d 69 6e 5f 78 3b 0a 09 09  double min_x;...
6eee0 64 6f 75 62 6c 65 20 6d 61 78 5f 78 3b 0a 09 09  double max_x;...
6eef0 64 6f 75 62 6c 65 20 6d 69 6e 5f 79 3b 0a 09 09  double min_y;...
6ef00 64 6f 75 62 6c 65 20 6d 61 78 5f 79 3b 0a 09 09  double max_y;...
6ef10 69 6e 74 20 68 61 73 5f 7a 3b 0a 09 09 64 6f 75  int has_z;...dou
6ef20 62 6c 65 20 6d 69 6e 5f 7a 3b 0a 09 09 64 6f 75  ble min_z;...dou
6ef30 62 6c 65 20 6d 61 78 5f 7a 3b 0a 09 09 69 6e 74  ble max_z;...int
6ef40 20 68 61 73 5f 6d 3b 0a 09 09 64 6f 75 62 6c 65   has_m;...double
6ef50 20 6d 69 6e 5f 6d 3b 0a 09 09 64 6f 75 62 6c 65   min_m;...double
6ef60 20 6d 61 78 5f 6d 3b 0a 09 09 69 66 20 28 67 61   max_m;...if (ga
6ef70 69 61 47 65 74 45 6e 76 65 6c 6f 70 65 46 72 6f  iaGetEnvelopeFro
6ef80 6d 47 50 42 0a 09 09 20 20 20 20 28 70 5f 62 6c  mGPB...    (p_bl
6ef90 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26 6d 69  ob, n_bytes, &mi
6efa0 6e 5f 78 2c 20 26 6d 61 78 5f 78 2c 20 26 6d 69  n_x, &max_x, &mi
6efb0 6e 5f 79 2c 20 26 6d 61 78 5f 79 2c 20 26 68 61  n_y, &max_y, &ha
6efc0 73 5f 7a 2c 0a 09 09 20 20 20 20 20 26 6d 69 6e  s_z,...     &min
6efd0 5f 7a 2c 20 26 6d 61 78 5f 7a 2c 20 26 68 61 73  _z, &max_z, &has
6efe0 5f 6d 2c 20 26 6d 69 6e 5f 6d 2c 20 26 6d 61 78  _m, &min_m, &max
6eff0 5f 6d 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  _m))...  {...   
6f000 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6f010 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
6f020 74 2c 20 6d 61 78 5f 79 29 3b 0a 09 09 20 20 7d  t, max_y);...  }
6f030 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
6f040 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 47 45  #endif /* end GE
6f050 4f 50 41 43 4b 41 47 45 3a 20 73 75 70 70 6f 72  OPACKAGE: suppor
6f060 74 69 6e 67 20 47 50 4b 47 20 67 65 6f 6d 65 74  ting GPKG geomet
6f070 72 69 65 73 20 2a 2f 0a 09 20 20 20 20 20 20 73  ries */..      s
6f080 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
6f090 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
6f0a0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09      }.    else..
6f0b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
6f0c0 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
6f0d0 63 6f 6f 72 64 29 3b 0a 7d 0a 0a 23 69 66 6e 64  coord);.}..#ifnd
6f0e0 65 66 20 4f 4d 49 54 5f 47 45 4f 43 41 4c 4c 42  ef OMIT_GEOCALLB
6f0f0 41 43 4b 53 09 2f 2a 20 73 75 70 70 6f 72 74 69  ACKS./* supporti
6f100 6e 67 20 52 54 72 65 65 20 67 65 6f 6d 65 74 72  ng RTree geometr
6f110 79 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 73  y callbacks */.s
6f120 74 61 74 69 63 20 76 6f 69 64 0a 67 61 69 61 5f  tatic void.gaia_
6f130 6d 62 72 5f 64 65 6c 20 28 76 6f 69 64 20 2a 70  mbr_del (void *p
6f140 29 0a 7b 0a 2f 2a 20 66 72 65 65 69 6e 67 20 64  ).{./* freeing d
6f150 61 74 61 20 75 73 65 64 20 62 79 20 52 2a 54 72  ata used by R*Tr
6f160 65 65 20 47 65 6f 6d 65 74 72 79 20 43 61 6c 6c  ee Geometry Call
6f170 62 61 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  back */.    sqli
6f180 74 65 33 5f 66 72 65 65 20 28 70 29 3b 0a 7d 0a  te3_free (p);.}.
6f190 0a 73 74 61 74 69 63 20 69 6e 74 0a 66 6e 63 74  .static int.fnct
6f1a0 5f 52 54 72 65 65 49 6e 74 65 72 73 65 63 74 73  _RTreeIntersects
6f1b0 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f   (sqlite3_rtree_
6f1c0 67 65 6f 6d 65 74 72 79 20 2a 20 70 2c 20 69 6e  geometry * p, in
6f1d0 74 20 6e 43 6f 6f 72 64 2c 20 64 6f 75 62 6c 65  t nCoord, double
6f1e0 20 2a 61 43 6f 6f 72 64 2c 0a 09 09 20 20 20 20   *aCoord,...    
6f1f0 20 20 69 6e 74 20 2a 70 52 65 73 29 0a 7b 0a 2f    int *pRes).{./
6f200 2a 20 52 2a 54 72 65 65 20 47 65 6f 6d 65 74 72  * R*Tree Geometr
6f210 79 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  y callback funct
6f220 69 6f 6e 3a 0a 2f 20 2e 2e 2e 20 4d 41 54 43 48  ion:./ ... MATCH
6f230 20 52 54 72 65 65 49 6e 74 65 72 73 65 63 74 73   RTreeIntersects
6f240 28 64 6f 75 62 6c 65 20 78 31 2c 20 64 6f 75 62  (double x1, doub
6f250 6c 65 20 79 31 2c 20 64 6f 75 62 6c 65 20 78 32  le y1, double x2
6f260 2c 20 64 6f 75 62 6c 65 20 79 32 29 0a 2a 2f 0a  , double y2).*/.
6f270 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f      struct gaia_
6f280 72 74 72 65 65 5f 6d 62 72 20 2a 6d 62 72 3b 0a  rtree_mbr *mbr;.
6f290 20 20 20 20 64 6f 75 62 6c 65 20 78 6d 69 6e 3b      double xmin;
6f2a0 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6d 61 78  .    double xmax
6f2b0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 6d 69  ;.    double ymi
6f2c0 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 6d  n;.    double ym
6f2d0 61 78 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66 6d  ax;.    float fm
6f2e0 69 6e 78 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66  inx;.    float f
6f2f0 6d 69 6e 79 3b 0a 20 20 20 20 66 6c 6f 61 74 20  miny;.    float 
6f300 66 6d 61 78 78 3b 0a 20 20 20 20 66 6c 6f 61 74  fmaxx;.    float
6f310 20 66 6d 61 78 79 3b 0a 20 20 20 20 64 6f 75 62   fmaxy;.    doub
6f320 6c 65 20 74 69 63 3b 0a 20 20 20 20 64 6f 75 62  le tic;.    doub
6f330 6c 65 20 74 69 63 32 3b 0a 0a 20 20 20 20 69 66  le tic2;..    if
6f340 20 28 70 2d 3e 70 55 73 65 72 20 3d 3d 20 30 29   (p->pUser == 0)
6f350 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66  .      {..  /* f
6f360 69 72 73 74 20 63 61 6c 6c 3a 20 77 65 20 6d 75  irst call: we mu
6f370 73 74 20 63 68 65 63 6b 20 61 72 67 73 20 61 6e  st check args an
6f380 64 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a  d then initializ
6f390 65 20 74 68 65 20 4d 42 52 20 73 74 72 75 63 74  e the MBR struct
6f3a0 20 2a 2f 0a 09 20 20 69 66 20 28 6e 43 6f 6f 72   */..  if (nCoor
6f3b0 64 20 21 3d 20 34 29 0a 09 20 20 20 20 20 20 72  d != 4)..      r
6f3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
6f3d0 4f 52 3b 0a 09 20 20 69 66 20 28 70 2d 3e 6e 50  OR;..  if (p->nP
6f3e0 61 72 61 6d 20 21 3d 20 34 29 0a 09 20 20 20 20  aram != 4)..    
6f3f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6f400 45 52 52 4f 52 3b 0a 09 20 20 6d 62 72 20 3d 20  ERROR;..  mbr = 
6f410 28 73 74 72 75 63 74 20 67 61 69 61 5f 72 74 72  (struct gaia_rtr
6f420 65 65 5f 6d 62 72 20 2a 29 20 28 70 2d 3e 70 55  ee_mbr *) (p->pU
6f430 73 65 72 20 3d 0a 09 09 09 09 09 20 20 20 73 71  ser =......   sq
6f440 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 28 73 69  lite3_malloc (si
6f450 7a 65 6f 66 0a 09 09 09 09 09 09 09 20 20 20 28  zeof........   (
6f460 73 74 72 75 63 74 0a 09 09 09 09 09 09 09 20 20  struct........  
6f470 20 20 67 61 69 61 5f 72 74 72 65 65 5f 6d 62 72    gaia_rtree_mbr
6f480 29 29 29 3b 0a 09 20 20 69 66 20 28 21 6d 62 72  )));..  if (!mbr
6f490 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20  )..      return 
6f4a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 09 20  SQLITE_NOMEM;.. 
6f4b0 20 70 2d 3e 78 44 65 6c 55 73 65 72 20 3d 20 67   p->xDelUser = g
6f4c0 61 69 61 5f 6d 62 72 5f 64 65 6c 3b 0a 09 20 20  aia_mbr_del;..  
6f4d0 78 6d 69 6e 20 3d 20 70 2d 3e 61 50 61 72 61 6d  xmin = p->aParam
6f4e0 5b 30 5d 3b 0a 09 20 20 79 6d 69 6e 20 3d 20 70  [0];..  ymin = p
6f4f0 2d 3e 61 50 61 72 61 6d 5b 31 5d 3b 0a 09 20 20  ->aParam[1];..  
6f500 78 6d 61 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d  xmax = p->aParam
6f510 5b 32 5d 3b 0a 09 20 20 79 6d 61 78 20 3d 20 70  [2];..  ymax = p
6f520 2d 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a 09 20 20  ->aParam[3];..  
6f530 69 66 20 28 78 6d 69 6e 20 3e 20 78 6d 61 78 29  if (xmin > xmax)
6f540 0a 09 20 20 20 20 7b 0a 09 09 78 6d 69 6e 20 3d  ..    {...xmin =
6f550 20 70 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 09   p->aParam[2];..
6f560 09 78 6d 61 78 20 3d 20 70 2d 3e 61 50 61 72 61  .xmax = p->aPara
6f570 6d 5b 30 5d 3b 0a 09 20 20 20 20 7d 0a 09 20 20  m[0];..    }..  
6f580 69 66 20 28 79 6d 69 6e 20 3e 20 79 6d 61 78 29  if (ymin > ymax)
6f590 0a 09 20 20 20 20 7b 0a 09 09 79 6d 69 6e 20 3d  ..    {...ymin =
6f5a0 20 70 2d 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a 09   p->aParam[3];..
6f5b0 09 79 6d 61 78 20 3d 20 70 2d 3e 61 50 61 72 61  .ymax = p->aPara
6f5c0 6d 5b 31 5d 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  m[1];..    }... 
6f5d0 20 2f 2a 20 61 64 6a 75 73 74 69 6e 67 20 74 68   /* adjusting th
6f5e0 65 20 4d 42 52 20 73 6f 20 74 6f 20 63 6f 6d 70  e MBR so to comp
6f5f0 65 6e 73 61 74 65 20 66 6f 72 20 44 4f 55 42 4c  ensate for DOUBL
6f600 45 2f 46 4c 4f 41 54 20 74 72 75 6e 63 61 74 69  E/FLOAT truncati
6f610 6f 6e 73 20 2a 2f 0a 09 20 20 66 6d 69 6e 78 20  ons */..  fminx 
6f620 3d 20 28 66 6c 6f 61 74 29 20 78 6d 69 6e 3b 0a  = (float) xmin;.
6f630 09 20 20 66 6d 69 6e 79 20 3d 20 28 66 6c 6f 61  .  fminy = (floa
6f640 74 29 20 79 6d 69 6e 3b 0a 09 20 20 66 6d 61 78  t) ymin;..  fmax
6f650 78 20 3d 20 28 66 6c 6f 61 74 29 20 78 6d 61 78  x = (float) xmax
6f660 3b 0a 09 20 20 66 6d 61 78 79 20 3d 20 28 66 6c  ;..  fmaxy = (fl
6f670 6f 61 74 29 20 79 6d 61 78 3b 0a 09 20 20 74 69  oat) ymax;..  ti
6f680 63 20 3d 20 66 61 62 73 20 28 78 6d 69 6e 20 2d  c = fabs (xmin -
6f690 20 66 6d 69 6e 78 29 3b 0a 09 20 20 74 69 63 32   fminx);..  tic2
6f6a0 20 3d 20 66 61 62 73 20 28 79 6d 69 6e 20 2d 20   = fabs (ymin - 
6f6b0 66 6d 69 6e 79 29 3b 0a 09 20 20 69 66 20 28 74  fminy);..  if (t
6f6c0 69 63 32 20 3e 20 74 69 63 29 0a 09 20 20 20 20  ic2 > tic)..    
6f6d0 20 20 74 69 63 20 3d 20 74 69 63 32 3b 0a 09 20    tic = tic2;.. 
6f6e0 20 74 69 63 32 20 3d 20 66 61 62 73 20 28 78 6d   tic2 = fabs (xm
6f6f0 61 78 20 2d 20 66 6d 61 78 78 29 3b 0a 09 20 20  ax - fmaxx);..  
6f700 69 66 20 28 74 69 63 32 20 3e 20 74 69 63 29 0a  if (tic2 > tic).
6f710 09 20 20 20 20 20 20 74 69 63 20 3d 20 74 69 63  .      tic = tic
6f720 32 3b 0a 09 20 20 74 69 63 32 20 3d 20 66 61 62  2;..  tic2 = fab
6f730 73 20 28 79 6d 61 78 20 2d 20 66 6d 61 78 79 29  s (ymax - fmaxy)
6f740 3b 0a 09 20 20 69 66 20 28 74 69 63 32 20 3e 20  ;..  if (tic2 > 
6f750 74 69 63 29 0a 09 20 20 20 20 20 20 74 69 63 20  tic)..      tic 
6f760 3d 20 74 69 63 32 3b 0a 09 20 20 74 69 63 20 2a  = tic2;..  tic *
6f770 3d 20 32 2e 30 3b 0a 0a 09 20 20 6d 62 72 2d 3e  = 2.0;...  mbr->
6f780 6d 69 6e 78 20 3d 20 78 6d 69 6e 20 2d 20 74 69  minx = xmin - ti
6f790 63 3b 0a 09 20 20 6d 62 72 2d 3e 6d 69 6e 79 20  c;..  mbr->miny 
6f7a0 3d 20 79 6d 69 6e 20 2d 20 74 69 63 3b 0a 09 20  = ymin - tic;.. 
6f7b0 20 6d 62 72 2d 3e 6d 61 78 78 20 3d 20 78 6d 61   mbr->maxx = xma
6f7c0 78 20 2b 20 74 69 63 3b 0a 09 20 20 6d 62 72 2d  x + tic;..  mbr-
6f7d0 3e 6d 61 78 79 20 3d 20 79 6d 61 78 20 2b 20 74  >maxy = ymax + t
6f7e0 69 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ic;.      }..   
6f7f0 20 6d 62 72 20 3d 20 28 73 74 72 75 63 74 20 67   mbr = (struct g
6f800 61 69 61 5f 72 74 72 65 65 5f 6d 62 72 20 2a 29  aia_rtree_mbr *)
6f810 20 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20   (p->pUser);.   
6f820 20 78 6d 69 6e 20 3d 20 61 43 6f 6f 72 64 5b 30   xmin = aCoord[0
6f830 5d 3b 0a 20 20 20 20 78 6d 61 78 20 3d 20 61 43  ];.    xmax = aC
6f840 6f 6f 72 64 5b 31 5d 3b 0a 20 20 20 20 79 6d 69  oord[1];.    ymi
6f850 6e 20 3d 20 61 43 6f 6f 72 64 5b 32 5d 3b 0a 20  n = aCoord[2];. 
6f860 20 20 20 79 6d 61 78 20 3d 20 61 43 6f 6f 72 64     ymax = aCoord
6f870 5b 33 5d 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  [3];.    *pRes =
6f880 20 31 3b 0a 2f 2a 20 65 76 61 6c 75 61 74 69 6e   1;./* evaluatin
6f890 67 20 49 6e 74 65 72 73 65 63 74 73 20 72 65 6c  g Intersects rel
6f8a0 61 74 69 6f 6e 73 68 69 70 20 2a 2f 0a 20 20 20  ationship */.   
6f8b0 20 69 66 20 28 78 6d 69 6e 20 3e 20 6d 62 72 2d   if (xmin > mbr-
6f8c0 3e 6d 61 78 78 29 0a 09 2a 70 52 65 73 20 3d 20  >maxx)..*pRes = 
6f8d0 30 3b 0a 20 20 20 20 69 66 20 28 78 6d 61 78 20  0;.    if (xmax 
6f8e0 3c 20 6d 62 72 2d 3e 6d 69 6e 78 29 0a 09 2a 70  < mbr->minx)..*p
6f8f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  Res = 0;.    if 
6f900 28 79 6d 69 6e 20 3e 20 6d 62 72 2d 3e 6d 61 78  (ymin > mbr->max
6f910 79 29 0a 09 2a 70 52 65 73 20 3d 20 30 3b 0a 20  y)..*pRes = 0;. 
6f920 20 20 20 69 66 20 28 79 6d 61 78 20 3c 20 6d 62     if (ymax < mb
6f930 72 2d 3e 6d 69 6e 79 29 0a 09 2a 70 52 65 73 20  r->miny)..*pRes 
6f940 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
6f950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
6f960 61 74 69 63 20 69 6e 74 0a 66 6e 63 74 5f 52 54  atic int.fnct_RT
6f970 72 65 65 44 69 73 74 57 69 74 68 69 6e 20 28 73  reeDistWithin (s
6f980 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
6f990 6d 65 74 72 79 20 2a 20 70 2c 20 69 6e 74 20 6e  metry * p, int n
6f9a0 43 6f 6f 72 64 2c 20 64 6f 75 62 6c 65 20 2a 61  Coord, double *a
6f9b0 43 6f 6f 72 64 2c 0a 09 09 20 20 20 20 20 20 69  Coord,...      i
6f9c0 6e 74 20 2a 70 52 65 73 29 0a 7b 0a 2f 2a 20 52  nt *pRes).{./* R
6f9d0 2a 54 72 65 65 20 47 65 6f 6d 65 74 72 79 20 63  *Tree Geometry c
6f9e0 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
6f9f0 3a 0a 2f 20 2e 2e 2e 20 4d 41 54 43 48 20 52 54  :./ ... MATCH RT
6fa00 72 65 65 44 69 73 74 57 69 74 68 69 6e 28 64 6f  reeDistWithin(do
6fa10 75 62 6c 65 20 78 2c 20 64 6f 75 62 6c 65 20 79  uble x, double y
6fa20 2c 20 64 6f 75 62 6c 65 20 72 61 64 69 75 73 29  , double radius)
6fa30 0a 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 67  .*/.    struct g
6fa40 61 69 61 5f 72 74 72 65 65 5f 6d 62 72 20 2a 6d  aia_rtree_mbr *m
6fa50 62 72 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  br;.    double x
6fa60 6d 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  min;.    double 
6fa70 78 6d 61 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65  xmax;.    double
6fa80 20 79 6d 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c   ymin;.    doubl
6fa90 65 20 79 6d 61 78 3b 0a 0a 20 20 20 20 69 66 20  e ymax;..    if 
6faa0 28 70 2d 3e 70 55 73 65 72 20 3d 3d 20 30 29 0a  (p->pUser == 0).
6fab0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66 69        {..  /* fi
6fac0 72 73 74 20 63 61 6c 6c 3a 20 77 65 20 6d 75 73  rst call: we mus
6fad0 74 20 63 68 65 63 6b 20 61 72 67 73 20 61 6e 64  t check args and
6fae0 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   then initialize
6faf0 20 74 68 65 20 4d 42 52 20 73 74 72 75 63 74 20   the MBR struct 
6fb00 2a 2f 0a 09 20 20 69 66 20 28 6e 43 6f 6f 72 64  */..  if (nCoord
6fb10 20 21 3d 20 34 29 0a 09 20 20 20 20 20 20 72 65   != 4)..      re
6fb20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6fb30 52 3b 0a 09 20 20 69 66 20 28 70 2d 3e 6e 50 61  R;..  if (p->nPa
6fb40 72 61 6d 20 21 3d 20 33 29 0a 09 20 20 20 20 20  ram != 3)..     
6fb50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
6fb60 52 52 4f 52 3b 0a 09 20 20 6d 62 72 20 3d 20 28  RROR;..  mbr = (
6fb70 73 74 72 75 63 74 20 67 61 69 61 5f 72 74 72 65  struct gaia_rtre
6fb80 65 5f 6d 62 72 20 2a 29 20 28 70 2d 3e 70 55 73  e_mbr *) (p->pUs
6fb90 65 72 20 3d 0a 09 09 09 09 09 20 20 20 73 71 6c  er =......   sql
6fba0 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 28 73 69 7a  ite3_malloc (siz
6fbb0 65 6f 66 0a 09 09 09 09 09 09 09 20 20 20 28 73  eof........   (s
6fbc0 74 72 75 63 74 0a 09 09 09 09 09 09 09 20 20 20  truct........   
6fbd0 20 67 61 69 61 5f 72 74 72 65 65 5f 6d 62 72 29   gaia_rtree_mbr)
6fbe0 29 29 3b 0a 09 20 20 69 66 20 28 21 6d 62 72 29  ));..  if (!mbr)
6fbf0 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ..      return S
6fc00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 09 20 20  QLITE_NOMEM;..  
6fc10 70 2d 3e 78 44 65 6c 55 73 65 72 20 3d 20 67 61  p->xDelUser = ga
6fc20 69 61 5f 6d 62 72 5f 64 65 6c 3b 0a 09 20 20 6d  ia_mbr_del;..  m
6fc30 62 72 2d 3e 6d 69 6e 78 20 3d 20 70 2d 3e 61 50  br->minx = p->aP
6fc40 61 72 61 6d 5b 30 5d 20 2d 20 70 2d 3e 61 50 61  aram[0] - p->aPa
6fc50 72 61 6d 5b 32 5d 3b 0a 09 20 20 6d 62 72 2d 3e  ram[2];..  mbr->
6fc60 6d 69 6e 79 20 3d 20 70 2d 3e 61 50 61 72 61 6d  miny = p->aParam
6fc70 5b 31 5d 20 2d 20 70 2d 3e 61 50 61 72 61 6d 5b  [1] - p->aParam[
6fc80 32 5d 3b 0a 09 20 20 6d 62 72 2d 3e 6d 61 78 78  2];..  mbr->maxx
6fc90 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 30 5d 20   = p->aParam[0] 
6fca0 2b 20 70 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a  + p->aParam[2];.
6fcb0 09 20 20 6d 62 72 2d 3e 6d 61 78 79 20 3d 20 70  .  mbr->maxy = p
6fcc0 2d 3e 61 50 61 72 61 6d 5b 31 5d 20 2b 20 70 2d  ->aParam[1] + p-
6fcd0 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 20 20 20 20  >aParam[2];.    
6fce0 20 20 7d 0a 0a 20 20 20 20 6d 62 72 20 3d 20 28    }..    mbr = (
6fcf0 73 74 72 75 63 74 20 67 61 69 61 5f 72 74 72 65  struct gaia_rtre
6fd00 65 5f 6d 62 72 20 2a 29 20 28 70 2d 3e 70 55 73  e_mbr *) (p->pUs
6fd10 65 72 29 3b 0a 20 20 20 20 78 6d 69 6e 20 3d 20  er);.    xmin = 
6fd20 61 43 6f 6f 72 64 5b 30 5d 3b 0a 20 20 20 20 78  aCoord[0];.    x
6fd30 6d 61 78 20 3d 20 61 43 6f 6f 72 64 5b 31 5d 3b  max = aCoord[1];
6fd40 0a 20 20 20 20 79 6d 69 6e 20 3d 20 61 43 6f 6f  .    ymin = aCoo
6fd50 72 64 5b 32 5d 3b 0a 20 20 20 20 79 6d 61 78 20  rd[2];.    ymax 
6fd60 3d 20 61 43 6f 6f 72 64 5b 33 5d 3b 0a 20 20 20  = aCoord[3];.   
6fd70 20 2a 70 52 65 73 20 3d 20 31 3b 0a 2f 2a 20 65   *pRes = 1;./* e
6fd80 76 61 6c 75 61 74 69 6e 67 20 49 6e 74 65 72 73  valuating Inters
6fd90 65 63 74 73 20 72 65 6c 61 74 69 6f 6e 73 68 69  ects relationshi
6fda0 70 20 2a 2f 0a 20 20 20 20 69 66 20 28 78 6d 69  p */.    if (xmi
6fdb0 6e 20 3e 20 6d 62 72 2d 3e 6d 61 78 78 29 0a 09  n > mbr->maxx)..
6fdc0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
6fdd0 66 20 28 78 6d 61 78 20 3c 20 6d 62 72 2d 3e 6d  f (xmax < mbr->m
6fde0 69 6e 78 29 0a 09 2a 70 52 65 73 20 3d 20 30 3b  inx)..*pRes = 0;
6fdf0 0a 20 20 20 20 69 66 20 28 79 6d 69 6e 20 3e 20  .    if (ymin > 
6fe00 6d 62 72 2d 3e 6d 61 78 79 29 0a 09 2a 70 52 65  mbr->maxy)..*pRe
6fe10 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 79  s = 0;.    if (y
6fe20 6d 61 78 20 3c 20 6d 62 72 2d 3e 6d 69 6e 79 29  max < mbr->miny)
6fe30 0a 09 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20  ..*pRes = 0;.   
6fe40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6fe50 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 65  K;.}.#endif /* e
6fe60 6e 64 20 52 54 72 65 65 20 67 65 6f 6d 65 74 72  nd RTree geometr
6fe70 79 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 0a  y callbacks */..
6fe80 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
6fe90 5f 58 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  _X (sqlite3_cont
6fea0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
6feb0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
6fec0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
6fed0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
6fee0 6e 3a 0a 2f 20 58 28 42 4c 4f 42 20 65 6e 63 6f  n:./ X(BLOB enco
6fef0 64 65 64 20 50 4f 49 4e 54 29 0a 2f 0a 2f 20 72  ded POINT)././ r
6ff00 65 74 75 72 6e 73 20 74 68 65 20 58 20 63 6f 6f  eturns the X coo
6ff10 72 64 69 6e 61 74 65 20 66 6f 72 20 63 75 72 72  rdinate for curr
6ff20 65 6e 74 20 50 4f 49 4e 54 20 67 65 6f 6d 65 74  ent POINT geomet
6ff30 72 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ry ./ or NULL if
6ff40 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
6ff50 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
6ff60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6ff70 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
6ff80 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
6ff90 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
6ffa0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
6ffb0 61 50 6f 69 6e 74 50 74 72 20 70 6f 69 6e 74 3b  aPointPtr point;
6ffc0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
6ffd0 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
6ffe0 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
6fff0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
70000 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
70010 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
70020 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
70030 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
70040 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
70050 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
70060 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
70070 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
70080 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
70090 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
700a0 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
700b0 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
700c0 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
700d0 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
700e0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
700f0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
70100 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
70110 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
70120 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
70130 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
70140 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
70150 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
70160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
70170 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
70180 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
70190 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
701a0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
701b0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
701c0 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
701d0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
701e0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
701f0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
70200 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
70210 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
70220 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
70230 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
70240 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
70250 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 6f 69  e.      {..  poi
70260 6e 74 20 3d 20 73 69 6d 70 6c 65 50 6f 69 6e 74  nt = simplePoint
70270 20 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 21   (geo);..  if (!
70280 70 6f 69 6e 74 29 0a 09 20 20 20 20 20 20 73 71  point)..      sq
70290 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
702a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
702b0 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69  else..      sqli
702c0 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
702d0 65 20 28 63 6f 6e 74 65 78 74 2c 20 70 6f 69 6e  e (context, poin
702e0 74 2d 3e 58 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t->X);.      }. 
702f0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
70300 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
70310 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 59  atic void.fnct_Y
70320 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
70330 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
70340 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
70350 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
70360 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
70370 0a 2f 20 59 28 42 4c 4f 42 20 65 6e 63 6f 64 65  ./ Y(BLOB encode
70380 64 20 50 4f 49 4e 54 29 0a 2f 0a 2f 20 72 65 74  d POINT)././ ret
70390 75 72 6e 73 20 74 68 65 20 59 20 63 6f 6f 72 64  urns the Y coord
703a0 69 6e 61 74 65 20 66 6f 72 20 63 75 72 72 65 6e  inate for curren
703b0 74 20 50 4f 49 4e 54 20 67 65 6f 6d 65 74 72 79  t POINT geometry
703c0 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
703d0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
703e0 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75  untered.*/.    u
703f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
70400 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
70410 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47  bytes;.    gaiaG
70420 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
70430 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 50   NULL;.    gaiaP
70440 6f 69 6e 74 50 74 72 20 70 6f 69 6e 74 3b 0a 20  ointPtr point;. 
70450 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
70460 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
70470 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
70480 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
70490 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
704a0 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
704b0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
704c0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
704d0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
704e0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
704f0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
70500 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
70510 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
70520 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
70530 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
70540 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
70550 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
70560 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
70570 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
70580 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
70590 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
705a0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
705b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
705c0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
705d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
705e0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
705f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
70600 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
70610 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
70620 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
70630 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
70640 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
70650 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  o =..gaiaFromSpa
70660 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
70670 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
70680 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
70690 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
706a0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
706b0 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f  (!geo)..sqlite3_
706c0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
706d0 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
706e0 20 20 20 20 20 20 7b 0a 09 20 20 70 6f 69 6e 74        {..  point
706f0 20 3d 20 73 69 6d 70 6c 65 50 6f 69 6e 74 20 28   = simplePoint (
70700 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 21 70 6f  geo);..  if (!po
70710 69 6e 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  int)..      sqli
70720 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
70730 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
70740 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
70750 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
70760 28 63 6f 6e 74 65 78 74 2c 20 70 6f 69 6e 74 2d  (context, point-
70770 3e 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >Y);.      }.   
70780 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
70790 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74  l (geo);.}..stat
707a0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 5a 20 28  ic void.fnct_Z (
707b0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
707c0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
707d0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
707e0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
707f0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
70800 20 5a 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20   Z(BLOB encoded 
70810 50 4f 49 4e 54 29 0a 2f 0a 2f 20 72 65 74 75 72  POINT)././ retur
70820 6e 73 20 74 68 65 20 5a 20 63 6f 6f 72 64 69 6e  ns the Z coordin
70830 61 74 65 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ate for current 
70840 50 4f 49 4e 54 20 67 65 6f 6d 65 74 72 79 20 0a  POINT geometry .
70850 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
70860 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
70870 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
70880 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
70890 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
708a0 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  tes;.    gaiaGeo
708b0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
708c0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 50 6f 69  ULL;.    gaiaPoi
708d0 6e 74 50 74 72 20 70 6f 69 6e 74 3b 0a 20 20 20  ntPtr point;.   
708e0 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
708f0 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
70900 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
70910 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
70920 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
70930 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
70940 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
70950 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
70960 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
70970 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
70980 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
70990 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
709a0 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
709b0 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
709c0 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
709d0 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
709e0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
709f0 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
70a00 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
70a10 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
70a20 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
70a30 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
70a40 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
70a50 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
70a60 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
70a70 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
70a80 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
70a90 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
70aa0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
70ab0 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
70ac0 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
70ad0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20  gv[0]);.    geo 
70ae0 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
70af0 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
70b00 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
70b10 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
70b20 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
70b30 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
70b40 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  geo)..sqlite3_re
70b50 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
70b60 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
70b70 20 20 20 20 7b 0a 09 20 20 70 6f 69 6e 74 20 3d      {..  point =
70b80 20 73 69 6d 70 6c 65 50 6f 69 6e 74 20 28 67 65   simplePoint (ge
70b90 6f 29 3b 0a 09 20 20 69 66 20 28 21 70 6f 69 6e  o);..  if (!poin
70ba0 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  t)..      sqlite
70bb0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
70bc0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65  ontext);..  else
70bd0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 6f  ..    {...if (po
70be0 69 6e 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  int->DimensionMo
70bf0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
70c00 0a 09 09 20 20 20 20 7c 7c 20 70 6f 69 6e 74 2d  ...    || point-
70c10 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
70c20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
70c30 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ..    sqlite3_re
70c40 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e  sult_double (con
70c50 74 65 78 74 2c 20 70 6f 69 6e 74 2d 3e 5a 29 3b  text, point->Z);
70c60 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71  ...else...    sq
70c70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
70c80 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
70c90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
70ca0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
70cb0 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
70cc0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 20 28 73  c void.fnct_M (s
70cd0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
70ce0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
70cf0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
70d00 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
70d10 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
70d20 4d 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 50  M(BLOB encoded P
70d30 4f 49 4e 54 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  OINT)././ return
70d40 73 20 74 68 65 20 4d 20 63 6f 6f 72 64 69 6e 61  s the M coordina
70d50 74 65 20 66 6f 72 20 63 75 72 72 65 6e 74 20 50  te for current P
70d60 4f 49 4e 54 20 67 65 6f 6d 65 74 72 79 20 0a 2f  OINT geometry ./
70d70 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
70d80 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
70d90 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ered.*/.    unsi
70da0 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
70db0 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
70dc0 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
70dd0 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
70de0 4c 4c 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e  LL;.    gaiaPoin
70df0 74 50 74 72 20 70 6f 69 6e 74 3b 0a 20 20 20 20  tPtr point;.    
70e00 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
70e10 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
70e20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
70e30 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
70e40 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
70e50 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
70e60 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
70e70 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
70e80 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
70e90 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
70ea0 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
70eb0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
70ec0 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
70ed0 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
70ee0 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
70ef0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
70f00 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
70f10 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
70f20 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
70f30 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
70f40 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
70f50 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
70f60 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
70f70 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
70f80 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
70f90 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
70fa0 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
70fb0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
70fc0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
70fd0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
70fe0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
70ff0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
71000 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
71010 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
71020 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
71030 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
71040 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
71050 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
71060 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
71070 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
71080 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
71090 20 20 20 7b 0a 09 20 20 70 6f 69 6e 74 20 3d 20     {..  point = 
710a0 73 69 6d 70 6c 65 50 6f 69 6e 74 20 28 67 65 6f  simplePoint (geo
710b0 29 3b 0a 09 20 20 69 66 20 28 21 70 6f 69 6e 74  );..  if (!point
710c0 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
710d0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
710e0 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
710f0 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 6f 69  .    {...if (poi
71100 6e 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  nt->DimensionMod
71110 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 0a  el == GAIA_XY_M.
71120 09 09 20 20 20 20 7c 7c 20 70 6f 69 6e 74 2d 3e  ..    || point->
71130 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
71140 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
71150 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
71160 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74  ult_double (cont
71170 65 78 74 2c 20 70 6f 69 6e 74 2d 3e 4d 29 3b 0a  ext, point->M);.
71180 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71 6c  ..else...    sql
71190 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
711a0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 20   (context);..   
711b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
711c0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
711d0 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
711e0 20 76 6f 69 64 0a 66 6e 63 74 5f 4e 75 6d 50 6f   void.fnct_NumPo
711f0 69 6e 74 73 20 28 73 71 6c 69 74 65 33 5f 63 6f  ints (sqlite3_co
71200 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
71210 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
71220 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
71230 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
71240 69 6f 6e 3a 0a 2f 20 4e 75 6d 50 6f 69 6e 74 73  ion:./ NumPoints
71250 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 4c 49  (BLOB encoded LI
71260 4e 45 53 54 52 49 4e 47 29 0a 2f 0a 2f 20 72 65  NESTRING)././ re
71270 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
71280 20 6f 66 20 76 65 72 74 69 63 65 73 20 66 6f 72   of vertices for
71290 20 63 75 72 72 65 6e 74 20 4c 49 4e 45 53 54 52   current LINESTR
712a0 49 4e 47 20 67 65 6f 6d 65 74 72 79 20 0a 2f 20  ING geometry ./ 
712b0 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
712c0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
712d0 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
712e0 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
712f0 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
71300 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  s;.    gaiaGeomC
71310 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
71320 4c 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73  L;.    gaiaLines
71330 74 72 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20  tringPtr line;. 
71340 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
71350 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
71360 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
71370 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
71380 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
71390 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
713a0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
713b0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
713c0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
713d0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
713e0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
713f0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
71400 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
71410 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
71420 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
71430 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
71440 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
71450 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
71460 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
71470 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
71480 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
71490 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
714a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
714b0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
714c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
714d0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
714e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
714f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
71500 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
71510 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
71520 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
71530 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
71540 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  o =..gaiaFromSpa
71550 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
71560 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
71570 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
71580 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
71590 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
715a0 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f  (!geo)..sqlite3_
715b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
715c0 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
715d0 20 20 20 20 20 20 7b 0a 09 20 20 6c 69 6e 65 20        {..  line 
715e0 3d 20 73 69 6d 70 6c 65 4c 69 6e 65 73 74 72 69  = simpleLinestri
715f0 6e 67 20 28 67 65 6f 29 3b 0a 09 20 20 69 66 20  ng (geo);..  if 
71600 28 21 6c 69 6e 65 29 0a 09 20 20 20 20 20 20 73  (!line)..      s
71610 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
71620 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
71630 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c   else..      sql
71640 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
71650 28 63 6f 6e 74 65 78 74 2c 20 6c 69 6e 65 2d 3e  (context, line->
71660 50 6f 69 6e 74 73 29 3b 0a 20 20 20 20 20 20 7d  Points);.      }
71670 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
71680 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
71690 73 74 61 74 69 63 20 76 6f 69 64 0a 70 6f 69 6e  static void.poin
716a0 74 5f 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  t_n (sqlite3_con
716b0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
716c0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
716d0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 2c  3_value ** argv,
716e0 0a 09 20 69 6e 74 20 72 65 71 75 65 73 74 29 0a  .. int request).
716f0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
71700 6e 73 3a 0a 2f 20 53 74 61 72 74 50 6f 69 6e 74  ns:./ StartPoint
71710 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 4c 49  (BLOB encoded LI
71720 4e 45 53 54 52 49 4e 47 20 67 65 6f 6d 65 74 72  NESTRING geometr
71730 79 29 0a 2f 20 45 6e 64 50 6f 69 6e 74 28 42 4c  y)./ EndPoint(BL
71740 4f 42 20 65 6e 63 6f 64 65 64 20 4c 49 4e 45 53  OB encoded LINES
71750 54 52 49 4e 47 20 67 65 6f 6d 65 74 72 79 29 0a  TRING geometry).
71760 2f 20 50 6f 69 6e 74 4e 28 42 4c 4f 42 20 65 6e  / PointN(BLOB en
71770 63 6f 64 65 64 20 4c 49 4e 45 53 54 52 49 4e 47  coded LINESTRING
71780 20 67 65 6f 6d 65 74 72 79 2c 20 69 6e 74 65 67   geometry, integ
71790 65 72 20 70 6f 69 6e 74 5f 6e 6f 29 0a 2f 0a 2f  er point_no)././
717a0 20 72 65 74 75 72 6e 73 20 74 68 65 20 4e 74 68   returns the Nth
717b0 20 50 4f 49 4e 54 20 66 6f 72 20 63 75 72 72 65   POINT for curre
717c0 6e 74 20 4c 49 4e 45 53 54 52 49 4e 47 20 67 65  nt LINESTRING ge
717d0 6f 6d 65 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c  ometry ./ or NUL
717e0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
717f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
71800 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
71810 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
71820 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
71830 20 69 6e 74 20 76 65 72 74 65 78 3b 0a 20 20 20   int vertex;.   
71840 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 64 6f   int len;.    do
71850 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62  uble x;.    doub
71860 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le y;.    double
71870 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d   z;.    double m
71880 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
71890 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
718a0 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
718b0 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
718c0 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
718d0 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74  omCollPtr result
718e0 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74  ;.    gaiaLinest
718f0 72 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20 20  ringPtr line;.  
71900 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
71910 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
71920 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
71930 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
71940 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
71950 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
71960 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
71970 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
71980 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
71990 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
719a0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
719b0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
719c0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
719d0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
719e0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
719f0 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
71a00 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
71a10 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
71a20 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
71a30 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
71a40 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
71a50 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
71a60 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
71a70 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
71a80 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
71a90 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
71aa0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
71ab0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
71ac0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
71ad0 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
71ae0 3d 3d 20 47 41 49 41 5f 50 4f 49 4e 54 4e 29 0a  == GAIA_POINTN).
71af0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 50 6f        {..  /* Po
71b00 69 6e 74 4e 28 29 20 72 65 71 75 69 72 65 73 20  intN() requires 
71b10 70 6f 69 6e 74 20 69 6e 64 65 78 20 74 6f 20 62  point index to b
71b20 65 20 64 65 66 69 6e 65 64 20 61 73 20 61 6e 20  e defined as an 
71b30 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
71b40 75 6d 65 6e 74 20 2a 2f 0a 09 20 20 69 66 20 28  ument */..  if (
71b50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
71b60 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
71b70 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
71b80 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
71b90 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
71ba0 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
71bb0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 76 65 72 74  ;..    }..  vert
71bc0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ex = sqlite3_val
71bd0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
71be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
71bf0 73 65 20 69 66 20 28 72 65 71 75 65 73 74 20 3d  se if (request =
71c00 3d 20 47 41 49 41 5f 45 4e 44 5f 50 4f 49 4e 54  = GAIA_END_POINT
71c10 29 0a 09 76 65 72 74 65 78 20 3d 20 2d 31 3b 09  )..vertex = -1;.
71c20 09 2f 2a 20 45 6e 64 50 6f 69 6e 74 28 29 20 73  ./* EndPoint() s
71c30 70 65 63 69 66 69 65 73 20 61 20 6e 65 67 61 74  pecifies a negat
71c40 69 76 65 20 70 6f 69 6e 74 20 69 6e 64 65 78 20  ive point index 
71c50 2a 2f 0a 20 20 20 20 65 6c 73 65 0a 09 76 65 72  */.    else..ver
71c60 74 65 78 20 3d 20 31 3b 09 09 2f 2a 20 53 74 61  tex = 1;../* Sta
71c70 72 74 50 6f 69 6e 74 28 29 20 2a 2f 0a 20 20 20  rtPoint() */.   
71c80 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
71c90 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
71ca0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
71cb0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
71cc0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
71cd0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
71ce0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
71cf0 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
71d00 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
71d10 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
71d20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
71d30 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
71d40 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
71d50 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
71d60 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
71d70 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
71d80 20 20 20 7b 0a 09 20 20 6c 69 6e 65 20 3d 20 73     {..  line = s
71d90 69 6d 70 6c 65 4c 69 6e 65 73 74 72 69 6e 67 20  impleLinestring 
71da0 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 21 6c  (geo);..  if (!l
71db0 69 6e 65 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ine)..      sqli
71dc0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
71dd0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
71de0 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28  se..    {...if (
71df0 76 65 72 74 65 78 20 3c 20 30 29 0a 09 09 20 20  vertex < 0)...  
71e00 20 20 76 65 72 74 65 78 20 3d 20 6c 69 6e 65 2d    vertex = line-
71e10 3e 50 6f 69 6e 74 73 20 2d 20 31 3b 0a 09 09 65  >Points - 1;...e
71e20 6c 73 65 0a 09 09 20 20 20 20 76 65 72 74 65 78  lse...    vertex
71e30 20 2d 3d 20 31 3b 09 2f 2a 20 64 65 63 72 65 61   -= 1;./* decrea
71e40 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 20 69  sing the point i
71e50 6e 64 65 78 20 62 79 20 31 2c 20 62 65 63 61 75  ndex by 1, becau
71e60 73 65 20 50 6f 69 6e 74 4e 20 63 6f 75 6e 74 73  se PointN counts
71e70 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 6e 64   starting at ind
71e80 65 78 20 31 20 2a 2f 0a 09 09 69 66 20 28 76 65  ex 1 */...if (ve
71e90 72 74 65 78 20 3e 3d 20 30 20 26 26 20 76 65 72  rtex >= 0 && ver
71ea0 74 65 78 20 3c 20 6c 69 6e 65 2d 3e 50 6f 69 6e  tex < line->Poin
71eb0 74 73 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  ts)...  {...    
71ec0 20 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65    if (line->Dime
71ed0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
71ee0 49 41 5f 58 59 5f 5a 29 0a 09 09 09 7b 0a 09 09  IA_XY_Z)....{...
71ef0 09 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e  .    gaiaGetPoin
71f00 74 58 59 5a 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72  tXYZ (line->Coor
71f10 64 73 2c 20 76 65 72 74 65 78 2c 20 26 78 2c 20  ds, vertex, &x, 
71f20 26 79 2c 20 26 7a 29 3b 0a 09 09 09 20 20 20 20  &y, &z);....    
71f30 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c  result = gaiaAll
71f40 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29  ocGeomCollXYZ ()
71f50 3b 0a 09 09 09 20 20 20 20 72 65 73 75 6c 74 2d  ;....    result-
71f60 3e 53 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69  >Srid = geo->Sri
71f70 64 3b 0a 09 09 09 20 20 20 20 67 61 69 61 41 64  d;....    gaiaAd
71f80 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
71f90 58 59 5a 20 28 72 65 73 75 6c 74 2c 20 78 2c 20  XYZ (result, x, 
71fa0 79 2c 20 7a 29 3b 0a 09 09 09 7d 0a 09 09 20 20  y, z);....}...  
71fb0 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 69 6e      else if (lin
71fc0 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  e->DimensionMode
71fd0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
71fe0 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61  ...{....    gaia
71ff0 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 6c 69 6e  GetPointXYM (lin
72000 65 2d 3e 43 6f 6f 72 64 73 2c 20 76 65 72 74 65  e->Coords, verte
72010 78 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a  x, &x, &y, &m);.
72020 09 09 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20  ...    result = 
72030 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c  gaiaAllocGeomCol
72040 6c 58 59 4d 20 28 29 3b 0a 09 09 09 20 20 20 20  lXYM ();....    
72050 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67  result->Srid = g
72060 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 09 20 20 20  eo->Srid;....   
72070 20 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47   gaiaAddPointToG
72080 65 6f 6d 43 6f 6c 6c 58 59 4d 20 28 72 65 73 75  eomCollXYM (resu
72090 6c 74 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 09  lt, x, y, m);...
720a0 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20  .}...      else 
720b0 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73  if (line->Dimens
720c0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
720d0 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b 0a 09 09  _XY_Z_M)....{...
720e0 09 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e  .    gaiaGetPoin
720f0 74 58 59 5a 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f  tXYZM (line->Coo
72100 72 64 73 2c 20 76 65 72 74 65 78 2c 20 26 78 2c  rds, vertex, &x,
72110 20 26 79 2c 0a 09 09 09 09 09 20 20 20 20 20 20   &y,......      
72120 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 20 20 20 20  &z, &m);....    
72130 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c  result = gaiaAll
72140 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20 28  ocGeomCollXYZM (
72150 29 3b 0a 09 09 09 20 20 20 20 72 65 73 75 6c 74  );....    result
72160 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72  ->Srid = geo->Sr
72170 69 64 3b 0a 09 09 09 20 20 20 20 67 61 69 61 41  id;....    gaiaA
72180 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c  ddPointToGeomCol
72190 6c 58 59 5a 4d 20 28 72 65 73 75 6c 74 2c 20 78  lXYZM (result, x
721a0 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 09 7d  , y, z, m);....}
721b0 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09  ...      else...
721c0 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65  .{....    gaiaGe
721d0 74 50 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e 43 6f  tPoint (line->Co
721e0 6f 72 64 73 2c 20 76 65 72 74 65 78 2c 20 26 78  ords, vertex, &x
721f0 2c 20 26 79 29 3b 0a 09 09 09 20 20 20 20 72 65  , &y);....    re
72200 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63  sult = gaiaAlloc
72210 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 09 09  GeomColl ();....
72220 20 20 20 20 72 65 73 75 6c 74 2d 3e 53 72 69 64      result->Srid
72230 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09   = geo->Srid;...
72240 09 20 20 20 20 67 61 69 61 41 64 64 50 6f 69 6e  .    gaiaAddPoin
72250 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  tToGeomColl (res
72260 75 6c 74 2c 20 78 2c 20 79 29 3b 0a 09 09 09 7d  ult, x, y);....}
72270 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09  ...  }...else...
72280 20 20 20 20 72 65 73 75 6c 74 20 3d 20 4e 55 4c      result = NUL
72290 4c 3b 0a 09 09 69 66 20 28 21 72 65 73 75 6c 74  L;...if (!result
722a0 29 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f  )...    sqlite3_
722b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
722c0 74 65 78 74 29 3b 0a 09 09 65 6c 73 65 0a 09 09  text);...else...
722d0 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61    {...      gaia
722e0 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
722f0 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20  WkbEx2 (result, 
72300 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
72310 0a 09 09 09 09 09 09 20 20 67 70 6b 67 5f 6d 6f  .......  gpkg_mo
72320 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b  de, tiny_point);
72330 0a 09 09 20 20 20 20 20 20 67 61 69 61 46 72 65  ...      gaiaFre
72340 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c  eGeomColl (resul
72350 74 29 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69  t);...      sqli
72360 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
72370 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
72380 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
72390 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20  ..  }..    }.   
723a0 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
723b0 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
723c0 0a 7d 0a 0a 2f 2a 0a 2f 20 74 68 65 20 66 6f 6c  .}../*./ the fol
723d0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
723e0 20 73 69 6d 70 6c 79 20 72 65 61 64 64 72 65 73   simply readdres
723f0 73 20 74 68 65 20 72 65 71 75 65 73 74 20 74 6f  s the request to
72400 20 70 6f 69 6e 74 5f 6e 28 29 0a 2f 20 73 65 74   point_n()./ set
72410 74 69 6e 67 20 74 68 65 20 61 70 70 72 6f 70 72  ting the appropr
72420 69 61 74 65 20 72 65 71 75 65 73 74 20 6d 6f 64  iate request mod
72430 65 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  e.*/..static voi
72440 64 0a 66 6e 63 74 5f 53 74 61 72 74 50 6f 69 6e  d.fnct_StartPoin
72450 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  t (sqlite3_conte
72460 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
72470 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
72480 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
72490 0a 20 20 20 20 70 6f 69 6e 74 5f 6e 20 28 63 6f  .    point_n (co
724a0 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
724b0 76 2c 20 47 41 49 41 5f 53 54 41 52 54 5f 50 4f  v, GAIA_START_PO
724c0 49 4e 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  INT);.}..static 
724d0 76 6f 69 64 0a 66 6e 63 74 5f 45 6e 64 50 6f 69  void.fnct_EndPoi
724e0 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nt (sqlite3_cont
724f0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
72500 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
72510 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
72520 7b 0a 20 20 20 20 70 6f 69 6e 74 5f 6e 20 28 63  {.    point_n (c
72530 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
72540 67 76 2c 20 47 41 49 41 5f 45 4e 44 5f 50 4f 49  gv, GAIA_END_POI
72550 4e 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  NT);.}..static v
72560 6f 69 64 0a 66 6e 63 74 5f 50 6f 69 6e 74 4e 20  oid.fnct_PointN 
72570 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
72580 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
72590 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
725a0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
725b0 20 20 20 70 6f 69 6e 74 5f 6e 20 28 63 6f 6e 74     point_n (cont
725c0 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ext, argc, argv,
725d0 20 47 41 49 41 5f 50 4f 49 4e 54 4e 29 3b 0a 7d   GAIA_POINTN);.}
725e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
725f0 63 74 5f 45 78 74 65 72 69 6f 72 52 69 6e 67 20  ct_ExteriorRing 
72600 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
72610 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
72620 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
72630 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
72640 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 3a  * SQL functions:
72650 0a 2f 20 45 78 74 65 72 69 6f 72 52 69 6e 67 28  ./ ExteriorRing(
72660 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 50 4f 4c  BLOB encoded POL
72670 59 47 4f 4e 20 67 65 6f 6d 65 74 72 79 29 0a 2f  YGON geometry)./
72680 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 45  ./ returns the E
72690 58 54 45 52 49 4f 52 20 52 49 4e 47 20 66 6f 72  XTERIOR RING for
726a0 20 63 75 72 72 65 6e 74 20 50 4f 4c 59 47 4f 4e   current POLYGON
726b0 20 67 65 6f 6d 65 74 72 79 20 0a 2f 20 6f 72 20   geometry ./ or 
726c0 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
726d0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
726e0 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
726f0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
72700 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
72710 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20 20      int iv;.    
72720 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f  double x;.    do
72730 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62  uble y;.    doub
72740 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le z;.    double
72750 20 6d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   m;.    int len;
72760 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
72770 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
72780 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
72790 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
727a0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
727b0 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b  mCollPtr result;
727c0 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e  .    gaiaPolygon
727d0 50 74 72 20 70 6f 6c 79 67 3b 0a 20 20 20 20 67  Ptr polyg;.    g
727e0 61 69 61 52 69 6e 67 50 74 72 20 72 69 6e 67 3b  aiaRingPtr ring;
727f0 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72  .    gaiaLinestr
72800 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20 20 20  ingPtr line;.   
72810 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
72820 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
72830 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
72840 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
72850 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
72860 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
72870 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
72880 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
72890 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
728a0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
728b0 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
728c0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
728d0 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
728e0 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
728f0 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
72900 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
72910 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
72920 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
72930 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
72940 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
72950 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
72960 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
72970 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
72980 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
72990 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
729a0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
729b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
729c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
729d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
729e0 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
729f0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
72a00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
72a10 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
72a20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
72a30 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
72a40 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
72a50 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
72a60 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
72a70 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
72a80 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
72a90 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
72aa0 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
72ab0 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
72ac0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
72ad0 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
72ae0 20 20 20 20 20 7b 0a 09 20 20 70 6f 6c 79 67 20       {..  polyg 
72af0 3d 20 73 69 6d 70 6c 65 50 6f 6c 79 67 6f 6e 20  = simplePolygon 
72b00 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 21 70  (geo);..  if (!p
72b10 6f 6c 79 67 29 0a 09 20 20 20 20 20 20 73 71 6c  olyg)..      sql
72b20 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
72b30 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65   (context);..  e
72b40 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 72 69 6e  lse..    {...rin
72b50 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72  g = polyg->Exter
72b60 69 6f 72 3b 0a 09 09 69 66 20 28 72 69 6e 67 2d  ior;...if (ring-
72b70 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
72b80 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09  == GAIA_XY_Z)...
72b90 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69      result = gai
72ba0 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59  aAllocGeomCollXY
72bb0 5a 20 28 29 3b 0a 09 09 65 6c 73 65 20 69 66 20  Z ();...else if 
72bc0 28 72 69 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (ring->Dimension
72bd0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
72be0 5f 4d 29 0a 09 09 20 20 20 20 72 65 73 75 6c 74  _M)...    result
72bf0 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
72c00 43 6f 6c 6c 58 59 4d 20 28 29 3b 0a 09 09 65 6c  CollXYM ();...el
72c10 73 65 20 69 66 20 28 72 69 6e 67 2d 3e 44 69 6d  se if (ring->Dim
72c20 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
72c30 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20  AIA_XY_Z_M)...  
72c40 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41    result = gaiaA
72c50 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d  llocGeomCollXYZM
72c60 20 28 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20   ();...else...  
72c70 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41    result = gaiaA
72c80 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b  llocGeomColl ();
72c90 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20  ...result->Srid 
72ca0 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 6c  = geo->Srid;...l
72cb0 69 6e 65 20 3d 20 67 61 69 61 41 64 64 4c 69 6e  ine = gaiaAddLin
72cc0 65 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c  estringToGeomCol
72cd0 6c 20 28 72 65 73 75 6c 74 2c 20 72 69 6e 67 2d  l (result, ring-
72ce0 3e 50 6f 69 6e 74 73 29 3b 0a 09 09 66 6f 72 20  >Points);...for 
72cf0 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69  (iv = 0; iv < li
72d00 6e 65 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b  ne->Points; iv++
72d10 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
72d20 69 66 20 28 72 69 6e 67 2d 3e 44 69 6d 65 6e 73  if (ring->Dimens
72d30 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
72d40 5f 58 59 5f 5a 29 0a 09 09 09 7b 0a 09 09 09 20  _XY_Z)....{.... 
72d50 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58     gaiaGetPointX
72d60 59 5a 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73  YZ (ring->Coords
72d70 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a  , iv, &x, &y, &z
72d80 29 3b 0a 09 09 09 20 20 20 20 67 61 69 61 53 65  );....    gaiaSe
72d90 74 50 6f 69 6e 74 58 59 5a 20 28 6c 69 6e 65 2d  tPointXYZ (line-
72da0 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20  >Coords, iv, x, 
72db0 79 2c 20 7a 29 3b 0a 09 09 09 7d 0a 09 09 20 20  y, z);....}...  
72dc0 20 20 20 20 65 6c 73 65 20 69 66 20 28 72 69 6e      else if (rin
72dd0 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  g->DimensionMode
72de0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
72df0 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61  ...{....    gaia
72e00 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 72 69 6e  GetPointXYM (rin
72e10 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  g->Coords, iv, &
72e20 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09 09 20  x, &y, &m);.... 
72e30 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58     gaiaSetPointX
72e40 59 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73  YM (line->Coords
72e50 2c 20 69 76 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a  , iv, x, y, m);.
72e60 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73  ...}...      els
72e70 65 20 69 66 20 28 72 69 6e 67 2d 3e 44 69 6d 65  e if (ring->Dime
72e80 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
72e90 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b 0a  IA_XY_Z_M)....{.
72ea0 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50 6f  ...    gaiaGetPo
72eb0 69 6e 74 58 59 5a 4d 20 28 72 69 6e 67 2d 3e 43  intXYZM (ring->C
72ec0 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
72ed0 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 20  y, &z, &m);.... 
72ee0 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58     gaiaSetPointX
72ef0 59 5a 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64  YZM (line->Coord
72f00 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a 2c 20  s, iv, x, y, z, 
72f10 6d 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  m);....}...     
72f20 20 65 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20   else....{....  
72f30 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28    gaiaGetPoint (
72f40 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  ring->Coords, iv
72f50 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 09 20 20  , &x, &y);....  
72f60 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28    gaiaSetPoint (
72f70 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  line->Coords, iv
72f80 2c 20 78 2c 20 79 29 3b 0a 09 09 09 7d 0a 09 09  , x, y);....}...
72f90 20 20 7d 0a 09 09 67 61 69 61 54 6f 53 70 61 74    }...gaiaToSpat
72fa0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32  iaLiteBlobWkbEx2
72fb0 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73   (result, &p_res
72fc0 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09  ult, &len,......
72fd0 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74      gpkg_mode, t
72fe0 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 67 61  iny_point);...ga
72ff0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
73000 72 65 73 75 6c 74 29 3b 0a 09 09 73 71 6c 69 74  result);...sqlit
73010 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
73020 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
73030 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  t, len, free);..
73040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
73050 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
73060 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61  ll (geo);.}..sta
73070 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4e 75  tic void.fnct_Nu
73080 6d 49 6e 74 65 72 69 6f 72 52 69 6e 67 73 20 28  mInteriorRings (
73090 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
730a0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
730b0 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71  rgc,...       sq
730c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
730d0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
730e0 6e 63 74 69 6f 6e 3a 0a 2f 20 4e 75 6d 49 6e 74  nction:./ NumInt
730f0 65 72 69 6f 72 52 69 6e 67 73 28 42 4c 4f 42 20  eriorRings(BLOB 
73100 65 6e 63 6f 64 65 64 20 50 4f 4c 59 47 4f 4e 29  encoded POLYGON)
73110 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65  ././ returns the
73120 20 6e 75 6d 62 65 72 20 6f 66 20 49 4e 54 45 52   number of INTER
73130 49 4f 52 20 52 49 4e 47 53 20 66 6f 72 20 63 75  IOR RINGS for cu
73140 72 72 65 6e 74 20 50 4f 4c 59 47 4f 4e 20 67 65  rrent POLYGON ge
73150 6f 6d 65 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c  ometry ./ or NUL
73160 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
73170 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
73180 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
73190 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
731a0 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
731b0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
731c0 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20   geo = NULL;.   
731d0 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
731e0 70 6f 6c 79 67 3b 0a 20 20 20 20 69 6e 74 20 67  polyg;.    int g
731f0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
73200 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
73210 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
73220 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
73230 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
73240 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
73250 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
73260 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
73270 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
73280 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
73290 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
732a0 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
732b0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
732c0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
732d0 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
732e0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
732f0 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
73300 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
73310 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
73320 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
73330 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
73340 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
73350 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
73360 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
73370 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
73380 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
73390 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
733a0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
733b0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
733c0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
733d0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
733e0 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
733f0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
73400 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
73410 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
73420 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
73430 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
73440 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
73450 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
73460 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
73470 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
73480 09 20 20 70 6f 6c 79 67 20 3d 20 73 69 6d 70 6c  .  polyg = simpl
73490 65 50 6f 6c 79 67 6f 6e 20 28 67 65 6f 29 3b 0a  ePolygon (geo);.
734a0 09 20 20 69 66 20 28 21 70 6f 6c 79 67 29 0a 09  .  if (!polyg)..
734b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
734c0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
734d0 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  xt);..  else..  
734e0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
734f0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
73500 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72   polyg->NumInter
73510 69 6f 72 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iors);.      }. 
73520 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
73530 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
73540 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49  atic void.fnct_I
73550 6e 74 65 72 69 6f 72 52 69 6e 67 4e 20 28 73 71  nteriorRingN (sq
73560 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
73570 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
73580 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
73590 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
735a0 51 4c 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20  QL functions:./ 
735b0 49 6e 74 65 72 69 6f 72 52 69 6e 67 4e 28 42 4c  InteriorRingN(BL
735c0 4f 42 20 65 6e 63 6f 64 65 64 20 50 4f 4c 59 47  OB encoded POLYG
735d0 4f 4e 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  ON geometry)././
735e0 20 72 65 74 75 72 6e 73 20 74 68 65 20 4e 74 68   returns the Nth
735f0 20 49 4e 54 45 52 49 4f 52 20 52 49 4e 47 20 66   INTERIOR RING f
73600 6f 72 20 63 75 72 72 65 6e 74 20 50 4f 4c 59 47  or current POLYG
73610 4f 4e 20 67 65 6f 6d 65 74 72 79 20 0a 2f 20 6f  ON geometry ./ o
73620 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
73630 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
73640 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ed.*/.    unsign
73650 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
73660 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
73670 3b 0a 20 20 20 20 69 6e 74 20 62 6f 72 64 65 72  ;.    int border
73680 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20  ;.    int iv;.  
73690 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20    double x;.    
736a0 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f  double y;.    do
736b0 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62  uble z;.    doub
736c0 6c 65 20 6d 3b 0a 20 20 20 20 69 6e 74 20 6c 65  le m;.    int le
736d0 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
736e0 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
736f0 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
73700 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
73710 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
73720 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c  eomCollPtr resul
73730 74 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67  t;.    gaiaPolyg
73740 6f 6e 50 74 72 20 70 6f 6c 79 67 3b 0a 20 20 20  onPtr polyg;.   
73750 20 67 61 69 61 52 69 6e 67 50 74 72 20 72 69 6e   gaiaRingPtr rin
73760 67 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73  g;.    gaiaLines
73770 74 72 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20  tringPtr line;. 
73780 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
73790 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
737a0 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
737b0 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  0;.    int tiny_
737c0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
737d0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
737e0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
737f0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
73800 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
73810 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
73820 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
73830 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
73840 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
73850 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
73860 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
73870 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
73880 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
73890 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
738a0 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20  e->gpkg_mode;.. 
738b0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61   tiny_point = ca
738c0 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e  che->tinyPointEn
738d0 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  abled;.      }. 
738e0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
738f0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
73900 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
73910 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
73920 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
73930 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
73940 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
73950 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
73960 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
73970 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
73980 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
73990 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
739a0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
739b0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
739c0 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
739d0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
739e0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
739f0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
73a00 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
73a10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
73a20 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
73a30 20 20 20 20 62 6f 72 64 65 72 20 3d 20 73 71 6c      border = sql
73a40 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
73a50 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65  argv[1]);.    ge
73a60 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  o =..gaiaFromSpa
73a70 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
73a80 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
73a90 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
73aa0 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
73ab0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
73ac0 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f  (!geo)..sqlite3_
73ad0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
73ae0 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
73af0 20 20 20 20 20 20 7b 0a 09 20 20 70 6f 6c 79 67        {..  polyg
73b00 20 3d 20 73 69 6d 70 6c 65 50 6f 6c 79 67 6f 6e   = simplePolygon
73b10 20 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 21   (geo);..  if (!
73b20 70 6f 6c 79 67 29 0a 09 20 20 20 20 20 20 73 71  polyg)..      sq
73b30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
73b40 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
73b50 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66  else..    {...if
73b60 20 28 62 6f 72 64 65 72 20 3e 3d 20 31 20 26 26   (border >= 1 &&
73b70 20 62 6f 72 64 65 72 20 3c 3d 20 70 6f 6c 79 67   border <= polyg
73b80 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 29 0a  ->NumInteriors).
73b90 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 72 69  ..  {...      ri
73ba0 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65  ng = polyg->Inte
73bb0 72 69 6f 72 73 20 2b 20 28 62 6f 72 64 65 72 20  riors + (border 
73bc0 2d 20 31 29 3b 0a 09 09 20 20 20 20 20 20 69 66  - 1);...      if
73bd0 20 28 72 69 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f   (ring->Dimensio
73be0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
73bf0 59 5f 5a 29 0a 09 09 09 20 20 72 65 73 75 6c 74  Y_Z)....  result
73c00 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
73c10 43 6f 6c 6c 58 59 5a 20 28 29 3b 0a 09 09 20 20  CollXYZ ();...  
73c20 20 20 20 20 65 6c 73 65 20 69 66 20 28 72 69 6e      else if (rin
73c30 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  g->DimensionMode
73c40 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
73c50 09 09 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61  ...  result = ga
73c60 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58  iaAllocGeomCollX
73c70 59 4d 20 28 29 3b 0a 09 09 20 20 20 20 20 20 65  YM ();...      e
73c80 6c 73 65 20 69 66 20 28 72 69 6e 67 2d 3e 44 69  lse if (ring->Di
73c90 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
73ca0 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09  GAIA_XY_Z_M)....
73cb0 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41    result = gaiaA
73cc0 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d  llocGeomCollXYZM
73cd0 20 28 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73   ();...      els
73ce0 65 0a 09 09 09 20 20 72 65 73 75 6c 74 20 3d 20  e....  result = 
73cf0 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c  gaiaAllocGeomCol
73d00 6c 20 28 29 3b 0a 09 09 20 20 20 20 20 20 72 65  l ();...      re
73d10 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f  sult->Srid = geo
73d20 2d 3e 53 72 69 64 3b 0a 09 09 20 20 20 20 20 20  ->Srid;...      
73d30 6c 69 6e 65 20 3d 20 67 61 69 61 41 64 64 4c 69  line = gaiaAddLi
73d40 6e 65 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f  nestringToGeomCo
73d50 6c 6c 20 28 72 65 73 75 6c 74 2c 20 72 69 6e 67  ll (result, ring
73d60 2d 3e 50 6f 69 6e 74 73 29 3b 0a 09 09 20 20 20  ->Points);...   
73d70 20 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20     for (iv = 0; 
73d80 69 76 20 3c 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74  iv < line->Point
73d90 73 3b 20 69 76 2b 2b 29 0a 09 09 09 7b 0a 09 09  s; iv++)....{...
73da0 09 20 20 20 20 69 66 20 28 72 69 6e 67 2d 3e 44  .    if (ring->D
73db0 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
73dc0 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09 20   GAIA_XY_Z).... 
73dd0 20 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61 69       {.....  gai
73de0 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 69  aGetPointXYZ (ri
73df0 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
73e00 26 78 2c 0a 09 09 09 09 09 09 20 20 20 26 79 2c  &x,.......   &y,
73e10 20 26 7a 29 3b 0a 09 09 09 09 20 20 67 61 69 61   &z);.....  gaia
73e20 53 65 74 50 6f 69 6e 74 58 59 5a 20 28 6c 69 6e  SetPointXYZ (lin
73e30 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78  e->Coords, iv, x
73e40 2c 20 79 2c 20 7a 29 3b 0a 09 09 09 20 20 20 20  , y, z);....    
73e50 20 20 7d 0a 09 09 09 20 20 20 20 65 6c 73 65 20    }....    else 
73e60 69 66 20 28 72 69 6e 67 2d 3e 44 69 6d 65 6e 73  if (ring->Dimens
73e70 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
73e80 5f 58 59 5f 4d 29 0a 09 09 09 20 20 20 20 20 20  _XY_M)....      
73e90 7b 0a 09 09 09 09 20 20 67 61 69 61 47 65 74 50  {.....  gaiaGetP
73ea0 6f 69 6e 74 58 59 4d 20 28 72 69 6e 67 2d 3e 43  ointXYM (ring->C
73eb0 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 0a 09  oords, iv, &x,..
73ec0 09 09 09 09 09 20 20 20 26 79 2c 20 26 6d 29 3b  .....   &y, &m);
73ed0 0a 09 09 09 09 20 20 67 61 69 61 53 65 74 50 6f  .....  gaiaSetPo
73ee0 69 6e 74 58 59 4d 20 28 6c 69 6e 65 2d 3e 43 6f  intXYM (line->Co
73ef0 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20  ords, iv, x, y, 
73f00 6d 29 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09  m);....      }..
73f10 09 09 20 20 20 20 65 6c 73 65 20 69 66 20 28 72  ..    else if (r
73f20 69 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  ing->DimensionMo
73f30 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
73f40 5f 4d 29 0a 09 09 09 20 20 20 20 20 20 7b 0a 09  _M)....      {..
73f50 09 09 09 20 20 67 61 69 61 47 65 74 50 6f 69 6e  ...  gaiaGetPoin
73f60 74 58 59 5a 4d 20 28 72 69 6e 67 2d 3e 43 6f 6f  tXYZM (ring->Coo
73f70 72 64 73 2c 20 69 76 2c 20 26 78 2c 0a 09 09 09  rds, iv, &x,....
73f80 09 09 09 20 20 20 20 26 79 2c 20 26 7a 2c 20 26  ...    &y, &z, &
73f90 6d 29 3b 0a 09 09 09 09 20 20 67 61 69 61 53 65  m);.....  gaiaSe
73fa0 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c 69 6e 65  tPointXYZM (line
73fb0 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c  ->Coords, iv, x,
73fc0 0a 09 09 09 09 09 09 20 20 20 20 79 2c 20 7a 2c  .......    y, z,
73fd0 20 6d 29 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a   m);....      }.
73fe0 09 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 20  ...    else.... 
73ff0 20 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61 69       {.....  gai
74000 61 47 65 74 50 6f 69 6e 74 20 28 72 69 6e 67 2d  aGetPoint (ring-
74010 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c  >Coords, iv, &x,
74020 20 26 79 29 3b 0a 09 09 09 09 20 20 67 61 69 61   &y);.....  gaia
74030 53 65 74 50 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e  SetPoint (line->
74040 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79  Coords, iv, x, y
74050 29 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09  );....      }...
74060 09 7d 0a 09 09 20 20 20 20 20 20 67 61 69 61 54  .}...      gaiaT
74070 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
74080 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26  kbEx2 (result, &
74090 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a  p_result, &len,.
740a0 09 09 09 09 09 09 20 20 67 70 6b 67 5f 6d 6f 64  ......  gpkg_mod
740b0 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a  e, tiny_point);.
740c0 09 09 20 20 20 20 20 20 67 61 69 61 46 72 65 65  ..      gaiaFree
740d0 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74  GeomColl (result
740e0 29 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74  );...      sqlit
740f0 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
74100 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
74110 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  t, len, free);..
74120 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20  .  }...else...  
74130 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
74140 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
74150 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
74160 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
74170 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73  Coll (geo);.}..s
74180 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
74190 4e 75 6d 47 65 6f 6d 65 74 72 69 65 73 20 28 73  NumGeometries (s
741a0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
741b0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
741c0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
741d0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
741e0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
741f0 4e 75 6d 47 65 6f 6d 65 74 72 69 65 73 28 42 4c  NumGeometries(BL
74200 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45  OB encoded GEOME
74210 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 2f  TRYCOLLECTION)./
74220 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ./ returns the n
74230 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
74240 61 72 79 20 67 65 6f 6d 65 74 72 69 65 73 20 66  ary geometries f
74250 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65  or current geome
74260 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  try ./ or NULL i
74270 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
74280 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
74290 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
742a0 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
742b0 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
742c0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 67  t cnt = 0;.    g
742d0 61 69 61 50 6f 69 6e 74 50 74 72 20 70 6f 69 6e  aiaPointPtr poin
742e0 74 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73  t;.    gaiaLines
742f0 74 72 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20  tringPtr line;. 
74300 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74     gaiaPolygonPt
74310 72 20 70 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69  r polyg;.    gai
74320 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
74330 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
74340 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
74350 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
74360 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
74370 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
74380 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
74390 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
743a0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
743b0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
743c0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
743d0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
743e0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
743f0 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
74400 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
74410 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
74420 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
74430 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
74440 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
74450 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
74460 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
74470 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
74480 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
74490 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
744a0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
744b0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
744c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
744d0 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
744e0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
744f0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
74500 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
74510 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
74520 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
74530 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
74540 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
74550 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
74560 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
74570 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
74580 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
74590 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
745a0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
745b0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
745c0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
745d0 7b 0a 09 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f  {..  point = geo
745e0 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 09 20  ->FirstPoint;.. 
745f0 20 77 68 69 6c 65 20 28 70 6f 69 6e 74 29 0a 09   while (point)..
74600 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 75 6e 74      {.../* count
74610 73 20 68 6f 77 20 6d 61 6e 79 20 70 6f 69 6e 74  s how many point
74620 73 20 61 72 65 20 74 68 65 72 65 20 2a 2f 0a 09  s are there */..
74630 09 63 6e 74 2b 2b 3b 0a 09 09 70 6f 69 6e 74 20  .cnt++;...point 
74640 3d 20 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b 0a 09  = point->Next;..
74650 20 20 20 20 7d 0a 09 20 20 6c 69 6e 65 20 3d 20      }..  line = 
74660 67 65 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74  geo->FirstLinest
74670 72 69 6e 67 3b 0a 09 20 20 77 68 69 6c 65 20 28  ring;..  while (
74680 6c 69 6e 65 29 0a 09 20 20 20 20 7b 0a 09 09 2f  line)..    {.../
74690 2a 20 63 6f 75 6e 74 73 20 68 6f 77 20 6d 61 6e  * counts how man
746a0 79 20 6c 69 6e 65 73 74 72 69 6e 67 73 20 61 72  y linestrings ar
746b0 65 20 74 68 65 72 65 20 2a 2f 0a 09 09 63 6e 74  e there */...cnt
746c0 2b 2b 3b 0a 09 09 6c 69 6e 65 20 3d 20 6c 69 6e  ++;...line = lin
746d0 65 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20 7d 0a  e->Next;..    }.
746e0 09 20 20 70 6f 6c 79 67 20 3d 20 67 65 6f 2d 3e  .  polyg = geo->
746f0 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 09 20  FirstPolygon;.. 
74700 20 77 68 69 6c 65 20 28 70 6f 6c 79 67 29 0a 09   while (polyg)..
74710 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 75 6e 74      {.../* count
74720 73 20 68 6f 77 20 6d 61 6e 79 20 70 6f 6c 79 67  s how many polyg
74730 6f 6e 73 20 61 72 65 20 74 68 65 72 65 20 2a 2f  ons are there */
74740 0a 09 09 63 6e 74 2b 2b 3b 0a 09 09 70 6f 6c 79  ...cnt++;...poly
74750 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b  g = polyg->Next;
74760 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74  ..    }..  sqlit
74770 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
74780 6f 6e 74 65 78 74 2c 20 63 6e 74 29 3b 0a 20 20  ontext, cnt);.  
74790 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
747a0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
747b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
747c0 0a 66 6e 63 74 5f 4e 50 6f 69 6e 74 73 20 28 73  .fnct_NPoints (s
747d0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
747e0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
747f0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
74800 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
74810 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
74820 53 54 5f 4e 50 6f 69 6e 74 73 28 42 4c 4f 42 20  ST_NPoints(BLOB 
74830 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45 54 52 59  encoded GEOMETRY
74840 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 2f 0a 2f 20  COLLECTION)././ 
74850 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
74860 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  l number of poin
74870 74 73 2f 76 65 72 74 69 63 65 73 20 66 6f 72 20  ts/vertices for 
74880 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
74890 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
748a0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
748b0 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75  untered.*/.    u
748c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
748d0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
748e0 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 63  bytes;.    int c
748f0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
74900 69 62 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e  ib;.    gaiaPoin
74910 74 50 74 72 20 70 6f 69 6e 74 3b 0a 20 20 20 20  tPtr point;.    
74920 67 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74  gaiaLinestringPt
74930 72 20 6c 69 6e 65 3b 0a 20 20 20 20 67 61 69 61  r line;.    gaia
74940 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67  PolygonPtr polyg
74950 3b 0a 20 20 20 20 67 61 69 61 52 69 6e 67 50 74  ;.    gaiaRingPt
74960 72 20 72 6e 67 3b 0a 20 20 20 20 67 61 69 61 47  r rng;.    gaiaG
74970 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
74980 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67   NULL;.    int g
74990 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
749a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
749b0 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
749c0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
749d0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
749e0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
749f0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
74a00 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
74a10 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
74a20 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
74a30 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
74a40 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
74a50 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
74a60 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
74a70 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
74a80 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
74a90 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
74aa0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
74ab0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
74ac0 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
74ad0 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
74ae0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
74af0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
74b00 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
74b10 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
74b20 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
74b30 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
74b40 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
74b50 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
74b60 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
74b70 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
74b80 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
74b90 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
74ba0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
74bb0 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
74bc0 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
74bd0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
74be0 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
74bf0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
74c00 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
74c10 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
74c20 09 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f 2d 3e  .  point = geo->
74c30 46 69 72 73 74 50 6f 69 6e 74 3b 0a 09 20 20 77  FirstPoint;..  w
74c40 68 69 6c 65 20 28 70 6f 69 6e 74 29 0a 09 20 20  hile (point)..  
74c50 20 20 7b 0a 09 09 2f 2a 20 63 6f 75 6e 74 73 20    {.../* counts 
74c60 68 6f 77 20 6d 61 6e 79 20 70 6f 69 6e 74 73 20  how many points 
74c70 61 72 65 20 74 68 65 72 65 20 2a 2f 0a 09 09 63  are there */...c
74c80 6e 74 2b 2b 3b 0a 09 09 70 6f 69 6e 74 20 3d 20  nt++;...point = 
74c90 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b 0a 09 20 20  point->Next;..  
74ca0 20 20 7d 0a 09 20 20 6c 69 6e 65 20 3d 20 67 65    }..  line = ge
74cb0 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  o->FirstLinestri
74cc0 6e 67 3b 0a 09 20 20 77 68 69 6c 65 20 28 6c 69  ng;..  while (li
74cd0 6e 65 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20  ne)..    {.../* 
74ce0 63 6f 75 6e 74 73 20 68 6f 77 20 6d 61 6e 79 20  counts how many 
74cf0 70 6f 69 6e 74 73 20 61 72 65 20 74 68 65 72 65  points are there
74d00 20 2a 2f 0a 09 09 63 6e 74 20 2b 3d 20 6c 69 6e   */...cnt += lin
74d10 65 2d 3e 50 6f 69 6e 74 73 3b 0a 09 09 6c 69 6e  e->Points;...lin
74d20 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a  e = line->Next;.
74d30 09 20 20 20 20 7d 0a 09 20 20 70 6f 6c 79 67 20  .    }..  polyg 
74d40 3d 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 6c 79  = geo->FirstPoly
74d50 67 6f 6e 3b 0a 09 20 20 77 68 69 6c 65 20 28 70  gon;..  while (p
74d60 6f 6c 79 67 29 0a 09 20 20 20 20 7b 0a 09 09 2f  olyg)..    {.../
74d70 2a 20 63 6f 75 6e 74 73 20 68 6f 77 20 6d 61 6e  * counts how man
74d80 79 20 70 6f 69 6e 74 73 20 61 72 65 20 69 6e 20  y points are in 
74d90 74 68 65 20 65 78 74 65 72 69 6f 72 20 72 69 6e  the exterior rin
74da0 67 20 2a 2f 0a 09 09 72 6e 67 20 3d 20 70 6f 6c  g */...rng = pol
74db0 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 09  yg->Exterior;...
74dc0 63 6e 74 20 2b 3d 20 72 6e 67 2d 3e 50 6f 69 6e  cnt += rng->Poin
74dd0 74 73 3b 0a 09 09 66 6f 72 20 28 69 62 20 3d 20  ts;...for (ib = 
74de0 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e  0; ib < polyg->N
74df0 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b  umInteriors; ib+
74e00 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  +)...  {...     
74e10 20 2f 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 61   /* processing a
74e20 6e 79 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67  ny interior ring
74e30 20 2a 2f 0a 09 09 20 20 20 20 20 20 72 6e 67 20   */...      rng 
74e40 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f  = polyg->Interio
74e50 72 73 20 2b 20 69 62 3b 0a 09 09 20 20 20 20 20  rs + ib;...     
74e60 20 63 6e 74 20 2b 3d 20 72 6e 67 2d 3e 50 6f 69   cnt += rng->Poi
74e70 6e 74 73 3b 0a 09 09 20 20 7d 0a 09 09 70 6f 6c  nts;...  }...pol
74e80 79 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78 74  yg = polyg->Next
74e90 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69  ;..    }..  sqli
74ea0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
74eb0 63 6f 6e 74 65 78 74 2c 20 63 6e 74 29 3b 0a 20  context, cnt);. 
74ec0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
74ed0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
74ee0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
74ef0 64 0a 66 6e 63 74 5f 4e 52 69 6e 67 73 20 28 73  d.fnct_NRings (s
74f00 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
74f10 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
74f20 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
74f30 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
74f40 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
74f50 53 54 5f 4e 52 69 6e 67 73 28 42 4c 4f 42 20 65  ST_NRings(BLOB e
74f60 6e 63 6f 64 65 64 20 47 45 4f 4d 45 54 52 59 43  ncoded GEOMETRYC
74f70 4f 4c 4c 45 43 54 49 4f 4e 29 0a 2f 0a 2f 20 72  OLLECTION)././ r
74f80 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
74f90 20 6e 75 6d 62 65 72 20 6f 66 20 72 69 6e 67 73   number of rings
74fa0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f   for current geo
74fb0 6d 65 74 72 79 20 0a 2f 20 28 74 68 69 73 20 69  metry ./ (this i
74fc0 6e 63 6c 75 64 69 6e 67 20 62 6f 74 68 20 69 6e  ncluding both in
74fd0 74 65 72 69 6f 72 20 61 6e 64 20 65 78 74 65 72  terior and exter
74fe0 69 6f 72 20 72 69 6e 67 73 29 0a 2f 20 6f 72 20  ior rings)./ or 
74ff0 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
75000 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
75010 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
75020 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
75030 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
75040 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
75050 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e  .    gaiaPolygon
75060 50 74 72 20 70 6f 6c 79 67 3b 0a 20 20 20 20 67  Ptr polyg;.    g
75070 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
75080 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  eo = NULL;.    i
75090 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
750a0 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
750b0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
750c0 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
750d0 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
750e0 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
750f0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
75100 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
75110 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
75120 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
75130 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
75140 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
75150 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
75160 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
75170 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
75180 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
75190 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
751a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
751b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
751c0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
751d0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
751e0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
751f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
75200 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
75210 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
75220 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
75230 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
75240 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
75250 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
75260 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
75270 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
75280 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
75290 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
752a0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
752b0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
752c0 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
752d0 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
752e0 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
752f0 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
75300 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
75310 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
75320 20 20 7b 0a 09 20 20 70 6f 6c 79 67 20 3d 20 67    {..  polyg = g
75330 65 6f 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e  eo->FirstPolygon
75340 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 6f 6c 79  ;..  while (poly
75350 67 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63  g)..    {.../* c
75360 6f 75 6e 74 73 20 68 6f 77 20 6d 61 6e 79 20 72  ounts how many r
75370 69 6e 67 73 20 61 72 65 20 74 68 65 72 65 20 2a  ings are there *
75380 2f 0a 09 09 63 6e 74 20 2b 3d 20 70 6f 6c 79 67  /...cnt += polyg
75390 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 20 2b  ->NumInteriors +
753a0 20 31 3b 0a 09 09 70 6f 6c 79 67 20 3d 20 70 6f   1;...polyg = po
753b0 6c 79 67 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20  lyg->Next;..    
753c0 7d 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  }..  sqlite3_res
753d0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
753e0 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  , cnt);.      }.
753f0 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
75400 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73  Coll (geo);.}..s
75410 74 61 74 69 63 20 69 6e 74 0a 69 73 5f 73 69 6e  tatic int.is_sin
75420 67 6c 65 5f 70 6f 69 6e 74 20 28 67 61 69 61 47  gle_point (gaiaG
75430 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 29  eomCollPtr geom)
75440 0a 7b 0a 2f 2a 20 63 68 65 63 6b 20 69 66 20 74  .{./* check if t
75450 68 69 73 20 67 65 6f 6d 65 74 72 79 20 69 73 20  his geometry is 
75460 61 20 73 69 6d 70 6c 65 20 50 6f 69 6e 74 20 2a  a simple Point *
75470 2f 0a 20 20 20 20 69 6e 74 20 70 74 73 20 3d 20  /.    int pts = 
75480 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73 20 3d  0;.    int lns =
75490 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 67 73 20   0;.    int pgs 
754a0 3d 20 30 3b 0a 20 20 20 20 67 61 69 61 50 6f 69  = 0;.    gaiaPoi
754b0 6e 74 50 74 72 20 70 74 3b 0a 20 20 20 20 67 61  ntPtr pt;.    ga
754c0 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20  iaLinestringPtr 
754d0 6c 6e 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79  ln;.    gaiaPoly
754e0 67 6f 6e 50 74 72 20 70 67 3b 0a 20 20 20 20 70  gonPtr pg;.    p
754f0 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  t = geom->FirstP
75500 6f 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65 20  oint;.    while 
75510 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  (pt).      {..  
75520 70 74 73 2b 2b 3b 0a 09 20 20 70 74 20 3d 20 70  pts++;..  pt = p
75530 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  t->Next;.      }
75540 0a 20 20 20 20 6c 6e 20 3d 20 67 65 6f 6d 2d 3e  .    ln = geom->
75550 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b  FirstLinestring;
75560 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 6e 29 0a  .    while (ln).
75570 20 20 20 20 20 20 7b 0a 09 20 20 6c 6e 73 2b 2b        {..  lns++
75580 3b 0a 09 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65  ;..  ln = ln->Ne
75590 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
755a0 70 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74  pg = geom->First
755b0 50 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69  Polygon;.    whi
755c0 6c 65 20 28 70 67 29 0a 20 20 20 20 20 20 7b 0a  le (pg).      {.
755d0 09 20 20 70 67 73 2b 2b 3b 0a 09 20 20 70 67 20  .  pgs++;..  pg 
755e0 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20  = pg->Next;.    
755f0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 74 73 20    }.    if (pts 
75600 3d 3d 20 31 20 26 26 20 6c 6e 73 20 3d 3d 20 30  == 1 && lns == 0
75610 20 26 26 20 70 67 73 20 3d 3d 20 30 29 0a 09 72   && pgs == 0)..r
75620 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
75630 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
75640 20 69 6e 74 0a 69 73 5f 73 69 6e 67 6c 65 5f 6c   int.is_single_l
75650 69 6e 65 73 74 72 69 6e 67 20 28 67 61 69 61 47  inestring (gaiaG
75660 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 29  eomCollPtr geom)
75670 0a 7b 0a 2f 2a 20 63 68 65 63 6b 20 69 66 20 74  .{./* check if t
75680 68 69 73 20 67 65 6f 6d 65 74 72 79 20 69 73 20  his geometry is 
75690 61 20 73 69 6d 70 6c 65 20 4c 69 6e 65 73 74 72  a simple Linestr
756a0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70  ing */.    int p
756b0 74 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ts = 0;.    int 
756c0 6c 6e 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  lns = 0;.    int
756d0 20 70 67 73 20 3d 20 30 3b 0a 20 20 20 20 67 61   pgs = 0;.    ga
756e0 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a 20  iaPointPtr pt;. 
756f0 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e     gaiaLinestrin
75700 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61 69  gPtr ln;.    gai
75710 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b 0a  aPolygonPtr pg;.
75720 20 20 20 20 70 74 20 3d 20 67 65 6f 6d 2d 3e 46      pt = geom->F
75730 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20 20 77  irstPoint;.    w
75740 68 69 6c 65 20 28 70 74 29 0a 20 20 20 20 20 20  hile (pt).      
75750 7b 0a 09 20 20 70 74 73 2b 2b 3b 0a 09 20 20 70  {..  pts++;..  p
75760 74 20 3d 20 70 74 2d 3e 4e 65 78 74 3b 0a 20 20  t = pt->Next;.  
75770 20 20 20 20 7d 0a 20 20 20 20 6c 6e 20 3d 20 67      }.    ln = g
75780 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74  eom->FirstLinest
75790 72 69 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65 20  ring;.    while 
757a0 28 6c 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  (ln).      {..  
757b0 6c 6e 73 2b 2b 3b 0a 09 20 20 6c 6e 20 3d 20 6c  lns++;..  ln = l
757c0 6e 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  n->Next;.      }
757d0 0a 20 20 20 20 70 67 20 3d 20 67 65 6f 6d 2d 3e  .    pg = geom->
757e0 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20  FirstPolygon;.  
757f0 20 20 77 68 69 6c 65 20 28 70 67 29 0a 20 20 20    while (pg).   
75800 20 20 20 7b 0a 09 20 20 70 67 73 2b 2b 3b 0a 09     {..  pgs++;..
75810 20 20 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74 3b    pg = pg->Next;
75820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
75830 28 70 74 73 20 3d 3d 20 30 20 26 26 20 6c 6e 73  (pts == 0 && lns
75840 20 3d 3d 20 31 20 26 26 20 70 67 73 20 3d 3d 20   == 1 && pgs == 
75850 30 29 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20  0)..return 1;.  
75860 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
75870 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
75880 41 64 64 50 6f 69 6e 74 20 28 73 71 6c 69 74 65  AddPoint (sqlite
75890 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
758a0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
758b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
758c0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
758d0 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20 53 54 5f 41  unctions:./ ST_A
758e0 64 64 50 6f 69 6e 74 28 42 4c 4f 42 20 65 6e 63  ddPoint(BLOB enc
758f0 6f 64 65 64 20 4c 49 4e 45 53 54 52 49 4e 47 20  oded LINESTRING 
75900 6c 69 6e 65 2c 20 42 4c 4f 42 20 65 6e 63 6f 64  line, BLOB encod
75910 65 64 20 50 4f 49 4e 54 20 70 6f 69 6e 74 29 0a  ed POINT point).
75920 2f 20 53 54 5f 41 64 64 50 6f 69 6e 74 28 42 4c  / ST_AddPoint(BL
75930 4f 42 20 65 6e 63 6f 64 65 64 20 4c 49 4e 45 53  OB encoded LINES
75940 54 52 49 4e 47 20 6c 69 6e 65 2c 20 42 4c 4f 42  TRING line, BLOB
75950 20 65 6e 63 6f 64 65 64 20 50 4f 49 4e 54 20 70   encoded POINT p
75960 6f 69 6e 74 2c 20 49 4e 54 45 47 45 52 20 70 6f  oint, INTEGER po
75970 73 69 74 69 6f 6e 29 0a 2f 0a 2f 20 72 65 74 75  sition)././ retu
75980 72 6e 73 20 61 20 6e 65 77 20 4c 69 6e 65 73 74  rns a new Linest
75990 72 69 6e 67 20 62 79 20 61 64 64 69 6e 67 20 61  ring by adding a
759a0 20 6e 65 77 20 50 6f 69 6e 74 20 62 65 66 6f 72   new Point befor
759b0 65 20 22 70 6f 73 69 74 69 6f 6e 22 20 28 7a 65  e "position" (ze
759c0 72 6f 2d 62 61 73 65 64 20 69 6e 64 65 78 29 0a  ro-based index).
759d0 2f 20 61 20 6e 65 67 61 74 69 76 65 20 22 70 6f  / a negative "po
759e0 73 69 74 69 6f 6e 22 20 28 64 65 66 61 75 6c 74  sition" (default
759f0 29 20 6d 65 61 6e 73 20 61 70 70 65 6e 64 69 6e  ) means appendin
75a00 67 20 74 6f 20 74 68 65 20 65 6e 64 20 0a 2f 20  g to the end ./ 
75a10 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
75a20 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
75a30 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
75a40 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
75a50 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
75a60 73 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73  s;.    gaiaLines
75a70 74 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20  tringPtr ln;.   
75a80 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50   gaiaLinestringP
75a90 74 72 20 6f 75 74 5f 6c 6e 3b 0a 20 20 20 20 67  tr out_ln;.    g
75aa0 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
75ab0 20 20 20 20 69 6e 74 20 70 6f 73 69 74 69 6f 6e      int position
75ac0 20 3d 20 2d 31 3b 0a 20 20 20 20 67 61 69 61 47   = -1;.    gaiaG
75ad0 65 6f 6d 43 6f 6c 6c 50 74 72 20 6c 69 6e 65 20  eomCollPtr line 
75ae0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
75af0 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 70 6f 69 6e  GeomCollPtr poin
75b00 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
75b10 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 6f 75  iaGeomCollPtr ou
75b20 74 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  t;.    int len;.
75b30 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
75b40 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
75b50 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a  LL;.    int iv;.
75b60 20 20 20 20 69 6e 74 20 6f 75 74 5f 69 76 3b 0a      int out_iv;.
75b70 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
75b80 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
75b90 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20 64 6f  double m;.    do
75ba0 75 62 6c 65 20 7a 3b 0a 20 20 20 20 69 6e 74 20  uble z;.    int 
75bb0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
75bc0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
75bd0 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
75be0 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
75bf0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
75c00 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
75c10 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
75c20 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
75c30 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
75c40 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
75c50 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
75c60 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
75c70 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
75c80 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
75c90 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
75ca0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
75cb0 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
75cc0 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
75cd0 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
75ce0 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
75cf0 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
75d00 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
75d10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
75d20 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
75d30 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
75d40 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
75d50 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
75d60 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
75d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
75d80 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
75d90 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
75da0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
75db0 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
75dc0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
75dd0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
75de0 5d 29 3b 0a 20 20 20 20 6c 69 6e 65 20 3d 0a 09  ]);.    line =..
75df0 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
75e00 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
75e10 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
75e20 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
75e30 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
75e40 73 29 3b 0a 20 20 20 20 69 66 20 28 21 6c 69 6e  s);.    if (!lin
75e50 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  e).      {..  sq
75e60 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
75e70 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
75e80 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
75e90 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
75ea0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
75eb0 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [1]) != SQLITE_B
75ec0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
75ed0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
75ee0 20 28 6c 69 6e 65 29 3b 0a 09 20 20 73 71 6c 69   (line);..  sqli
75ef0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
75f00 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
75f10 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
75f20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
75f30 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
75f40 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
75f50 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e  (argv[1]);.    n
75f60 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
75f70 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
75f80 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 6f 69 6e  gv[1]);.    poin
75f90 74 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  t =..gaiaFromSpa
75fa0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
75fb0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
75fc0 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
75fd0 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
75fe0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
75ff0 28 21 70 6f 69 6e 74 29 0a 20 20 20 20 20 20 7b  (!point).      {
76000 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d  ..  gaiaFreeGeom
76010 43 6f 6c 6c 20 28 6c 69 6e 65 29 3b 0a 09 20 20  Coll (line);..  
76020 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
76030 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
76040 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
76050 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
76060 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 3).      {..  
76070 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
76080 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
76090 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
760a0 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  ER)..    {...sql
760b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
760c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 67 6f   (context);...go
760d0 74 6f 20 73 74 6f 70 3b 0a 09 20 20 20 20 7d 0a  to stop;..    }.
760e0 09 20 20 70 6f 73 69 74 69 6f 6e 20 3d 20 73 71  .  position = sq
760f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
76100 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (argv[2]);.     
76110 20 7d 0a 20 20 20 20 69 66 20 28 69 73 5f 73 69   }.    if (is_si
76120 6e 67 6c 65 5f 6c 69 6e 65 73 74 72 69 6e 67 20  ngle_linestring 
76130 28 6c 69 6e 65 29 20 26 26 20 69 73 5f 73 69 6e  (line) && is_sin
76140 67 6c 65 5f 70 6f 69 6e 74 20 28 70 6f 69 6e 74  gle_point (point
76150 29 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ))..;.    else. 
76160 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
76170 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
76180 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74 6f  ontext);..  goto
76190 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20   stop;.      }. 
761a0 20 20 20 6c 6e 20 3d 20 6c 69 6e 65 2d 3e 46 69     ln = line->Fi
761b0 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 20  rstLinestring;. 
761c0 20 20 20 70 74 20 3d 20 70 6f 69 6e 74 2d 3e 46     pt = point->F
761d0 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20 20 69  irstPoint;.    i
761e0 66 20 28 70 6f 73 69 74 69 6f 6e 20 3e 3d 20 30  f (position >= 0
761f0 20 26 26 20 70 6f 73 69 74 69 6f 6e 20 3e 3d 20   && position >= 
76200 6c 6e 2d 3e 50 6f 69 6e 74 73 29 0a 20 20 20 20  ln->Points).    
76210 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
76220 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
76230 65 78 74 29 3b 0a 09 20 20 67 6f 74 6f 20 73 74  ext);..  goto st
76240 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63  op;.      }./* c
76250 72 65 61 74 69 6e 67 20 74 68 65 20 6f 75 74 70  reating the outp
76260 75 74 20 47 65 6f 6d 65 74 72 79 20 2a 2f 0a 20  ut Geometry */. 
76270 20 20 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d     if (line->Dim
76280 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
76290 41 49 41 5f 58 59 5f 5a 29 0a 09 6f 75 74 20 3d  AIA_XY_Z)..out =
762a0 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f   gaiaAllocGeomCo
762b0 6c 6c 58 59 5a 20 28 29 3b 0a 20 20 20 20 65 6c  llXYZ ();.    el
762c0 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d  se if (line->Dim
762d0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
762e0 41 49 41 5f 58 59 5f 4d 29 0a 09 6f 75 74 20 3d  AIA_XY_M)..out =
762f0 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f   gaiaAllocGeomCo
76300 6c 6c 58 59 4d 20 28 29 3b 0a 20 20 20 20 65 6c  llXYM ();.    el
76310 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d  se if (line->Dim
76320 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
76330 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 6f 75 74  AIA_XY_Z_M)..out
76340 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
76350 43 6f 6c 6c 58 59 5a 4d 20 28 29 3b 0a 20 20 20  CollXYZM ();.   
76360 20 65 6c 73 65 0a 09 6f 75 74 20 3d 20 67 61 69   else..out = gai
76370 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28  aAllocGeomColl (
76380 29 3b 0a 20 20 20 20 6f 75 74 2d 3e 53 72 69 64  );.    out->Srid
76390 20 3d 20 6c 69 6e 65 2d 3e 53 72 69 64 3b 0a 20   = line->Srid;. 
763a0 20 20 20 6f 75 74 2d 3e 44 65 63 6c 61 72 65 64     out->Declared
763b0 54 79 70 65 20 3d 20 6c 69 6e 65 2d 3e 44 65 63  Type = line->Dec
763c0 6c 61 72 65 64 54 79 70 65 3b 0a 20 20 20 20 6f  laredType;.    o
763d0 75 74 5f 6c 6e 20 3d 20 67 61 69 61 41 64 64 4c  ut_ln = gaiaAddL
763e0 69 6e 65 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43  inestringToGeomC
763f0 6f 6c 6c 20 28 6f 75 74 2c 20 6c 6e 2d 3e 50 6f  oll (out, ln->Po
76400 69 6e 74 73 20 2b 20 31 29 3b 0a 20 20 20 20 69  ints + 1);.    i
76410 66 20 28 70 6f 73 69 74 69 6f 6e 20 3c 20 30 29  f (position < 0)
76420 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 61  .      {..  /* a
76430 70 70 65 6e 64 69 6e 67 20 74 68 65 20 6e 65 77  ppending the new
76440 20 50 6f 69 6e 74 20 2a 2f 0a 09 20 20 66 6f 72   Point */..  for
76450 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c   (iv = 0; iv < l
76460 6e 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29  n->Points; iv++)
76470 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 6c 69  ..    {...if (li
76480 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ne->DimensionMod
76490 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
764a0 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67  ...  {...      g
764b0 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28  aiaGetPointXYZ (
764c0 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ln->Coords, iv, 
764d0 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 20  &x, &y, &z);... 
764e0 20 20 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e       gaiaSetPoin
764f0 74 58 59 5a 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f  tXYZ (out_ln->Co
76500 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20  ords, iv, x, y, 
76510 7a 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65  z);...  }...else
76520 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e   if (line->Dimen
76530 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
76540 41 5f 58 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09  A_XY_M)...  {...
76550 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69        gaiaGetPoi
76560 6e 74 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64  ntXYM (ln->Coord
76570 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  s, iv, &x, &y, &
76580 6d 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61  m);...      gaia
76590 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 6f 75 74  SetPointXYM (out
765a0 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  _ln->Coords, iv,
765b0 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 09 20 20 7d   x, y, m);...  }
765c0 0a 09 09 65 6c 73 65 20 69 66 20 28 6c 69 6e 65  ...else if (line
765d0 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
765e0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
765f0 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67  ...  {...      g
76600 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20  aiaGetPointXYZM 
76610 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  (ln->Coords, iv,
76620 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29   &x, &y, &z, &m)
76630 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 53 65  ;...      gaiaSe
76640 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6f 75 74 5f  tPointXYZM (out_
76650 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ln->Coords, iv, 
76660 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 20  x, y, z, m);... 
76670 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a   }...else...  {.
76680 09 09 20 20 20 20 20 20 67 61 69 61 47 65 74 50  ..      gaiaGetP
76690 6f 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73  oint (ln->Coords
766a0 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09  , iv, &x, &y);..
766b0 09 20 20 20 20 20 20 67 61 69 61 53 65 74 50 6f  .      gaiaSetPo
766c0 69 6e 74 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f  int (out_ln->Coo
766d0 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 29 3b 0a  rds, iv, x, y);.
766e0 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20  ..  }..    }..  
766f0 2f 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65  /* appending the
76700 20 6e 65 77 20 50 6f 69 6e 74 20 2a 2f 0a 09 20   new Point */.. 
76710 20 78 20 3d 20 70 74 2d 3e 58 3b 0a 09 20 20 79   x = pt->X;..  y
76720 20 3d 20 70 74 2d 3e 59 3b 0a 09 20 20 7a 20 3d   = pt->Y;..  z =
76730 20 70 74 2d 3e 5a 3b 0a 09 20 20 6d 20 3d 20 70   pt->Z;..  m = p
76740 74 2d 3e 4d 3b 0a 09 20 20 6f 75 74 5f 69 76 20  t->M;..  out_iv 
76750 3d 20 6c 6e 2d 3e 50 6f 69 6e 74 73 3b 0a 09 20  = ln->Points;.. 
76760 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e   if (line->Dimen
76770 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
76780 41 5f 58 59 5f 5a 29 0a 09 20 20 20 20 7b 0a 09  A_XY_Z)..    {..
76790 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a  .gaiaSetPointXYZ
767a0 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73   (out_ln->Coords
767b0 2c 20 6f 75 74 5f 69 76 2c 20 78 2c 20 79 2c 20  , out_iv, x, y, 
767c0 7a 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  z);..    }..  el
767d0 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d  se if (line->Dim
767e0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
767f0 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20 20 7b  AIA_XY_M)..    {
76800 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58  ...gaiaSetPointX
76810 59 4d 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72  YM (out_ln->Coor
76820 64 73 2c 20 6f 75 74 5f 69 76 2c 20 78 2c 20 79  ds, out_iv, x, y
76830 2c 20 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  , m);..    }..  
76840 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44  else if (line->D
76850 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
76860 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20   GAIA_XY_Z_M).. 
76870 20 20 20 7b 0a 09 09 67 61 69 61 53 65 74 50 6f     {...gaiaSetPo
76880 69 6e 74 58 59 5a 4d 20 28 6f 75 74 5f 6c 6e 2d  intXYZM (out_ln-
76890 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f 69 76 2c  >Coords, out_iv,
768a0 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 20   x, y, z, m);.. 
768b0 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
768c0 20 20 7b 0a 09 09 67 61 69 61 53 65 74 50 6f 69    {...gaiaSetPoi
768d0 6e 74 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72  nt (out_ln->Coor
768e0 64 73 2c 20 6f 75 74 5f 69 76 2c 20 78 2c 20 79  ds, out_iv, x, y
768f0 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  );..    }.      
76900 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
76910 20 7b 0a 09 20 20 2f 2a 20 69 6e 73 65 72 74 69   {..  /* inserti
76920 6e 67 20 74 68 65 20 6e 65 77 20 50 6f 69 6e 74  ng the new Point
76930 20 62 65 66 6f 72 65 20 22 70 6f 73 69 74 69 6f   before "positio
76940 6e 22 20 2a 2f 0a 09 20 20 6f 75 74 5f 69 76 20  n" */..  out_iv 
76950 3d 20 30 3b 0a 09 20 20 66 6f 72 20 28 69 76 20  = 0;..  for (iv 
76960 3d 20 30 3b 20 69 76 20 3c 20 70 6f 73 69 74 69  = 0; iv < positi
76970 6f 6e 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  on; iv++)..    {
76980 0a 09 09 2f 2a 20 63 6f 70 79 69 6e 67 20 61 6c  .../* copying al
76990 6c 20 50 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  l Points before 
769a0 22 70 6f 73 69 74 69 6f 6e 22 20 2a 2f 0a 09 09  "position" */...
769b0 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73  if (line->Dimens
769c0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
769d0 5f 58 59 5f 5a 29 0a 09 09 20 20 7b 0a 09 09 20  _XY_Z)...  {... 
769e0 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e       gaiaGetPoin
769f0 74 58 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73  tXYZ (ln->Coords
76a00 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a  , iv, &x, &y, &z
76a10 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 53  );...      gaiaS
76a20 65 74 50 6f 69 6e 74 58 59 5a 20 28 6f 75 74 5f  etPointXYZ (out_
76a30 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f  ln->Coords, out_
76a40 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 09  iv, x, y, z);...
76a50 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 6c    }...else if (l
76a60 69 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  ine->DimensionMo
76a70 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
76a80 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
76a90 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20  gaiaGetPointXYM 
76aa0 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  (ln->Coords, iv,
76ab0 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09   &x, &y, &m);...
76ac0 20 20 20 20 20 20 67 61 69 61 53 65 74 50 6f 69        gaiaSetPoi
76ad0 6e 74 58 59 4d 20 28 6f 75 74 5f 6c 6e 2d 3e 43  ntXYM (out_ln->C
76ae0 6f 6f 72 64 73 2c 20 6f 75 74 5f 69 76 2c 20 78  oords, out_iv, x
76af0 2c 20 79 2c 20 6d 29 3b 0a 09 09 20 20 7d 0a 09  , y, m);...  }..
76b00 09 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e  .else if (line->
76b10 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
76b20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
76b30 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69  .  {...      gai
76b40 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c  aGetPointXYZM (l
76b50 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  n->Coords, iv, &
76b60 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a  x, &y, &z, &m);.
76b70 09 09 20 20 20 20 20 20 67 61 69 61 53 65 74 50  ..      gaiaSetP
76b80 6f 69 6e 74 58 59 5a 4d 20 28 6f 75 74 5f 6c 6e  ointXYZM (out_ln
76b90 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f 69 76  ->Coords, out_iv
76ba0 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09  , x, y, z, m);..
76bb0 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20  .  }...else...  
76bc0 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 47 65  {...      gaiaGe
76bd0 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72  tPoint (ln->Coor
76be0 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b  ds, iv, &x, &y);
76bf0 0a 09 09 20 20 20 20 20 20 67 61 69 61 53 65 74  ...      gaiaSet
76c00 50 6f 69 6e 74 20 28 6f 75 74 5f 6c 6e 2d 3e 43  Point (out_ln->C
76c10 6f 6f 72 64 73 2c 20 6f 75 74 5f 69 76 2c 20 78  oords, out_iv, x
76c20 2c 20 79 29 3b 0a 09 09 20 20 7d 0a 09 09 6f 75  , y);...  }...ou
76c30 74 5f 69 76 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  t_iv++;..    }..
76c40 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    /* inserting t
76c50 68 65 20 6e 65 77 20 50 6f 69 6e 74 20 2a 2f 0a  he new Point */.
76c60 09 20 20 78 20 3d 20 70 74 2d 3e 58 3b 0a 09 20  .  x = pt->X;.. 
76c70 20 79 20 3d 20 70 74 2d 3e 59 3b 0a 09 20 20 7a   y = pt->Y;..  z
76c80 20 3d 20 70 74 2d 3e 5a 3b 0a 09 20 20 6d 20 3d   = pt->Z;..  m =
76c90 20 70 74 2d 3e 4d 3b 0a 09 20 20 69 66 20 28 6c   pt->M;..  if (l
76ca0 69 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  ine->DimensionMo
76cb0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
76cc0 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 53  )..    {...gaiaS
76cd0 65 74 50 6f 69 6e 74 58 59 5a 20 28 6f 75 74 5f  etPointXYZ (out_
76ce0 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f  ln->Coords, out_
76cf0 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 20  iv, x, y, z);.. 
76d00 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20     }..  else if 
76d10 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (line->Dimension
76d20 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
76d30 5f 4d 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69  _M)..    {...gai
76d40 61 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 6f 75  aSetPointXYM (ou
76d50 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75  t_ln->Coords, ou
76d60 74 5f 69 76 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a  t_iv, x, y, m);.
76d70 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69  .    }..  else i
76d80 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73 69  f (line->Dimensi
76d90 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
76da0 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b 0a 09  XY_Z_M)..    {..
76db0 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a  .gaiaSetPointXYZ
76dc0 4d 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64  M (out_ln->Coord
76dd0 73 2c 20 6f 75 74 5f 69 76 2c 20 78 2c 20 79 2c  s, out_iv, x, y,
76de0 20 7a 2c 20 6d 29 3b 0a 09 20 20 20 20 7d 0a 09   z, m);..    }..
76df0 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
76e00 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 6f 75  gaiaSetPoint (ou
76e10 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75  t_ln->Coords, ou
76e20 74 5f 69 76 2c 20 78 2c 20 79 29 3b 0a 09 20 20  t_iv, x, y);..  
76e30 20 20 7d 0a 09 20 20 6f 75 74 5f 69 76 2b 2b 3b    }..  out_iv++;
76e40 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 70 6f  ..  for (iv = po
76e50 73 69 74 69 6f 6e 3b 20 69 76 20 3c 20 6c 6e 2d  sition; iv < ln-
76e60 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09  >Points; iv++)..
76e70 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 70 79 69      {.../* copyi
76e80 6e 67 20 61 6c 6c 20 50 6f 69 6e 74 73 20 61 66  ng all Points af
76e90 74 65 72 20 22 70 6f 73 69 74 69 6f 6e 22 20 2a  ter "position" *
76ea0 2f 0a 09 09 69 66 20 28 6c 69 6e 65 2d 3e 44 69  /...if (line->Di
76eb0 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
76ec0 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 7b  GAIA_XY_Z)...  {
76ed0 0a 09 09 20 20 20 20 20 20 67 61 69 61 47 65 74  ...      gaiaGet
76ee0 50 6f 69 6e 74 58 59 5a 20 28 6c 6e 2d 3e 43 6f  PointXYZ (ln->Co
76ef0 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79  ords, iv, &x, &y
76f00 2c 20 26 7a 29 3b 0a 09 09 20 20 20 20 20 20 67  , &z);...      g
76f10 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 20 28  aiaSetPointXYZ (
76f20 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  out_ln->Coords, 
76f30 6f 75 74 5f 69 76 2c 20 78 2c 20 79 2c 20 7a 29  out_iv, x, y, z)
76f40 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69  ;...  }...else i
76f50 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73 69  f (line->Dimensi
76f60 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
76f70 58 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20  XY_M)...  {...  
76f80 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74      gaiaGetPoint
76f90 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  XYM (ln->Coords,
76fa0 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29   iv, &x, &y, &m)
76fb0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 53 65  ;...      gaiaSe
76fc0 74 50 6f 69 6e 74 58 59 4d 20 28 6f 75 74 5f 6c  tPointXYM (out_l
76fd0 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f 69  n->Coords, out_i
76fe0 76 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 09 20  v, x, y, m);... 
76ff0 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 6c 69   }...else if (li
77000 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ne->DimensionMod
77010 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
77020 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  M)...  {...     
77030 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a   gaiaGetPointXYZ
77040 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69  M (ln->Coords, i
77050 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26  v, &x, &y, &z, &
77060 6d 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61  m);...      gaia
77070 53 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6f 75  SetPointXYZM (ou
77080 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75  t_ln->Coords, ou
77090 74 5f 69 76 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d  t_iv, x, y, z, m
770a0 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a  );...  }...else.
770b0 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61  ..  {...      ga
770c0 69 61 47 65 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e  iaGetPoint (ln->
770d0 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20  Coords, iv, &x, 
770e0 26 79 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69  &y);...      gai
770f0 61 53 65 74 50 6f 69 6e 74 20 28 6f 75 74 5f 6c  aSetPoint (out_l
77100 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f 69  n->Coords, out_i
77110 76 2c 20 78 2c 20 79 29 3b 0a 09 09 20 20 7d 0a  v, x, y);...  }.
77120 09 09 6f 75 74 5f 69 76 2b 2b 3b 0a 09 20 20 20  ..out_iv++;..   
77130 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
77140 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
77150 6c 6f 62 57 6b 62 45 78 32 20 28 6f 75 74 2c 20  lobWkbEx2 (out, 
77160 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
77170 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79   gpkg_mode, tiny
77180 5f 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69  _point);.    gai
77190 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6f  aFreeGeomColl (o
771a0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
771b0 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
771c0 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
771d0 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 73   len, free);.  s
771e0 74 6f 70 3a 0a 20 20 20 20 67 61 69 61 46 72 65  top:.    gaiaFre
771f0 65 47 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65 29  eGeomColl (line)
77200 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
77210 6f 6d 43 6f 6c 6c 20 28 70 6f 69 6e 74 29 3b 0a  omColl (point);.
77220 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 63  }..static void.c
77230 6f 6d 6d 6f 6e 74 5f 73 65 74 5f 70 6f 69 6e 74  ommont_set_point
77240 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
77250 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 67 61 69  t * context, gai
77260 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 6c 69 6e  aGeomCollPtr lin
77270 65 2c 0a 09 09 20 20 20 69 6e 74 20 70 6f 73 69  e,...   int posi
77280 74 69 6f 6e 2c 20 67 61 69 61 47 65 6f 6d 43 6f  tion, gaiaGeomCo
77290 6c 6c 50 74 72 20 70 6f 69 6e 74 29 0a 7b 0a 2f  llPtr point).{./
772a0 2a 20 53 65 74 50 6f 69 6e 74 20 2d 20 63 6f 6d  * SetPoint - com
772b0 6d 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  mon implementati
772c0 6f 6e 20 2a 2f 0a 20 20 20 20 67 61 69 61 47 65  on */.    gaiaGe
772d0 6f 6d 43 6f 6c 6c 50 74 72 20 6f 75 74 3b 0a 20  omCollPtr out;. 
772e0 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e     gaiaLinestrin
772f0 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61 69  gPtr ln;.    gai
77300 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6f  aLinestringPtr o
77310 75 74 5f 6c 6e 3b 0a 20 20 20 20 67 61 69 61 50  ut_ln;.    gaiaP
77320 6f 69 6e 74 50 74 72 20 70 74 3b 0a 20 20 20 20  ointPtr pt;.    
77330 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
77340 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
77350 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
77360 20 69 6e 74 20 69 76 3b 0a 20 20 20 20 64 6f 75   int iv;.    dou
77370 62 6c 65 20 78 20 3d 20 30 2e 30 3b 0a 20 20 20  ble x = 0.0;.   
77380 20 64 6f 75 62 6c 65 20 79 20 3d 20 30 2e 30 3b   double y = 0.0;
77390 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 20 3d 20  .    double m = 
773a0 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
773b0 7a 20 3d 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74  z = 0.0;.    int
773c0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
773d0 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
773e0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nt = 0;.    stru
773f0 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
77400 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
77410 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
77420 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
77430 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
77440 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
77450 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
77460 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
77470 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
77480 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
77490 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
774a0 0a 20 20 20 20 69 66 20 28 69 73 5f 73 69 6e 67  .    if (is_sing
774b0 6c 65 5f 6c 69 6e 65 73 74 72 69 6e 67 20 28 6c  le_linestring (l
774c0 69 6e 65 29 20 26 26 20 69 73 5f 73 69 6e 67 6c  ine) && is_singl
774d0 65 5f 70 6f 69 6e 74 20 28 70 6f 69 6e 74 29 29  e_point (point))
774e0 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  ..;.    else.   
774f0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
77500 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
77510 74 65 78 74 29 3b 0a 09 20 20 67 6f 74 6f 20 73  text);..  goto s
77520 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  top;.      }.   
77530 20 6c 6e 20 3d 20 6c 69 6e 65 2d 3e 46 69 72 73   ln = line->Firs
77540 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 20 20 20  tLinestring;.   
77550 20 70 74 20 3d 20 70 6f 69 6e 74 2d 3e 46 69 72   pt = point->Fir
77560 73 74 50 6f 69 6e 74 3b 0a 20 20 20 20 69 66 20  stPoint;.    if 
77570 28 70 6f 73 69 74 69 6f 6e 20 3c 20 30 20 7c 7c  (position < 0 ||
77580 20 70 6f 73 69 74 69 6f 6e 20 3e 3d 20 6c 6e 2d   position >= ln-
77590 3e 50 6f 69 6e 74 73 29 0a 20 20 20 20 20 20 7b  >Points).      {
775a0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
775b0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
775c0 29 3b 0a 09 20 20 67 6f 74 6f 20 73 74 6f 70 3b  );..  goto stop;
775d0 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 72 65 61  .      }./* crea
775e0 74 69 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20  ting the output 
775f0 47 65 6f 6d 65 74 72 79 20 2a 2f 0a 20 20 20 20  Geometry */.    
77600 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73  if (line->Dimens
77610 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
77620 5f 58 59 5f 5a 29 0a 09 6f 75 74 20 3d 20 67 61  _XY_Z)..out = ga
77630 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58  iaAllocGeomCollX
77640 59 5a 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 20  YZ ();.    else 
77650 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73  if (line->Dimens
77660 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
77670 5f 58 59 5f 4d 29 0a 09 6f 75 74 20 3d 20 67 61  _XY_M)..out = ga
77680 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58  iaAllocGeomCollX
77690 59 4d 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 20  YM ();.    else 
776a0 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73  if (line->Dimens
776b0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
776c0 5f 58 59 5f 5a 5f 4d 29 0a 09 6f 75 74 20 3d 20  _XY_Z_M)..out = 
776d0 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c  gaiaAllocGeomCol
776e0 6c 58 59 5a 4d 20 28 29 3b 0a 20 20 20 20 65 6c  lXYZM ();.    el
776f0 73 65 0a 09 6f 75 74 20 3d 20 67 61 69 61 41 6c  se..out = gaiaAl
77700 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a  locGeomColl ();.
77710 20 20 20 20 6f 75 74 2d 3e 53 72 69 64 20 3d 20      out->Srid = 
77720 6c 69 6e 65 2d 3e 53 72 69 64 3b 0a 20 20 20 20  line->Srid;.    
77730 6f 75 74 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  out->DeclaredTyp
77740 65 20 3d 20 6c 69 6e 65 2d 3e 44 65 63 6c 61 72  e = line->Declar
77750 65 64 54 79 70 65 3b 0a 20 20 20 20 6f 75 74 5f  edType;.    out_
77760 6c 6e 20 3d 20 67 61 69 61 41 64 64 4c 69 6e 65  ln = gaiaAddLine
77770 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c 6c  stringToGeomColl
77780 20 28 6f 75 74 2c 20 6c 6e 2d 3e 50 6f 69 6e 74   (out, ln->Point
77790 73 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 76 20  s);.    for (iv 
777a0 3d 20 30 3b 20 69 76 20 3c 20 6c 6e 2d 3e 50 6f  = 0; iv < ln->Po
777b0 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 20 20 20 20  ints; iv++).    
777c0 20 20 7b 0a 09 20 20 69 66 20 28 6c 69 6e 65 2d    {..  if (line-
777d0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
777e0 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 20  == GAIA_XY_Z).. 
777f0 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f     {...gaiaGetPo
77800 69 6e 74 58 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72  intXYZ (ln->Coor
77810 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20  ds, iv, &x, &y, 
77820 26 7a 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  &z);..    }..  e
77830 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69  lse if (line->Di
77840 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
77850 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20 20  GAIA_XY_M)..    
77860 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74  {...gaiaGetPoint
77870 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  XYM (ln->Coords,
77880 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29   iv, &x, &y, &m)
77890 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
778a0 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e   if (line->Dimen
778b0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
778c0 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b  A_XY_Z_M)..    {
778d0 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
778e0 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  YZM (ln->Coords,
778f0 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c   iv, &x, &y, &z,
77900 20 26 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20   &m);..    }..  
77910 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 67 61  else..    {...ga
77920 69 61 47 65 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e  iaGetPoint (ln->
77930 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20  Coords, iv, &x, 
77940 26 79 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  &y);..    }..  i
77950 66 20 28 69 76 20 3d 3d 20 70 6f 73 69 74 69 6f  f (iv == positio
77960 6e 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 72  n)..    {.../* r
77970 65 70 6c 61 63 69 6e 67 20 74 68 65 20 6e 65 77  eplacing the new
77980 20 50 6f 69 6e 74 20 2a 2f 0a 09 09 78 20 3d 20   Point */...x = 
77990 70 74 2d 3e 58 3b 0a 09 09 79 20 3d 20 70 74 2d  pt->X;...y = pt-
779a0 3e 59 3b 0a 09 09 7a 20 3d 20 70 74 2d 3e 5a 3b  >Y;...z = pt->Z;
779b0 0a 09 09 6d 20 3d 20 70 74 2d 3e 4d 3b 0a 09 20  ...m = pt->M;.. 
779c0 20 20 20 7d 0a 09 20 20 69 66 20 28 6c 69 6e 65     }..  if (line
779d0 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
779e0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
779f0 20 20 20 20 7b 0a 09 09 67 61 69 61 53 65 74 50      {...gaiaSetP
77a00 6f 69 6e 74 58 59 5a 20 28 6f 75 74 5f 6c 6e 2d  ointXYZ (out_ln-
77a10 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20  >Coords, iv, x, 
77a20 79 2c 20 7a 29 3b 0a 09 20 20 20 20 7d 0a 09 20  y, z);..    }.. 
77a30 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e   else if (line->
77a40 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
77a50 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20  = GAIA_XY_M)..  
77a60 20 20 7b 0a 09 09 67 61 69 61 53 65 74 50 6f 69    {...gaiaSetPoi
77a70 6e 74 58 59 4d 20 28 6f 75 74 5f 6c 6e 2d 3e 43  ntXYM (out_ln->C
77a80 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c  oords, iv, x, y,
77a90 20 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65   m);..    }..  e
77aa0 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69  lse if (line->Di
77ab0 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
77ac0 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20  GAIA_XY_Z_M)..  
77ad0 20 20 7b 0a 09 09 67 61 69 61 53 65 74 50 6f 69    {...gaiaSetPoi
77ae0 6e 74 58 59 5a 4d 20 28 6f 75 74 5f 6c 6e 2d 3e  ntXYZM (out_ln->
77af0 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79  Coords, iv, x, y
77b00 2c 20 7a 2c 20 6d 29 3b 0a 09 20 20 20 20 7d 0a  , z, m);..    }.
77b10 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
77b20 09 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 6f  .gaiaSetPoint (o
77b30 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69  ut_ln->Coords, i
77b40 76 2c 20 78 2c 20 79 29 3b 0a 09 20 20 20 20 7d  v, x, y);..    }
77b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
77b60 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
77b70 62 57 6b 62 45 78 32 20 28 6f 75 74 2c 20 26 70  bWkbEx2 (out, &p
77b80 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67  _result, &len, g
77b90 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70  pkg_mode, tiny_p
77ba0 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69 61 46  oint);.    gaiaF
77bb0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6f 75 74  reeGeomColl (out
77bc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
77bd0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
77be0 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
77bf0 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 73 74 6f  en, free);.  sto
77c00 70 3a 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  p:.    gaiaFreeG
77c10 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65 29 3b 0a  eomColl (line);.
77c20 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
77c30 43 6f 6c 6c 20 28 70 6f 69 6e 74 29 3b 0a 7d 0a  Coll (point);.}.
77c40 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
77c50 74 5f 53 65 74 50 6f 69 6e 74 20 28 73 71 6c 69  t_SetPoint (sqli
77c60 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
77c70 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
77c80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
77c90 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
77ca0 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20 53 54   functions:./ ST
77cb0 5f 53 65 74 50 6f 69 6e 74 28 42 4c 4f 42 20 65  _SetPoint(BLOB e
77cc0 6e 63 6f 64 65 64 20 4c 49 4e 45 53 54 52 49 4e  ncoded LINESTRIN
77cd0 47 20 6c 69 6e 65 2c 20 49 4e 54 45 47 45 52 20  G line, INTEGER 
77ce0 70 6f 73 69 74 69 6f 6e 2c 20 42 4c 4f 42 20 65  position, BLOB e
77cf0 6e 63 6f 64 65 64 20 50 4f 49 4e 54 20 70 6f 69  ncoded POINT poi
77d00 6e 74 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  nt)././ returns 
77d10 61 20 6e 65 77 20 4c 69 6e 65 73 74 72 69 6e 67  a new Linestring
77d20 20 62 79 20 72 65 70 6c 61 63 69 6e 67 20 74 68   by replacing th
77d30 65 20 50 6f 69 6e 74 20 61 74 20 22 70 6f 73 69  e Point at "posi
77d40 74 69 6f 6e 22 20 28 7a 65 72 6f 2d 62 61 73 65  tion" (zero-base
77d50 64 20 69 6e 64 65 78 29 0a 2f 20 6f 72 20 4e 55  d index)./ or NU
77d60 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
77d70 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
77d80 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
77d90 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
77da0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
77db0 20 20 69 6e 74 20 70 6f 73 69 74 69 6f 6e 3b 0a    int position;.
77dc0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
77dd0 50 74 72 20 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b  Ptr line = NULL;
77de0 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
77df0 6c 50 74 72 20 70 6f 69 6e 74 20 3d 20 4e 55 4c  lPtr point = NUL
77e00 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  L;.    int gpkg_
77e10 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a  amphibious = 0;.
77e20 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
77e30 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  e = 0;.    struc
77e40 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
77e50 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
77e60 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
77e70 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
77e80 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
77e90 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
77ea0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
77eb0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
77ec0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
77ed0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
77ee0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
77ef0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
77f00 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
77f10 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20  pkg_mode;.      
77f20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
77f30 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
77f40 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
77f50 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
77f60 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
77f70 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
77f80 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
77f90 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
77fa0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
77fb0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
77fc0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
77fd0 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
77fe0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
77ff0 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
78000 20 20 6c 69 6e 65 20 3d 0a 09 67 61 69 61 46 72    line =..gaiaFr
78010 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
78020 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
78030 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
78040 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
78050 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
78060 20 20 69 66 20 28 21 6c 69 6e 65 29 0a 20 20 20    if (!line).   
78070 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
78080 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
78090 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
780a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
780b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
780c0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
780d0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
780e0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69  ).      {..  gai
780f0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6c  aFreeGeomColl (l
78100 69 6e 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  ine);..  sqlite3
78110 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
78120 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
78130 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
78140 6f 73 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  osition = sqlite
78150 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
78160 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73  v[1]);.    if (s
78170 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
78180 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53  e (argv[2]) != S
78190 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
781a0 20 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47    {..  gaiaFreeG
781b0 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65 29 3b 0a  eomColl (line);.
781c0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
781d0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
781e0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
781f0 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
78200 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
78210 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
78220 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 32 5d 29  e_blob (argv[2])
78230 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
78240 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
78250 74 65 73 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20  tes (argv[2]);. 
78260 20 20 20 70 6f 69 6e 74 20 3d 0a 09 67 61 69 61     point =..gaia
78270 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
78280 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
78290 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
782a0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
782b0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
782c0 20 20 20 20 69 66 20 28 21 70 6f 69 6e 74 29 0a      if (!point).
782d0 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 46        {..  gaiaF
782e0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e  reeGeomColl (lin
782f0 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  e);..  sqlite3_r
78300 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
78310 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
78320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 6d  .      }.    com
78330 6d 6f 6e 74 5f 73 65 74 5f 70 6f 69 6e 74 20 28  mont_set_point (
78340 63 6f 6e 74 65 78 74 2c 20 6c 69 6e 65 2c 20 70  context, line, p
78350 6f 73 69 74 69 6f 6e 2c 20 70 6f 69 6e 74 29 3b  osition, point);
78360 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
78370 66 6e 63 74 5f 53 65 74 53 74 61 72 74 50 6f 69  fnct_SetStartPoi
78380 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nt (sqlite3_cont
78390 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
783a0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
783b0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
783c0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
783d0 6e 73 3a 0a 2f 20 53 54 5f 53 65 74 53 74 61 72  ns:./ ST_SetStar
783e0 74 50 6f 69 6e 74 28 42 4c 4f 42 20 65 6e 63 6f  tPoint(BLOB enco
783f0 64 65 64 20 4c 49 4e 45 53 54 52 49 4e 47 20 6c  ded LINESTRING l
78400 69 6e 65 2c 20 42 4c 4f 42 20 65 6e 63 6f 64 65  ine, BLOB encode
78410 64 20 50 4f 49 4e 54 20 70 6f 69 6e 74 29 0a 2f  d POINT point)./
78420 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  ./ returns a new
78430 20 4c 69 6e 65 73 74 72 69 6e 67 20 62 79 20 72   Linestring by r
78440 65 70 6c 61 63 69 6e 67 20 69 74 73 20 53 74 61  eplacing its Sta
78450 72 74 50 6f 69 6e 74 0a 2f 20 6f 72 20 4e 55 4c  rtPoint./ or NUL
78460 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
78470 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
78480 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
78490 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
784a0 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
784b0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
784c0 20 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20   line = NULL;.  
784d0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
784e0 72 20 70 6f 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  r point = NULL;.
784f0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
78500 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
78510 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
78520 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
78530 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
78540 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
78550 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
78560 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
78570 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
78580 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
78590 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
785a0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
785b0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
785c0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
785d0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
785e0 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
785f0 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
78600 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _mode;.      }. 
78610 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
78620 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
78630 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
78640 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
78650 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
78660 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
78670 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
78680 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
78690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
786a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
786b0 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
786c0 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
786d0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
786e0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6c  (argv[0]);.    l
786f0 69 6e 65 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  ine =..gaiaFromS
78700 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
78710 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
78720 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
78730 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
78740 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
78750 66 20 28 21 6c 69 6e 65 29 0a 20 20 20 20 20 20  f (!line).      
78760 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
78770 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
78780 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
78790 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
787a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
787b0 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
787c0 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
787d0 20 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47    {..  gaiaFreeG
787e0 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65 29 3b 0a  eomColl (line);.
787f0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
78800 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
78810 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
78820 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
78830 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
78840 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
78850 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29  e_blob (argv[1])
78860 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
78870 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
78880 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  tes (argv[1]);. 
78890 20 20 20 70 6f 69 6e 74 20 3d 0a 09 67 61 69 61     point =..gaia
788a0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
788b0 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
788c0 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
788d0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
788e0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
788f0 20 20 20 20 69 66 20 28 21 70 6f 69 6e 74 29 0a      if (!point).
78900 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 46        {..  gaiaF
78910 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e  reeGeomColl (lin
78920 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  e);..  sqlite3_r
78930 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
78940 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
78950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 6d  .      }.    com
78960 6d 6f 6e 74 5f 73 65 74 5f 70 6f 69 6e 74 20 28  mont_set_point (
78970 63 6f 6e 74 65 78 74 2c 20 6c 69 6e 65 2c 20 30  context, line, 0
78980 2c 20 70 6f 69 6e 74 29 3b 0a 7d 0a 0a 73 74 61  , point);.}..sta
78990 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 65  tic void.fnct_Se
789a0 74 45 6e 64 50 6f 69 6e 74 20 28 73 71 6c 69 74  tEndPoint (sqlit
789b0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
789c0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
789d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
789e0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
789f0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20 53 54 5f  functions:./ ST_
78a00 53 65 74 45 6e 64 50 6f 69 6e 74 28 42 4c 4f 42  SetEndPoint(BLOB
78a10 20 65 6e 63 6f 64 65 64 20 4c 49 4e 45 53 54 52   encoded LINESTR
78a20 49 4e 47 20 6c 69 6e 65 2c 20 42 4c 4f 42 20 65  ING line, BLOB e
78a30 6e 63 6f 64 65 64 20 50 4f 49 4e 54 20 70 6f 69  ncoded POINT poi
78a40 6e 74 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  nt)././ returns 
78a50 61 20 6e 65 77 20 4c 69 6e 65 73 74 72 69 6e 67  a new Linestring
78a60 20 62 79 20 72 65 70 6c 61 63 69 6e 67 20 69 74   by replacing it
78a70 73 20 45 6e 64 50 6f 69 6e 74 0a 2f 20 6f 72 20  s EndPoint./ or 
78a80 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
78a90 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
78aa0 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
78ab0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
78ac0 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
78ad0 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
78ae0 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
78af0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 6c 69  iaGeomCollPtr li
78b00 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  ne = NULL;.    g
78b10 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 70  aiaGeomCollPtr p
78b20 6f 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  oint = NULL;.   
78b30 20 69 6e 74 20 70 6f 73 69 74 69 6f 6e 3b 0a 20   int position;. 
78b40 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
78b50 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
78b60 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
78b70 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
78b80 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
78b90 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
78ba0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
78bb0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
78bc0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
78bd0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
78be0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
78bf0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
78c00 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
78c10 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
78c20 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
78c30 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
78c40 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
78c50 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
78c60 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
78c70 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
78c80 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
78c90 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
78ca0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
78cb0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
78cc0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
78cd0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
78ce0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
78cf0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
78d00 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
78d10 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
78d20 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
78d30 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6c 69  argv[0]);.    li
78d40 6e 65 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  ne =..gaiaFromSp
78d50 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
78d60 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
78d70 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
78d80 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
78d90 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
78da0 20 28 21 6c 69 6e 65 29 0a 20 20 20 20 20 20 7b   (!line).      {
78db0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
78dc0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
78dd0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
78de0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
78df0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
78e00 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
78e10 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
78e20 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65   {..  gaiaFreeGe
78e30 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65 29 3b 0a 09  omColl (line);..
78e40 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
78e50 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
78e60 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
78e70 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
78e80 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
78e90 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
78ea0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b  _blob (argv[1]);
78eb0 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
78ec0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
78ed0 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  es (argv[1]);.  
78ee0 20 20 70 6f 69 6e 74 20 3d 0a 09 67 61 69 61 46    point =..gaiaF
78ef0 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
78f00 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
78f10 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
78f20 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
78f30 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
78f40 20 20 20 69 66 20 28 21 70 6f 69 6e 74 29 0a 20     if (!point). 
78f50 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 46 72       {..  gaiaFr
78f60 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65  eeGeomColl (line
78f70 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
78f80 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
78f90 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
78fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
78fb0 69 73 5f 73 69 6e 67 6c 65 5f 6c 69 6e 65 73 74  is_single_linest
78fc0 72 69 6e 67 20 28 6c 69 6e 65 29 20 26 26 20 69  ring (line) && i
78fd0 73 5f 73 69 6e 67 6c 65 5f 70 6f 69 6e 74 20 28  s_single_point (
78fe0 70 6f 69 6e 74 29 29 0a 09 3b 0a 20 20 20 20 65  point))..;.    e
78ff0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
79000 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
79010 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
79020 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 20 20 20 20   goto stop;.    
79030 20 20 7d 0a 20 20 20 20 6c 6e 20 3d 20 6c 69 6e    }.    ln = lin
79040 65 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  e->FirstLinestri
79050 6e 67 3b 0a 20 20 20 20 70 6f 73 69 74 69 6f 6e  ng;.    position
79060 20 3d 20 6c 6e 2d 3e 50 6f 69 6e 74 73 20 2d 20   = ln->Points - 
79070 31 3b 0a 20 20 20 20 63 6f 6d 6d 6f 6e 74 5f 73  1;.    commont_s
79080 65 74 5f 70 6f 69 6e 74 20 28 63 6f 6e 74 65 78  et_point (contex
79090 74 2c 20 6c 69 6e 65 2c 20 70 6f 73 69 74 69 6f  t, line, positio
790a0 6e 2c 20 70 6f 69 6e 74 29 3b 0a 20 20 20 20 72  n, point);.    r
790b0 65 74 75 72 6e 3b 0a 20 20 73 74 6f 70 3a 0a 20  eturn;.  stop:. 
790c0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
790d0 6f 6c 6c 20 28 6c 69 6e 65 29 3b 0a 20 20 20 20  oll (line);.    
790e0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
790f0 20 28 70 6f 69 6e 74 29 3b 0a 7d 0a 0a 73 74 61   (point);.}..sta
79100 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65  tic void.fnct_Re
79110 6d 6f 76 65 50 6f 69 6e 74 20 28 73 71 6c 69 74  movePoint (sqlit
79120 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
79130 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
79140 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
79150 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
79160 66 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20 53 54 5f  functions:./ ST_
79170 52 65 6d 6f 76 65 50 6f 69 6e 74 28 42 4c 4f 42  RemovePoint(BLOB
79180 20 65 6e 63 6f 64 65 64 20 4c 49 4e 45 53 54 52   encoded LINESTR
79190 49 4e 47 20 6c 69 6e 65 2c 20 49 4e 54 45 47 45  ING line, INTEGE
791a0 52 20 70 6f 73 69 74 69 6f 6e 29 0a 2f 0a 2f 20  R position)././ 
791b0 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 4c 69  returns a new Li
791c0 6e 65 73 74 72 69 6e 67 20 62 79 20 72 65 6d 6f  nestring by remo
791d0 76 69 6e 67 20 74 68 65 20 50 6f 69 6e 74 20 61  ving the Point a
791e0 74 20 22 70 6f 73 69 74 69 6f 6e 22 20 28 7a 65  t "position" (ze
791f0 72 6f 2d 62 61 73 65 64 20 69 6e 64 65 78 29 0a  ro-based index).
79200 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
79210 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
79220 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
79230 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
79240 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
79250 74 65 73 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e  tes;.    gaiaLin
79260 65 73 74 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20  estringPtr ln;. 
79270 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e     gaiaLinestrin
79280 67 50 74 72 20 6f 75 74 5f 6c 6e 3b 0a 20 20 20  gPtr out_ln;.   
79290 20 69 6e 74 20 70 6f 73 69 74 69 6f 6e 3b 0a 20   int position;. 
792a0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
792b0 74 72 20 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a  tr line = NULL;.
792c0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
792d0 50 74 72 20 6f 75 74 3b 0a 20 20 20 20 69 6e 74  Ptr out;.    int
792e0 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e   len;.    unsign
792f0 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
79300 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  t = NULL;.    in
79310 74 20 69 76 3b 0a 20 20 20 20 69 6e 74 20 6f 75  t iv;.    int ou
79320 74 5f 69 76 3b 0a 20 20 20 20 64 6f 75 62 6c 65  t_iv;.    double
79330 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79   x;.    double y
79340 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b 0a  ;.    double m;.
79350 20 20 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20      double z;.  
79360 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
79370 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
79380 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
79390 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
793a0 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
793b0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
793c0 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
793d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
793e0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
793f0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
79400 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
79410 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
79420 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
79430 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
79440 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
79450 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
79460 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
79470 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
79480 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
79490 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
794a0 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
794b0 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
794c0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
794d0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
794e0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
794f0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
79500 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
79510 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
79520 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
79530 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
79540 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
79550 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
79560 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
79570 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
79580 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
79590 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6c 69  argv[0]);.    li
795a0 6e 65 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  ne =..gaiaFromSp
795b0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
795c0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
795d0 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
795e0 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
795f0 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
79600 20 28 21 6c 69 6e 65 29 0a 20 20 20 20 20 20 7b   (!line).      {
79610 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
79620 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
79630 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
79640 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
79650 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
79660 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
79670 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
79680 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
79690 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
796a0 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74 6f 20  ntext);..  goto 
796b0 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stop;.      }.  
796c0 20 20 70 6f 73 69 74 69 6f 6e 20 3d 20 73 71 6c    position = sql
796d0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
796e0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
796f0 20 28 21 69 73 5f 73 69 6e 67 6c 65 5f 6c 69 6e   (!is_single_lin
79700 65 73 74 72 69 6e 67 20 28 6c 69 6e 65 29 29 0a  estring (line)).
79710 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
79720 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
79730 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74  context);..  got
79740 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  o stop;.      }.
79750 20 20 20 20 6c 6e 20 3d 20 6c 69 6e 65 2d 3e 46      ln = line->F
79760 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a  irstLinestring;.
79770 20 20 20 20 69 66 20 28 70 6f 73 69 74 69 6f 6e      if (position
79780 20 3c 20 30 20 7c 7c 20 70 6f 73 69 74 69 6f 6e   < 0 || position
79790 20 3e 3d 20 6c 6e 2d 3e 50 6f 69 6e 74 73 29 0a   >= ln->Points).
797a0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
797b0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
797c0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74  context);..  got
797d0 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  o stop;.      }.
797e0 2f 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  /* creating the 
797f0 6f 75 74 70 75 74 20 47 65 6f 6d 65 74 72 79 20  output Geometry 
79800 2a 2f 0a 20 20 20 20 69 66 20 28 6c 69 6e 65 2d  */.    if (line-
79810 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
79820 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 6f  == GAIA_XY_Z)..o
79830 75 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65  ut = gaiaAllocGe
79840 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29 3b 0a 20 20  omCollXYZ ();.  
79850 20 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d    else if (line-
79860 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
79870 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 6f  == GAIA_XY_M)..o
79880 75 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65  ut = gaiaAllocGe
79890 6f 6d 43 6f 6c 6c 58 59 4d 20 28 29 3b 0a 20 20  omCollXYM ();.  
798a0 20 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d    else if (line-
798b0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
798c0 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
798d0 09 6f 75 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63  .out = gaiaAlloc
798e0 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20 28 29 3b  GeomCollXYZM ();
798f0 0a 20 20 20 20 65 6c 73 65 0a 09 6f 75 74 20 3d  .    else..out =
79900 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f   gaiaAllocGeomCo
79910 6c 6c 20 28 29 3b 0a 20 20 20 20 6f 75 74 2d 3e  ll ();.    out->
79920 53 72 69 64 20 3d 20 6c 69 6e 65 2d 3e 53 72 69  Srid = line->Sri
79930 64 3b 0a 20 20 20 20 6f 75 74 2d 3e 44 65 63 6c  d;.    out->Decl
79940 61 72 65 64 54 79 70 65 20 3d 20 6c 69 6e 65 2d  aredType = line-
79950 3e 44 65 63 6c 61 72 65 64 54 79 70 65 3b 0a 20  >DeclaredType;. 
79960 20 20 20 6f 75 74 5f 6c 6e 20 3d 20 67 61 69 61     out_ln = gaia
79970 41 64 64 4c 69 6e 65 73 74 72 69 6e 67 54 6f 47  AddLinestringToG
79980 65 6f 6d 43 6f 6c 6c 20 28 6f 75 74 2c 20 6c 6e  eomColl (out, ln
79990 2d 3e 50 6f 69 6e 74 73 20 2d 20 31 29 3b 0a 20  ->Points - 1);. 
799a0 20 20 20 6f 75 74 5f 69 76 20 3d 20 30 3b 0a 20     out_iv = 0;. 
799b0 20 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20     for (iv = 0; 
799c0 69 76 20 3c 20 70 6f 73 69 74 69 6f 6e 3b 20 69  iv < position; i
799d0 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  v++).      {..  
799e0 2f 2a 20 63 6f 70 79 69 6e 67 20 61 6c 6c 20 50  /* copying all P
799f0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 22 70 6f  oints before "po
79a00 73 69 74 69 6f 6e 22 20 2a 2f 0a 09 20 20 69 66  sition" */..  if
79a10 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f   (line->Dimensio
79a20 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
79a30 59 5f 5a 29 0a 09 20 20 20 20 7b 0a 09 09 67 61  Y_Z)..    {...ga
79a40 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 6c  iaGetPointXYZ (l
79a50 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  n->Coords, iv, &
79a60 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 67 61  x, &y, &z);...ga
79a70 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 20 28 6f  iaSetPointXYZ (o
79a80 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f  ut_ln->Coords, o
79a90 75 74 5f 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b  ut_iv, x, y, z);
79aa0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20  ..    }..  else 
79ab0 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73  if (line->Dimens
79ac0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
79ad0 5f 58 59 5f 4d 29 0a 09 20 20 20 20 7b 0a 09 09  _XY_M)..    {...
79ae0 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20  gaiaGetPointXYM 
79af0 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  (ln->Coords, iv,
79b00 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09   &x, &y, &m);...
79b10 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 4d 20  gaiaSetPointXYM 
79b20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  (out_ln->Coords,
79b30 20 6f 75 74 5f 69 76 2c 20 78 2c 20 79 2c 20 6d   out_iv, x, y, m
79b40 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
79b50 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65  e if (line->Dime
79b60 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
79b70 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20  IA_XY_Z_M)..    
79b80 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74  {...gaiaGetPoint
79b90 58 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73  XYZM (ln->Coords
79ba0 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a  , iv, &x, &y, &z
79bb0 2c 20 26 6d 29 3b 0a 09 09 67 61 69 61 53 65 74  , &m);...gaiaSet
79bc0 50 6f 69 6e 74 58 59 5a 4d 20 28 6f 75 74 5f 6c  PointXYZM (out_l
79bd0 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f 75 74 5f 69  n->Coords, out_i
79be0 76 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a  v, x, y, z, m);.
79bf0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
79c00 20 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50      {...gaiaGetP
79c10 6f 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73  oint (ln->Coords
79c20 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09  , iv, &x, &y);..
79c30 09 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 6f  .gaiaSetPoint (o
79c40 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 6f  ut_ln->Coords, o
79c50 75 74 5f 69 76 2c 20 78 2c 20 79 29 3b 0a 09 20  ut_iv, x, y);.. 
79c60 20 20 20 7d 0a 09 20 20 6f 75 74 5f 69 76 2b 2b     }..  out_iv++
79c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66 6f  ;.      }.    fo
79c80 72 20 28 69 76 20 3d 20 70 6f 73 69 74 69 6f 6e  r (iv = position
79c90 20 2b 20 31 3b 20 69 76 20 3c 20 6c 6e 2d 3e 50   + 1; iv < ln->P
79ca0 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 20 20 20  oints; iv++).   
79cb0 20 20 20 7b 0a 09 20 20 2f 2a 20 63 6f 70 79 69     {..  /* copyi
79cc0 6e 67 20 61 6c 6c 20 50 6f 69 6e 74 73 20 61 66  ng all Points af
79cd0 74 65 72 20 22 70 6f 73 69 74 69 6f 6e 22 20 2a  ter "position" *
79ce0 2f 0a 09 20 20 69 66 20 28 6c 69 6e 65 2d 3e 44  /..  if (line->D
79cf0 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
79d00 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 20 20 20   GAIA_XY_Z)..   
79d10 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e   {...gaiaGetPoin
79d20 74 58 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73  tXYZ (ln->Coords
79d30 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a  , iv, &x, &y, &z
79d40 29 3b 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e  );...gaiaSetPoin
79d50 74 58 59 5a 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f  tXYZ (out_ln->Co
79d60 6f 72 64 73 2c 20 6f 75 74 5f 69 76 2c 20 78 2c  ords, out_iv, x,
79d70 20 79 2c 20 7a 29 3b 0a 09 20 20 20 20 7d 0a 09   y, z);..    }..
79d80 20 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d    else if (line-
79d90 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
79da0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20  == GAIA_XY_M).. 
79db0 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f     {...gaiaGetPo
79dc0 69 6e 74 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72  intXYM (ln->Coor
79dd0 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20  ds, iv, &x, &y, 
79de0 26 6d 29 3b 0a 09 09 67 61 69 61 53 65 74 50 6f  &m);...gaiaSetPo
79df0 69 6e 74 58 59 4d 20 28 6f 75 74 5f 6c 6e 2d 3e  intXYM (out_ln->
79e00 43 6f 6f 72 64 73 2c 20 6f 75 74 5f 69 76 2c 20  Coords, out_iv, 
79e10 78 2c 20 79 2c 20 6d 29 3b 0a 09 20 20 20 20 7d  x, y, m);..    }
79e20 0a 09 20 20 65 6c 73 65 20 69 66 20 28 6c 69 6e  ..  else if (lin
79e30 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  e->DimensionMode
79e40 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
79e50 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47  )..    {...gaiaG
79e60 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c 6e 2d  etPointXYZM (ln-
79e70 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c  >Coords, iv, &x,
79e80 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09   &y, &z, &m);...
79e90 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 4d  gaiaSetPointXYZM
79ea0 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f 6f 72 64 73   (out_ln->Coords
79eb0 2c 20 6f 75 74 5f 69 76 2c 20 78 2c 20 79 2c 20  , out_iv, x, y, 
79ec0 7a 2c 20 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20  z, m);..    }.. 
79ed0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 67   else..    {...g
79ee0 61 69 61 47 65 74 50 6f 69 6e 74 20 28 6c 6e 2d  aiaGetPoint (ln-
79ef0 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c  >Coords, iv, &x,
79f00 20 26 79 29 3b 0a 09 09 67 61 69 61 53 65 74 50   &y);...gaiaSetP
79f10 6f 69 6e 74 20 28 6f 75 74 5f 6c 6e 2d 3e 43 6f  oint (out_ln->Co
79f20 6f 72 64 73 2c 20 6f 75 74 5f 69 76 2c 20 78 2c  ords, out_iv, x,
79f30 20 79 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 6f   y);..    }..  o
79f40 75 74 5f 69 76 2b 2b 3b 0a 20 20 20 20 20 20 7d  ut_iv++;.      }
79f50 0a 20 20 20 20 67 61 69 61 54 6f 53 70 61 74 69  .    gaiaToSpati
79f60 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20  aLiteBlobWkbEx2 
79f70 28 6f 75 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c  (out, &p_result,
79f80 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
79f90 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 20  , tiny_point);. 
79fa0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
79fb0 6f 6c 6c 20 28 6f 75 74 29 3b 0a 20 20 20 20 73  oll (out);.    s
79fc0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
79fd0 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
79fe0 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
79ff0 29 3b 0a 20 20 73 74 6f 70 3a 0a 20 20 20 20 67  );.  stop:.    g
7a000 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
7a010 28 6c 69 6e 65 29 3b 0a 7d 0a 0a 73 74 61 74 69  (line);.}..stati
7a020 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61 6b 65  c void.fnct_Make
7a030 50 6f 6c 79 67 6f 6e 20 28 73 71 6c 69 74 65 33  Polygon (sqlite3
7a040 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
7a050 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
7a060 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
7a070 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
7a080 6e 63 74 69 6f 6e 73 3a 0a 2f 20 53 54 5f 4d 61  nctions:./ ST_Ma
7a090 6b 65 50 6f 6c 79 67 6f 6e 28 42 4c 4f 42 20 65  kePolygon(BLOB e
7a0a0 6e 63 6f 64 65 64 20 4c 49 4e 45 53 54 52 49 4e  ncoded LINESTRIN
7a0b0 47 20 6c 69 6e 65 29 0a 2f 20 53 54 5f 4d 61 6b  G line)./ ST_Mak
7a0c0 65 50 6f 6c 79 67 6f 6e 28 42 4c 4f 42 20 65 6e  ePolygon(BLOB en
7a0d0 63 6f 64 65 64 20 4c 49 4e 45 53 54 52 49 4e 47  coded LINESTRING
7a0e0 20 6c 69 6e 65 2c 20 42 4c 4f 42 20 65 6e 63 6f   line, BLOB enco
7a0f0 64 65 64 20 28 4d 55 4c 54 49 29 4c 49 4e 45 53  ded (MULTI)LINES
7a100 54 49 4e 47 20 68 6f 6c 65 73 29 0a 2f 0a 2f 20  TING holes)././ 
7a110 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 50 4f  returns a new PO
7a120 4c 59 47 4f 4e 20 66 72 6f 6d 20 74 68 65 20 67  LYGON from the g
7a130 69 76 65 6e 20 65 78 74 65 72 69 6f 72 20 61 6e  iven exterior an
7a140 64 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 73  d interior rings
7a150 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
7a160 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
7a170 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
7a180 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
7a190 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
7a1a0 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65  ytes;.    gaiaGe
7a1b0 6f 6d 43 6f 6c 6c 50 74 72 20 65 78 74 65 72 69  omCollPtr exteri
7a1c0 6f 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  or = NULL;.    g
7a1d0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 69  aiaGeomCollPtr i
7a1e0 6e 74 65 72 69 6f 72 73 20 3d 20 4e 55 4c 4c 3b  nteriors = NULL;
7a1f0 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
7a200 6c 50 74 72 20 6f 75 74 3b 0a 20 20 20 20 69 6e  lPtr out;.    in
7a210 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67  t len;.    unsig
7a220 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
7a230 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  lt = NULL;.    i
7a240 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
7a250 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
7a260 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
7a270 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
7a280 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
7a290 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
7a2a0 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
7a2b0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
7a2c0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
7a2d0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
7a2e0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
7a2f0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
7a300 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
7a310 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
7a320 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
7a330 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
7a340 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
7a350 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
7a360 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
7a370 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
7a380 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
7a390 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
7a3a0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
7a3b0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
7a3c0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
7a3d0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
7a3e0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
7a3f0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f 74  context);..  got
7a400 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  o stop;.      }.
7a410 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
7a420 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
7a430 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
7a440 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
7a450 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
7a460 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
7a470 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78  argv[0]);.    ex
7a480 74 65 72 69 6f 72 20 3d 0a 09 67 61 69 61 46 72  terior =..gaiaFr
7a490 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
7a4a0 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
7a4b0 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
7a4c0 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
7a4d0 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
7a4e0 20 20 69 66 20 28 21 65 78 74 65 72 69 6f 72 29    if (!exterior)
7a4f0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
7a500 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
7a510 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 67 6f  (context);..  go
7a520 74 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d  to stop;.      }
7a530 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
7a540 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   2).      {..  i
7a550 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
7a560 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
7a570 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
7a580 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
7a590 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
7a5a0 6e 74 65 78 74 29 3b 0a 09 09 67 6f 74 6f 20 73  ntext);...goto s
7a5b0 74 6f 70 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70  top;..    }..  p
7a5c0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
7a5d0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
7a5e0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
7a5f0 67 76 5b 31 5d 29 3b 0a 09 20 20 6e 5f 62 79 74  gv[1]);..  n_byt
7a600 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
7a610 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31  ue_bytes (argv[1
7a620 5d 29 3b 0a 09 20 20 69 6e 74 65 72 69 6f 72 73  ]);..  interiors
7a630 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72   =..      gaiaFr
7a640 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
7a650 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
7a660 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
7a670 65 2c 0a 09 09 09 09 09 20 20 20 67 70 6b 67 5f  e,......   gpkg_
7a680 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 09 20 20  amphibious);..  
7a690 69 66 20 28 21 69 6e 74 65 72 69 6f 72 73 29 0a  if (!interiors).
7a6a0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
7a6b0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
7a6c0 6e 74 65 78 74 29 3b 0a 09 09 67 6f 74 6f 20 73  ntext);...goto s
7a6d0 74 6f 70 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  top;..    }.    
7a6e0 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d 20 67 61    }.    out = ga
7a6f0 69 61 4d 61 6b 65 50 6f 6c 79 67 6f 6e 20 28 65  iaMakePolygon (e
7a700 78 74 65 72 69 6f 72 2c 20 69 6e 74 65 72 69 6f  xterior, interio
7a710 72 73 29 3b 0a 20 20 20 20 69 66 20 28 21 6f 75  rs);.    if (!ou
7a720 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  t).      {..  sq
7a730 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
7a740 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
7a750 67 6f 74 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20  goto stop;.     
7a760 20 7d 0a 20 20 20 20 67 61 69 61 54 6f 53 70 61   }.    gaiaToSpa
7a770 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
7a780 32 20 28 6f 75 74 2c 20 26 70 5f 72 65 73 75 6c  2 (out, &p_resul
7a790 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f  t, &len, gpkg_mo
7a7a0 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b  de, tiny_point);
7a7b0 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
7a7c0 6d 43 6f 6c 6c 20 28 6f 75 74 29 3b 0a 20 20 20  mColl (out);.   
7a7d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7a7e0 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
7a7f0 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
7a800 65 65 29 3b 0a 20 20 73 74 6f 70 3a 0a 20 20 20  ee);.  stop:.   
7a810 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
7a820 6c 20 28 65 78 74 65 72 69 6f 72 29 3b 0a 20 20  l (exterior);.  
7a830 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
7a840 6c 6c 20 28 69 6e 74 65 72 69 6f 72 73 29 3b 0a  ll (interiors);.
7a850 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 67 65  }..static int.ge
7a860 74 58 59 5a 4d 53 69 6e 67 6c 65 50 6f 69 6e 74  tXYZMSinglePoint
7a870 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
7a880 72 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 2a  r geom, double *
7a890 78 2c 20 64 6f 75 62 6c 65 20 2a 79 2c 20 64 6f  x, double *y, do
7a8a0 75 62 6c 65 20 2a 7a 2c 0a 09 09 20 20 20 20 64  uble *z,...    d
7a8b0 6f 75 62 6c 65 20 2a 6d 29 0a 7b 0a 2f 2a 20 63  ouble *m).{./* c
7a8c0 68 65 63 6b 20 69 66 20 74 68 69 73 20 67 65 6f  heck if this geo
7a8d0 6d 65 74 72 79 20 69 73 20 61 20 73 69 6d 70 6c  metry is a simpl
7a8e0 65 20 50 6f 69 6e 74 20 28 72 65 74 75 72 6e 69  e Point (returni
7a8f0 6e 67 20 66 75 6c 6c 20 63 6f 6f 72 64 73 29 20  ng full coords) 
7a900 2a 2f 0a 20 20 20 20 69 6e 74 20 70 74 73 20 3d  */.    int pts =
7a910 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73 20   0;.    int lns 
7a920 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 67 73  = 0;.    int pgs
7a930 20 3d 20 30 3b 0a 20 20 20 20 67 61 69 61 50 6f   = 0;.    gaiaPo
7a940 69 6e 74 50 74 72 20 70 74 3b 0a 20 20 20 20 67  intPtr pt;.    g
7a950 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72  aiaLinestringPtr
7a960 20 6c 6e 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c   ln;.    gaiaPol
7a970 79 67 6f 6e 50 74 72 20 70 67 3b 0a 20 20 20 20  ygonPtr pg;.    
7a980 70 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74  pt = geom->First
7a990 50 6f 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65  Point;.    while
7a9a0 20 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20   (pt).      {.. 
7a9b0 20 70 74 73 2b 2b 3b 0a 09 20 20 70 74 20 3d 20   pts++;..  pt = 
7a9c0 70 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20  pt->Next;.      
7a9d0 7d 0a 20 20 20 20 6c 6e 20 3d 20 67 65 6f 6d 2d  }.    ln = geom-
7a9e0 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67  >FirstLinestring
7a9f0 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 6e 29  ;.    while (ln)
7aa00 0a 20 20 20 20 20 20 7b 0a 09 20 20 6c 6e 73 2b  .      {..  lns+
7aa10 2b 3b 0a 09 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e  +;..  ln = ln->N
7aa20 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
7aa30 20 70 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73   pg = geom->Firs
7aa40 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68  tPolygon;.    wh
7aa50 69 6c 65 20 28 70 67 29 0a 20 20 20 20 20 20 7b  ile (pg).      {
7aa60 0a 09 20 20 70 67 73 2b 2b 3b 0a 09 20 20 70 67  ..  pgs++;..  pg
7aa70 20 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a 20 20 20   = pg->Next;.   
7aa80 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 74 73     }.    if (pts
7aa90 20 3d 3d 20 31 20 26 26 20 6c 6e 73 20 3d 3d 20   == 1 && lns == 
7aaa0 30 20 26 26 20 70 67 73 20 3d 3d 20 30 29 0a 09  0 && pgs == 0)..
7aab0 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75  ;.    else..retu
7aac0 72 6e 20 30 3b 0a 20 20 20 20 2a 78 20 3d 20 67  rn 0;.    *x = g
7aad0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d  eom->FirstPoint-
7aae0 3e 58 3b 0a 20 20 20 20 2a 79 20 3d 20 67 65 6f  >X;.    *y = geo
7aaf0 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 59  m->FirstPoint->Y
7ab00 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e  ;.    if (geom->
7ab10 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
7ab20 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09 7c 7c 20  = GAIA_XY_Z..|| 
7ab30 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
7ab40 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
7ab50 5a 5f 4d 29 0a 09 2a 7a 20 3d 20 67 65 6f 6d 2d  Z_M)..*z = geom-
7ab60 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 5a 3b 0a  >FirstPoint->Z;.
7ab70 20 20 20 20 65 6c 73 65 0a 09 2a 7a 20 3d 20 30      else..*z = 0
7ab80 2e 30 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d  .0;.    if (geom
7ab90 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
7aba0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 0a 09 7c   == GAIA_XY_M..|
7abb0 7c 20 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f  | geom->Dimensio
7abc0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
7abd0 59 5f 5a 5f 4d 29 0a 09 2a 6d 20 3d 20 67 65 6f  Y_Z_M)..*m = geo
7abe0 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 4d  m->FirstPoint->M
7abf0 3b 0a 20 20 20 20 65 6c 73 65 0a 09 2a 6d 20 3d  ;.    else..*m =
7ac00 20 30 2e 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   0.0;.    return
7ac10 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   1;.}..static vo
7ac20 69 64 0a 66 6e 63 74 5f 53 6e 61 70 54 6f 47 72  id.fnct_SnapToGr
7ac30 69 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  id (sqlite3_cont
7ac40 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
7ac50 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
7ac60 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
7ac70 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
7ac80 6e 3a 0a 2f 20 53 54 5f 53 6e 61 70 54 6f 47 72  n:./ ST_SnapToGr
7ac90 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  id(BLOBencoded g
7aca0 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73 69 7a 65  eom, double size
7acb0 29 0a 2f 20 53 54 5f 53 6e 61 70 54 6f 47 72 69  )./ ST_SnapToGri
7acc0 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  d(BLOBencoded ge
7acd0 6f 6d 2c 20 64 6f 75 62 6c 65 20 73 69 7a 65 58  om, double sizeX
7ace0 2c 20 64 6f 75 62 6c 65 20 73 69 7a 65 59 29 0a  , double sizeY).
7acf0 2f 20 53 54 5f 53 6e 61 70 54 6f 47 72 69 64 28  / ST_SnapToGrid(
7ad00 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
7ad10 2c 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e 58  , double originX
7ad20 2c 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e 59  , double originY
7ad30 2c 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  , ./            
7ad40 20 20 20 64 6f 75 62 6c 65 20 73 69 7a 65 58 2c     double sizeX,
7ad50 20 64 6f 75 62 6c 65 20 73 69 7a 65 59 29 0a 2f   double sizeY)./
7ad60 0a 2f 20 53 6e 61 70 20 61 6c 6c 20 70 6f 69 6e  ./ Snap all poin
7ad70 74 73 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ts of the input 
7ad80 67 65 6f 6d 65 74 72 79 20 74 6f 20 74 68 65 20  geometry to the 
7ad90 67 72 69 64 20 64 65 66 69 6e 65 64 20 62 79 20  grid defined by 
7ada0 69 74 73 20 0a 2f 20 6f 72 69 67 69 6e 20 61 6e  its ./ origin an
7adb0 64 20 63 65 6c 6c 20 73 69 7a 65 2e 20 52 65 6d  d cell size. Rem
7adc0 6f 76 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20  ove consecutive 
7add0 70 6f 69 6e 74 73 20 66 61 6c 6c 69 6e 67 20 6f  points falling o
7ade0 6e 20 74 68 65 20 73 61 6d 65 0a 2f 20 63 65 6c  n the same./ cel
7adf0 6c 2e 20 43 6f 6c 6c 61 70 73 65 64 20 67 65 6f  l. Collapsed geo
7ae00 6d 65 74 72 69 65 73 20 69 6e 20 61 20 63 6f 6c  metries in a col
7ae10 6c 65 63 74 69 6f 6e 20 61 72 65 20 73 74 72 69  lection are stri
7ae20 70 70 65 64 20 66 72 6f 6d 20 69 74 2e 0a 2f 0a  pped from it../.
7ae30 2f 0a 2f 20 53 54 5f 53 6e 61 70 54 6f 47 72 69  /./ ST_SnapToGri
7ae40 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  d(BLOBencoded ge
7ae50 6f 6d 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20  om, BLOBencoded 
7ae60 70 6f 69 6e 74 2c 20 64 6f 75 62 6c 65 20 73 69  point, double si
7ae70 7a 65 58 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  zeX,./          
7ae80 20 20 20 20 20 64 6f 75 62 6c 65 20 73 69 7a 65       double size
7ae90 59 2c 20 64 6f 75 62 6c 65 20 73 69 7a 65 5a 2c  Y, double sizeZ,
7aea0 20 64 6f 75 62 6c 65 20 73 69 7a 65 4d 29 0a 2f   double sizeM)./
7aeb0 0a 2f 20 53 6e 61 70 20 61 6c 6c 20 70 6f 69 6e  ./ Snap all poin
7aec0 74 73 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ts of the input 
7aed0 67 65 6f 6d 65 74 72 79 20 74 6f 20 74 68 65 20  geometry to the 
7aee0 67 72 69 64 20 64 65 66 69 6e 65 64 20 62 79 20  grid defined by 
7aef0 69 74 73 20 0a 2f 20 6f 72 69 67 69 6e 20 28 74  its ./ origin (t
7af00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7af10 6e 74 2c 20 6d 75 73 74 20 62 65 20 61 20 70 6f  nt, must be a po
7af20 69 6e 74 29 20 61 6e 64 20 63 65 6c 6c 20 73 69  int) and cell si
7af30 7a 65 73 2e 0a 2f 20 0a 2f 20 53 70 65 63 69 66  zes../ ./ Specif
7af40 79 20 30 20 61 73 20 73 69 7a 65 20 66 6f 72 20  y 0 as size for 
7af50 61 6e 79 20 64 69 6d 65 6e 73 69 6f 6e 20 79 6f  any dimension yo
7af60 75 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  u don't want to 
7af70 73 6e 61 70 20 74 6f 0a 2f 20 61 20 67 72 69 64  snap to./ a grid
7af80 2e 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ../ return NULL 
7af90 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
7afa0 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
7afb0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
7afc0 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e   *p_blob;.    in
7afd0 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69  t n_bytes;.    i
7afe0 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20  nt int_value;.  
7aff0 20 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e 5f    double origin_
7b000 78 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  x = 0.0;.    dou
7b010 62 6c 65 20 6f 72 69 67 69 6e 5f 79 20 3d 20 30  ble origin_y = 0
7b020 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6f  .0;.    double o
7b030 72 69 67 69 6e 5f 7a 20 3d 20 30 2e 30 3b 0a 20  rigin_z = 0.0;. 
7b040 20 20 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e     double origin
7b050 5f 6d 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f  _m = 0.0;.    do
7b060 75 62 6c 65 20 73 69 7a 65 5f 78 20 3d 20 30 2e  uble size_x = 0.
7b070 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 69  0;.    double si
7b080 7a 65 5f 79 20 3d 20 30 2e 30 3b 0a 20 20 20 20  ze_y = 0.0;.    
7b090 64 6f 75 62 6c 65 20 73 69 7a 65 5f 7a 20 3d 20  double size_z = 
7b0a0 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
7b0b0 73 69 7a 65 5f 6d 20 3d 20 30 2e 30 3b 0a 20 20  size_m = 0.0;.  
7b0c0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
7b0d0 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
7b0e0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
7b0f0 72 20 70 6f 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  r point = NULL;.
7b100 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
7b110 50 74 72 20 72 65 73 75 6c 74 20 3d 20 4e 55 4c  Ptr result = NUL
7b120 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  L;.    int gpkg_
7b130 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a  amphibious = 0;.
7b140 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
7b150 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  e = 0;.    int t
7b160 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  iny_point = 0;. 
7b170 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
7b180 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
7b190 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
7b1a0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
7b1b0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
7b1c0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
7b1d0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
7b1e0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
7b1f0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
7b200 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
7b210 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
7b220 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
7b230 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
7b240 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
7b250 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20  ;..  tiny_point 
7b260 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69  = cache->tinyPoi
7b270 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20  ntEnabled;.     
7b280 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
7b290 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
7b2a0 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
7b2b0 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
7b2c0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
7b2d0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
7b2e0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
7b2f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
7b300 63 20 3d 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a  c == 2).      {.
7b310 09 20 20 2f 2a 20 53 54 5f 53 6e 61 70 54 6f 47  .  /* ST_SnapToG
7b320 72 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  rid(BLOBencoded 
7b330 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73 69 7a  geom, double siz
7b340 65 29 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c  e) */..  if (sql
7b350 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
7b360 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
7b370 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
7b380 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20    {...int_value 
7b390 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7b3a0 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  int (argv[1]);..
7b3b0 09 73 69 7a 65 5f 78 20 3d 20 69 6e 74 5f 76 61  .size_x = int_va
7b3c0 6c 75 65 3b 0a 09 09 73 69 7a 65 5f 79 20 3d 20  lue;...size_y = 
7b3d0 73 69 7a 65 5f 78 3b 0a 09 20 20 20 20 7d 0a 09  size_x;..    }..
7b3e0 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
7b3f0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
7b400 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
7b410 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 7b 0a  E_FLOAT)..    {.
7b420 09 09 73 69 7a 65 5f 78 20 3d 20 73 71 6c 69 74  ..size_x = sqlit
7b430 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
7b440 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 73 69 7a  (argv[1]);...siz
7b450 65 5f 79 20 3d 20 73 69 7a 65 5f 78 3b 0a 09 20  e_y = size_x;.. 
7b460 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
7b470 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
7b480 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
7b490 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
7b4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7b4b0 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29    if (argc == 3)
7b4c0 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 53  .      {..  /* S
7b4d0 54 5f 53 6e 61 70 54 6f 47 72 69 64 28 42 4c 4f  T_SnapToGrid(BLO
7b4e0 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 2c 20 64  Bencoded geom, d
7b4f0 6f 75 62 6c 65 20 73 69 7a 65 58 2c 20 64 6f 75  ouble sizeX, dou
7b500 62 6c 65 20 73 69 7a 65 59 29 20 2a 2f 0a 09 20  ble sizeY) */.. 
7b510 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
7b520 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
7b530 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
7b540 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e  GER)..    {...in
7b550 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  t_value = sqlite
7b560 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
7b570 76 5b 31 5d 29 3b 0a 09 09 73 69 7a 65 5f 78 20  v[1]);...size_x 
7b580 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
7b590 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28    }..  else if (
7b5a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
7b5b0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
7b5c0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20  SQLITE_FLOAT).. 
7b5d0 20 20 20 7b 0a 09 09 73 69 7a 65 5f 78 20 3d 20     {...size_x = 
7b5e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
7b5f0 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a  uble (argv[1]);.
7b600 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
7b610 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
7b620 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
7b630 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
7b640 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73  ..    }..  if (s
7b650 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7b660 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
7b670 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
7b680 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75      {...int_valu
7b690 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
7b6a0 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b  e_int (argv[2]);
7b6b0 0a 09 09 73 69 7a 65 5f 79 20 3d 20 69 6e 74 5f  ...size_y = int_
7b6c0 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20  value;..    }.. 
7b6d0 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
7b6e0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
7b6f0 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
7b700 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 7b 0a 09  _FLOAT)..    {..
7b710 09 73 69 7a 65 5f 79 20 3d 20 73 71 6c 69 74 65  .size_y = sqlite
7b720 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
7b730 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 20 20 7d  argv[2]);..    }
7b740 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
7b750 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
7b760 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
7b770 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
7b780 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  }.      }.    if
7b790 20 28 61 72 67 63 20 3d 3d 20 35 29 0a 20 20 20   (argc == 5).   
7b7a0 20 20 20 7b 0a 09 20 20 2f 2a 0a 09 20 20 20 20     {..  /*..    
7b7b0 20 2f 20 53 54 5f 53 6e 61 70 54 6f 47 72 69 64   / ST_SnapToGrid
7b7c0 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
7b7d0 6d 2c 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e  m, double origin
7b7e0 58 2c 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e  X, double origin
7b7f0 59 2c 20 0a 09 20 20 20 20 20 2f 20 20 20 20 20  Y, ..     /     
7b800 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
7b810 20 73 69 7a 65 58 2c 20 64 6f 75 62 6c 65 20 73   sizeX, double s
7b820 69 7a 65 59 29 0a 09 20 20 20 2a 2f 0a 09 20 20  izeY)..   */..  
7b830 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
7b840 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
7b850 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
7b860 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74  ER)..    {...int
7b870 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
7b880 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
7b890 5b 31 5d 29 3b 0a 09 09 6f 72 69 67 69 6e 5f 78  [1]);...origin_x
7b8a0 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20   = int_value;.. 
7b8b0 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20     }..  else if 
7b8c0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
7b8d0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
7b8e0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
7b8f0 20 20 20 20 7b 0a 09 09 6f 72 69 67 69 6e 5f 78      {...origin_x
7b900 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7b910 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d  _double (argv[1]
7b920 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
7b930 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
7b940 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
7b950 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
7b960 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
7b970 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
7b980 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
7b990 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
7b9a0 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
7b9b0 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
7b9c0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32  alue_int (argv[2
7b9d0 5d 29 3b 0a 09 09 6f 72 69 67 69 6e 5f 79 20 3d  ]);...origin_y =
7b9e0 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
7b9f0 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73   }..  else if (s
7ba00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7ba10 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
7ba20 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20  QLITE_FLOAT)..  
7ba30 20 20 7b 0a 09 09 6f 72 69 67 69 6e 5f 79 20 3d    {...origin_y =
7ba40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
7ba50 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b  ouble (argv[2]);
7ba60 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
7ba70 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
7ba80 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
7ba90 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
7baa0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28  ;..    }..  if (
7bab0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
7bac0 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
7bad0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
7bae0 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c  .    {...int_val
7baf0 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
7bb00 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29  ue_int (argv[3])
7bb10 3b 0a 09 09 73 69 7a 65 5f 78 20 3d 20 69 6e 74  ;...size_x = int
7bb20 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09  _value;..    }..
7bb30 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
7bb40 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
7bb50 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
7bb60 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 7b 0a  E_FLOAT)..    {.
7bb70 09 09 73 69 7a 65 5f 78 20 3d 20 73 71 6c 69 74  ..size_x = sqlit
7bb80 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
7bb90 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (argv[3]);..    
7bba0 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
7bbb0 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
7bbc0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
7bbd0 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
7bbe0 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   }..  if (sqlite
7bbf0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
7bc00 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[4]) == SQLITE
7bc10 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
7bc20 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  ...int_value = s
7bc30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
7bc40 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 09 73 69   (argv[4]);...si
7bc50 7a 65 5f 79 20 3d 20 69 6e 74 5f 76 61 6c 75 65  ze_y = int_value
7bc60 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
7bc70 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
7bc80 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d  ue_type (argv[4]
7bc90 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
7bca0 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 69 7a 65  T)..    {...size
7bcb0 5f 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  _y = sqlite3_val
7bcc0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
7bcd0 34 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  4]);..    }..  e
7bce0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
7bcf0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
7bd00 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
7bd10 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
7bd20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
7bd30 63 20 3d 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a  c == 6).      {.
7bd40 09 20 20 2f 2a 0a 09 20 20 20 20 20 2f 20 53 54  .  /*..     / ST
7bd50 5f 53 6e 61 70 54 6f 47 72 69 64 28 42 4c 4f 42  _SnapToGrid(BLOB
7bd60 65 6e 63 6f 64 65 64 20 67 65 6f 6d 2c 20 42 4c  encoded geom, BL
7bd70 4f 42 65 6e 63 6f 64 65 64 20 70 6f 69 6e 74 2c  OBencoded point,
7bd80 20 64 6f 75 62 6c 65 20 73 69 7a 65 58 2c 0a 09   double sizeX,..
7bd90 20 20 20 20 20 2f 20 20 20 20 20 20 20 20 20 20       /          
7bda0 20 20 20 20 20 64 6f 75 62 6c 65 20 73 69 7a 65       double size
7bdb0 59 2c 20 64 6f 75 62 6c 65 20 73 69 7a 65 5a 2c  Y, double sizeZ,
7bdc0 20 64 6f 75 62 6c 65 20 73 69 7a 65 4d 29 0a 09   double sizeM)..
7bdd0 20 20 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c     */..  if (sql
7bde0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
7bdf0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
7be00 49 54 45 5f 42 4c 4f 42 29 0a 09 20 20 20 20 7b  ITE_BLOB)..    {
7be10 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
7be20 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
7be30 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
7be40 20 7d 0a 09 20 20 70 5f 62 6c 6f 62 20 3d 20 28   }..  p_blob = (
7be50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
7be60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
7be70 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  lob (argv[1]);..
7be80 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
7be90 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
7bea0 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 70 6f  (argv[1]);..  po
7beb0 69 6e 74 20 3d 0a 09 20 20 20 20 20 20 67 61 69  int =..      gai
7bec0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
7bed0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
7bee0 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
7bef0 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 20 67 70  mode,......   gp
7bf00 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
7bf10 09 20 20 69 66 20 28 21 70 6f 69 6e 74 29 0a 09  .  if (!point)..
7bf20 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
7bf30 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
7bf40 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
7bf50 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 21  ..    }..  if (!
7bf60 67 65 74 58 59 5a 4d 53 69 6e 67 6c 65 50 6f 69  getXYZMSinglePoi
7bf70 6e 74 0a 09 20 20 20 20 20 20 28 70 6f 69 6e 74  nt..      (point
7bf80 2c 20 26 6f 72 69 67 69 6e 5f 78 2c 20 26 6f 72  , &origin_x, &or
7bf90 69 67 69 6e 5f 79 2c 20 26 6f 72 69 67 69 6e 5f  igin_y, &origin_
7bfa0 7a 2c 20 26 6f 72 69 67 69 6e 5f 6d 29 29 0a 09  z, &origin_m))..
7bfb0 20 20 20 20 7b 0a 09 09 67 61 69 61 46 72 65 65      {...gaiaFree
7bfc0 47 65 6f 6d 43 6f 6c 6c 20 28 70 6f 69 6e 74 29  GeomColl (point)
7bfd0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
7bfe0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
7bff0 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
7c000 20 20 7d 0a 09 20 20 67 61 69 61 46 72 65 65 47    }..  gaiaFreeG
7c010 65 6f 6d 43 6f 6c 6c 20 28 70 6f 69 6e 74 29 3b  eomColl (point);
7c020 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
7c030 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
7c040 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
7c050 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
7c060 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c  .int_value = sql
7c070 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
7c080 61 72 67 76 5b 32 5d 29 3b 0a 09 09 73 69 7a 65  argv[2]);...size
7c090 5f 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a  _x = int_value;.
7c0a0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69  .    }..  else i
7c0b0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
7c0c0 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
7c0d0 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
7c0e0 0a 09 20 20 20 20 7b 0a 09 09 73 69 7a 65 5f 78  ..    {...size_x
7c0f0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7c100 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d  _double (argv[2]
7c110 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
7c120 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
7c130 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
7c140 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
7c150 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
7c160 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
7c170 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d  type (argv[3]) =
7c180 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
7c190 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
7c1a0 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
7c1b0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33  alue_int (argv[3
7c1c0 5d 29 3b 0a 09 09 73 69 7a 65 5f 79 20 3d 20 69  ]);...size_y = i
7c1d0 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d  nt_value;..    }
7c1e0 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c  ..  else if (sql
7c1f0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
7c200 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
7c210 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20  ITE_FLOAT)..    
7c220 7b 0a 09 09 73 69 7a 65 5f 79 20 3d 20 73 71 6c  {...size_y = sql
7c230 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
7c240 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20  e (argv[3]);..  
7c250 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
7c260 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
7c270 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
7c280 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
7c290 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
7c2a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
7c2b0 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
7c2c0 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
7c2d0 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d   {...int_value =
7c2e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
7c2f0 6e 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 09  nt (argv[4]);...
7c300 73 69 7a 65 5f 7a 20 3d 20 69 6e 74 5f 76 61 6c  size_z = int_val
7c310 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  ue;..    }..  el
7c320 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
7c330 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
7c340 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  4]) == SQLITE_FL
7c350 4f 41 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 69  OAT)..    {...si
7c360 7a 65 5f 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  ze_z = sqlite3_v
7c370 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
7c380 76 5b 34 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 20  v[4]);..    }.. 
7c390 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
7c3a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
7c3b0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
7c3c0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
7c3d0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
7c3e0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
7c3f0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
7c400 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69  EGER)..    {...i
7c410 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
7c420 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
7c430 67 76 5b 35 5d 29 3b 0a 09 09 73 69 7a 65 5f 6d  gv[5]);...size_m
7c440 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20   = int_value;.. 
7c450 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20     }..  else if 
7c460 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
7c470 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d  ype (argv[5]) ==
7c480 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
7c490 20 20 20 20 7b 0a 09 09 73 69 7a 65 5f 6d 20 3d      {...size_m =
7c4a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
7c4b0 6f 75 62 6c 65 20 28 61 72 67 76 5b 35 5d 29 3b  ouble (argv[5]);
7c4c0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
7c4d0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
7c4e0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
7c4f0 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
7c500 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
7c510 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
7c520 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
7c530 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
7c540 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
7c550 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
7c560 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
7c570 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
7c580 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  eo =..gaiaFromSp
7c590 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
7c5a0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
7c5b0 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
7c5c0 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
7c5d0 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
7c5e0 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33   (!geo)..sqlite3
7c5f0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
7c600 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
7c610 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65 73 75  .      {..  resu
7c620 6c 74 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61  lt =..      gaia
7c630 53 6e 61 70 54 6f 47 72 69 64 20 28 67 65 6f 2c  SnapToGrid (geo,
7c640 20 6f 72 69 67 69 6e 5f 78 2c 20 6f 72 69 67 69   origin_x, origi
7c650 6e 5f 79 2c 20 6f 72 69 67 69 6e 5f 7a 2c 20 6f  n_y, origin_z, o
7c660 72 69 67 69 6e 5f 6d 2c 0a 09 09 09 20 20 20 20  rigin_m,....    
7c670 20 20 73 69 7a 65 5f 78 2c 20 73 69 7a 65 5f 79    size_x, size_y
7c680 2c 20 73 69 7a 65 5f 7a 2c 20 73 69 7a 65 5f 6d  , size_z, size_m
7c690 29 3b 0a 09 20 20 69 66 20 28 72 65 73 75 6c 74  );..  if (result
7c6a0 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   == NULL)..     
7c6b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7c6c0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
7c6d0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
7c6e0 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42  ./* builds the B
7c6f0 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20  LOB geometry to 
7c700 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09  be returned */..
7c710 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69  .int len;...unsi
7c720 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73  gned char *p_res
7c730 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65  ult = NULL;...re
7c740 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f  sult->Srid = geo
7c750 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f  ->Srid;...gaiaTo
7c760 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
7c770 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70  bEx2 (result, &p
7c780 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09  _result, &len,..
7c790 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64  ....    gpkg_mod
7c7a0 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a  e, tiny_point);.
7c7b0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
7c7c0 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
7c7d0 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
7c7e0 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65  ree);...gaiaFree
7c7f0 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74  GeomColl (result
7c800 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  );..    }.      
7c810 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
7c820 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a  omColl (geo);.}.
7c830 0a 73 74 61 74 69 63 20 63 68 61 72 20 67 61 72  .static char gar
7c840 73 4d 61 70 70 69 6e 67 5b 32 34 5d 20 3d 20 7b  sMapping[24] = {
7c850 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20   'A', 'B', 'C', 
7c860 27 44 27 2c 20 27 45 27 2c 20 27 46 27 2c 20 27  'D', 'E', 'F', '
7c870 47 27 2c 20 27 48 27 2c 20 27 4a 27 2c 0a 20 20  G', 'H', 'J',.  
7c880 20 20 27 4b 27 2c 20 27 4c 27 2c 20 27 4d 27 2c    'K', 'L', 'M',
7c890 20 27 4e 27 2c 20 27 50 27 2c 20 27 51 27 2c 20   'N', 'P', 'Q', 
7c8a0 27 52 27 2c 20 27 53 27 2c 20 27 54 27 2c 20 27  'R', 'S', 'T', '
7c8b0 55 27 2c 20 27 56 27 2c 20 27 57 27 2c 20 27 58  U', 'V', 'W', 'X
7c8c0 27 2c 20 27 59 27 2c 20 27 5a 27 0a 7d 3b 0a 0a  ', 'Y', 'Z'.};..
7c8d0 73 74 61 74 69 63 20 63 68 61 72 0a 67 61 72 73  static char.gars
7c8e0 4c 65 74 74 65 72 43 6f 64 65 20 28 69 6e 74 20  LetterCode (int 
7c8f0 76 61 6c 75 65 29 0a 7b 0a 20 20 20 20 72 65 74  value).{.    ret
7c900 75 72 6e 20 67 61 72 73 4d 61 70 70 69 6e 67 5b  urn garsMapping[
7c910 76 61 6c 75 65 5d 3b 0a 7d 0a 0a 73 74 61 74 69  value];.}..stati
7c920 63 20 69 6e 74 0a 67 61 72 73 4d 61 70 70 69 6e  c int.garsMappin
7c930 67 49 6e 64 65 78 20 28 63 6f 6e 73 74 20 63 68  gIndex (const ch
7c940 61 72 20 6c 65 74 74 65 72 29 0a 7b 0a 20 20 20  ar letter).{.   
7c950 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
7c960 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
7c970 32 34 3b 20 2b 2b 69 29 0a 20 20 20 20 20 20 7b  24; ++i).      {
7c980 0a 09 20 20 69 66 20 28 6c 65 74 74 65 72 20 3d  ..  if (letter =
7c990 3d 20 67 61 72 73 4d 61 70 70 69 6e 67 5b 69 5d  = garsMapping[i]
7c9a0 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20  )..      return 
7c9b0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  i;.      }.    r
7c9c0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
7c9d0 74 69 63 20 64 6f 75 62 6c 65 0a 67 61 72 73 4c  tic double.garsL
7c9e0 65 74 74 65 72 54 6f 44 65 67 72 65 65 73 4c 61  etterToDegreesLa
7c9f0 74 20 28 63 68 61 72 20 6d 73 64 2c 20 63 68 61  t (char msd, cha
7ca00 72 20 6c 73 64 29 0a 7b 0a 20 20 20 20 64 6f 75  r lsd).{.    dou
7ca10 62 6c 65 20 68 69 67 68 20 3d 20 67 61 72 73 4d  ble high = garsM
7ca20 61 70 70 69 6e 67 49 6e 64 65 78 20 28 6d 73 64  appingIndex (msd
7ca30 29 20 2a 20 32 34 2e 30 3b 0a 20 20 20 20 64 6f  ) * 24.0;.    do
7ca40 75 62 6c 65 20 6c 6f 77 20 3d 20 67 61 72 73 4d  uble low = garsM
7ca50 61 70 70 69 6e 67 49 6e 64 65 78 20 28 6c 73 64  appingIndex (lsd
7ca60 29 3b 0a 20 20 20 20 69 66 20 28 28 68 69 67 68  );.    if ((high
7ca70 20 3c 20 30 29 20 7c 7c 20 28 6c 6f 77 20 3c 20   < 0) || (low < 
7ca80 30 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 72  0)).      {..  r
7ca90 65 74 75 72 6e 20 2d 31 30 30 2e 30 3b 0a 20 20  eturn -100.0;.  
7caa0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7cab0 20 28 28 28 68 69 67 68 20 2b 20 6c 6f 77 29 20   (((high + low) 
7cac0 2a 20 30 2e 35 29 20 2d 20 39 30 2e 30 29 3b 0a  * 0.5) - 90.0);.
7cad0 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  }...static void.
7cae0 66 6e 63 74 5f 47 41 52 53 4d 62 72 20 28 73 71  fnct_GARSMbr (sq
7caf0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
7cb00 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
7cb10 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
7cb20 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
7cb30 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47  QL function:./ G
7cb40 41 52 53 4d 62 72 28 54 65 78 74 29 0a 2f 0a 2f  ARSMbr(Text)././
7cb50 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 54 65   converts the Te
7cb60 78 74 20 28 77 68 69 63 68 20 73 68 6f 75 6c 64  xt (which should
7cb70 20 62 65 20 61 20 76 61 6c 69 64 20 47 41 52 53   be a valid GARS
7cb80 20 61 72 65 61 29 20 74 6f 20 74 68 65 20 63 6f   area) to the co
7cb90 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2f 20 4d 42  rresponding./ MB
7cba0 52 20 67 65 6f 6d 65 74 72 79 2e 0a 2f 20 54 68  R geometry../ Th
7cbb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
7cbc0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
7cbd0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  an error occurs.
7cbe0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
7cbf0 72 20 2a 74 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  r *text = NULL;.
7cc00 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b      int len = 0;
7cc10 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
7cc20 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
7cc30 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ULL;.    double 
7cc40 78 31 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f  x1 = 0.0;.    do
7cc50 75 62 6c 65 20 79 31 20 3d 20 30 2e 30 3b 0a 20  uble y1 = 0.0;. 
7cc60 20 20 20 64 6f 75 62 6c 65 20 78 32 20 3d 20 30     double x2 = 0
7cc70 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  .0;.    double y
7cc80 32 20 3d 20 30 2e 30 3b 0a 0a 20 20 20 20 47 41  2 = 0.0;..    GA
7cc90 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
7cca0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
7ccb0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
7ccc0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
7ccd0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
7cce0 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
7ccf0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
7cd00 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
7cd10 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
7cd20 20 20 20 20 7d 0a 20 20 20 20 74 65 78 74 20 3d      }.    text =
7cd30 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
7cd40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7cd50 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
7cd60 20 20 69 66 20 28 28 73 74 72 6c 65 6e 20 28 74    if ((strlen (t
7cd70 65 78 74 29 20 3c 20 35 29 20 7c 7c 20 28 73 74  ext) < 5) || (st
7cd80 72 6c 65 6e 20 28 74 65 78 74 29 20 3e 20 37 29  rlen (text) > 7)
7cd90 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
7cda0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
7cdb0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
7cdc0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7cdd0 20 20 20 69 66 20 28 73 74 72 6c 65 6e 20 28 74     if (strlen (t
7cde0 65 78 74 29 20 3d 3d 20 35 29 0a 20 20 20 20 20  ext) == 5).     
7cdf0 20 7b 0a 09 20 20 69 6e 74 20 6e 75 6d 4d 61 74   {..  int numMat
7ce00 63 68 20 3d 20 30 3b 0a 09 20 20 75 6e 73 69 67  ch = 0;..  unsig
7ce10 6e 65 64 20 69 6e 74 20 64 69 67 69 74 31 30 30  ned int digit100
7ce20 20 3d 20 30 3b 0a 09 20 20 63 68 61 72 20 6c 65   = 0;..  char le
7ce30 74 74 65 72 4d 53 44 20 3d 20 27 5c 30 27 3b 0a  tterMSD = '\0';.
7ce40 09 20 20 63 68 61 72 20 6c 65 74 74 65 72 4c 53  .  char letterLS
7ce50 44 20 3d 20 27 5c 30 27 3b 0a 09 20 20 6e 75 6d  D = '\0';..  num
7ce60 4d 61 74 63 68 20 3d 20 73 73 63 61 6e 66 20 28  Match = sscanf (
7ce70 74 65 78 74 2c 20 22 25 75 25 63 25 63 22 2c 20  text, "%u%c%c", 
7ce80 26 64 69 67 69 74 31 30 30 2c 20 26 6c 65 74 74  &digit100, &lett
7ce90 65 72 4d 53 44 2c 20 26 6c 65 74 74 65 72 4c 53  erMSD, &letterLS
7cea0 44 29 3b 0a 09 20 20 69 66 20 28 6e 75 6d 4d 61  D);..  if (numMa
7ceb0 74 63 68 20 21 3d 20 33 29 0a 09 20 20 20 20 7b  tch != 3)..    {
7cec0 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
7ced0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
7cee0 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
7cef0 20 7d 0a 09 20 20 78 31 20 3d 20 28 28 64 69 67   }..  x1 = ((dig
7cf00 69 74 31 30 30 20 2d 20 31 29 20 2a 20 30 2e 35  it100 - 1) * 0.5
7cf10 29 20 2d 20 31 38 30 2e 30 3b 0a 09 20 20 79 31  ) - 180.0;..  y1
7cf20 20 3d 20 67 61 72 73 4c 65 74 74 65 72 54 6f 44   = garsLetterToD
7cf30 65 67 72 65 65 73 4c 61 74 20 28 6c 65 74 74 65  egreesLat (lette
7cf40 72 4d 53 44 2c 20 6c 65 74 74 65 72 4c 53 44 29  rMSD, letterLSD)
7cf50 3b 0a 09 20 20 69 66 20 28 28 78 31 20 3c 20 2d  ;..  if ((x1 < -
7cf60 31 38 30 2e 30 29 20 7c 7c 20 28 78 31 20 3e 20  180.0) || (x1 > 
7cf70 31 37 39 2e 35 29 20 7c 7c 20 28 79 31 20 3c 20  179.5) || (y1 < 
7cf80 2d 39 30 2e 30 29 20 7c 7c 20 28 79 31 20 3e 20  -90.0) || (y1 > 
7cf90 38 39 2e 35 29 29 0a 09 20 20 20 20 7b 0a 09 09  89.5))..    {...
7cfa0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
7cfb0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
7cfc0 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
7cfd0 09 20 20 78 32 20 3d 20 78 31 20 2b 20 30 2e 35  .  x2 = x1 + 0.5
7cfe0 3b 0a 09 20 20 79 32 20 3d 20 79 31 20 2b 20 30  ;..  y2 = y1 + 0
7cff0 2e 35 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .5;.      }.    
7d000 69 66 20 28 73 74 72 6c 65 6e 20 28 74 65 78 74  if (strlen (text
7d010 29 20 3d 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a  ) == 6).      {.
7d020 09 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7d030 6e 75 6d 4d 61 74 63 68 20 3d 20 30 3b 0a 09 20  numMatch = 0;.. 
7d040 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 64 69   unsigned int di
7d050 67 69 74 31 30 30 20 3d 20 30 3b 0a 09 20 20 63  git100 = 0;..  c
7d060 68 61 72 20 6c 65 74 74 65 72 4d 53 44 20 3d 20  har letterMSD = 
7d070 27 5c 30 27 3b 0a 09 20 20 63 68 61 72 20 6c 65  '\0';..  char le
7d080 74 74 65 72 4c 53 44 20 3d 20 27 5c 30 27 3b 0a  tterLSD = '\0';.
7d090 09 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7d0a0 64 69 67 69 74 53 65 67 6d 65 6e 74 20 3d 20 30  digitSegment = 0
7d0b0 3b 0a 09 20 20 6e 75 6d 4d 61 74 63 68 20 3d 0a  ;..  numMatch =.
7d0c0 09 20 20 20 20 20 20 73 73 63 61 6e 66 20 28 74  .      sscanf (t
7d0d0 65 78 74 2c 20 22 25 75 25 63 25 63 25 75 22 2c  ext, "%u%c%c%u",
7d0e0 20 26 64 69 67 69 74 31 30 30 2c 20 26 6c 65 74   &digit100, &let
7d0f0 74 65 72 4d 53 44 2c 20 26 6c 65 74 74 65 72 4c  terMSD, &letterL
7d100 53 44 2c 0a 09 09 20 20 20 20 20 20 26 64 69 67  SD,...      &dig
7d110 69 74 53 65 67 6d 65 6e 74 29 3b 0a 09 20 20 69  itSegment);..  i
7d120 66 20 28 6e 75 6d 4d 61 74 63 68 20 21 3d 20 34  f (numMatch != 4
7d130 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
7d140 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
7d150 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
7d160 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
7d170 20 28 28 64 69 67 69 74 53 65 67 6d 65 6e 74 20   ((digitSegment 
7d180 3c 20 31 29 20 7c 7c 20 28 64 69 67 69 74 53 65  < 1) || (digitSe
7d190 67 6d 65 6e 74 20 3e 20 34 29 29 0a 09 20 20 20  gment > 4))..   
7d1a0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
7d1b0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
7d1c0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
7d1d0 20 20 20 7d 0a 09 20 20 78 31 20 3d 20 28 28 64     }..  x1 = ((d
7d1e0 69 67 69 74 31 30 30 20 2d 20 31 29 20 2a 20 30  igit100 - 1) * 0
7d1f0 2e 35 29 20 2d 20 31 38 30 2e 30 3b 0a 09 20 20  .5) - 180.0;..  
7d200 69 66 20 28 28 64 69 67 69 74 53 65 67 6d 65 6e  if ((digitSegmen
7d210 74 20 3d 3d 20 32 29 20 7c 7c 20 28 64 69 67 69  t == 2) || (digi
7d220 74 53 65 67 6d 65 6e 74 20 3d 3d 20 34 29 29 0a  tSegment == 4)).
7d230 09 20 20 20 20 7b 0a 09 09 78 31 20 2b 3d 20 30  .    {...x1 += 0
7d240 2e 32 35 3b 0a 09 20 20 20 20 7d 0a 09 20 20 79  .25;..    }..  y
7d250 31 20 3d 20 67 61 72 73 4c 65 74 74 65 72 54 6f  1 = garsLetterTo
7d260 44 65 67 72 65 65 73 4c 61 74 20 28 6c 65 74 74  DegreesLat (lett
7d270 65 72 4d 53 44 2c 20 6c 65 74 74 65 72 4c 53 44  erMSD, letterLSD
7d280 29 3b 0a 09 20 20 69 66 20 28 28 64 69 67 69 74  );..  if ((digit
7d290 53 65 67 6d 65 6e 74 20 3d 3d 20 31 29 20 7c 7c  Segment == 1) ||
7d2a0 20 28 64 69 67 69 74 53 65 67 6d 65 6e 74 20 3d   (digitSegment =
7d2b0 3d 20 32 29 29 0a 09 20 20 20 20 7b 0a 09 09 79  = 2))..    {...y
7d2c0 31 20 2b 3d 20 30 2e 32 35 3b 0a 09 20 20 20 20  1 += 0.25;..    
7d2d0 7d 0a 09 20 20 69 66 20 28 28 78 31 20 3c 20 2d  }..  if ((x1 < -
7d2e0 31 38 30 2e 30 29 20 7c 7c 20 28 78 31 20 3e 20  180.0) || (x1 > 
7d2f0 31 37 39 2e 37 35 29 20 7c 7c 20 28 79 31 20 3c  179.75) || (y1 <
7d300 20 2d 39 30 2e 30 29 20 7c 7c 20 28 79 31 20 3e   -90.0) || (y1 >
7d310 20 38 39 2e 37 35 29 29 0a 09 20 20 20 20 7b 0a   89.75))..    {.
7d320 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
7d330 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
7d340 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
7d350 7d 0a 09 20 20 78 32 20 3d 20 78 31 20 2b 20 30  }..  x2 = x1 + 0
7d360 2e 32 35 3b 0a 09 20 20 79 32 20 3d 20 79 31 20  .25;..  y2 = y1 
7d370 2b 20 30 2e 32 35 3b 0a 20 20 20 20 20 20 7d 0a  + 0.25;.      }.
7d380 20 20 20 20 69 66 20 28 73 74 72 6c 65 6e 20 28      if (strlen (
7d390 74 65 78 74 29 20 3d 3d 20 37 29 0a 20 20 20 20  text) == 7).    
7d3a0 20 20 7b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20    {..  unsigned 
7d3b0 69 6e 74 20 6e 75 6d 4d 61 74 63 68 20 3d 20 30  int numMatch = 0
7d3c0 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ;..  unsigned in
7d3d0 74 20 64 69 67 69 74 31 30 30 20 3d 20 30 3b 0a  t digit100 = 0;.
7d3e0 09 20 20 63 68 61 72 20 6c 65 74 74 65 72 4d 53  .  char letterMS
7d3f0 44 20 3d 20 27 5c 30 27 3b 0a 09 20 20 63 68 61  D = '\0';..  cha
7d400 72 20 6c 65 74 74 65 72 4c 53 44 20 3d 20 27 5c  r letterLSD = '\
7d410 30 27 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20  0';..  unsigned 
7d420 69 6e 74 20 64 69 67 69 74 41 6e 64 4b 65 79 70  int digitAndKeyp
7d430 61 64 20 3d 20 30 3b 0a 09 20 20 75 6e 73 69 67  ad = 0;..  unsig
7d440 6e 65 64 20 69 6e 74 20 64 69 67 69 74 53 65 67  ned int digitSeg
7d450 6d 65 6e 74 20 3d 20 30 3b 0a 09 20 20 75 6e 73  ment = 0;..  uns
7d460 69 67 6e 65 64 20 69 6e 74 20 6b 65 79 70 61 64  igned int keypad
7d470 4e 75 6d 62 65 72 20 3d 20 30 3b 0a 09 20 20 6e  Number = 0;..  n
7d480 75 6d 4d 61 74 63 68 20 3d 0a 09 20 20 20 20 20  umMatch =..     
7d490 20 73 73 63 61 6e 66 20 28 74 65 78 74 2c 20 22   sscanf (text, "
7d4a0 25 75 25 63 25 63 25 75 22 2c 20 26 64 69 67 69  %u%c%c%u", &digi
7d4b0 74 31 30 30 2c 20 26 6c 65 74 74 65 72 4d 53 44  t100, &letterMSD
7d4c0 2c 20 26 6c 65 74 74 65 72 4c 53 44 2c 0a 09 09  , &letterLSD,...
7d4d0 20 20 20 20 20 20 26 64 69 67 69 74 41 6e 64 4b        &digitAndK
7d4e0 65 79 70 61 64 29 3b 0a 09 20 20 69 66 20 28 6e  eypad);..  if (n
7d4f0 75 6d 4d 61 74 63 68 20 21 3d 20 34 29 0a 09 20  umMatch != 4).. 
7d500 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
7d510 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
7d520 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
7d530 09 20 20 20 20 7d 0a 09 20 20 64 69 67 69 74 53  .    }..  digitS
7d540 65 67 6d 65 6e 74 20 3d 20 64 69 67 69 74 41 6e  egment = digitAn
7d550 64 4b 65 79 70 61 64 20 2f 20 31 30 3b 0a 09 20  dKeypad / 10;.. 
7d560 20 6b 65 79 70 61 64 4e 75 6d 62 65 72 20 3d 20   keypadNumber = 
7d570 64 69 67 69 74 41 6e 64 4b 65 79 70 61 64 20 25  digitAndKeypad %
7d580 20 31 30 3b 0a 09 20 20 69 66 20 28 28 64 69 67   10;..  if ((dig
7d590 69 74 53 65 67 6d 65 6e 74 20 3c 20 31 29 20 7c  itSegment < 1) |
7d5a0 7c 20 28 64 69 67 69 74 53 65 67 6d 65 6e 74 20  | (digitSegment 
7d5b0 3e 20 34 29 29 0a 09 20 20 20 20 7b 0a 09 09 73  > 4))..    {...s
7d5c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
7d5d0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
7d5e0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
7d5f0 20 20 69 66 20 28 6b 65 79 70 61 64 4e 75 6d 62    if (keypadNumb
7d600 65 72 20 3c 20 31 29 0a 09 20 20 20 20 7b 0a 09  er < 1)..    {..
7d610 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
7d620 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
7d630 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
7d640 0a 09 20 20 78 31 20 3d 20 28 28 64 69 67 69 74  ..  x1 = ((digit
7d650 31 30 30 20 2d 20 31 29 20 2a 20 30 2e 35 29 20  100 - 1) * 0.5) 
7d660 2d 20 31 38 30 2e 30 3b 0a 09 20 20 69 66 20 28  - 180.0;..  if (
7d670 28 64 69 67 69 74 53 65 67 6d 65 6e 74 20 3d 3d  (digitSegment ==
7d680 20 32 29 20 7c 7c 20 28 64 69 67 69 74 53 65 67   2) || (digitSeg
7d690 6d 65 6e 74 20 3d 3d 20 34 29 29 0a 09 20 20 20  ment == 4))..   
7d6a0 20 7b 0a 09 09 78 31 20 2b 3d 20 30 2e 32 35 3b   {...x1 += 0.25;
7d6b0 0a 09 20 20 20 20 7d 0a 09 20 20 79 31 20 3d 20  ..    }..  y1 = 
7d6c0 67 61 72 73 4c 65 74 74 65 72 54 6f 44 65 67 72  garsLetterToDegr
7d6d0 65 65 73 4c 61 74 20 28 6c 65 74 74 65 72 4d 53  eesLat (letterMS
7d6e0 44 2c 20 6c 65 74 74 65 72 4c 53 44 29 3b 0a 09  D, letterLSD);..
7d6f0 20 20 69 66 20 28 28 64 69 67 69 74 53 65 67 6d    if ((digitSegm
7d700 65 6e 74 20 3d 3d 20 31 29 20 7c 7c 20 28 64 69  ent == 1) || (di
7d710 67 69 74 53 65 67 6d 65 6e 74 20 3d 3d 20 32 29  gitSegment == 2)
7d720 29 0a 09 20 20 20 20 7b 0a 09 09 79 31 20 2b 3d  )..    {...y1 +=
7d730 20 30 2e 32 35 3b 0a 09 20 20 20 20 7d 0a 09 20   0.25;..    }.. 
7d740 20 73 77 69 74 63 68 20 28 6b 65 79 70 61 64 4e   switch (keypadN
7d750 75 6d 62 65 72 29 0a 09 20 20 20 20 7b 0a 09 20  umber)..    {.. 
7d760 20 20 20 63 61 73 65 20 31 3a 0a 09 09 78 31 20     case 1:...x1 
7d770 2b 3d 20 30 20 2a 20 30 2e 32 35 20 2f 20 33 3b  += 0 * 0.25 / 3;
7d780 0a 09 09 79 31 20 2b 3d 20 32 20 2a 20 30 2e 32  ...y1 += 2 * 0.2
7d790 35 20 2f 20 33 3b 0a 09 09 62 72 65 61 6b 3b 0a  5 / 3;...break;.
7d7a0 09 20 20 20 20 63 61 73 65 20 32 3a 0a 09 09 78  .    case 2:...x
7d7b0 31 20 2b 3d 20 31 20 2a 20 30 2e 32 35 20 2f 20  1 += 1 * 0.25 / 
7d7c0 33 3b 0a 09 09 79 31 20 2b 3d 20 32 20 2a 20 30  3;...y1 += 2 * 0
7d7d0 2e 32 35 20 2f 20 33 3b 0a 09 09 62 72 65 61 6b  .25 / 3;...break
7d7e0 3b 0a 09 20 20 20 20 63 61 73 65 20 33 3a 0a 09  ;..    case 3:..
7d7f0 09 78 31 20 2b 3d 20 32 20 2a 20 30 2e 32 35 20  .x1 += 2 * 0.25 
7d800 2f 20 33 3b 0a 09 09 79 31 20 2b 3d 20 32 20 2a  / 3;...y1 += 2 *
7d810 20 30 2e 32 35 20 2f 20 33 3b 0a 09 09 62 72 65   0.25 / 3;...bre
7d820 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 34 3a  ak;..    case 4:
7d830 0a 09 09 78 31 20 2b 3d 20 30 20 2a 20 30 2e 32  ...x1 += 0 * 0.2
7d840 35 20 2f 20 33 3b 0a 09 09 79 31 20 2b 3d 20 31  5 / 3;...y1 += 1
7d850 20 2a 20 30 2e 32 35 20 2f 20 33 3b 0a 09 09 62   * 0.25 / 3;...b
7d860 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
7d870 35 3a 0a 09 09 78 31 20 2b 3d 20 31 20 2a 20 30  5:...x1 += 1 * 0
7d880 2e 32 35 20 2f 20 33 3b 0a 09 09 79 31 20 2b 3d  .25 / 3;...y1 +=
7d890 20 31 20 2a 20 30 2e 32 35 20 2f 20 33 3b 0a 09   1 * 0.25 / 3;..
7d8a0 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
7d8b0 65 20 36 3a 0a 09 09 78 31 20 2b 3d 20 32 20 2a  e 6:...x1 += 2 *
7d8c0 20 30 2e 32 35 20 2f 20 33 3b 0a 09 09 79 31 20   0.25 / 3;...y1 
7d8d0 2b 3d 20 31 20 2a 20 30 2e 32 35 20 2f 20 33 3b  += 1 * 0.25 / 3;
7d8e0 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
7d8f0 61 73 65 20 37 3a 0a 09 09 78 31 20 2b 3d 20 30  ase 7:...x1 += 0
7d900 20 2a 20 30 2e 32 35 20 2f 20 33 3b 0a 09 09 79   * 0.25 / 3;...y
7d910 31 20 2b 3d 20 30 20 2a 20 30 2e 32 35 20 2f 20  1 += 0 * 0.25 / 
7d920 33 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  3;...break;..   
7d930 20 63 61 73 65 20 38 3a 0a 09 09 78 31 20 2b 3d   case 8:...x1 +=
7d940 20 31 20 2a 20 30 2e 32 35 20 2f 20 33 3b 0a 09   1 * 0.25 / 3;..
7d950 09 79 31 20 2b 3d 20 30 20 2a 20 30 2e 32 35 20  .y1 += 0 * 0.25 
7d960 2f 20 33 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  / 3;...break;.. 
7d970 20 20 20 63 61 73 65 20 39 3a 0a 09 09 78 31 20     case 9:...x1 
7d980 2b 3d 20 32 20 2a 20 30 2e 32 35 20 2f 20 33 3b  += 2 * 0.25 / 3;
7d990 0a 09 09 79 31 20 2b 3d 20 30 20 2a 20 30 2e 32  ...y1 += 0 * 0.2
7d9a0 35 20 2f 20 33 3b 0a 09 09 62 72 65 61 6b 3b 0a  5 / 3;...break;.
7d9b0 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 28 78  .    }..  if ((x
7d9c0 31 20 3c 20 2d 31 38 30 2e 30 29 20 7c 7c 20 28  1 < -180.0) || (
7d9d0 78 31 20 3e 3d 20 31 38 30 2e 30 29 20 7c 7c 20  x1 >= 180.0) || 
7d9e0 28 79 31 20 3c 20 2d 39 30 2e 30 29 20 7c 7c 20  (y1 < -90.0) || 
7d9f0 28 79 31 20 3e 3d 20 39 30 2e 30 29 29 0a 09 20  (y1 >= 90.0)).. 
7da00 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
7da10 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
7da20 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
7da30 09 20 20 20 20 7d 0a 09 20 20 78 32 20 3d 20 78  .    }..  x2 = x
7da40 31 20 2b 20 28 30 2e 32 35 20 2f 20 33 29 3b 0a  1 + (0.25 / 3);.
7da50 09 20 20 79 32 20 3d 20 79 31 20 2b 20 28 30 2e  .  y2 = y1 + (0.
7da60 32 35 20 2f 20 33 29 3b 0a 20 20 20 20 20 20 7d  25 / 3);.      }
7da70 0a 20 20 20 20 67 61 69 61 42 75 69 6c 64 4d 62  .    gaiaBuildMb
7da80 72 20 28 78 31 2c 20 79 31 2c 20 78 32 2c 20 79  r (x1, y1, x2, y
7da90 32 2c 20 34 33 32 36 2c 20 26 70 5f 72 65 73 75  2, 4326, &p_resu
7daa0 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69  lt, &len);.    i
7dab0 66 20 28 21 70 5f 72 65 73 75 6c 74 29 0a 20 20  f (!p_result).  
7dac0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
7dad0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
7dae0 6e 74 65 78 74 29 3b 0a 09 20 20 73 70 61 74 69  ntext);..  spati
7daf0 61 6c 69 74 65 5f 65 20 28 22 62 61 64 20 70 5f  alite_e ("bad p_
7db00 72 65 73 75 6c 74 5c 6e 22 29 3b 0a 20 20 20 20  result\n");.    
7db10 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 73 71    }.    else..sq
7db20 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
7db30 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
7db40 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
7db50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
7db60 0a 66 6e 63 74 5f 54 6f 47 41 52 53 20 28 73 71  .fnct_ToGARS (sq
7db70 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
7db80 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
7db90 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
7dba0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
7dbb0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 54  QL function:./ T
7dbc0 6f 47 41 52 53 28 42 4c 4f 42 20 65 6e 63 6f 64  oGARS(BLOB encod
7dbd0 65 64 20 50 4f 49 4e 54 29 0a 2f 0a 2f 20 72 65  ed POINT)././ re
7dbe0 74 75 72 6e 73 20 74 68 65 20 47 6c 6f 62 61 6c  turns the Global
7dbf0 20 41 72 65 61 20 52 65 66 65 72 65 6e 63 65 20   Area Reference 
7dc00 53 79 73 74 65 6d 20 63 6f 6f 72 64 69 6e 61 74  System coordinat
7dc10 65 20 61 72 65 61 20 66 6f 72 20 61 20 67 69 76  e area for a giv
7dc20 65 6e 20 70 6f 69 6e 74 2c 0a 2f 20 6f 72 20 4e  en point,./ or N
7dc30 55 4c 4c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ULL if an error 
7dc40 6f 63 63 75 72 73 0a 2a 2f 0a 20 20 20 20 75 6e  occurs.*/.    un
7dc50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
7dc60 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
7dc70 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 70 74  ytes;.    int pt
7dc80 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  s = 0;.    int l
7dc90 6e 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ns = 0;.    int 
7dca0 70 67 73 20 3d 20 30 3b 0a 20 20 20 20 67 61 69  pgs = 0;.    gai
7dcb0 61 50 6f 69 6e 74 50 74 72 20 70 6f 69 6e 74 3b  aPointPtr point;
7dcc0 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72  .    gaiaLinestr
7dcd0 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20 20 20  ingPtr line;.   
7dce0 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
7dcf0 70 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69 61 47  polyg;.    gaiaG
7dd00 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
7dd10 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
7dd20 70 5f 72 65 73 75 6c 74 5b 38 5d 3b 0a 20 20 20  p_result[8];.   
7dd30 20 69 6e 74 20 6c 6f 6e 5f 62 61 6e 64 20 3d 20   int lon_band = 
7dd40 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  0;.    double lo
7dd50 6e 5f 6d 69 6e 75 74 65 73 20 3d 20 30 3b 0a 20  n_minutes = 0;. 
7dd60 20 20 20 69 6e 74 20 73 65 67 6d 65 6e 74 4e 75     int segmentNu
7dd70 6d 62 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mber = 0;.    in
7dd80 74 20 6c 61 74 5f 62 61 6e 64 20 3d 20 30 3b 0a  t lat_band = 0;.
7dd90 20 20 20 20 64 6f 75 62 6c 65 20 6c 61 74 5f 6d      double lat_m
7dda0 69 6e 75 74 65 73 20 3d 20 30 3b 0a 20 20 20 20  inutes = 0;.    
7ddb0 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
7ddc0 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
7ddd0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
7dde0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
7ddf0 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
7de00 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
7de10 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
7de20 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
7de30 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
7de40 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
7de50 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
7de60 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
7de70 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
7de80 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
7de90 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
7dea0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
7deb0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
7dec0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
7ded0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
7dee0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
7def0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
7df00 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
7df10 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
7df20 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
7df30 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
7df40 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
7df50 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
7df60 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
7df70 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
7df80 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
7df90 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
7dfa0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
7dfb0 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
7dfc0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
7dfd0 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
7dfe0 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
7dff0 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
7e000 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
7e010 65 6f 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  eo).      {..  s
7e020 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
7e030 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
7e040 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7e050 0a 20 20 20 20 67 61 69 61 4e 6f 72 6d 61 6c 69  .    gaiaNormali
7e060 7a 65 4c 6f 6e 4c 61 74 20 28 67 65 6f 29 3b 0a  zeLonLat (geo);.
7e070 20 20 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f 2d      point = geo-
7e080 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20  >FirstPoint;.   
7e090 20 77 68 69 6c 65 20 28 70 6f 69 6e 74 20 21 3d   while (point !=
7e0a0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
7e0b0 20 20 70 74 73 2b 2b 3b 0a 09 20 20 70 6f 69 6e    pts++;..  poin
7e0c0 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b  t = point->Next;
7e0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e  .      }.    lin
7e0e0 65 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69  e = geo->FirstLi
7e0f0 6e 65 73 74 72 69 6e 67 3b 0a 20 20 20 20 77 68  nestring;.    wh
7e100 69 6c 65 20 28 6c 69 6e 65 20 21 3d 20 4e 55 4c  ile (line != NUL
7e110 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 6c 6e  L).      {..  ln
7e120 73 2b 2b 3b 0a 09 20 20 6c 69 6e 65 20 3d 20 6c  s++;..  line = l
7e130 69 6e 65 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20  ine->Next;.     
7e140 20 7d 0a 20 20 20 20 70 6f 6c 79 67 20 3d 20 67   }.    polyg = g
7e150 65 6f 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e  eo->FirstPolygon
7e160 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 6f 6c  ;.    while (pol
7e170 79 67 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  yg != NULL).    
7e180 20 20 7b 0a 09 20 20 70 67 73 2b 2b 3b 0a 09 20    {..  pgs++;.. 
7e190 20 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67 2d 3e   polyg = polyg->
7e1a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7e1b0 20 20 69 66 20 28 70 74 73 20 3d 3d 20 31 20 26    if (pts == 1 &
7e1c0 26 20 6c 6e 73 20 3d 3d 20 30 20 26 26 20 70 67  & lns == 0 && pg
7e1d0 73 20 3d 3d 20 30 29 0a 09 70 6f 69 6e 74 20 3d  s == 0)..point =
7e1e0 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 69 6e 74   geo->FirstPoint
7e1f0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
7e200 20 7b 0a 09 20 20 2f 2a 20 6e 6f 74 20 61 20 73   {..  /* not a s
7e210 69 6e 67 6c 65 20 50 6f 69 6e 74 20 2a 2f 0a 09  ingle Point */..
7e220 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
7e230 6c 6c 20 28 67 65 6f 29 3b 0a 09 20 20 73 71 6c  ll (geo);..  sql
7e240 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
7e250 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
7e260 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7e270 20 20 20 2f 2a 20 6c 6f 6e 67 69 74 75 64 65 20     /* longitude 
7e280 62 61 6e 64 20 2a 2f 0a 20 20 20 20 6c 6f 6e 5f  band */.    lon_
7e290 62 61 6e 64 20 3d 20 31 20 2b 20 28 69 6e 74 29  band = 1 + (int)
7e2a0 20 28 28 70 6f 69 6e 74 2d 3e 58 20 2b 20 31 38   ((point->X + 18
7e2b0 30 2e 30 29 20 2a 20 32 29 3b 0a 20 20 20 20 73  0.0) * 2);.    s
7e2c0 70 72 69 6e 74 66 20 28 70 5f 72 65 73 75 6c 74  printf (p_result
7e2d0 2c 20 22 25 30 33 69 22 2c 20 6c 6f 6e 5f 62 61  , "%03i", lon_ba
7e2e0 6e 64 29 3b 0a 20 20 20 20 2f 2a 20 6c 61 74 69  nd);.    /* lati
7e2f0 74 75 64 65 20 62 61 6e 64 20 2a 2f 0a 20 20 20  tude band */.   
7e300 20 6c 61 74 5f 62 61 6e 64 20 3d 20 28 69 6e 74   lat_band = (int
7e310 29 20 28 28 70 6f 69 6e 74 2d 3e 59 20 2b 20 39  ) ((point->Y + 9
7e320 30 2e 30 29 20 2a 20 32 29 3b 0a 20 20 20 20 70  0.0) * 2);.    p
7e330 5f 72 65 73 75 6c 74 5b 33 5d 20 3d 20 67 61 72  _result[3] = gar
7e340 73 4c 65 74 74 65 72 43 6f 64 65 20 28 6c 61 74  sLetterCode (lat
7e350 5f 62 61 6e 64 20 2f 20 32 34 29 3b 0a 20 20 20  _band / 24);.   
7e360 20 70 5f 72 65 73 75 6c 74 5b 34 5d 20 3d 20 67   p_result[4] = g
7e370 61 72 73 4c 65 74 74 65 72 43 6f 64 65 20 28 6c  arsLetterCode (l
7e380 61 74 5f 62 61 6e 64 20 25 20 32 34 29 3b 0a 20  at_band % 24);. 
7e390 20 20 20 2f 2a 20 71 75 61 64 72 61 6e 74 20 2a     /* quadrant *
7e3a0 2f 0a 20 20 20 20 6c 6f 6e 5f 6d 69 6e 75 74 65  /.    lon_minute
7e3b0 73 20 3d 20 66 6d 6f 64 20 28 28 70 6f 69 6e 74  s = fmod ((point
7e3c0 2d 3e 58 20 2b 20 31 38 30 2e 30 29 2c 20 30 2e  ->X + 180.0), 0.
7e3d0 35 29 20 2a 20 36 30 2e 30 3b 0a 20 20 20 20 69  5) * 60.0;.    i
7e3e0 66 20 28 6c 6f 6e 5f 6d 69 6e 75 74 65 73 20 3c  f (lon_minutes <
7e3f0 20 31 35 2e 30 29 0a 20 20 20 20 20 20 7b 0a 09   15.0).      {..
7e400 20 20 73 65 67 6d 65 6e 74 4e 75 6d 62 65 72 20    segmentNumber 
7e410 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
7e420 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
7e430 20 73 65 67 6d 65 6e 74 4e 75 6d 62 65 72 20 3d   segmentNumber =
7e440 20 32 3b 0a 09 20 20 6c 6f 6e 5f 6d 69 6e 75 74   2;..  lon_minut
7e450 65 73 20 2d 3d 20 31 35 2e 30 3b 0a 20 20 20 20  es -= 15.0;.    
7e460 20 20 7d 0a 20 20 20 20 6c 61 74 5f 6d 69 6e 75    }.    lat_minu
7e470 74 65 73 20 3d 20 66 6d 6f 64 20 28 28 70 6f 69  tes = fmod ((poi
7e480 6e 74 2d 3e 59 20 2b 20 39 30 2e 30 29 2c 20 30  nt->Y + 90.0), 0
7e490 2e 35 29 20 2a 20 36 30 2e 30 3b 0a 20 20 20 20  .5) * 60.0;.    
7e4a0 69 66 20 28 6c 61 74 5f 6d 69 6e 75 74 65 73 20  if (lat_minutes 
7e4b0 3c 20 31 35 2e 30 29 0a 20 20 20 20 20 20 7b 0a  < 15.0).      {.
7e4c0 09 20 20 73 65 67 6d 65 6e 74 4e 75 6d 62 65 72  .  segmentNumber
7e4d0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20   += 2;.      }. 
7e4e0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
7e4f0 09 20 20 2f 2a 20 77 65 20 61 6c 72 65 61 64 79  .  /* we already
7e500 20 68 61 76 65 20 74 68 65 20 72 69 67 68 74 20   have the right 
7e510 73 65 67 6d 65 6e 74 20 2a 2f 0a 09 20 20 6c 61  segment */..  la
7e520 74 5f 6d 69 6e 75 74 65 73 20 2d 3d 20 31 35 2e  t_minutes -= 15.
7e530 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  0;.      }.    s
7e540 70 72 69 6e 74 66 20 28 26 28 70 5f 72 65 73 75  printf (&(p_resu
7e550 6c 74 5b 35 5d 29 2c 20 22 25 69 22 2c 20 73 65  lt[5]), "%i", se
7e560 67 6d 65 6e 74 4e 75 6d 62 65 72 29 3b 0a 20 20  gmentNumber);.  
7e570 20 20 2f 2a 20 61 72 65 61 20 2a 2f 0a 20 20 20    /* area */.   
7e580 20 73 65 67 6d 65 6e 74 4e 75 6d 62 65 72 20 3d   segmentNumber =
7e590 20 30 3b 0a 20 20 20 20 69 66 20 28 6c 6f 6e 5f   0;.    if (lon_
7e5a0 6d 69 6e 75 74 65 73 20 3e 3d 20 31 30 2e 30 29  minutes >= 10.0)
7e5b0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 65 67 6d  .      {..  segm
7e5c0 65 6e 74 4e 75 6d 62 65 72 20 3d 20 33 3b 0a 20  entNumber = 3;. 
7e5d0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20       }.    else 
7e5e0 69 66 20 28 6c 6f 6e 5f 6d 69 6e 75 74 65 73 20  if (lon_minutes 
7e5f0 3e 3d 20 35 2e 30 29 0a 20 20 20 20 20 20 7b 0a  >= 5.0).      {.
7e600 09 20 20 73 65 67 6d 65 6e 74 4e 75 6d 62 65 72  .  segmentNumber
7e610 20 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 2;.      }.  
7e620 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
7e630 20 20 73 65 67 6d 65 6e 74 4e 75 6d 62 65 72 20    segmentNumber 
7e640 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
7e650 20 69 66 20 28 6c 61 74 5f 6d 69 6e 75 74 65 73   if (lat_minutes
7e660 20 3e 3d 20 31 30 2e 30 29 0a 20 20 20 20 20 20   >= 10.0).      
7e670 7b 0a 09 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  {..  /* nothing 
7e680 74 6f 20 61 64 64 20 2a 2f 0a 20 20 20 20 20 20  to add */.      
7e690 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c  }.    else if (l
7e6a0 61 74 5f 6d 69 6e 75 74 65 73 20 3e 3d 20 35 2e  at_minutes >= 5.
7e6b0 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 65  0).      {..  se
7e6c0 67 6d 65 6e 74 4e 75 6d 62 65 72 20 2b 3d 20 33  gmentNumber += 3
7e6d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
7e6e0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 65  se.      {..  se
7e6f0 67 6d 65 6e 74 4e 75 6d 62 65 72 20 2b 3d 20 36  gmentNumber += 6
7e700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 70  ;.      }.    sp
7e710 72 69 6e 74 66 20 28 26 28 70 5f 72 65 73 75 6c  rintf (&(p_resul
7e720 74 5b 36 5d 29 2c 20 22 25 69 22 2c 20 73 65 67  t[6]), "%i", seg
7e730 6d 65 6e 74 4e 75 6d 62 65 72 29 3b 0a 20 20 20  mentNumber);.   
7e740 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7e750 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 70  text (context, p
7e760 5f 72 65 73 75 6c 74 2c 20 37 2c 20 53 51 4c 49  _result, 7, SQLI
7e770 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
7e780 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
7e790 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
7e7a0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47  atic void.fnct_G
7e7b0 65 6f 6d 65 74 72 79 4e 20 28 73 71 6c 69 74 65  eometryN (sqlite
7e7c0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
7e7d0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
7e7e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
7e7f0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
7e800 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 6d 65  unction:./ Geome
7e810 74 72 79 4e 28 42 4c 4f 42 20 65 6e 63 6f 64 65  tryN(BLOB encode
7e820 64 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  d GEOMETRYCOLLEC
7e830 54 49 4f 4e 20 67 65 6f 6d 65 74 72 79 29 0a 2f  TION geometry)./
7e840 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 4e  ./ returns the N
7e850 74 68 20 67 65 6f 6d 65 74 72 79 20 66 6f 72 20  th geometry for 
7e860 63 75 72 72 65 6e 74 20 47 45 4f 4d 45 54 52 59  current GEOMETRY
7e870 43 4f 4c 4c 45 43 54 49 4f 4e 20 6f 72 20 4d 55  COLLECTION or MU
7e880 4c 54 49 78 78 78 78 20 67 65 6f 6d 65 74 72 79  LTIxxxx geometry
7e890 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
7e8a0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
7e8b0 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75  untered.*/.    u
7e8c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
7e8d0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
7e8e0 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 65  bytes;.    int e
7e8f0 6e 74 69 74 79 3b 0a 20 20 20 20 69 6e 74 20 6c  ntity;.    int l
7e900 65 6e 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20  en;.    int cnt 
7e910 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b  = 0;.    int iv;
7e920 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a 20 20 20  .    int ib;.   
7e930 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64   double x;.    d
7e940 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75  ouble y;.    dou
7e950 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c  ble z;.    doubl
7e960 65 20 6d 3b 0a 20 20 20 20 67 61 69 61 50 6f 69  e m;.    gaiaPoi
7e970 6e 74 50 74 72 20 70 6f 69 6e 74 3b 0a 20 20 20  ntPtr point;.   
7e980 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50   gaiaLinestringP
7e990 74 72 20 6c 69 6e 65 3b 0a 20 20 20 20 67 61 69  tr line;.    gai
7e9a0 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c  aLinestringPtr l
7e9b0 69 6e 65 32 3b 0a 20 20 20 20 67 61 69 61 50 6f  ine2;.    gaiaPo
7e9c0 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 3b 0a  lygonPtr polyg;.
7e9d0 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50      gaiaPolygonP
7e9e0 74 72 20 70 6f 6c 79 67 32 3b 0a 20 20 20 20 67  tr polyg2;.    g
7e9f0 61 69 61 52 69 6e 67 50 74 72 20 72 69 6e 67 5f  aiaRingPtr ring_
7ea00 69 6e 3b 0a 20 20 20 20 67 61 69 61 52 69 6e 67  in;.    gaiaRing
7ea10 50 74 72 20 72 69 6e 67 5f 6f 75 74 3b 0a 20 20  Ptr ring_out;.  
7ea20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7ea30 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
7ea40 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
7ea50 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c  llPtr geo = NULL
7ea60 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
7ea70 6c 6c 50 74 72 20 72 65 73 75 6c 74 20 3d 20 4e  llPtr result = N
7ea80 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ULL;.    int gpk
7ea90 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
7eaa0 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
7eab0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ode = 0;.    int
7eac0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b   tiny_point = 0;
7ead0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
7eae0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
7eaf0 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
7eb00 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
7eb10 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
7eb20 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
7eb30 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
7eb40 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
7eb50 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
7eb60 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
7eb70 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
7eb80 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
7eb90 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
7eba0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
7ebb0 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
7ebc0 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
7ebd0 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
7ebe0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
7ebf0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
7ec00 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
7ec10 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
7ec20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
7ec30 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
7ec40 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
7ec50 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
7ec60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7ec70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
7ec80 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
7ec90 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
7eca0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
7ecb0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
7ecc0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
7ecd0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
7ece0 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
7ecf0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
7ed00 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
7ed10 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
7ed20 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
7ed30 5b 30 5d 29 3b 0a 20 20 20 20 65 6e 74 69 74 79  [0]);.    entity
7ed40 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7ed50 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
7ed60 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46      geo =..gaiaF
7ed70 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
7ed80 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
7ed90 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
7eda0 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
7edb0 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
7edc0 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71     if (!geo)..sq
7edd0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
7ede0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
7edf0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
7ee00 20 70 6f 69 6e 74 20 3d 20 67 65 6f 2d 3e 46 69   point = geo->Fi
7ee10 72 73 74 50 6f 69 6e 74 3b 0a 09 20 20 77 68 69  rstPoint;..  whi
7ee20 6c 65 20 28 70 6f 69 6e 74 29 0a 09 20 20 20 20  le (point)..    
7ee30 7b 0a 09 09 2f 2a 20 63 6f 75 6e 74 73 20 68 6f  {.../* counts ho
7ee40 77 20 6d 61 6e 79 20 70 6f 69 6e 74 73 20 61 72  w many points ar
7ee50 65 20 74 68 65 72 65 20 2a 2f 0a 09 09 63 6e 74  e there */...cnt
7ee60 2b 2b 3b 0a 09 09 69 66 20 28 63 6e 74 20 3d 3d  ++;...if (cnt ==
7ee70 20 65 6e 74 69 74 79 29 0a 09 09 20 20 7b 0a 09   entity)...  {..
7ee80 09 20 20 20 20 20 20 2f 2a 20 6f 6b 2c 20 72 65  .      /* ok, re
7ee90 71 75 69 72 65 64 20 65 6c 65 6d 65 6e 74 61 72  quired elementar
7eea0 79 20 67 65 6f 6d 65 74 72 79 20 69 73 20 74 68  y geometry is th
7eeb0 69 73 20 50 4f 49 4e 54 20 2a 2f 0a 09 09 20 20  is POINT */...  
7eec0 20 20 20 20 69 66 20 28 70 6f 69 6e 74 2d 3e 44      if (point->D
7eed0 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
7eee0 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09 20   GAIA_XY_Z).... 
7eef0 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c   result = gaiaAl
7ef00 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28  locGeomCollXYZ (
7ef10 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20  );...      else 
7ef20 69 66 20 28 70 6f 69 6e 74 2d 3e 44 69 6d 65 6e  if (point->Dimen
7ef30 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
7ef40 41 5f 58 59 5f 4d 29 0a 09 09 09 20 20 72 65 73  A_XY_M)....  res
7ef50 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47  ult = gaiaAllocG
7ef60 65 6f 6d 43 6f 6c 6c 58 59 4d 20 28 29 3b 0a 09  eomCollXYM ();..
7ef70 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28  .      else if (
7ef80 70 6f 69 6e 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e  point->Dimension
7ef90 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
7efa0 5f 5a 5f 4d 29 0a 09 09 09 20 20 72 65 73 75 6c  _Z_M)....  resul
7efb0 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f  t = gaiaAllocGeo
7efc0 6d 43 6f 6c 6c 58 59 5a 4d 20 28 29 3b 0a 09 09  mCollXYZM ();...
7efd0 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20        else....  
7efe0 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c  result = gaiaAll
7eff0 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09  ocGeomColl ();..
7f000 09 20 20 20 20 20 20 72 65 73 75 6c 74 2d 3e 53  .      result->S
7f010 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b  rid = geo->Srid;
7f020 0a 09 09 20 20 20 20 20 20 69 66 20 28 70 6f 69  ...      if (poi
7f030 6e 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  nt->DimensionMod
7f040 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
7f050 0a 09 09 09 20 20 67 61 69 61 41 64 64 50 6f 69  ....  gaiaAddPoi
7f060 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20  ntToGeomCollXYZ 
7f070 28 72 65 73 75 6c 74 2c 20 70 6f 69 6e 74 2d 3e  (result, point->
7f080 58 2c 0a 09 09 09 09 09 09 20 20 20 20 20 70 6f  X,.......     po
7f090 69 6e 74 2d 3e 59 2c 20 70 6f 69 6e 74 2d 3e 5a  int->Y, point->Z
7f0a0 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20  );...      else 
7f0b0 69 66 20 28 70 6f 69 6e 74 2d 3e 44 69 6d 65 6e  if (point->Dimen
7f0c0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
7f0d0 41 5f 58 59 5f 4d 29 0a 09 09 09 20 20 67 61 69  A_XY_M)....  gai
7f0e0 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43  aAddPointToGeomC
7f0f0 6f 6c 6c 58 59 4d 20 28 72 65 73 75 6c 74 2c 20  ollXYM (result, 
7f100 70 6f 69 6e 74 2d 3e 58 2c 0a 09 09 09 09 09 09  point->X,.......
7f110 20 20 20 20 20 70 6f 69 6e 74 2d 3e 59 2c 20 70       point->Y, p
7f120 6f 69 6e 74 2d 3e 4d 29 3b 0a 09 09 20 20 20 20  oint->M);...    
7f130 20 20 65 6c 73 65 20 69 66 20 28 70 6f 69 6e 74    else if (point
7f140 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
7f150 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
7f160 0a 09 09 09 20 20 67 61 69 61 41 64 64 50 6f 69  ....  gaiaAddPoi
7f170 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d  ntToGeomCollXYZM
7f180 20 28 72 65 73 75 6c 74 2c 20 70 6f 69 6e 74 2d   (result, point-
7f190 3e 58 2c 0a 09 09 09 09 09 09 20 20 20 20 20 20  >X,.......      
7f1a0 70 6f 69 6e 74 2d 3e 59 2c 20 70 6f 69 6e 74 2d  point->Y, point-
7f1b0 3e 5a 2c 0a 09 09 09 09 09 09 20 20 20 20 20 20  >Z,.......      
7f1c0 70 6f 69 6e 74 2d 3e 4d 29 3b 0a 09 09 20 20 20  point->M);...   
7f1d0 20 20 20 65 6c 73 65 0a 09 09 09 20 20 67 61 69     else....  gai
7f1e0 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43  aAddPointToGeomC
7f1f0 6f 6c 6c 20 28 72 65 73 75 6c 74 2c 20 70 6f 69  oll (result, poi
7f200 6e 74 2d 3e 58 2c 20 70 6f 69 6e 74 2d 3e 59 29  nt->X, point->Y)
7f210 3b 0a 09 09 20 20 20 20 20 20 67 6f 74 6f 20 73  ;...      goto s
7f220 6b 69 70 3b 0a 09 09 20 20 7d 0a 09 09 70 6f 69  kip;...  }...poi
7f230 6e 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e 65 78 74  nt = point->Next
7f240 3b 0a 09 20 20 20 20 7d 0a 09 20 20 6c 69 6e 65  ;..    }..  line
7f250 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69 6e   = geo->FirstLin
7f260 65 73 74 72 69 6e 67 3b 0a 09 20 20 77 68 69 6c  estring;..  whil
7f270 65 20 28 6c 69 6e 65 29 0a 09 20 20 20 20 7b 0a  e (line)..    {.
7f280 09 09 2f 2a 20 63 6f 75 6e 74 73 20 68 6f 77 20  ../* counts how 
7f290 6d 61 6e 79 20 6c 69 6e 65 73 74 72 69 6e 67 73  many linestrings
7f2a0 20 61 72 65 20 74 68 65 72 65 20 2a 2f 0a 09 09   are there */...
7f2b0 63 6e 74 2b 2b 3b 0a 09 09 69 66 20 28 63 6e 74  cnt++;...if (cnt
7f2c0 20 3d 3d 20 65 6e 74 69 74 79 29 0a 09 09 20 20   == entity)...  
7f2d0 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 6f 6b 2c  {...      /* ok,
7f2e0 20 72 65 71 75 69 72 65 64 20 65 6c 65 6d 65 6e   required elemen
7f2f0 74 61 72 79 20 67 65 6f 6d 65 74 72 79 20 69 73  tary geometry is
7f300 20 74 68 69 73 20 4c 49 4e 45 53 54 52 49 4e 47   this LINESTRING
7f310 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 20 28   */...      if (
7f320 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  line->DimensionM
7f330 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
7f340 5a 29 0a 09 09 09 20 20 72 65 73 75 6c 74 20 3d  Z)....  result =
7f350 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f   gaiaAllocGeomCo
7f360 6c 6c 58 59 5a 20 28 29 3b 0a 09 09 20 20 20 20  llXYZ ();...    
7f370 20 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d    else if (line-
7f380 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
7f390 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
7f3a0 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61  .  result = gaia
7f3b0 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 4d  AllocGeomCollXYM
7f3c0 20 28 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73   ();...      els
7f3d0 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65  e if (line->Dime
7f3e0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
7f3f0 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 20 20  IA_XY_Z_M)....  
7f400 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c  result = gaiaAll
7f410 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20 28  ocGeomCollXYZM (
7f420 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a  );...      else.
7f430 09 09 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61  ...  result = ga
7f440 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20  iaAllocGeomColl 
7f450 28 29 3b 0a 09 09 20 20 20 20 20 20 72 65 73 75  ();...      resu
7f460 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d 3e  lt->Srid = geo->
7f470 53 72 69 64 3b 0a 09 09 20 20 20 20 20 20 6c 69  Srid;...      li
7f480 6e 65 32 20 3d 0a 09 09 09 20 20 67 61 69 61 41  ne2 =....  gaiaA
7f490 64 64 4c 69 6e 65 73 74 72 69 6e 67 54 6f 47 65  ddLinestringToGe
7f4a0 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 2c 20  omColl (result, 
7f4b0 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 29 3b 0a 09  line->Points);..
7f4c0 09 20 20 20 20 20 20 66 6f 72 20 28 69 76 20 3d  .      for (iv =
7f4d0 20 30 3b 20 69 76 20 3c 20 6c 69 6e 65 32 2d 3e   0; iv < line2->
7f4e0 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09  Points; iv++)...
7f4f0 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28 6c 69  .{....    if (li
7f500 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ne->DimensionMod
7f510 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
7f520 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09  ....      {.....
7f530 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59    gaiaGetPointXY
7f540 5a 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c  Z (line->Coords,
7f550 20 69 76 2c 20 26 78 2c 0a 09 09 09 09 09 09 20   iv, &x,....... 
7f560 20 20 26 79 2c 20 26 7a 29 3b 0a 09 09 09 09 20    &y, &z);..... 
7f570 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a   gaiaSetPointXYZ
7f580 20 28 6c 69 6e 65 32 2d 3e 43 6f 6f 72 64 73 2c   (line2->Coords,
7f590 20 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09   iv, x, y, z);..
7f5a0 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20  ..      }....   
7f5b0 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 65 2d 3e   else if (line->
7f5c0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
7f5d0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09  = GAIA_XY_M)....
7f5e0 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61        {.....  ga
7f5f0 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 6c  iaGetPointXYM (l
7f600 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  ine->Coords, iv,
7f610 20 26 78 2c 0a 09 09 09 09 09 09 20 20 20 26 79   &x,.......   &y
7f620 2c 20 26 6d 29 3b 0a 09 09 09 09 20 20 67 61 69  , &m);.....  gai
7f630 61 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 6c 69  aSetPointXYM (li
7f640 6e 65 32 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  ne2->Coords, iv,
7f650 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 09 09 20 20   x, y, m);....  
7f660 20 20 20 20 7d 0a 09 09 09 20 20 20 20 65 6c 73      }....    els
7f670 65 20 69 66 20 28 6c 69 6e 65 2d 3e 44 69 6d 65  e if (line->Dime
7f680 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
7f690 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 20 20  IA_XY_Z_M)....  
7f6a0 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61 69 61      {.....  gaia
7f6b0 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c 69  GetPointXYZM (li
7f6c0 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ne->Coords, iv, 
7f6d0 26 78 2c 0a 09 09 09 09 09 09 20 20 20 20 26 79  &x,.......    &y
7f6e0 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 09 20  , &z, &m);..... 
7f6f0 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a   gaiaSetPointXYZ
7f700 4d 20 28 6c 69 6e 65 32 2d 3e 43 6f 6f 72 64 73  M (line2->Coords
7f710 2c 20 69 76 2c 20 78 2c 0a 09 09 09 09 09 09 20  , iv, x,....... 
7f720 20 20 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 09     y, z, m);....
7f730 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 65        }....    e
7f740 6c 73 65 0a 09 09 09 20 20 20 20 20 20 7b 0a 09  lse....      {..
7f750 09 09 09 20 20 67 61 69 61 47 65 74 50 6f 69 6e  ...  gaiaGetPoin
7f760 74 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c  t (line->Coords,
7f770 20 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09   iv, &x, &y);...
7f780 09 09 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74  ..  gaiaSetPoint
7f790 20 28 6c 69 6e 65 32 2d 3e 43 6f 6f 72 64 73 2c   (line2->Coords,
7f7a0 20 69 76 2c 20 78 2c 20 79 29 3b 0a 09 09 09 20   iv, x, y);.... 
7f7b0 20 20 20 20 20 7d 0a 09 09 09 7d 0a 09 09 20 20       }....}...  
7f7c0 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 3b 0a 09      goto skip;..
7f7d0 09 20 20 7d 0a 09 09 6c 69 6e 65 20 3d 20 6c 69  .  }...line = li
7f7e0 6e 65 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20 7d  ne->Next;..    }
7f7f0 0a 09 20 20 70 6f 6c 79 67 20 3d 20 67 65 6f 2d  ..  polyg = geo-
7f800 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 09  >FirstPolygon;..
7f810 20 20 77 68 69 6c 65 20 28 70 6f 6c 79 67 29 0a    while (polyg).
7f820 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 75 6e  .    {.../* coun
7f830 74 73 20 68 6f 77 20 6d 61 6e 79 20 70 6f 6c 79  ts how many poly
7f840 67 6f 6e 73 20 61 72 65 20 74 68 65 72 65 20 2a  gons are there *
7f850 2f 0a 09 09 63 6e 74 2b 2b 3b 0a 09 09 69 66 20  /...cnt++;...if 
7f860 28 63 6e 74 20 3d 3d 20 65 6e 74 69 74 79 29 0a  (cnt == entity).
7f870 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a  ..  {...      /*
7f880 20 6f 6b 2c 20 72 65 71 75 69 72 65 64 20 65 6c   ok, required el
7f890 65 6d 65 6e 74 61 72 79 20 67 65 6f 6d 65 74 72  ementary geometr
7f8a0 79 20 69 73 20 74 68 69 73 20 50 4f 4c 59 47 4f  y is this POLYGO
7f8b0 4e 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 20  N */...      if 
7f8c0 28 70 6f 6c 79 67 2d 3e 44 69 6d 65 6e 73 69 6f  (polyg->Dimensio
7f8d0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
7f8e0 59 5f 5a 29 0a 09 09 09 20 20 72 65 73 75 6c 74  Y_Z)....  result
7f8f0 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
7f900 43 6f 6c 6c 58 59 5a 20 28 29 3b 0a 09 09 20 20  CollXYZ ();...  
7f910 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 6f 6c      else if (pol
7f920 79 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  yg->DimensionMod
7f930 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
7f940 0a 09 09 09 20 20 72 65 73 75 6c 74 20 3d 20 67  ....  result = g
7f950 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c  aiaAllocGeomColl
7f960 58 59 4d 20 28 29 3b 0a 09 09 20 20 20 20 20 20  XYM ();...      
7f970 65 6c 73 65 20 69 66 20 28 70 6f 6c 79 67 2d 3e  else if (polyg->
7f980 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
7f990 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
7f9a0 09 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69  ..  result = gai
7f9b0 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59  aAllocGeomCollXY
7f9c0 5a 4d 20 28 29 3b 0a 09 09 20 20 20 20 20 20 65  ZM ();...      e
7f9d0 6c 73 65 0a 09 09 09 20 20 72 65 73 75 6c 74 20  lse....  result 
7f9e0 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43  = gaiaAllocGeomC
7f9f0 6f 6c 6c 20 28 29 3b 0a 09 09 20 20 20 20 20 20  oll ();...      
7fa00 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67  result->Srid = g
7fa10 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 20 20 20 20  eo->Srid;...    
7fa20 20 20 72 69 6e 67 5f 69 6e 20 3d 20 70 6f 6c 79    ring_in = poly
7fa30 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 09 20  g->Exterior;... 
7fa40 20 20 20 20 20 70 6f 6c 79 67 32 20 3d 0a 09 09       polyg2 =...
7fa50 09 20 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f  .  gaiaAddPolygo
7fa60 6e 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  nToGeomColl (res
7fa70 75 6c 74 2c 0a 09 09 09 09 09 09 20 20 20 20 72  ult,.......    r
7fa80 69 6e 67 5f 69 6e 2d 3e 50 6f 69 6e 74 73 2c 0a  ing_in->Points,.
7fa90 09 09 09 09 09 09 20 20 20 20 70 6f 6c 79 67 2d  ......    polyg-
7faa0 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 29 3b 0a  >NumInteriors);.
7fab0 09 09 20 20 20 20 20 20 72 69 6e 67 5f 6f 75 74  ..      ring_out
7fac0 20 3d 20 70 6f 6c 79 67 32 2d 3e 45 78 74 65 72   = polyg2->Exter
7fad0 69 6f 72 3b 0a 09 09 20 20 20 20 20 20 66 6f 72  ior;...      for
7fae0 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 72   (iv = 0; iv < r
7faf0 69 6e 67 5f 6f 75 74 2d 3e 50 6f 69 6e 74 73 3b  ing_out->Points;
7fb00 20 69 76 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20   iv++)....{.... 
7fb10 20 20 20 2f 2a 20 63 6f 70 79 69 6e 67 20 74 68     /* copying th
7fb20 65 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20  e exterior ring 
7fb30 50 4f 49 4e 54 73 20 2a 2f 0a 09 09 09 20 20 20  POINTs */....   
7fb40 20 69 66 20 28 72 69 6e 67 5f 69 6e 2d 3e 44 69   if (ring_in->Di
7fb50 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
7fb60 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09 20 20  GAIA_XY_Z)....  
7fb70 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61 69 61      {.....  gaia
7fb80 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 69 6e  GetPointXYZ (rin
7fb90 67 5f 69 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  g_in->Coords, iv
7fba0 2c 0a 09 09 09 09 09 09 20 20 20 26 78 2c 20 26  ,.......   &x, &
7fbb0 79 2c 20 26 7a 29 3b 0a 09 09 09 09 20 20 67 61  y, &z);.....  ga
7fbc0 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 20 28 72  iaSetPointXYZ (r
7fbd0 69 6e 67 5f 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c  ing_out->Coords,
7fbe0 20 69 76 2c 0a 09 09 09 09 09 09 20 20 20 78 2c   iv,.......   x,
7fbf0 20 79 2c 20 7a 29 3b 0a 09 09 09 20 20 20 20 20   y, z);....     
7fc00 20 7d 0a 09 09 09 20 20 20 20 65 6c 73 65 20 69   }....    else i
7fc10 66 20 28 72 69 6e 67 5f 69 6e 2d 3e 44 69 6d 65  f (ring_in->Dime
7fc20 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
7fc30 49 41 5f 58 59 5f 4d 29 0a 09 09 09 20 20 20 20  IA_XY_M)....    
7fc40 20 20 7b 0a 09 09 09 09 20 20 67 61 69 61 47 65    {.....  gaiaGe
7fc50 74 50 6f 69 6e 74 58 59 4d 20 28 72 69 6e 67 5f  tPointXYM (ring_
7fc60 69 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 0a  in->Coords, iv,.
7fc70 09 09 09 09 09 09 20 20 20 26 78 2c 20 26 79 2c  ......   &x, &y,
7fc80 20 26 6d 29 3b 0a 09 09 09 09 20 20 67 61 69 61   &m);.....  gaia
7fc90 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 72 69 6e  SetPointXYM (rin
7fca0 67 5f 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c 20 69  g_out->Coords, i
7fcb0 76 2c 0a 09 09 09 09 09 09 20 20 20 78 2c 20 79  v,.......   x, y
7fcc0 2c 20 6d 29 3b 0a 09 09 09 20 20 20 20 20 20 7d  , m);....      }
7fcd0 0a 09 09 09 20 20 20 20 65 6c 73 65 20 69 66 20  ....    else if 
7fce0 28 72 69 6e 67 5f 69 6e 2d 3e 44 69 6d 65 6e 73  (ring_in->Dimens
7fcf0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
7fd00 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 20 20 20 20  _XY_Z_M)....    
7fd10 20 20 7b 0a 09 09 09 09 20 20 67 61 69 61 47 65    {.....  gaiaGe
7fd20 74 50 6f 69 6e 74 58 59 5a 4d 20 28 72 69 6e 67  tPointXYZM (ring
7fd30 5f 69 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  _in->Coords, iv,
7fd40 0a 09 09 09 09 09 09 20 20 20 20 26 78 2c 20 26  .......    &x, &
7fd50 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 09  y, &z, &m);.....
7fd60 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59    gaiaSetPointXY
7fd70 5a 4d 20 28 72 69 6e 67 5f 6f 75 74 2d 3e 43 6f  ZM (ring_out->Co
7fd80 6f 72 64 73 2c 20 69 76 2c 0a 09 09 09 09 09 09  ords, iv,.......
7fd90 20 20 20 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b      x, y, z, m);
7fda0 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20  ....      }.... 
7fdb0 20 20 20 65 6c 73 65 0a 09 09 09 20 20 20 20 20     else....     
7fdc0 20 7b 0a 09 09 09 09 20 20 67 61 69 61 47 65 74   {.....  gaiaGet
7fdd0 50 6f 69 6e 74 20 28 72 69 6e 67 5f 69 6e 2d 3e  Point (ring_in->
7fde0 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20  Coords, iv, &x, 
7fdf0 26 79 29 3b 0a 09 09 09 09 20 20 67 61 69 61 53  &y);.....  gaiaS
7fe00 65 74 50 6f 69 6e 74 20 28 72 69 6e 67 5f 6f 75  etPoint (ring_ou
7fe10 74 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78  t->Coords, iv, x
7fe20 2c 20 79 29 3b 0a 09 09 09 20 20 20 20 20 20 7d  , y);....      }
7fe30 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 66 6f  ....}...      fo
7fe40 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20  r (ib = 0; ib < 
7fe50 70 6f 6c 79 67 32 2d 3e 4e 75 6d 49 6e 74 65 72  polyg2->NumInter
7fe60 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 09 09 7b  iors; ib++)....{
7fe70 0a 09 09 09 20 20 20 20 2f 2a 20 70 72 6f 63 65  ....    /* proce
7fe80 73 73 69 6e 67 20 74 68 65 20 69 6e 74 65 72 69  ssing the interi
7fe90 6f 72 20 72 69 6e 67 73 20 2a 2f 0a 09 09 09 20  or rings */.... 
7fea0 20 20 20 72 69 6e 67 5f 69 6e 20 3d 20 70 6f 6c     ring_in = pol
7feb0 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20  yg->Interiors + 
7fec0 69 62 3b 0a 09 09 09 20 20 20 20 72 69 6e 67 5f  ib;....    ring_
7fed0 6f 75 74 20 3d 0a 09 09 09 09 67 61 69 61 41 64  out =.....gaiaAd
7fee0 64 49 6e 74 65 72 69 6f 72 52 69 6e 67 20 28 70  dInteriorRing (p
7fef0 6f 6c 79 67 32 2c 20 69 62 2c 0a 09 09 09 09 09  olyg2, ib,......
7ff00 09 20 20 20 20 20 72 69 6e 67 5f 69 6e 2d 3e 50  .     ring_in->P
7ff10 6f 69 6e 74 73 29 3b 0a 09 09 09 20 20 20 20 66  oints);....    f
7ff20 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c  or (iv = 0; iv <
7ff30 20 72 69 6e 67 5f 6f 75 74 2d 3e 50 6f 69 6e 74   ring_out->Point
7ff40 73 3b 20 69 76 2b 2b 29 0a 09 09 09 20 20 20 20  s; iv++)....    
7ff50 20 20 7b 0a 09 09 09 09 20 20 69 66 20 28 72 69    {.....  if (ri
7ff60 6e 67 5f 69 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e  ng_in->Dimension
7ff70 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
7ff80 5f 5a 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09  _Z).....    {...
7ff90 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
7ffa0 59 5a 20 28 72 69 6e 67 5f 69 6e 2d 3e 43 6f 6f  YZ (ring_in->Coo
7ffb0 72 64 73 2c 0a 09 09 09 09 09 09 09 20 69 76 2c  rds,........ iv,
7ffc0 20 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09   &x, &y, &z);...
7ffd0 09 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58  ...gaiaSetPointX
7ffe0 59 5a 20 28 72 69 6e 67 5f 6f 75 74 2d 3e 43 6f  YZ (ring_out->Co
7fff0 6f 72 64 73 2c 20 69 76 2c 0a 09 09 09 09 09 09  ords, iv,.......
80000 09 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 09 09 09  . x, y, z);.....
80010 20 20 20 20 7d 0a 09 09 09 09 20 20 65 6c 73 65      }.....  else
80020 20 69 66 20 28 72 69 6e 67 5f 69 6e 2d 3e 44 69   if (ring_in->Di
80030 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
80040 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09 09 20  GAIA_XY_M)..... 
80050 20 20 20 7b 0a 09 09 09 09 09 67 61 69 61 47 65     {......gaiaGe
80060 74 50 6f 69 6e 74 58 59 4d 20 28 72 69 6e 67 5f  tPointXYM (ring_
80070 69 6e 2d 3e 43 6f 6f 72 64 73 2c 0a 09 09 09 09  in->Coords,.....
80080 09 09 09 20 69 76 2c 20 26 78 2c 20 26 79 2c 20  ... iv, &x, &y, 
80090 26 6d 29 3b 0a 09 09 09 09 09 67 61 69 61 53 65  &m);......gaiaSe
800a0 74 50 6f 69 6e 74 58 59 4d 20 28 72 69 6e 67 5f  tPointXYM (ring_
800b0 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  out->Coords, iv,
800c0 0a 09 09 09 09 09 09 09 20 78 2c 20 79 2c 20 6d  ........ x, y, m
800d0 29 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09 09 09  );.....    }....
800e0 09 20 20 65 6c 73 65 20 69 66 20 28 72 69 6e 67  .  else if (ring
800f0 5f 69 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  _in->DimensionMo
80100 64 65 6c 20 3d 3d 0a 09 09 09 09 09 20 20 20 47  del ==......   G
80110 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 09  AIA_XY_Z_M).....
80120 20 20 20 20 7b 0a 09 09 09 09 09 67 61 69 61 47      {......gaiaG
80130 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 72 69 6e  etPointXYZM (rin
80140 67 5f 69 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  g_in->Coords, iv
80150 2c 0a 09 09 09 09 09 09 09 20 20 26 78 2c 20 26  ,........  &x, &
80160 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 09  y, &z, &m);.....
80170 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a  .gaiaSetPointXYZ
80180 4d 20 28 72 69 6e 67 5f 6f 75 74 2d 3e 43 6f 6f  M (ring_out->Coo
80190 72 64 73 2c 0a 09 09 09 09 09 09 09 20 20 69 76  rds,........  iv
801a0 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09  , x, y, z, m);..
801b0 09 09 09 20 20 20 20 7d 0a 09 09 09 09 20 20 65  ...    }.....  e
801c0 6c 73 65 0a 09 09 09 09 20 20 20 20 7b 0a 09 09  lse.....    {...
801d0 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 20  ...gaiaGetPoint 
801e0 28 72 69 6e 67 5f 69 6e 2d 3e 43 6f 6f 72 64 73  (ring_in->Coords
801f0 2c 0a 09 09 09 09 09 09 20 20 20 20 20 20 69 76  ,.......      iv
80200 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 09 09 09  , &x, &y);......
80210 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72 69  gaiaSetPoint (ri
80220 6e 67 5f 6f 75 74 2d 3e 43 6f 6f 72 64 73 2c 0a  ng_out->Coords,.
80230 09 09 09 09 09 09 20 20 20 20 20 20 69 76 2c 20  ......      iv, 
80240 78 2c 20 79 29 3b 0a 09 09 09 09 20 20 20 20 7d  x, y);.....    }
80250 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 7d  ....      }....}
80260 0a 09 09 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  ...      goto sk
80270 69 70 3b 0a 09 09 20 20 7d 0a 09 09 70 6f 6c 79  ip;...  }...poly
80280 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b  g = polyg->Next;
80290 0a 09 20 20 20 20 7d 0a 09 73 6b 69 70 3a 0a 09  ..    }..skip:..
802a0 20 20 69 66 20 28 72 65 73 75 6c 74 29 0a 09 20    if (result).. 
802b0 20 20 20 7b 0a 09 09 67 61 69 61 54 6f 53 70 61     {...gaiaToSpa
802c0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
802d0 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65  2 (result, &p_re
802e0 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09  sult, &len,.....
802f0 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20  .    gpkg_mode, 
80300 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 67  tiny_point);...g
80310 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
80320 28 72 65 73 75 6c 74 29 3b 0a 09 09 73 71 6c 69  (result);...sqli
80330 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
80340 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
80350 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
80360 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
80370 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
80380 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
80390 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
803a0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
803b0 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74  l (geo);.}..stat
803c0 69 63 20 76 6f 69 64 0a 6d 62 72 73 5f 65 76 61  ic void.mbrs_eva
803d0 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l (sqlite3_conte
803e0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
803f0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
80400 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 2c 0a 09  value ** argv,..
80410 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 29 0a     int request).
80420 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
80430 6e 3a 0a 2f 20 4d 42 52 73 6f 6d 65 74 68 69 6e  n:./ MBRsomethin
80440 67 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 47  g(BLOB encoded G
80450 45 4f 4d 45 54 52 59 2d 31 2c 20 42 4c 4f 42 20  EOMETRY-1, BLOB 
80460 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45 54 52 59  encoded GEOMETRY
80470 2d 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a  -2)././ returns:
80480 0a 2f 20 31 20 69 66 20 74 68 65 20 72 65 71 75  ./ 1 if the requ
80490 69 72 65 64 20 73 70 61 74 69 61 6c 20 72 65 6c  ired spatial rel
804a0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
804b0 6e 20 74 68 65 20 74 77 6f 20 4d 42 52 73 20 69  n the two MBRs i
804c0 73 20 54 52 55 45 0a 2f 20 30 20 6f 74 68 65 72  s TRUE./ 0 other
804d0 77 69 73 65 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  wise./ or NULL i
804e0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
804f0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
80500 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
80510 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
80520 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
80530 74 20 72 65 74 3b 0a 20 20 20 20 67 61 69 61 47  t ret;.    gaiaG
80540 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20  eomCollPtr geo1 
80550 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
80560 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32  GeomCollPtr geo2
80570 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49   = NULL;.    GAI
80580 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
80590 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
805a0 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
805b0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
805c0 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
805d0 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
805e0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
805f0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
80600 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
80610 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
80620 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
80630 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
80640 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
80650 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
80660 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
80670 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
80680 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
80690 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
806a0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
806b0 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
806c0 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
806d0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
806e0 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
806f0 0a 20 20 20 20 67 65 6f 31 20 3d 20 67 61 69 61  .    geo1 = gaia
80700 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
80710 6f 62 4d 62 72 20 28 70 5f 62 6c 6f 62 2c 20 6e  obMbr (p_blob, n
80720 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 70 5f 62  _bytes);.    p_b
80730 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
80740 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
80750 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
80760 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [1]);.    n_byte
80770 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
80780 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d  e_bytes (argv[1]
80790 29 3b 0a 20 20 20 20 67 65 6f 32 20 3d 20 67 61  );.    geo2 = ga
807a0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
807b0 42 6c 6f 62 4d 62 72 20 28 70 5f 62 6c 6f 62 2c  BlobMbr (p_blob,
807c0 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 69   n_bytes);.    i
807d0 66 20 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f  f (!geo1 || !geo
807e0 32 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  2)..sqlite3_resu
807f0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
80800 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
80810 20 20 7b 0a 09 20 20 72 65 74 20 3d 20 30 3b 0a    {..  ret = 0;.
80820 09 20 20 67 61 69 61 4d 62 72 47 65 6f 6d 65 74  .  gaiaMbrGeomet
80830 72 79 20 28 67 65 6f 31 29 3b 0a 09 20 20 67 61  ry (geo1);..  ga
80840 69 61 4d 62 72 47 65 6f 6d 65 74 72 79 20 28 67  iaMbrGeometry (g
80850 65 6f 32 29 3b 0a 09 20 20 73 77 69 74 63 68 20  eo2);..  switch 
80860 28 72 65 71 75 65 73 74 29 0a 09 20 20 20 20 7b  (request)..    {
80870 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
80880 4d 42 52 5f 43 4f 4e 54 41 49 4e 53 3a 0a 09 09  MBR_CONTAINS:...
80890 72 65 74 20 3d 20 67 61 69 61 4d 62 72 73 43 6f  ret = gaiaMbrsCo
808a0 6e 74 61 69 6e 73 20 28 67 65 6f 31 2c 20 67 65  ntains (geo1, ge
808b0 6f 32 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  o2);...break;.. 
808c0 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 42 52     case GAIA_MBR
808d0 5f 44 49 53 4a 4f 49 4e 54 3a 0a 09 09 72 65 74  _DISJOINT:...ret
808e0 20 3d 20 67 61 69 61 4d 62 72 73 44 69 73 6a 6f   = gaiaMbrsDisjo
808f0 69 6e 74 20 28 67 65 6f 31 2c 20 67 65 6f 32 29  int (geo1, geo2)
80900 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
80910 63 61 73 65 20 47 41 49 41 5f 4d 42 52 5f 45 51  case GAIA_MBR_EQ
80920 55 41 4c 3a 0a 09 09 72 65 74 20 3d 20 67 61 69  UAL:...ret = gai
80930 61 4d 62 72 73 45 71 75 61 6c 20 28 67 65 6f 31  aMbrsEqual (geo1
80940 2c 20 67 65 6f 32 29 3b 0a 09 09 62 72 65 61 6b  , geo2);...break
80950 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
80960 5f 4d 42 52 5f 49 4e 54 45 52 53 45 43 54 53 3a  _MBR_INTERSECTS:
80970 0a 09 09 72 65 74 20 3d 20 67 61 69 61 4d 62 72  ...ret = gaiaMbr
80980 73 49 6e 74 65 72 73 65 63 74 73 20 28 67 65 6f  sIntersects (geo
80990 31 2c 20 67 65 6f 32 29 3b 0a 09 09 62 72 65 61  1, geo2);...brea
809a0 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
809b0 41 5f 4d 42 52 5f 4f 56 45 52 4c 41 50 53 3a 0a  A_MBR_OVERLAPS:.
809c0 09 09 72 65 74 20 3d 20 67 61 69 61 4d 62 72 73  ..ret = gaiaMbrs
809d0 4f 76 65 72 6c 61 70 73 20 28 67 65 6f 31 2c 20  Overlaps (geo1, 
809e0 67 65 6f 32 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  geo2);...break;.
809f0 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
80a00 42 52 5f 54 4f 55 43 48 45 53 3a 0a 09 09 72 65  BR_TOUCHES:...re
80a10 74 20 3d 20 67 61 69 61 4d 62 72 73 54 6f 75 63  t = gaiaMbrsTouc
80a20 68 65 73 20 28 67 65 6f 31 2c 20 67 65 6f 32 29  hes (geo1, geo2)
80a30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
80a40 63 61 73 65 20 47 41 49 41 5f 4d 42 52 5f 57 49  case GAIA_MBR_WI
80a50 54 48 49 4e 3a 0a 09 09 72 65 74 20 3d 20 67 61  THIN:...ret = ga
80a60 69 61 4d 62 72 73 57 69 74 68 69 6e 20 28 67 65  iaMbrsWithin (ge
80a70 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 09 62 72 65  o1, geo2);...bre
80a80 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  ak;..    }..  if
80a90 20 28 72 65 74 20 3c 20 30 29 0a 09 20 20 20 20   (ret < 0)..    
80aa0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
80ab0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
80ac0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
80ad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
80ae0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
80af0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
80b00 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
80b10 28 67 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61  (geo1);.    gaia
80b20 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
80b30 6f 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2f 20 74 68 65  o2);.}../*./ the
80b40 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
80b50 69 6f 6e 73 20 73 69 6d 70 6c 79 20 72 65 61 64  ions simply read
80b60 64 72 65 73 73 20 74 68 65 20 6d 62 72 5f 65 76  dress the mbr_ev
80b70 61 6c 28 29 0a 2f 20 73 65 74 74 69 6e 67 20 74  al()./ setting t
80b80 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
80b90 65 71 75 65 73 74 20 6d 6f 64 65 0a 2a 2f 0a 0a  equest mode.*/..
80ba0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
80bb0 5f 4d 62 72 43 6f 6e 74 61 69 6e 73 20 28 73 71  _MbrContains (sq
80bc0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
80bd0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
80be0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
80bf0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
80c00 6d 62 72 73 5f 65 76 61 6c 20 28 63 6f 6e 74 65  mbrs_eval (conte
80c10 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
80c20 47 41 49 41 5f 4d 42 52 5f 43 4f 4e 54 41 49 4e  GAIA_MBR_CONTAIN
80c30 53 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  S);.}..static vo
80c40 69 64 0a 66 6e 63 74 5f 4d 62 72 44 69 73 6a 6f  id.fnct_MbrDisjo
80c50 69 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  int (sqlite3_con
80c60 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
80c70 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
80c80 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
80c90 0a 7b 0a 20 20 20 20 6d 62 72 73 5f 65 76 61 6c  .{.    mbrs_eval
80ca0 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
80cb0 20 61 72 67 76 2c 20 47 41 49 41 5f 4d 42 52 5f   argv, GAIA_MBR_
80cc0 44 49 53 4a 4f 49 4e 54 29 3b 0a 7d 0a 0a 73 74  DISJOINT);.}..st
80cd0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d  atic void.fnct_M
80ce0 62 72 45 71 75 61 6c 20 28 73 71 6c 69 74 65 33  brEqual (sqlite3
80cf0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
80d00 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
80d10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
80d20 72 67 76 29 0a 7b 0a 20 20 20 20 6d 62 72 73 5f  rgv).{.    mbrs_
80d30 65 76 61 6c 20 28 63 6f 6e 74 65 78 74 2c 20 61  eval (context, a
80d40 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f  rgc, argv, GAIA_
80d50 4d 42 52 5f 45 51 55 41 4c 29 3b 0a 7d 0a 0a 73  MBR_EQUAL);.}..s
80d60 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
80d70 4d 62 72 49 6e 74 65 72 73 65 63 74 73 20 28 73  MbrIntersects (s
80d80 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
80d90 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
80da0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
80db0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
80dc0 20 6d 62 72 73 5f 65 76 61 6c 20 28 63 6f 6e 74   mbrs_eval (cont
80dd0 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ext, argc, argv,
80de0 20 47 41 49 41 5f 4d 42 52 5f 49 4e 54 45 52 53   GAIA_MBR_INTERS
80df0 45 43 54 53 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ECTS);.}..static
80e00 20 76 6f 69 64 0a 66 6e 63 74 5f 45 6e 76 49 6e   void.fnct_EnvIn
80e10 74 65 72 73 65 63 74 73 20 28 73 71 6c 69 74 65  tersects (sqlite
80e20 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
80e30 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
80e40 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
80e50 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
80e60 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f 45 6e  unction:./ ST_En
80e70 76 49 6e 74 65 72 73 65 63 74 73 28 47 65 6f 6d  vIntersects(Geom
80e80 65 74 72 79 20 67 65 6f 6d 2c 20 64 6f 75 62 6c  etry geom, doubl
80e90 65 20 58 31 2c 20 64 6f 75 62 6c 65 20 59 31 2c  e X1, double Y1,
80ea0 20 64 6f 75 62 6c 65 20 58 32 2c 20 64 6f 75 62   double X2, doub
80eb0 6c 65 20 59 32 29 0a 2f 20 53 54 5f 45 6e 76 65  le Y2)./ ST_Enve
80ec0 6c 6f 70 65 73 49 6e 74 65 72 73 65 63 74 73 28  lopesIntersects(
80ed0 47 65 6f 6d 65 74 72 79 20 67 65 6f 6d 2c 20 64  Geometry geom, d
80ee0 6f 75 62 6c 65 20 58 31 2c 20 64 6f 75 62 6c 65  ouble X1, double
80ef0 20 59 31 2c 20 64 6f 75 62 6c 65 20 58 32 2c 20   Y1, double X2, 
80f00 64 6f 75 62 6c 65 20 59 32 29 0a 2f 0a 2f 20 74  double Y2)././ t
80f10 68 65 20 73 65 63 6f 6e 64 20 4d 42 52 20 69 73  he second MBR is
80f20 20 64 65 66 69 6e 65 64 20 62 79 20 74 77 6f 20   defined by two 
80f30 70 6f 69 6e 74 73 20 28 69 64 65 6e 74 69 66 79  points (identify
80f40 69 6e 67 20 61 20 72 65 63 74 61 6e 67 6c 65 27  ing a rectangle'
80f50 73 20 64 69 61 67 6f 6e 61 6c 29 20 0a 2f 20 6f  s diagonal) ./ o
80f60 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
80f70 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
80f80 65 64 0a 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  ed.*/.    double
80f90 20 78 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20   x1;.    double 
80fa0 79 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  y1;.    double x
80fb0 32 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 32  2;.    double y2
80fc0 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  ;.    int int_va
80fd0 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  lue;.    unsigne
80fe0 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
80ff0 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
81000 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 30  .    int ret = 0
81010 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
81020 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c  llPtr geo1 = NUL
81030 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
81040 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55  ollPtr geo2 = NU
81050 4c 4c 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65  LL;.    gaiaLine
81060 73 74 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20 20  stringPtr ln;.  
81070 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
81080 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
81090 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
810a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
810b0 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
810c0 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
810d0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
810e0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
810f0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
81100 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
81110 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
81120 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
81130 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
81140 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
81150 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
81160 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
81170 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
81180 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
81190 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
811a0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
811b0 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
811c0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
811d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
811e0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
811f0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
81200 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
81210 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
81220 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  1]) == SQLITE_FL
81230 4f 41 54 29 0a 09 78 31 20 3d 20 73 71 6c 69 74  OAT)..x1 = sqlit
81240 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
81250 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65  (argv[1]);.    e
81260 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
81270 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
81280 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [1]) == SQLITE_I
81290 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
812a0 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  .  int_value = s
812b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
812c0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 78   (argv[1]);..  x
812d0 31 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  1 = int_value;. 
812e0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
812f0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
81300 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
81310 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
81320 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
81330 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
81340 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
81350 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
81360 54 29 0a 09 79 31 20 3d 20 73 71 6c 69 74 65 33  T)..y1 = sqlite3
81370 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
81380 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[2]);.    els
81390 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
813a0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
813b0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
813c0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
813d0 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
813e0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
813f0 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 79 31 20  argv[2]);..  y1 
81400 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  = int_value;.   
81410 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
81420 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
81430 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
81440 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
81450 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
81460 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
81470 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20  _type (argv[3]) 
81480 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
81490 0a 09 78 32 20 3d 20 73 71 6c 69 74 65 33 5f 76  ..x2 = sqlite3_v
814a0 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
814b0 76 5b 33 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[3]);.    else 
814c0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
814d0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29  e_type (argv[3])
814e0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
814f0 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
81500 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
81510 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
81520 67 76 5b 33 5d 29 3b 0a 09 20 20 78 32 20 3d 20  gv[3]);..  x2 = 
81530 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
81540 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
81550 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
81560 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
81570 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
81580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
81590 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
815a0 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d 3d  ype (argv[4]) ==
815b0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
815c0 79 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  y2 = sqlite3_val
815d0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
815e0 34 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  4]);.    else if
815f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
81600 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d  type (argv[4]) =
81610 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
81620 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
81630 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
81640 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
81650 5b 34 5d 29 3b 0a 09 20 20 79 32 20 3d 20 69 6e  [4]);..  y2 = in
81660 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  t_value;.      }
81670 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
81680 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
81690 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
816a0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
816b0 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
816c0 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
816d0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
816e0 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
816f0 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
81700 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
81710 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
81720 0a 20 20 20 20 67 65 6f 31 20 3d 0a 09 67 61 69  .    geo1 =..gai
81730 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
81740 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
81750 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
81760 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
81770 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
81780 0a 20 20 20 20 69 66 20 28 21 67 65 6f 31 29 0a  .    if (!geo1).
81790 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
817a0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
817b0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
817c0 0a 09 20 20 67 61 69 61 4d 62 72 47 65 6f 6d 65  ..  gaiaMbrGeome
817d0 74 72 79 20 28 67 65 6f 31 29 3b 0a 09 20 20 67  try (geo1);..  g
817e0 65 6f 32 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47  eo2 = gaiaAllocG
817f0 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 20 20 6c  eomColl ();..  l
81800 6e 20 3d 20 67 61 69 61 41 64 64 4c 69 6e 65 73  n = gaiaAddLines
81810 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c 6c 20  tringToGeomColl 
81820 28 67 65 6f 32 2c 20 32 29 3b 0a 09 20 20 67 61  (geo2, 2);..  ga
81830 69 61 53 65 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e  iaSetPoint (ln->
81840 43 6f 6f 72 64 73 2c 20 30 2c 20 78 31 2c 20 79  Coords, 0, x1, y
81850 31 29 3b 0a 09 20 20 67 61 69 61 53 65 74 50 6f  1);..  gaiaSetPo
81860 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  int (ln->Coords,
81870 20 31 2c 20 78 32 2c 20 79 32 29 3b 0a 09 20 20   1, x2, y2);..  
81880 67 61 69 61 4d 62 72 47 65 6f 6d 65 74 72 79 20  gaiaMbrGeometry 
81890 28 67 65 6f 32 29 3b 0a 09 20 20 72 65 74 20 3d  (geo2);..  ret =
818a0 20 67 61 69 61 4d 62 72 73 49 6e 74 65 72 73 65   gaiaMbrsInterse
818b0 63 74 73 20 28 67 65 6f 31 2c 20 67 65 6f 32 29  cts (geo1, geo2)
818c0 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
818d0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
818e0 2c 20 72 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  , ret);.      }.
818f0 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
81900 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20  Coll (geo1);.   
81910 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
81920 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a 0a 73 74  l (geo2);.}...st
81930 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d  atic void.fnct_M
81940 62 72 4f 76 65 72 6c 61 70 73 20 28 73 71 6c 69  brOverlaps (sqli
81950 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
81960 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
81970 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
81980 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 6d 62  * argv).{.    mb
81990 72 73 5f 65 76 61 6c 20 28 63 6f 6e 74 65 78 74  rs_eval (context
819a0 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41  , argc, argv, GA
819b0 49 41 5f 4d 42 52 5f 4f 56 45 52 4c 41 50 53 29  IA_MBR_OVERLAPS)
819c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
819d0 0a 66 6e 63 74 5f 4d 62 72 54 6f 75 63 68 65 73  .fnct_MbrTouches
819e0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
819f0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
81a00 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
81a10 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
81a20 20 20 20 20 6d 62 72 73 5f 65 76 61 6c 20 28 63      mbrs_eval (c
81a30 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
81a40 67 76 2c 20 47 41 49 41 5f 4d 42 52 5f 54 4f 55  gv, GAIA_MBR_TOU
81a50 43 48 45 53 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  CHES);.}..static
81a60 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 62 72 57 69   void.fnct_MbrWi
81a70 74 68 69 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f  thin (sqlite3_co
81a80 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
81a90 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
81aa0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
81ab0 29 0a 7b 0a 20 20 20 20 6d 62 72 73 5f 65 76 61  ).{.    mbrs_eva
81ac0 6c 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  l (context, argc
81ad0 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4d 42 52  , argv, GAIA_MBR
81ae0 5f 57 49 54 48 49 4e 29 3b 0a 7d 0a 0a 73 74 61  _WITHIN);.}..sta
81af0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 68  tic void.fnct_Sh
81b00 69 66 74 43 6f 6f 72 64 73 20 28 73 71 6c 69 74  iftCoords (sqlit
81b10 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
81b20 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
81b30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
81b40 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
81b50 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 68 69 66  function:./ Shif
81b60 74 43 6f 6f 72 64 73 28 42 4c 4f 42 65 6e 63 6f  tCoords(BLOBenco
81b70 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20 73 68  ded geometry, sh
81b80 69 66 74 58 2c 20 73 68 69 66 74 59 29 0a 2f 0a  iftX, shiftY)./.
81b90 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  / returns a new 
81ba0 67 65 6f 6d 65 74 72 79 20 74 68 61 74 20 69 73  geometry that is
81bb0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e   the original on
81bc0 65 20 72 65 63 65 69 76 65 64 2c 20 62 75 74 20  e received, but 
81bd0 77 69 74 68 20 73 68 69 66 74 65 64 20 63 6f 6f  with shifted coo
81be0 72 64 69 6e 61 74 65 73 0a 2f 20 6f 72 20 4e 55  rdinates./ or NU
81bf0 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
81c00 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
81c10 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
81c20 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
81c30 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
81c40 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
81c50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
81c60 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
81c70 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
81c80 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
81c90 20 20 20 64 6f 75 62 6c 65 20 73 68 69 66 74 5f     double shift_
81ca0 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 68  x;.    double sh
81cb0 69 66 74 5f 79 3b 0a 20 20 20 20 69 6e 74 20 69  ift_y;.    int i
81cc0 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 69 6e  nt_value;.    in
81cd0 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
81ce0 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
81cf0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
81d00 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
81d10 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
81d20 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
81d30 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
81d40 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
81d50 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
81d60 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
81d70 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
81d80 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
81d90 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
81da0 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
81db0 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
81dc0 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
81dd0 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
81de0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
81df0 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
81e00 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
81e10 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
81e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
81e30 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
81e40 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
81e50 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
81e60 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
81e70 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
81e80 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
81e90 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
81ea0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
81eb0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
81ec0 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
81ed0 29 0a 09 73 68 69 66 74 5f 78 20 3d 20 73 71 6c  )..shift_x = sql
81ee0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
81ef0 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  e (argv[1]);.   
81f00 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
81f10 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
81f20 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
81f30 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
81f40 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
81f50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
81f60 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
81f70 20 73 68 69 66 74 5f 78 20 3d 20 69 6e 74 5f 76   shift_x = int_v
81f80 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alue;.      }.  
81f90 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
81fa0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
81fb0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
81fc0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
81fd0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
81fe0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
81ff0 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
82000 54 45 5f 46 4c 4f 41 54 29 0a 09 73 68 69 66 74  TE_FLOAT)..shift
82010 5f 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  _y = sqlite3_val
82020 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
82030 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  2]);.    else if
82040 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
82050 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
82060 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
82070 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
82080 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
82090 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
820a0 5b 32 5d 29 3b 0a 09 20 20 73 68 69 66 74 5f 79  [2]);..  shift_y
820b0 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20   = int_value;.  
820c0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
820d0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
820e0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
820f0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
82100 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
82110 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
82120 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
82130 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
82140 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
82150 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
82160 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
82170 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
82180 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
82190 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
821a0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
821b0 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
821c0 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
821d0 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
821e0 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
821f0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
82200 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
82210 20 20 7b 0a 09 20 20 67 61 69 61 53 68 69 66 74    {..  gaiaShift
82220 43 6f 6f 72 64 73 20 28 67 65 6f 2c 20 73 68 69  Coords (geo, shi
82230 66 74 5f 78 2c 20 73 68 69 66 74 5f 79 29 3b 0a  ft_x, shift_y);.
82240 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c  .  gaiaToSpatiaL
82250 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67  iteBlobWkbEx2 (g
82260 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  eo, &p_result, &
82270 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  len, gpkg_mode,.
82280 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70  ....      tiny_p
82290 6f 69 6e 74 29 3b 0a 09 20 20 69 66 20 28 21 70  oint);..  if (!p
822a0 5f 72 65 73 75 6c 74 29 0a 09 20 20 20 20 20 20  _result)..      
822b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
822c0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
822d0 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71    else..      sq
822e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
822f0 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
82300 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
82310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
82320 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
82330 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  geo);.}..static 
82340 76 6f 69 64 0a 66 6e 63 74 5f 54 72 61 6e 73 6c  void.fnct_Transl
82350 61 74 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ate (sqlite3_con
82360 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
82370 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
82380 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
82390 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
823a0 6f 6e 3a 0a 2f 20 54 72 61 6e 73 6c 61 74 65 28  on:./ Translate(
823b0 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
823c0 65 74 72 79 2c 20 73 68 69 66 74 58 2c 20 73 68  etry, shiftX, sh
823d0 69 66 74 59 2c 20 73 68 69 66 74 5a 29 0a 2f 0a  iftY, shiftZ)./.
823e0 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  / returns a new 
823f0 67 65 6f 6d 65 74 72 79 20 74 68 61 74 20 69 73  geometry that is
82400 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e   the original on
82410 65 20 72 65 63 65 69 76 65 64 2c 20 62 75 74 20  e received, but 
82420 77 69 74 68 20 73 68 69 66 74 65 64 20 63 6f 6f  with shifted coo
82430 72 64 69 6e 61 74 65 73 0a 2f 20 6f 72 20 4e 55  rdinates./ or NU
82440 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
82450 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
82460 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
82470 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
82480 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
82490 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
824a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
824b0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
824c0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
824d0 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
824e0 20 20 20 64 6f 75 62 6c 65 20 73 68 69 66 74 5f     double shift_
824f0 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 68  x;.    double sh
82500 69 66 74 5f 79 3b 0a 20 20 20 20 64 6f 75 62 6c  ift_y;.    doubl
82510 65 20 73 68 69 66 74 5f 7a 3b 0a 20 20 20 20 69  e shift_z;.    i
82520 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20  nt int_value;.  
82530 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
82540 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
82550 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
82560 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
82570 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
82580 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
82590 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
825a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
825b0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
825c0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
825d0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
825e0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
825f0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
82600 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
82610 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
82620 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
82630 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
82640 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
82650 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
82660 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
82670 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
82680 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
82690 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
826a0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
826b0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
826c0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
826d0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
826e0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
826f0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
82700 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
82710 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
82720 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [1]) == SQLITE_F
82730 4c 4f 41 54 29 0a 09 73 68 69 66 74 5f 78 20 3d  LOAT)..shift_x =
82740 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
82750 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b  ouble (argv[1]);
82760 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
82770 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
82780 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
82790 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
827a0 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
827b0 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
827c0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
827d0 3b 0a 09 20 20 73 68 69 66 74 5f 78 20 3d 20 69  ;..  shift_x = i
827e0 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  nt_value;.      
827f0 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
82800 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
82810 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
82820 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
82830 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
82840 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
82850 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
82860 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 73  SQLITE_FLOAT)..s
82870 68 69 66 74 5f 79 20 3d 20 73 71 6c 69 74 65 33  hift_y = sqlite3
82880 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
82890 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[2]);.    els
828a0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
828b0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
828c0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
828d0 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
828e0 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
828f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
82900 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 73 68 69  argv[2]);..  shi
82910 66 74 5f 79 20 3d 20 69 6e 74 5f 76 61 6c 75 65  ft_y = int_value
82920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
82930 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
82940 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
82950 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
82960 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
82970 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
82980 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
82990 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [3]) == SQLITE_F
829a0 4c 4f 41 54 29 0a 09 73 68 69 66 74 5f 7a 20 3d  LOAT)..shift_z =
829b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
829c0 6f 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b  ouble (argv[3]);
829d0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
829e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
829f0 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51   (argv[3]) == SQ
82a00 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
82a10 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
82a20 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
82a30 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29  ue_int (argv[3])
82a40 3b 0a 09 20 20 73 68 69 66 74 5f 7a 20 3d 20 69  ;..  shift_z = i
82a50 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  nt_value;.      
82a60 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
82a70 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
82a80 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
82a90 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
82aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
82ab0 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
82ac0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
82ad0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
82ae0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
82af0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
82b00 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
82b10 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
82b20 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
82b30 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
82b40 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
82b50 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
82b60 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
82b70 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
82b80 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
82b90 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
82ba0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
82bb0 09 20 20 67 61 69 61 53 68 69 66 74 43 6f 6f 72  .  gaiaShiftCoor
82bc0 64 73 33 44 20 28 67 65 6f 2c 20 73 68 69 66 74  ds3D (geo, shift
82bd0 5f 78 2c 20 73 68 69 66 74 5f 79 2c 20 73 68 69  _x, shift_y, shi
82be0 66 74 5f 7a 29 3b 0a 09 20 20 67 61 69 61 54 6f  ft_z);..  gaiaTo
82bf0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
82c00 62 45 78 32 20 28 67 65 6f 2c 20 26 70 5f 72 65  bEx2 (geo, &p_re
82c10 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67  sult, &len, gpkg
82c20 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
82c30 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20   tiny_point);.. 
82c40 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29 0a   if (!p_result).
82c50 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
82c60 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
82c70 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ext);..  else.. 
82c80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
82c90 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
82ca0 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
82cb0 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  , free);.      }
82cc0 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
82cd0 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
82ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
82cf0 74 5f 53 68 69 66 74 4c 6f 6e 67 69 74 75 64 65  t_ShiftLongitude
82d00 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
82d10 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
82d20 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
82d30 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
82d40 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
82d50 0a 2f 20 53 68 69 66 74 4c 6f 6e 67 69 74 75 64  ./ ShiftLongitud
82d60 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  e(BLOBencoded ge
82d70 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
82d80 72 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65 74  rns a new geomet
82d90 72 79 20 74 68 61 74 20 69 73 20 74 68 65 20 6f  ry that is the o
82da0 72 69 67 69 6e 61 6c 20 6f 6e 65 20 72 65 63 65  riginal one rece
82db0 69 76 65 64 2c 20 62 75 74 20 77 69 74 68 20 6e  ived, but with n
82dc0 65 67 61 74 69 76 65 0a 2f 20 6c 6f 6e 67 69 74  egative./ longit
82dd0 75 64 65 73 20 73 68 69 66 74 65 64 20 62 79 20  udes shifted by 
82de0 33 36 30 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  360./ or NULL if
82df0 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
82e00 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
82e10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
82e20 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
82e30 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74  n_bytes;.    int
82e40 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e   len;.    unsign
82e50 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
82e60 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
82e70 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
82e80 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
82e90 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
82ea0 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
82eb0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
82ec0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
82ed0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
82ee0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
82ef0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
82f00 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
82f10 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
82f20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
82f30 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
82f40 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
82f50 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
82f60 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
82f70 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
82f80 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
82f90 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
82fa0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
82fb0 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
82fc0 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
82fd0 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
82fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
82ff0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
83000 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
83010 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
83020 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
83030 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
83040 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
83050 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
83060 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
83070 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
83080 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
83090 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
830a0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
830b0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
830c0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
830d0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
830e0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
830f0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
83100 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
83110 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
83120 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
83130 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
83140 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
83150 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
83160 20 20 7b 0a 09 20 20 67 61 69 61 53 68 69 66 74    {..  gaiaShift
83170 4c 6f 6e 67 69 74 75 64 65 20 28 67 65 6f 29 3b  Longitude (geo);
83180 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61  ..  gaiaToSpatia
83190 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
831a0 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  geo, &p_result, 
831b0 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  &len, gpkg_mode,
831c0 0a 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f  .....      tiny_
831d0 70 6f 69 6e 74 29 3b 0a 09 20 20 69 66 20 28 21  point);..  if (!
831e0 70 5f 72 65 73 75 6c 74 29 0a 09 20 20 20 20 20  p_result)..     
831f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
83200 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
83210 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
83220 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
83230 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
83240 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
83250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
83260 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
83270 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
83280 20 76 6f 69 64 0a 66 6e 63 74 5f 4e 6f 72 6d 61   void.fnct_Norma
83290 6c 69 7a 65 4c 6f 6e 4c 61 74 20 28 73 71 6c 69  lizeLonLat (sqli
832a0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
832b0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
832c0 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
832d0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
832e0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
832f0 6e 3a 0a 2f 20 4e 6f 72 6d 61 6c 69 7a 65 4c 6f  n:./ NormalizeLo
83300 6e 4c 61 74 20 28 42 4c 4f 42 65 6e 63 6f 64 65  nLat (BLOBencode
83310 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20  d geometry)././ 
83320 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65  returns a new ge
83330 6f 6d 65 74 72 79 20 74 68 61 74 20 69 73 20 74  ometry that is t
83340 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e 65 20  he original one 
83350 72 65 63 65 69 76 65 64 2c 20 62 75 74 20 77 69  received, but wi
83360 74 68 20 6c 6f 6e 67 69 74 75 64 65 0a 2f 20 61  th longitude./ a
83370 6e 64 20 6c 61 74 69 74 75 64 65 20 76 61 6c 75  nd latitude valu
83380 65 73 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  es shifted into 
83390 74 68 65 20 72 61 6e 67 65 20 5b 2d 31 38 30 20  the range [-180 
833a0 2d 20 31 38 30 2c 20 2d 39 30 20 2d 20 39 30 5d  - 180, -90 - 90]
833b0 2e 20 0a 2f 20 4e 55 4c 4c 20 69 73 20 72 65 74  . ./ NULL is ret
833c0 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
833d0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
833e0 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
833f0 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
83400 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
83410 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
83420 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
83430 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
83440 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
83450 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c  llPtr geo = NULL
83460 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
83470 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
83480 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
83490 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69   = 0;.    int ti
834a0 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  ny_point = 0;.  
834b0 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
834c0 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
834d0 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
834e0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
834f0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
83500 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
83510 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
83520 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
83530 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
83540 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
83550 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
83560 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
83570 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
83580 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
83590 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
835a0 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
835b0 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
835c0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
835d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
835e0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
835f0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
83600 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
83610 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
83620 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
83630 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
83640 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
83650 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
83660 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
83670 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
83680 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
83690 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
836a0 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f    geo =..gaiaFro
836b0 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
836c0 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
836d0 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
836e0 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
836f0 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
83700 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69   if (!geo)..sqli
83710 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
83720 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
83730 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  lse.      {..  g
83740 61 69 61 4e 6f 72 6d 61 6c 69 7a 65 4c 6f 6e 4c  aiaNormalizeLonL
83750 61 74 20 28 67 65 6f 29 3b 0a 09 20 20 67 61 69  at (geo);..  gai
83760 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
83770 62 57 6b 62 45 78 32 20 28 67 65 6f 2c 20 26 70  bWkbEx2 (geo, &p
83780 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67  _result, &len, g
83790 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
837a0 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b      tiny_point);
837b0 0a 09 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c  ..  if (!p_resul
837c0 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  t)..      sqlite
837d0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
837e0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65  ontext);..  else
837f0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
83800 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
83810 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
83820 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20  len, free);.    
83830 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
83840 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
83850 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
83860 6e 63 74 5f 53 63 61 6c 65 43 6f 6f 72 64 73 20  nct_ScaleCoords 
83870 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
83880 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
83890 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
838a0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
838b0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
838c0 2f 20 53 63 61 6c 65 43 6f 6f 72 64 73 28 42 4c  / ScaleCoords(BL
838d0 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  OBencoded geomet
838e0 72 79 2c 20 73 63 61 6c 65 5f 66 61 63 74 6f 72  ry, scale_factor
838f0 5f 78 20 5b 2c 20 73 63 61 6c 65 5f 66 61 63 74  _x [, scale_fact
83900 6f 72 5f 79 5d 29 0a 2f 0a 2f 20 72 65 74 75 72  or_y])././ retur
83910 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65 74 72  ns a new geometr
83920 79 20 74 68 61 74 20 69 73 20 74 68 65 20 6f 72  y that is the or
83930 69 67 69 6e 61 6c 20 6f 6e 65 20 72 65 63 65 69  iginal one recei
83940 76 65 64 2c 20 62 75 74 20 77 69 74 68 20 73 63  ved, but with sc
83950 61 6c 65 64 20 63 6f 6f 72 64 69 6e 61 74 65 73  aled coordinates
83960 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
83970 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
83980 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
83990 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
839a0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
839b0 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
839c0 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
839d0 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
839e0 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
839f0 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
83a00 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c   NULL;.    doubl
83a10 65 20 73 63 61 6c 65 5f 78 3b 0a 20 20 20 20 64  e scale_x;.    d
83a20 6f 75 62 6c 65 20 73 63 61 6c 65 5f 79 3b 0a 20  ouble scale_y;. 
83a30 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65     int int_value
83a40 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
83a50 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
83a60 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
83a70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69   = 0;.    int ti
83a80 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  ny_point = 0;.  
83a90 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
83aa0 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
83ab0 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
83ac0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
83ad0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
83ae0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
83af0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
83b00 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
83b10 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
83b20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
83b30 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
83b40 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
83b50 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
83b60 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
83b70 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
83b80 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
83b90 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
83ba0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
83bb0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
83bc0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
83bd0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
83be0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
83bf0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
83c00 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
83c10 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
83c20 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
83c30 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
83c40 54 45 5f 46 4c 4f 41 54 29 0a 09 73 63 61 6c 65  TE_FLOAT)..scale
83c50 5f 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  _x = sqlite3_val
83c60 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
83c70 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  1]);.    else if
83c80 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
83c90 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
83ca0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
83cb0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
83cc0 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
83cd0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
83ce0 5b 31 5d 29 3b 0a 09 20 20 73 63 61 6c 65 5f 78  [1]);..  scale_x
83cf0 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20   = int_value;.  
83d00 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
83d10 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
83d20 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
83d30 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
83d40 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
83d50 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29 0a 09  if (argc == 2)..
83d60 73 63 61 6c 65 5f 79 20 3d 20 73 63 61 6c 65 5f  scale_y = scale_
83d70 78 3b 09 2f 2a 20 74 68 69 73 20 6f 6e 65 20 69  x;./* this one i
83d80 73 20 61 6e 20 69 73 6f 74 72 6f 70 69 63 20 73  s an isotropic s
83d90 63 61 6c 69 6e 67 20 72 65 71 75 65 73 74 20 2a  caling request *
83da0 2f 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  /.    else.     
83db0 20 7b 0a 09 20 20 2f 2a 20 61 6e 20 61 6e 69 73   {..  /* an anis
83dc0 6f 74 72 6f 70 69 63 20 73 63 61 6c 69 6e 67 20  otropic scaling 
83dd0 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
83de0 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
83df0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
83e00 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  2]) == SQLITE_FL
83e10 4f 41 54 29 0a 09 20 20 20 20 20 20 73 63 61 6c  OAT)..      scal
83e20 65 5f 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e_y = sqlite3_va
83e30 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
83e40 5b 32 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  [2]);..  else if
83e50 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
83e60 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
83e70 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
83e80 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
83e90 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
83ea0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32  alue_int (argv[2
83eb0 5d 29 3b 0a 09 09 73 63 61 6c 65 5f 79 20 3d 20  ]);...scale_y = 
83ec0 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20  int_value;..    
83ed0 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
83ee0 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
83ef0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
83f00 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
83f10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70   }.      }.    p
83f20 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
83f30 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
83f40 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
83f50 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
83f60 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
83f70 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
83f80 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09  0]);.    geo =..
83f90 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
83fa0 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
83fb0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
83fc0 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
83fd0 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
83fe0 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f  s);.    if (!geo
83ff0 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
84000 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
84010 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
84020 20 7b 0a 09 20 20 67 61 69 61 53 63 61 6c 65 43   {..  gaiaScaleC
84030 6f 6f 72 64 73 20 28 67 65 6f 2c 20 73 63 61 6c  oords (geo, scal
84040 65 5f 78 2c 20 73 63 61 6c 65 5f 79 29 3b 0a 09  e_x, scale_y);..
84050 20 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69    gaiaToSpatiaLi
84060 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67 65  teBlobWkbEx2 (ge
84070 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c  o, &p_result, &l
84080 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  en, gpkg_mode,..
84090 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f  ...      tiny_po
840a0 69 6e 74 29 3b 0a 09 20 20 69 66 20 28 21 70 5f  int);..  if (!p_
840b0 72 65 73 75 6c 74 29 0a 09 20 20 20 20 20 20 73  result)..      s
840c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
840d0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
840e0 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c   else..      sql
840f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
84100 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73   (context, p_res
84110 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b  ult, len, free);
84120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
84130 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
84140 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  eo);.}..static v
84150 6f 69 64 0a 66 6e 63 74 5f 52 6f 74 61 74 65 43  oid.fnct_RotateC
84160 6f 6f 72 64 73 20 28 73 71 6c 69 74 65 33 5f 63  oords (sqlite3_c
84170 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
84180 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
84190 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
841a0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
841b0 74 69 6f 6e 3a 0a 2f 20 52 6f 74 61 74 65 43 6f  tion:./ RotateCo
841c0 6f 72 64 73 28 42 4c 4f 42 65 6e 63 6f 64 65 64  ords(BLOBencoded
841d0 20 67 65 6f 6d 65 74 72 79 2c 20 61 6e 67 6c 65   geometry, angle
841e0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20  )././ returns a 
841f0 6e 65 77 20 67 65 6f 6d 65 74 72 79 20 74 68 61  new geometry tha
84200 74 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61  t is the origina
84210 6c 20 6f 6e 65 20 72 65 63 65 69 76 65 64 2c 20  l one received, 
84220 62 75 74 20 77 69 74 68 20 72 6f 74 61 74 65 64  but with rotated
84230 20 63 6f 6f 72 64 69 6e 61 74 65 73 0a 2f 20 6f   coordinates./ o
84240 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
84250 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
84260 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ed.*/.    unsign
84270 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
84280 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
84290 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
842a0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
842b0 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
842c0 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
842d0 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
842e0 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 61 6e  L;.    double an
842f0 67 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74  gle;.    int int
84300 5f 76 61 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20  _value;.    int 
84310 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
84320 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
84330 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
84340 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
84350 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
84360 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
84370 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
84380 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
84390 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
843a0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
843b0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
843c0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
843d0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
843e0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
843f0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
84400 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
84410 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
84420 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
84430 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
84440 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
84450 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
84460 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
84470 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
84480 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
84490 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
844a0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
844b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
844c0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
844d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
844e0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
844f0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
84500 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
84510 09 61 6e 67 6c 65 20 3d 20 73 71 6c 69 74 65 33  .angle = sqlite3
84520 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
84530 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
84540 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
84550 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
84560 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
84570 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
84580 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
84590 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
845a0 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 61 6e 67  argv[1]);..  ang
845b0 6c 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a  le = int_value;.
845c0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
845d0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
845e0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
845f0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
84600 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
84610 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
84620 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
84630 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
84640 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
84650 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
84660 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
84670 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20  gv[0]);.    geo 
84680 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
84690 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
846a0 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
846b0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
846c0 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
846d0 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
846e0 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  geo)..sqlite3_re
846f0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
84700 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
84710 20 20 20 20 7b 0a 09 20 20 67 61 69 61 52 6f 74      {..  gaiaRot
84720 61 74 65 43 6f 6f 72 64 73 20 28 67 65 6f 2c 20  ateCoords (geo, 
84730 61 6e 67 6c 65 29 3b 0a 09 20 20 67 61 69 61 54  angle);..  gaiaT
84740 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
84750 6b 62 45 78 32 20 28 67 65 6f 2c 20 26 70 5f 72  kbEx2 (geo, &p_r
84760 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b  esult, &len, gpk
84770 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
84780 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09    tiny_point);..
84790 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74 29    if (!p_result)
847a0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
847b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
847c0 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
847d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
847e0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
847f0 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
84800 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20  n, free);.      
84810 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
84820 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a  omColl (geo);.}.
84830 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
84840 74 5f 52 65 66 6c 65 63 74 43 6f 6f 72 64 73 20  t_ReflectCoords 
84850 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
84860 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
84870 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
84880 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
84890 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
848a0 2f 20 52 65 66 6c 65 63 74 43 6f 6f 72 64 73 28  / ReflectCoords(
848b0 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
848c0 65 74 72 79 2c 20 78 5f 61 78 69 73 2c 20 20 79  etry, x_axis,  y
848d0 5f 61 78 69 73 29 0a 2f 0a 2f 20 72 65 74 75 72  _axis)././ retur
848e0 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65 74 72  ns a new geometr
848f0 79 20 74 68 61 74 20 69 73 20 74 68 65 20 6f 72  y that is the or
84900 69 67 69 6e 61 6c 20 6f 6e 65 20 72 65 63 65 69  iginal one recei
84910 76 65 64 2c 20 62 75 74 20 77 69 74 68 20 6d 69  ved, but with mi
84920 72 72 6f 72 65 64 20 63 6f 6f 72 64 69 6e 61 74  rrored coordinat
84930 65 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  es./ or NULL if 
84940 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
84950 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
84960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
84970 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
84980 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
84990 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  len;.    unsigne
849a0 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
849b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
849c0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
849d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
849e0 20 78 5f 61 78 69 73 3b 0a 20 20 20 20 69 6e 74   x_axis;.    int
849f0 20 79 5f 61 78 69 73 3b 0a 20 20 20 20 69 6e 74   y_axis;.    int
84a00 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
84a10 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
84a20 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
84a30 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
84a40 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
84a50 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
84a60 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
84a70 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
84a80 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
84a90 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
84aa0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
84ab0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
84ac0 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
84ad0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
84ae0 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
84af0 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
84b00 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
84b10 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
84b20 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f  g_mode;..  tiny_
84b30 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
84b40 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
84b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
84b60 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
84b70 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
84b80 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
84b90 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
84ba0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
84bb0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
84bc0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
84bd0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
84be0 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
84bf0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
84c00 52 29 0a 09 78 5f 61 78 69 73 20 3d 20 73 71 6c  R)..x_axis = sql
84c10 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
84c20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c  argv[1]);.    el
84c30 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
84c40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
84c50 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
84c60 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
84c70 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
84c80 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
84c90 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
84ca0 4e 54 45 47 45 52 29 0a 09 79 5f 61 78 69 73 20  NTEGER)..y_axis 
84cb0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
84cc0 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20  int (argv[2]);. 
84cd0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
84ce0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
84cf0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
84d00 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
84d10 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
84d20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
84d30 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
84d40 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
84d50 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
84d60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
84d70 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
84d80 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72     geo =..gaiaFr
84d90 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
84da0 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
84db0 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
84dc0 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
84dd0 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
84de0 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c    if (!geo)..sql
84df0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
84e00 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
84e10 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
84e20 67 61 69 61 52 65 66 6c 65 63 74 43 6f 6f 72 64  gaiaReflectCoord
84e30 73 20 28 67 65 6f 2c 20 78 5f 61 78 69 73 2c 20  s (geo, x_axis, 
84e40 79 5f 61 78 69 73 29 3b 0a 09 20 20 67 61 69 61  y_axis);..  gaia
84e50 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
84e60 57 6b 62 45 78 32 20 28 67 65 6f 2c 20 26 70 5f  WkbEx2 (geo, &p_
84e70 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70  result, &len, gp
84e80 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
84e90 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a     tiny_point);.
84ea0 09 20 20 69 66 20 28 21 70 5f 72 65 73 75 6c 74  .  if (!p_result
84eb0 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
84ec0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
84ed0 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
84ee0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
84ef0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
84f00 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
84f10 65 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20  en, free);.     
84f20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
84f30 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d  eomColl (geo);.}
84f40 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
84f50 63 74 5f 53 77 61 70 43 6f 6f 72 64 73 20 28 73  ct_SwapCoords (s
84f60 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
84f70 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
84f80 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
84f90 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
84fa0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
84fb0 53 77 61 70 43 6f 6f 72 64 73 28 42 4c 4f 42 65  SwapCoords(BLOBe
84fc0 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29  ncoded geometry)
84fd0 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 6e  ././ returns a n
84fe0 65 77 20 67 65 6f 6d 65 74 72 79 20 74 68 61 74  ew geometry that
84ff0 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
85000 20 6f 6e 65 20 72 65 63 65 69 76 65 64 2c 20 62   one received, b
85010 75 74 20 77 69 74 68 20 73 77 61 70 70 65 64 20  ut with swapped 
85020 78 2d 20 61 6e 64 20 79 2d 63 6f 6f 72 64 69 6e  x- and y-coordin
85030 61 74 65 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ate./ or NULL if
85040 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
85050 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
85060 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
85070 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
85080 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74  n_bytes;.    int
85090 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e   len;.    unsign
850a0 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
850b0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
850c0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
850d0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
850e0 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
850f0 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
85100 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
85110 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
85120 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
85130 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
85140 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
85150 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
85160 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
85170 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
85180 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
85190 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
851a0 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
851b0 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
851c0 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
851d0 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
851e0 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
851f0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
85200 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
85210 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
85220 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
85230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
85240 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
85250 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
85260 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
85270 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
85280 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
85290 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
852a0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
852b0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
852c0 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
852d0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
852e0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
852f0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
85300 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
85310 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
85320 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
85330 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
85340 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
85350 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
85360 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
85370 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
85380 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
85390 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
853a0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
853b0 20 20 7b 0a 09 20 20 67 61 69 61 53 77 61 70 43    {..  gaiaSwapC
853c0 6f 6f 72 64 73 20 28 67 65 6f 29 3b 0a 09 20 20  oords (geo);..  
853d0 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
853e0 42 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 2c  BlobWkbEx2 (geo,
853f0 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
85400 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
85410 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e  .      tiny_poin
85420 74 29 3b 0a 09 20 20 69 66 20 28 21 70 5f 72 65  t);..  if (!p_re
85430 73 75 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c  sult)..      sql
85440 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
85450 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65   (context);..  e
85460 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lse..      sqlit
85470 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
85480 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
85490 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 20  t, len, free);. 
854a0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
854b0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
854c0 29 3b 0a 7d 0a 0a 53 50 41 54 49 41 4c 49 54 45  );.}..SPATIALITE
854d0 5f 50 52 49 56 41 54 45 20 69 6e 74 0a 67 65 74  _PRIVATE int.get
854e0 45 6c 6c 69 70 73 6f 69 64 50 61 72 61 6d 73 20  EllipsoidParams 
854f0 28 76 6f 69 64 20 2a 70 5f 73 71 6c 69 74 65 2c  (void *p_sqlite,
85500 20 69 6e 74 20 73 72 69 64 2c 20 64 6f 75 62 6c   int srid, doubl
85510 65 20 2a 61 2c 20 64 6f 75 62 6c 65 20 2a 62 2c  e *a, double *b,
85520 20 64 6f 75 62 6c 65 20 2a 72 66 29 0a 7b 0a 2f   double *rf).{./
85530 2a 20 0a 2f 20 72 65 74 72 69 65 76 65 73 20 74  * ./ retrieves t
85540 68 65 20 50 52 4f 4a 20 2b 65 6c 6c 70 73 3d 78  he PROJ +ellps=x
85550 78 20 5b 2b 61 3d 78 78 20 2b 62 3d 78 78 5d 20  x [+a=xx +b=xx] 
85560 70 61 72 61 6d 73 20 0a 2f 66 72 6f 6d 20 53 50  params ./from SP
85570 41 54 49 41 4c 5f 53 59 53 5f 52 45 46 20 74 61  ATIAL_SYS_REF ta
85580 62 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ble, if possible
85590 20 0a 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33   .*/.    sqlite3
855a0 20 2a 73 71 6c 69 74 65 20 3d 20 28 73 71 6c 69   *sqlite = (sqli
855b0 74 65 33 20 2a 29 20 70 5f 73 71 6c 69 74 65 3b  te3 *) p_sqlite;
855c0 0a 20 20 20 20 63 68 61 72 20 2a 70 72 6f 6a 34  .    char *proj4
855d0 74 65 78 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  text;.    char *
855e0 70 5f 70 72 6f 6a 3b 0a 20 20 20 20 63 68 61 72  p_proj;.    char
855f0 20 2a 70 5f 65 6c 6c 70 73 3b 0a 20 20 20 20 63   *p_ellps;.    c
85600 68 61 72 20 2a 70 5f 64 61 74 75 6d 3b 0a 20 20  har *p_datum;.  
85610 20 20 63 68 61 72 20 2a 70 5f 61 3b 0a 20 20 20    char *p_a;.   
85620 20 63 68 61 72 20 2a 70 5f 62 3b 0a 20 20 20 20   char *p_b;.    
85630 63 68 61 72 20 2a 70 5f 65 6e 64 3b 0a 0a 20 20  char *p_end;..  
85640 20 20 69 66 20 28 73 72 69 64 20 3d 3d 20 30 29    if (srid == 0)
85650 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 0a  .      {..  /* .
85660 09 20 20 20 20 20 2f 20 53 52 49 44 3d 30 20 69  .     / SRID=0 i
85670 73 20 66 6f 72 6d 61 6c 6c 79 20 64 65 66 69 6e  s formally defin
85680 65 64 20 61 73 20 22 55 6e 64 65 66 69 6e 65 64  ed as "Undefined
85690 20 47 65 6f 67 72 61 70 68 69 63 22 0a 09 20 20   Geographic"..  
856a0 20 20 20 2f 20 73 6f 20 77 69 6c 6c 20 64 65 66     / so will def
856b0 61 75 6c 74 20 74 6f 20 53 52 49 44 3d 34 33 32  ault to SRID=432
856c0 36 20 28 57 47 53 38 34 20 4c 6f 6e 67 2f 4c 61  6 (WGS84 Long/La
856d0 74 29 0a 09 20 20 20 2a 2f 0a 09 20 20 73 72 69  t)..   */..  sri
856e0 64 20 3d 20 34 33 32 36 3b 0a 20 20 20 20 20 20  d = 4326;.      
856f0 7d 0a 20 20 20 20 67 65 74 50 72 6f 6a 50 61 72  }.    getProjPar
85700 61 6d 73 20 28 73 71 6c 69 74 65 2c 20 73 72 69  ams (sqlite, sri
85710 64 2c 20 26 70 72 6f 6a 34 74 65 78 74 29 3b 0a  d, &proj4text);.
85720 20 20 20 20 69 66 20 28 70 72 6f 6a 34 74 65 78      if (proj4tex
85730 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75  t == NULL)..retu
85740 72 6e 20 30 3b 0a 2f 2a 20 70 61 72 73 69 6e 67  rn 0;./* parsing
85750 20 74 68 65 20 70 72 6f 6a 34 74 65 78 74 20 67   the proj4text g
85760 65 6f 64 65 73 69 63 20 73 74 72 69 6e 67 20 2a  eodesic string *
85770 2f 0a 20 20 20 20 70 5f 70 72 6f 6a 20 3d 20 73  /.    p_proj = s
85780 74 72 73 74 72 20 28 70 72 6f 6a 34 74 65 78 74  trstr (proj4text
85790 2c 20 22 2b 70 72 6f 6a 3d 22 29 3b 0a 20 20 20  , "+proj=");.   
857a0 20 70 5f 64 61 74 75 6d 20 3d 20 73 74 72 73 74   p_datum = strst
857b0 72 20 28 70 72 6f 6a 34 74 65 78 74 2c 20 22 2b  r (proj4text, "+
857c0 64 61 74 75 6d 3d 22 29 3b 0a 20 20 20 20 70 5f  datum=");.    p_
857d0 65 6c 6c 70 73 20 3d 20 73 74 72 73 74 72 20 28  ellps = strstr (
857e0 70 72 6f 6a 34 74 65 78 74 2c 20 22 2b 65 6c 6c  proj4text, "+ell
857f0 70 73 3d 22 29 3b 0a 20 20 20 20 70 5f 61 20 3d  ps=");.    p_a =
85800 20 73 74 72 73 74 72 20 28 70 72 6f 6a 34 74 65   strstr (proj4te
85810 78 74 2c 20 22 2b 61 3d 22 29 3b 0a 20 20 20 20  xt, "+a=");.    
85820 70 5f 62 20 3d 20 73 74 72 73 74 72 20 28 70 72  p_b = strstr (pr
85830 6f 6a 34 74 65 78 74 2c 20 22 2b 62 3d 22 29 3b  oj4text, "+b=");
85840 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69 66 20  ./* checking if 
85850 2b 70 72 6f 6a 3d 6c 6f 6e 67 6c 61 74 20 69 73  +proj=longlat is
85860 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 69 66 20   true */.    if 
85870 28 21 70 5f 70 72 6f 6a 29 0a 09 67 6f 74 6f 20  (!p_proj)..goto 
85880 69 6e 76 61 6c 69 64 3b 0a 20 20 20 20 70 5f 65  invalid;.    p_e
85890 6e 64 20 3d 20 73 74 72 63 68 72 20 28 70 5f 70  nd = strchr (p_p
858a0 72 6f 6a 2c 20 27 20 27 29 3b 0a 20 20 20 20 69  roj, ' ');.    i
858b0 66 20 28 70 5f 65 6e 64 29 0a 09 2a 70 5f 65 6e  f (p_end)..*p_en
858c0 64 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69 66  d = '\0';.    if
858d0 20 28 73 74 72 63 6d 70 20 28 70 5f 70 72 6f 6a   (strcmp (p_proj
858e0 20 2b 20 36 2c 20 22 6c 6f 6e 67 6c 61 74 22 29   + 6, "longlat")
858f0 20 21 3d 20 30 29 0a 09 67 6f 74 6f 20 69 6e 76   != 0)..goto inv
85900 61 6c 69 64 3b 0a 20 20 20 20 69 66 20 28 70 5f  alid;.    if (p_
85910 65 6c 6c 70 73 29 0a 20 20 20 20 20 20 7b 0a 09  ellps).      {..
85920 20 20 2f 2a 20 74 72 79 69 6e 67 20 74 6f 20 72    /* trying to r
85930 65 74 72 69 65 76 65 20 74 68 65 20 65 6c 6c 69  etrieve the elli
85940 70 73 6f 69 64 20 70 61 72 61 6d 73 20 62 79 20  psoid params by 
85950 6e 61 6d 65 20 2a 2f 0a 09 20 20 70 5f 65 6e 64  name */..  p_end
85960 20 3d 20 73 74 72 63 68 72 20 28 70 5f 65 6c 6c   = strchr (p_ell
85970 70 73 2c 20 27 20 27 29 3b 0a 09 20 20 69 66 20  ps, ' ');..  if 
85980 28 70 5f 65 6e 64 29 0a 09 20 20 20 20 20 20 2a  (p_end)..      *
85990 70 5f 65 6e 64 20 3d 20 27 5c 30 27 3b 0a 09 20  p_end = '\0';.. 
859a0 20 69 66 20 28 67 61 69 61 45 6c 6c 69 70 73 65   if (gaiaEllipse
859b0 50 61 72 61 6d 73 20 28 70 5f 65 6c 6c 70 73 20  Params (p_ellps 
859c0 2b 20 37 2c 20 61 2c 20 62 2c 20 72 66 29 29 0a  + 7, a, b, rf)).
859d0 09 20 20 20 20 20 20 67 6f 74 6f 20 76 61 6c 69  .      goto vali
859e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  d;.      }.    e
859f0 6c 73 65 20 69 66 20 28 70 5f 64 61 74 75 6d 29  lse if (p_datum)
85a00 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 0a 09  .      {..  /*..
85a10 20 20 20 20 20 2f 20 73 74 61 72 74 69 6e 67 20       / starting 
85a20 73 69 6e 63 65 20 47 44 41 4c 20 31 2e 39 2e 30  since GDAL 1.9.0
85a30 20 74 68 65 20 57 47 53 38 34 20 5b 34 33 32 36   the WGS84 [4326
85a40 5d 20 50 52 4f 4a 2e 34 20 64 65 66 20 64 6f 65  ] PROJ.4 def doe
85a50 73 6e 27 74 20 0a 09 20 20 20 20 20 2f 20 64 65  sn't ..     / de
85a60 63 6c 61 72 65 73 20 61 6e 79 20 6c 6f 6e 67 65  clares any longe
85a70 72 20 74 68 65 20 22 2b 65 6c 6c 70 73 3d 22 20  r the "+ellps=" 
85a80 70 61 72 61 6d 0a 09 20 20 20 20 20 2f 20 69 6e  param..     / in
85a90 20 74 68 69 73 20 63 61 73 65 20 77 65 27 6c 6c   this case we'll
85aa0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 63 6f   attempt to reco
85ab0 76 65 72 20 75 73 69 6e 67 20 22 2b 64 61 74 75  ver using "+datu
85ac0 6d 3d 22 2e 0a 09 20 20 20 2a 2f 0a 09 20 20 70  m="...   */..  p
85ad0 5f 65 6e 64 20 3d 20 73 74 72 63 68 72 20 28 70  _end = strchr (p
85ae0 5f 64 61 74 75 6d 2c 20 27 20 27 29 3b 0a 09 20  _datum, ' ');.. 
85af0 20 69 66 20 28 70 5f 65 6e 64 29 0a 09 20 20 20   if (p_end)..   
85b00 20 20 20 2a 70 5f 65 6e 64 20 3d 20 27 5c 30 27     *p_end = '\0'
85b10 3b 0a 09 20 20 69 66 20 28 67 61 69 61 45 6c 6c  ;..  if (gaiaEll
85b20 69 70 73 65 50 61 72 61 6d 73 20 28 70 5f 64 61  ipseParams (p_da
85b30 74 75 6d 20 2b 20 37 2c 20 61 2c 20 62 2c 20 72  tum + 7, a, b, r
85b40 66 29 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20  f))..      goto 
85b50 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20  valid;.      }. 
85b60 20 20 20 69 66 20 28 70 5f 61 20 26 26 20 70 5f     if (p_a && p_
85b70 62 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  b).      {..  /*
85b80 20 74 72 79 69 6e 67 20 74 6f 20 72 65 74 72 69   trying to retri
85b90 65 76 65 20 74 68 65 20 2b 61 3d 78 78 20 61 6e  eve the +a=xx an
85ba0 64 20 2b 62 3d 78 78 20 61 72 67 73 20 2a 2f 0a  d +b=xx args */.
85bb0 09 20 20 70 5f 65 6e 64 20 3d 20 73 74 72 63 68  .  p_end = strch
85bc0 72 20 28 70 5f 61 2c 20 27 20 27 29 3b 0a 09 20  r (p_a, ' ');.. 
85bd0 20 69 66 20 28 70 5f 65 6e 64 29 0a 09 20 20 20   if (p_end)..   
85be0 20 20 20 2a 70 5f 65 6e 64 20 3d 20 27 5c 30 27     *p_end = '\0'
85bf0 3b 0a 09 20 20 70 5f 65 6e 64 20 3d 20 73 74 72  ;..  p_end = str
85c00 63 68 72 20 28 70 5f 62 2c 20 27 20 27 29 3b 0a  chr (p_b, ' ');.
85c10 09 20 20 69 66 20 28 70 5f 65 6e 64 29 0a 09 20  .  if (p_end).. 
85c20 20 20 20 20 20 2a 70 5f 65 6e 64 20 3d 20 27 5c       *p_end = '\
85c30 30 27 3b 0a 09 20 20 2a 61 20 3d 20 61 74 6f 66  0';..  *a = atof
85c40 20 28 70 5f 61 20 2b 20 33 29 3b 0a 09 20 20 2a   (p_a + 3);..  *
85c50 62 20 3d 20 61 74 6f 66 20 28 70 5f 62 20 2b 20  b = atof (p_b + 
85c60 33 29 3b 0a 09 20 20 2a 72 66 20 3d 20 31 2e 30  3);..  *rf = 1.0
85c70 20 2f 20 28 28 2a 61 20 2d 20 2a 62 29 20 2f 20   / ((*a - *b) / 
85c80 2a 61 29 3b 0a 09 20 20 67 6f 74 6f 20 76 61 6c  *a);..  goto val
85c90 69 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 76  id;.      }..  v
85ca0 61 6c 69 64 3a 0a 20 20 20 20 66 72 65 65 20 28  alid:.    free (
85cb0 70 72 6f 6a 34 74 65 78 74 29 3b 0a 20 20 20 20  proj4text);.    
85cc0 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 69 6e 76  return 1;..  inv
85cd0 61 6c 69 64 3a 0a 20 20 20 20 66 72 65 65 20 28  alid:.    free (
85ce0 70 72 6f 6a 34 74 65 78 74 29 3b 0a 20 20 20 20  proj4text);.    
85cf0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
85d00 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 46 72  tic void.fnct_Fr
85d10 6f 6d 45 57 4b 42 20 28 73 71 6c 69 74 65 33 5f  omEWKB (sqlite3_
85d20 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
85d30 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
85d40 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
85d50 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
85d60 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 6d 46 72 6f  ction:./ GeomFro
85d70 6d 45 57 4b 42 28 45 57 4b 42 20 65 6e 63 6f 64  mEWKB(EWKB encod
85d80 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  ed geometry)././
85d90 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72   returns the cur
85da0 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 62 79  rent geometry by
85db0 20 70 61 72 73 69 6e 67 20 47 65 6f 73 2f 50 6f   parsing Geos/Po
85dc0 73 74 47 69 73 20 45 57 4b 42 20 65 6e 63 6f 64  stGis EWKB encod
85dd0 65 64 20 73 74 72 69 6e 67 20 0a 2f 20 6f 72 20  ed string ./ or 
85de0 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
85df0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
85e00 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  .*/.    int len;
85e10 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
85e20 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
85e30 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ULL;.    const u
85e40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
85e50 78 74 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  xt;.    gaiaGeom
85e60 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
85e70 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  LL;.    int gpkg
85e80 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
85e90 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
85ea0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
85eb0 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
85ec0 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
85ed0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
85ee0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
85ef0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
85f00 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
85f10 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
85f20 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
85f30 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20   {..  gpkg_mode 
85f40 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
85f50 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
85f60 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
85f70 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
85f80 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
85f90 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
85fa0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
85fb0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
85fc0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
85fd0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
85fe0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
85ff0 20 20 20 20 20 7d 0a 20 20 20 20 74 65 78 74 20       }.    text 
86000 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
86010 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
86020 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 46 72      geo = gaiaFr
86030 6f 6d 45 57 4b 42 20 28 74 65 78 74 29 3b 0a 20  omEWKB (text);. 
86040 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55     if (geo == NU
86050 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  LL).      {..  s
86060 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
86070 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
86080 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
86090 0a 20 20 20 20 67 61 69 61 54 6f 53 70 61 74 69  .    gaiaToSpati
860a0 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20  aLiteBlobWkbEx2 
860b0 28 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c  (geo, &p_result,
860c0 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
860d0 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 20  , tiny_point);. 
860e0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
860f0 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 73  oll (geo);.    s
86100 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
86110 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
86120 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
86130 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
86140 64 0a 66 6e 63 74 5f 54 6f 45 57 4b 42 20 28 73  d.fnct_ToEWKB (s
86150 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
86160 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
86170 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
86180 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
86190 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
861a0 41 73 45 57 4b 42 28 42 4c 4f 42 20 65 6e 63 6f  AsEWKB(BLOB enco
861b0 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a  ded geometry)./.
861c0 2f 20 72 65 74 75 72 6e 73 20 61 20 74 65 78 74  / returns a text
861d0 20 73 74 72 69 6e 67 20 63 6f 72 72 65 73 70 6f   string correspo
861e0 6e 64 69 6e 67 20 74 6f 20 47 65 6f 73 2f 50 6f  nding to Geos/Po
861f0 73 74 47 49 53 20 45 57 4b 42 20 6e 6f 74 61 74  stGIS EWKB notat
86200 69 6f 6e 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ion ./ or NULL i
86210 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
86220 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
86230 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86240 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
86250 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
86260 74 20 6c 65 6e 3b 0a 20 20 20 20 67 61 69 61 4f  t len;.    gaiaO
86270 75 74 42 75 66 66 65 72 20 6f 75 74 5f 62 75 66  utBuffer out_buf
86280 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
86290 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c  llPtr geo = NULL
862a0 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
862b0 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
862c0 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
862d0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
862e0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
862f0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
86300 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
86310 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
86320 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
86330 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
86340 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
86350 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
86360 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
86370 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
86380 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
86390 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
863a0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
863b0 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d  kg_mode;.      }
863c0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
863d0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
863e0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
863f0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
86400 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
86410 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
86420 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
86430 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
86440 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
86450 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
86460 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
86470 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
86480 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
86490 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
864a0 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
864b0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
864c0 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
864d0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
864e0 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
864f0 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
86500 69 66 20 28 21 67 65 6f 29 0a 20 20 20 20 20 20  if (!geo).      
86510 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
86520 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
86530 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
86540 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
86550 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 4f        {..  gaiaO
86560 75 74 42 75 66 66 65 72 49 6e 69 74 69 61 6c 69  utBufferInitiali
86570 7a 65 20 28 26 6f 75 74 5f 62 75 66 29 3b 0a 09  ze (&out_buf);..
86580 20 20 67 61 69 61 54 6f 45 57 4b 42 20 28 26 6f    gaiaToEWKB (&o
86590 75 74 5f 62 75 66 2c 20 67 65 6f 29 3b 0a 09 20  ut_buf, geo);.. 
865a0 20 69 66 20 28 6f 75 74 5f 62 75 66 2e 45 72 72   if (out_buf.Err
865b0 6f 72 20 7c 7c 20 6f 75 74 5f 62 75 66 2e 42 75  or || out_buf.Bu
865c0 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20  ffer == NULL).. 
865d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
865e0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
865f0 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  t);..  else..   
86600 20 7b 0a 09 09 6c 65 6e 20 3d 20 6f 75 74 5f 62   {...len = out_b
86610 75 66 2e 57 72 69 74 65 4f 66 66 73 65 74 3b 0a  uf.WriteOffset;.
86620 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
86630 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
86640 6f 75 74 5f 62 75 66 2e 42 75 66 66 65 72 2c 20  out_buf.Buffer, 
86650 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 6f 75  len, free);...ou
86660 74 5f 62 75 66 2e 42 75 66 66 65 72 20 3d 20 4e  t_buf.Buffer = N
86670 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  ULL;..    }.    
86680 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
86690 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
866a0 20 20 20 20 67 61 69 61 4f 75 74 42 75 66 66 65      gaiaOutBuffe
866b0 72 52 65 73 65 74 20 28 26 6f 75 74 5f 62 75 66  rReset (&out_buf
866c0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
866d0 64 0a 66 6e 63 74 5f 54 6f 45 57 4b 54 20 28 73  d.fnct_ToEWKT (s
866e0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
866f0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
86700 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
86710 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
86720 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
86730 41 73 45 57 4b 54 28 42 4c 4f 42 20 65 6e 63 6f  AsEWKT(BLOB enco
86740 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a  ded geometry)./.
86750 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  / returns the co
86760 72 72 65 73 70 6f 6e 64 69 6e 67 20 50 6f 73 74  rresponding Post
86770 47 49 53 20 45 57 4b 54 20 65 6e 63 6f 64 65 64  GIS EWKT encoded
86780 20 76 61 6c 75 65 0a 2f 20 6f 72 20 4e 55 4c 4c   value./ or NULL
86790 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
867a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
867b0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
867c0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
867d0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
867e0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 67 61 69  int len;.    gai
867f0 61 4f 75 74 42 75 66 66 65 72 20 6f 75 74 5f 62  aOutBuffer out_b
86800 75 66 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  uf;.    gaiaGeom
86810 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
86820 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  LL;.    int gpkg
86830 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
86840 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
86850 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  de = 0;.    stru
86860 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
86870 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
86880 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
86890 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
868a0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
868b0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
868c0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
868d0 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
868e0 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
868f0 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
86900 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
86910 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
86920 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
86930 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20  gpkg_mode;.     
86940 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
86950 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
86960 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
86970 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
86980 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
86990 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
869a0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
869b0 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
869c0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
869d0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
869e0 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
869f0 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
86a00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
86a10 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
86a20 20 20 20 67 61 69 61 4f 75 74 42 75 66 66 65 72     gaiaOutBuffer
86a30 49 6e 69 74 69 61 6c 69 7a 65 20 28 26 6f 75 74  Initialize (&out
86a40 5f 62 75 66 29 3b 0a 20 20 20 20 67 65 6f 20 3d  _buf);.    geo =
86a50 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
86a60 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
86a70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
86a80 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
86a90 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
86aa0 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
86ab0 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
86ac0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
86ad0 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
86ae0 20 20 20 7b 0a 09 20 20 67 61 69 61 54 6f 45 57     {..  gaiaToEW
86af0 4b 54 20 28 26 6f 75 74 5f 62 75 66 2c 20 67 65  KT (&out_buf, ge
86b00 6f 29 3b 0a 09 20 20 69 66 20 28 6f 75 74 5f 62  o);..  if (out_b
86b10 75 66 2e 45 72 72 6f 72 20 7c 7c 20 6f 75 74 5f  uf.Error || out_
86b20 62 75 66 2e 42 75 66 66 65 72 20 3d 3d 20 4e 55  buf.Buffer == NU
86b30 4c 4c 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  LL)..      sqlit
86b40 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
86b50 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
86b60 65 0a 09 20 20 20 20 7b 0a 09 09 6c 65 6e 20 3d  e..    {...len =
86b70 20 6f 75 74 5f 62 75 66 2e 57 72 69 74 65 4f 66   out_buf.WriteOf
86b80 66 73 65 74 3b 0a 09 09 73 71 6c 69 74 65 33 5f  fset;...sqlite3_
86b90 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e  result_text (con
86ba0 74 65 78 74 2c 20 6f 75 74 5f 62 75 66 2e 42 75  text, out_buf.Bu
86bb0 66 66 65 72 2c 20 6c 65 6e 2c 20 66 72 65 65 29  ffer, len, free)
86bc0 3b 0a 09 09 6f 75 74 5f 62 75 66 2e 42 75 66 66  ;...out_buf.Buff
86bd0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  er = NULL;..    
86be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  }.      }.    ga
86bf0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
86c00 67 65 6f 29 3b 0a 20 20 20 20 67 61 69 61 4f 75  geo);.    gaiaOu
86c10 74 42 75 66 66 65 72 52 65 73 65 74 20 28 26 6f  tBufferReset (&o
86c20 75 74 5f 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74  ut_buf);.}..stat
86c30 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 46 72 6f  ic void.fnct_Fro
86c40 6d 45 57 4b 54 20 28 73 71 6c 69 74 65 33 5f 63  mEWKT (sqlite3_c
86c50 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
86c60 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
86c70 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
86c80 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
86c90 74 69 6f 6e 3a 0a 2f 20 47 65 6f 6d 46 72 6f 6d  tion:./ GeomFrom
86ca0 45 57 4b 54 28 45 57 4b 54 20 65 6e 63 6f 64 65  EWKT(EWKT encode
86cb0 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20  d geometry)././ 
86cc0 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72  returns the curr
86cd0 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 62 79 20  ent geometry by 
86ce0 70 61 72 73 69 6e 67 20 45 57 4b 54 20 20 28 50  parsing EWKT  (P
86cf0 6f 73 74 47 49 53 29 20 65 6e 63 6f 64 65 64 20  ostGIS) encoded 
86d00 73 74 72 69 6e 67 20 0a 2f 20 6f 72 20 4e 55 4c  string ./ or NUL
86d10 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
86d20 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
86d30 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
86d40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86d50 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
86d60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
86d70 67 6e 65 64 20 63 68 61 72 20 2a 74 65 78 74 3b  gned char *text;
86d80 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
86d90 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
86da0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
86db0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
86dc0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
86dd0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
86de0 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
86df0 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
86e00 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
86e10 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
86e20 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
86e30 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
86e40 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
86e50 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
86e60 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
86e70 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
86e80 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
86e90 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
86ea0 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
86eb0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
86ec0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
86ed0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
86ee0 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
86ef0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
86f00 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
86f10 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
86f20 20 20 7d 0a 20 20 20 20 74 65 78 74 20 3d 20 73    }.    text = s
86f30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
86f40 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
86f50 20 67 65 6f 20 3d 20 67 61 69 61 50 61 72 73 65   geo = gaiaParse
86f60 45 57 4b 54 20 28 74 65 78 74 29 3b 0a 20 20 20  EWKT (text);.   
86f70 20 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c   if (geo == NULL
86f80 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
86f90 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
86fa0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
86fb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
86fc0 20 20 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c     gaiaToSpatiaL
86fd0 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67  iteBlobWkbEx2 (g
86fe0 65 6f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  eo, &p_result, &
86ff0 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20  len, gpkg_mode, 
87000 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 20 20 20  tiny_point);.   
87010 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
87020 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 73 71 6c  l (geo);.    sql
87030 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
87040 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73   (context, p_res
87050 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b  ult, len, free);
87060 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
87070 66 6e 63 74 5f 46 72 6f 6d 47 65 6f 4a 53 4f 4e  fnct_FromGeoJSON
87080 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
87090 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
870a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
870b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
870c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
870d0 0a 2f 20 47 65 6f 6d 46 72 6f 6d 47 65 6f 4a 53  ./ GeomFromGeoJS
870e0 4f 4e 28 47 65 6f 4a 53 4f 4e 20 65 6e 63 6f 64  ON(GeoJSON encod
870f0 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  ed geometry)././
87100 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72   returns the cur
87110 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 62 79  rent geometry by
87120 20 70 61 72 73 69 6e 67 20 47 65 6f 4a 53 4f 4e   parsing GeoJSON
87130 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20   encoded string 
87140 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
87150 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
87160 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e  ntered.*/.    in
87170 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67  t len;.    unsig
87180 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
87190 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  lt = NULL;.    c
871a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
871b0 61 72 20 2a 74 65 78 74 3b 0a 20 20 20 20 67 61  ar *text;.    ga
871c0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
871d0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
871e0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
871f0 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
87200 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
87210 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
87220 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
87230 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
87240 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
87250 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
87260 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
87270 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
87280 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
87290 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
872a0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
872b0 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
872c0 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
872d0 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
872e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
872f0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
87300 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
87310 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
87320 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
87330 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
87340 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
87350 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
87360 20 74 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f   text = sqlite3_
87370 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
87380 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20  [0]);.    geo = 
87390 67 61 69 61 50 61 72 73 65 47 65 6f 4a 53 4f 4e  gaiaParseGeoJSON
873a0 20 28 74 65 78 74 29 3b 0a 20 20 20 20 69 66 20   (text);.    if 
873b0 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  (geo == NULL).  
873c0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
873d0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
873e0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
873f0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  n;.      }.    g
87400 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
87410 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 2c 20  lobWkbEx2 (geo, 
87420 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
87430 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79   gpkg_mode, tiny
87440 5f 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69  _point);.    gai
87450 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
87460 65 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eo);.    sqlite3
87470 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
87480 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
87490 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a   len, free);.}..
874a0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
874b0 5f 46 72 6f 6d 4b 6d 6c 20 28 73 71 6c 69 74 65  _FromKml (sqlite
874c0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
874d0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
874e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
874f0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
87500 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 6d 46  unction:./ GeomF
87510 72 6f 6d 4b 6d 6c 28 4b 4d 4c 20 65 6e 63 6f 64  romKml(KML encod
87520 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  ed geometry)././
87530 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72   returns the cur
87540 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 62 79  rent geometry by
87550 20 70 61 72 73 69 6e 67 20 4b 4d 4c 20 65 6e 63   parsing KML enc
87560 6f 64 65 64 20 73 74 72 69 6e 67 20 0a 2f 20 6f  oded string ./ o
87570 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
87580 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
87590 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  ed.*/.    int le
875a0 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
875b0 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
875c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
875d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
875e0 74 65 78 74 3b 0a 20 20 20 20 67 61 69 61 47 65  text;.    gaiaGe
875f0 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
87600 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70  NULL;.    int gp
87610 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
87620 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
87630 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
87640 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
87650 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
87660 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
87670 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
87680 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
87690 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
876a0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
876b0 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
876c0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64     {..  gpkg_mod
876d0 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
876e0 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
876f0 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
87700 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
87710 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
87720 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
87730 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
87740 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20  QLITE_TEXT).    
87750 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
87760 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
87770 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
87780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 65 78  .      }.    tex
87790 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
877a0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
877b0 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61  ;.    geo = gaia
877c0 50 61 72 73 65 4b 6d 6c 20 28 74 65 78 74 29 3b  ParseKml (text);
877d0 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20  .    if (geo == 
877e0 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
877f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
87800 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
87810 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
87820 20 7d 0a 20 20 20 20 67 61 69 61 54 6f 53 70 61   }.    gaiaToSpa
87830 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
87840 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75 6c  2 (geo, &p_resul
87850 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f  t, &len, gpkg_mo
87860 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b  de, tiny_point);
87870 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
87880 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20  mColl (geo);.   
87890 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
878a0 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
878b0 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
878c0 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ee);.}..static v
878d0 6f 69 64 0a 66 6e 63 74 5f 46 72 6f 6d 47 6d 6c  oid.fnct_FromGml
878e0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
878f0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
87900 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
87910 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
87920 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
87930 0a 2f 20 47 65 6f 6d 46 72 6f 6d 47 6d 6c 28 47  ./ GeomFromGml(G
87940 4d 4c 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  ML encoded geome
87950 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  try)././ returns
87960 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 65 6f   the current geo
87970 6d 65 74 72 79 20 62 79 20 70 61 72 73 69 6e 67  metry by parsing
87980 20 47 4d 4c 20 65 6e 63 6f 64 65 64 20 73 74 72   GML encoded str
87990 69 6e 67 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ing ./ or NULL i
879a0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
879b0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
879c0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
879d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
879e0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
879f0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
87a00 64 20 63 68 61 72 20 2a 74 65 78 74 3b 0a 20 20  d char *text;.  
87a10 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
87a20 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
87a30 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73    void *data = s
87a40 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
87a50 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
87a60 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
87a70 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
87a80 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
87a90 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67  text);.    int g
87aa0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
87ab0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
87ac0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
87ad0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
87ae0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
87af0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
87b00 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
87b10 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
87b20 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
87b30 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
87b40 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
87b50 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f      {..  gpkg_mo
87b60 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
87b70 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
87b80 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
87b90 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
87ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
87bb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
87bc0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
87bd0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
87be0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
87bf0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
87c00 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
87c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 65  ;.      }.    te
87c20 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  xt = sqlite3_val
87c30 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
87c40 29 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61 20  );.    if (data 
87c50 21 3d 20 4e 55 4c 4c 29 0a 09 67 65 6f 20 3d 20  != NULL)..geo = 
87c60 67 61 69 61 50 61 72 73 65 47 6d 6c 5f 72 20 28  gaiaParseGml_r (
87c70 64 61 74 61 2c 20 74 65 78 74 2c 20 73 71 6c 69  data, text, sqli
87c80 74 65 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 67  te);.    else..g
87c90 65 6f 20 3d 20 67 61 69 61 50 61 72 73 65 47 6d  eo = gaiaParseGm
87ca0 6c 20 28 74 65 78 74 2c 20 73 71 6c 69 74 65 29  l (text, sqlite)
87cb0 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d  ;.    if (geo ==
87cc0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
87cd0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
87ce0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
87cf0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
87d00 20 20 7d 0a 20 20 20 20 67 61 69 61 54 6f 53 70    }.    gaiaToSp
87d10 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
87d20 78 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75  x2 (geo, &p_resu
87d30 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d  lt, &len, gpkg_m
87d40 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29  ode, tiny_point)
87d50 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
87d60 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20  omColl (geo);.  
87d70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
87d80 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
87d90 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
87da0 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ree);.}..static 
87db0 76 6f 69 64 0a 66 6e 63 74 5f 4c 69 6e 65 73 46  void.fnct_LinesF
87dc0 72 6f 6d 52 69 6e 67 73 20 28 73 71 6c 69 74 65  romRings (sqlite
87dd0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
87de0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
87df0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
87e00 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
87e10 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4c 69 6e 65 73  unction:./ Lines
87e20 46 72 6f 6d 52 69 6e 67 73 28 42 4c 4f 42 65 6e  FromRings(BLOBen
87e30 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20  coded geometry, 
87e40 42 4f 4f 4c 20 6d 75 6c 74 69 5f 6c 69 6e 65 73  BOOL multi_lines
87e50 74 72 69 6e 67 29 0a 2f 0a 2f 20 72 65 74 75 72  tring)././ retur
87e60 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65 74 72  ns a new geometr
87e70 79 20 5b 4c 49 4e 45 53 54 52 49 4e 47 20 6f 72  y [LINESTRING or
87e80 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47   MULTILINESTRING
87e90 5d 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 0a  ] representing .
87ea0 2f 20 74 68 65 20 6c 69 6e 65 61 72 69 7a 61 74  / the linearizat
87eb0 69 6f 6e 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ion for current 
87ec0 28 4d 55 4c 54 49 29 50 4f 4c 59 47 4f 4e 20 67  (MULTI)POLYGON g
87ed0 65 6f 6d 65 74 72 79 0a 2f 20 6f 72 20 4e 55 4c  eometry./ or NUL
87ee0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
87ef0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
87f00 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
87f10 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
87f20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
87f30 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
87f40 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20   geo = NULL;.   
87f50 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
87f60 20 67 65 6f 6d 5f 6e 65 77 20 3d 20 4e 55 4c 4c   geom_new = NULL
87f70 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
87f80 20 20 20 69 6e 74 20 6d 75 6c 74 69 5f 6c 69 6e     int multi_lin
87f90 65 73 74 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20  estring = 0;.   
87fa0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
87fb0 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
87fc0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
87fd0 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
87fe0 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
87ff0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
88000 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
88010 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
88020 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
88030 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
88040 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
88050 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
88060 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
88070 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
88080 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
88090 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
880a0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
880b0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
880c0 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
880d0 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
880e0 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
880f0 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
88100 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
88110 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
88120 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
88130 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
88140 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
88150 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
88160 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
88170 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
88180 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
88190 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
881a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
881b0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
881c0 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
881d0 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
881e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
881f0 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
88200 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
88210 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
88220 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
88230 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
88240 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
88250 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
88260 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29  if (geo == NULL)
88270 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
88280 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
88290 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
882a0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
882b0 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29    if (argc == 2)
882c0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
882d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
882e0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
882f0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
88300 09 20 20 20 20 20 20 6d 75 6c 74 69 5f 6c 69 6e  .      multi_lin
88310 65 73 74 72 69 6e 67 20 3d 20 73 71 6c 69 74 65  estring = sqlite
88320 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
88330 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[1]);.      }. 
88340 20 20 20 67 65 6f 6d 5f 6e 65 77 20 3d 20 67 61     geom_new = ga
88350 69 61 4c 69 6e 65 61 72 69 7a 65 20 28 67 65 6f  iaLinearize (geo
88360 2c 20 6d 75 6c 74 69 5f 6c 69 6e 65 73 74 72 69  , multi_linestri
88370 6e 67 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  ng);.    if (!ge
88380 6f 6d 5f 6e 65 77 29 0a 09 67 6f 74 6f 20 69 6e  om_new)..goto in
88390 76 61 6c 69 64 3b 0a 20 20 20 20 67 61 69 61 46  valid;.    gaiaF
883a0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
883b0 29 3b 0a 20 20 20 20 67 61 69 61 54 6f 53 70 61  );.    gaiaToSpa
883c0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
883d0 32 20 28 67 65 6f 6d 5f 6e 65 77 2c 20 26 70 5f  2 (geom_new, &p_
883e0 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70  result, &len, gp
883f0 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 74 69 6e  kg_mode,.....tin
88400 79 5f 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61  y_point);.    ga
88410 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
88420 67 65 6f 6d 5f 6e 65 77 29 3b 0a 20 20 20 20 73  geom_new);.    s
88430 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
88440 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
88450 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
88460 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
88470 20 69 6e 76 61 6c 69 64 3a 0a 20 20 20 20 69 66   invalid:.    if
88480 20 28 67 65 6f 29 0a 09 67 61 69 61 46 72 65 65   (geo)..gaiaFree
88490 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
884a0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
884b0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
884c0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 4d  );.}..#ifndef OM
884d0 49 54 5f 47 45 4f 53 09 09 2f 2a 20 69 6e 63 6c  IT_GEOS../* incl
884e0 75 64 69 6e 67 20 47 45 4f 53 20 2a 2f 0a 0a 73  uding GEOS */..s
884f0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
88500 42 75 69 6c 64 41 72 65 61 20 28 73 71 6c 69 74  BuildArea (sqlit
88510 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
88520 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
88530 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
88540 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
88550 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 42 75 69 6c  function:./ Buil
88560 64 41 72 65 61 28 42 4c 4f 42 65 6e 63 6f 64 65  dArea(BLOBencode
88570 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20  d geometry)././ 
88580 41 73 73 75 6d 69 6e 67 20 74 68 61 74 20 47 65  Assuming that Ge
88590 6f 6d 65 74 72 79 20 72 65 70 72 65 73 65 6e 74  ometry represent
885a0 73 20 61 20 73 65 74 20 6f 66 20 73 70 61 72 73  s a set of spars
885b0 65 20 4c 69 6e 65 73 74 72 69 6e 67 73 2c 0a 2f  e Linestrings,./
885c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
885d0 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 72  ill attempt to r
885e0 65 61 73 73 65 6d 62 6c 65 20 61 20 73 69 6e 67  eassemble a sing
885f0 6c 65 20 50 6f 6c 79 67 6f 6e 0a 2f 20 28 6f 72  le Polygon./ (or
88600 20 61 20 73 65 74 20 6f 66 20 50 6f 6c 79 67 6f   a set of Polygo
88610 6e 73 29 0a 2f 20 4e 55 4c 4c 20 69 73 20 72 65  ns)./ NULL is re
88620 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76 61 6c  turned for inval
88630 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
88640 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
88650 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
88660 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
88670 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
88680 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
88690 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
886a0 72 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  result;.    int 
886b0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
886c0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
886d0 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
886e0 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
886f0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
88700 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
88710 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
88720 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
88730 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
88740 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
88750 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
88760 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
88770 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
88780 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
88790 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
887a0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
887b0 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
887c0 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
887d0 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
887e0 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
887f0 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
88800 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
88810 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
88820 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
88830 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
88840 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
88850 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
88860 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
88870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
88880 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
88890 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
888a0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
888b0 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
888c0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
888d0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
888e0 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
888f0 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
88900 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
88910 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
88920 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
88930 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
88940 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d  );.    if (geo =
88950 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
88960 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
88970 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
88980 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64  .      {..  void
88990 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
889a0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
889b0 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74  ext);..  if (dat
889c0 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
889d0 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 50    result = gaiaP
889e0 6f 6c 79 67 6f 6e 69 7a 65 5f 72 20 28 64 61 74  olygonize_r (dat
889f0 61 2c 20 67 65 6f 2c 20 30 29 3b 0a 09 20 20 65  a, geo, 0);..  e
88a00 6c 73 65 0a 09 20 20 20 20 20 20 72 65 73 75 6c  lse..      resul
88a10 74 20 3d 20 67 61 69 61 50 6f 6c 79 67 6f 6e 69  t = gaiaPolygoni
88a20 7a 65 20 28 67 65 6f 2c 20 30 29 3b 0a 09 20 20  ze (geo, 0);..  
88a30 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55  if (result == NU
88a40 4c 4c 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  LL)..      sqlit
88a50 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
88a60 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
88a70 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75  e..    {.../* bu
88a80 69 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65  ilds the BLOB ge
88a90 6f 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65 74  ometry to be ret
88aa0 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c  urned */...int l
88ab0 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63  en;...unsigned c
88ac0 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
88ad0 4e 55 4c 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e  NULL;...result->
88ae0 53 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64  Srid = geo->Srid
88af0 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61  ;...gaiaToSpatia
88b00 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
88b10 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c  result, &p_resul
88b20 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20  t, &len,......  
88b30 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e    gpkg_mode, tin
88b40 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69  y_point);...sqli
88b50 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
88b60 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
88b70 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
88b80 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
88b90 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20  ll (result);..  
88ba0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
88bb0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
88bc0 20 28 67 65 6f 29 3b 0a 7d 0a 0a 0a 73 74 61 74   (geo);.}...stat
88bd0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 50 6f 6c  ic void.fnct_Pol
88be0 79 67 6f 6e 69 7a 65 5f 73 74 65 70 20 28 73 71  ygonize_step (sq
88bf0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
88c00 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
88c10 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74  c,...      sqlit
88c20 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
88c30 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
88c40 69 6f 6e 3a 0a 2f 20 50 6f 6c 79 67 6f 6e 69 7a  ion:./ Polygoniz
88c50 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  e(BLOBencoded ge
88c60 6f 6d 29 0a 2f 0a 2f 20 61 67 67 72 65 67 61 74  om)././ aggregat
88c70 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20 53 54 45  e function - STE
88c80 50 0a 2f 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  P./.*/.    unsig
88c90 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
88ca0 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
88cb0 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  s;.    gaiaGeomC
88cc0 6f 6c 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20  ollPtr geom;.   
88cd0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
88ce0 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 67 61 69   result;.    gai
88cf0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 2a 70 3b  aGeomCollPtr *p;
88d00 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
88d10 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
88d20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
88d30 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
88d40 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
88d50 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
88d60 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
88d70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
88d80 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
88d90 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
88da0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
88db0 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
88dc0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
88dd0 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
88de0 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
88df0 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
88e00 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
88e10 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
88e20 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
88e30 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
88e40 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
88e50 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
88e60 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
88e70 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
88e80 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
88e90 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
88ea0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
88eb0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
88ec0 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
88ed0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
88ee0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
88ef0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
88f00 67 65 6f 6d 20 3d 0a 09 67 61 69 61 46 72 6f 6d  geom =..gaiaFrom
88f10 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
88f20 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
88f30 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
88f40 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
88f50 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
88f60 69 66 20 28 21 67 65 6f 6d 29 0a 09 72 65 74 75  if (!geom)..retu
88f70 72 6e 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  rn;.    p = sqli
88f80 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
88f90 6e 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  ntext (context, 
88fa0 73 69 7a 65 6f 66 20 28 67 61 69 61 47 65 6f 6d  sizeof (gaiaGeom
88fb0 43 6f 6c 6c 50 74 72 29 29 3b 0a 20 20 20 20 69  CollPtr));.    i
88fc0 66 20 28 21 28 2a 70 29 29 0a 20 20 20 20 20 20  f (!(*p)).      
88fd0 7b 0a 09 20 20 2f 2a 20 74 68 69 73 20 69 73 20  {..  /* this is 
88fe0 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 2a 2f  the first row */
88ff0 0a 09 20 20 2a 70 20 3d 20 67 65 6f 6d 3b 0a 20  ..  *p = geom;. 
89000 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
89010 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 75        {..  /* su
89020 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20 2a 2f  bsequent rows */
89030 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  ..  void *data =
89040 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
89050 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ta (context);.. 
89060 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c   if (data != NUL
89070 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74  L)..      result
89080 20 3d 20 67 61 69 61 4d 65 72 67 65 47 65 6f 6d   = gaiaMergeGeom
89090 65 74 72 69 65 73 5f 72 20 28 64 61 74 61 2c 20  etries_r (data, 
890a0 2a 70 2c 20 67 65 6f 6d 29 3b 0a 09 20 20 65 6c  *p, geom);..  el
890b0 73 65 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74  se..      result
890c0 20 3d 20 67 61 69 61 4d 65 72 67 65 47 65 6f 6d   = gaiaMergeGeom
890d0 65 74 72 69 65 73 20 28 2a 70 2c 20 67 65 6f 6d  etries (*p, geom
890e0 29 3b 0a 09 20 20 2a 70 20 3d 20 72 65 73 75 6c  );..  *p = resul
890f0 74 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65  t;..  gaiaFreeGe
89100 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 20  omColl (geom);. 
89110 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
89120 20 76 6f 69 64 0a 66 6e 63 74 5f 50 6f 6c 79 67   void.fnct_Polyg
89130 6f 6e 69 7a 65 5f 66 69 6e 61 6c 20 28 73 71 6c  onize_final (sql
89140 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
89150 6f 6e 74 65 78 74 29 0a 7b 0a 2f 2a 20 53 51 4c  ontext).{./* SQL
89160 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 50 6f 6c   function:./ Pol
89170 79 67 6f 6e 69 7a 65 28 42 4c 4f 42 65 6e 63 6f  ygonize(BLOBenco
89180 64 65 64 20 67 65 6f 6d 29 0a 2f 0a 2f 20 61 67  ded geom)././ ag
89190 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
891a0 20 2d 20 46 49 4e 41 4c 0a 2f 0a 2a 2f 0a 20 20   - FINAL./.*/.  
891b0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
891c0 72 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 67 61  r result;.    ga
891d0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
891e0 6f 6d 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  om;.    gaiaGeom
891f0 43 6f 6c 6c 50 74 72 20 2a 70 20 3d 20 73 71 6c  CollPtr *p = sql
89200 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
89210 6f 6e 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c  ontext (context,
89220 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b   0);.    int gpk
89230 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
89240 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
89250 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
89260 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
89270 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
89280 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
89290 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69  (context);.    i
892a0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
892b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
892c0 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
892d0 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69  gpkg_mode;..  ti
892e0 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65  ny_point = cache
892f0 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c  ->tinyPointEnabl
89300 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
89310 69 66 20 28 21 70 29 0a 20 20 20 20 20 20 7b 0a  if (!p).      {.
89320 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
89330 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
89340 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
89350 20 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 20     }.    result 
89360 3d 20 2a 70 3b 0a 20 20 20 20 69 66 20 28 21 72  = *p;.    if (!r
89370 65 73 75 6c 74 29 0a 09 73 71 6c 69 74 65 33 5f  esult)..sqlite3_
89380 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
89390 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
893a0 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64 20        {..  void 
893b0 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  *data = sqlite3_
893c0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
893d0 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74 61  xt);..  if (data
893e0 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   != NULL)..     
893f0 20 67 65 6f 6d 20 3d 20 67 61 69 61 50 6f 6c 79   geom = gaiaPoly
89400 67 6f 6e 69 7a 65 5f 72 20 28 64 61 74 61 2c 20  gonize_r (data, 
89410 72 65 73 75 6c 74 2c 20 30 29 3b 0a 09 20 20 65  result, 0);..  e
89420 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f 6d 20  lse..      geom 
89430 3d 20 67 61 69 61 50 6f 6c 79 67 6f 6e 69 7a 65  = gaiaPolygonize
89440 20 28 72 65 73 75 6c 74 2c 20 30 29 3b 0a 09 20   (result, 0);.. 
89450 20 69 66 20 28 67 65 6f 6d 20 3d 3d 20 4e 55 4c   if (geom == NUL
89460 4c 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  L)..      sqlite
89470 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
89480 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65  ontext);..  else
89490 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69  ..    {.../* bui
894a0 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f  lds the BLOB geo
894b0 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75  metry to be retu
894c0 72 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65  rned */...int le
894d0 6e 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68  n;...unsigned ch
894e0 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e  ar *p_result = N
894f0 55 4c 4c 3b 0a 09 09 67 65 6f 6d 2d 3e 53 72 69  ULL;...geom->Sri
89500 64 20 3d 20 72 65 73 75 6c 74 2d 3e 53 72 69 64  d = result->Srid
89510 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61  ;...gaiaToSpatia
89520 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
89530 67 65 6f 6d 2c 20 26 70 5f 72 65 73 75 6c 74 2c  geom, &p_result,
89540 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65   &len, gpkg_mode
89550 2c 0a 09 09 09 09 09 20 20 20 20 74 69 6e 79 5f  ,......    tiny_
89560 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65  point);...sqlite
89570 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
89580 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
89590 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09  , len, free);...
895a0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
895b0 20 28 67 65 6f 6d 29 3b 0a 09 20 20 20 20 7d 0a   (geom);..    }.
895c0 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43  .  gaiaFreeGeomC
895d0 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 20 20  oll (result);.  
895e0 20 20 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20      }.}..#endif 
895f0 2f 2a 20 65 6e 64 20 69 6e 63 6c 75 64 69 6e 67  /* end including
89600 20 47 45 4f 53 20 2a 2f 0a 0a 73 74 61 74 69 63   GEOS */..static
89610 20 76 6f 69 64 0a 66 6e 63 74 5f 44 69 73 73 6f   void.fnct_Disso
89620 6c 76 65 53 65 67 6d 65 6e 74 73 20 28 73 71 6c  lveSegments (sql
89630 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
89640 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
89650 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c 69 74  ,...       sqlit
89660 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
89670 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
89680 69 6f 6e 3a 0a 2f 20 44 69 73 73 6f 6c 76 65 53  ion:./ DissolveS
89690 65 67 6d 65 6e 74 73 28 42 4c 4f 42 65 6e 63 6f  egments(BLOBenco
896a0 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a  ded geometry)./.
896b0 2f 20 44 69 73 73 6f 6c 76 65 73 20 61 6e 79 20  / Dissolves any 
896c0 4c 49 4e 45 53 54 52 49 4e 47 20 6f 72 20 52 49  LINESTRING or RI
896d0 4e 47 20 69 6e 74 6f 20 65 6c 65 6d 65 6e 74 61  NG into elementa
896e0 72 79 20 73 65 67 6d 65 6e 74 73 0a 2f 20 4e 55  ry segments./ NU
896f0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  LL is returned f
89700 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  or invalid argum
89710 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ents.*/.    unsi
89720 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
89730 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
89740 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
89750 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
89760 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
89770 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
89780 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
89790 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
897a0 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
897b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
897c0 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
897d0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
897e0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
897f0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
89800 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
89810 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
89820 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
89830 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
89840 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
89850 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
89860 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
89870 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
89880 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
89890 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
898a0 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
898b0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
898c0 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
898d0 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
898e0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
898f0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
89900 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
89910 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
89920 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
89930 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
89940 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
89950 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
89960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
89970 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
89980 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
89990 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
899a0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
899b0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
899c0 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
899d0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
899e0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
899f0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
89a00 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
89a10 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
89a20 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a  f (geo == NULL).
89a30 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
89a40 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
89a50 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
89a60 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69  ..  result = gai
89a70 61 44 69 73 73 6f 6c 76 65 53 65 67 6d 65 6e 74  aDissolveSegment
89a80 73 20 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28  s (geo);..  if (
89a90 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a  result == NULL).
89aa0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
89ab0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
89ac0 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ext);..  else.. 
89ad0 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73     {.../* builds
89ae0 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74   the BLOB geomet
89af0 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ry to be returne
89b00 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a  d */...int len;.
89b10 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
89b20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
89b30 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64  ;...result->Srid
89b40 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09   = geo->Srid;...
89b50 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
89b60 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75  BlobWkbEx2 (resu
89b70 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  lt, &p_result, &
89b80 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70  len,......    gp
89b90 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f  kg_mode, tiny_po
89ba0 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  int);...sqlite3_
89bb0 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
89bc0 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
89bd0 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61  len, free);...ga
89be0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
89bf0 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a  result);..    }.
89c00 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
89c10 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
89c20 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  o);.}..static vo
89c30 69 64 0a 66 6e 63 74 5f 44 69 73 73 6f 6c 76 65  id.fnct_Dissolve
89c40 50 6f 69 6e 74 73 20 28 73 71 6c 69 74 65 33 5f  Points (sqlite3_
89c50 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
89c60 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
89c70 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
89c80 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
89c90 63 74 69 6f 6e 3a 0a 2f 20 44 69 73 73 6f 6c 76  ction:./ Dissolv
89ca0 65 50 6f 69 6e 74 73 28 42 4c 4f 42 65 6e 63 6f  ePoints(BLOBenco
89cb0 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a  ded geometry)./.
89cc0 2f 20 44 69 73 73 6f 6c 76 65 73 20 61 6e 79 20  / Dissolves any 
89cd0 4c 49 4e 45 53 54 52 49 4e 47 20 6f 72 20 52 49  LINESTRING or RI
89ce0 4e 47 20 69 6e 74 6f 20 65 6c 65 6d 65 6e 74 61  NG into elementa
89cf0 72 79 20 56 65 72 74 69 63 65 73 0a 2f 20 4e 55  ry Vertices./ NU
89d00 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  LL is returned f
89d10 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  or invalid argum
89d20 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ents.*/.    unsi
89d30 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
89d40 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
89d50 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
89d60 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
89d70 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
89d80 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
89d90 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
89da0 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
89db0 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
89dc0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
89dd0 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
89de0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
89df0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
89e00 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
89e10 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
89e20 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
89e30 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
89e40 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
89e50 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
89e60 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
89e70 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
89e80 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
89e90 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
89ea0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
89eb0 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
89ec0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
89ed0 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
89ee0 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
89ef0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
89f00 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
89f10 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
89f20 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
89f30 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
89f40 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
89f50 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
89f60 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
89f70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
89f80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
89f90 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
89fa0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
89fb0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
89fc0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
89fd0 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
89fe0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
89ff0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
8a000 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
8a010 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
8a020 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
8a030 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a  f (geo == NULL).
8a040 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
8a050 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
8a060 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
8a070 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69  ..  result = gai
8a080 61 44 69 73 73 6f 6c 76 65 50 6f 69 6e 74 73 20  aDissolvePoints 
8a090 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 72 65  (geo);..  if (re
8a0a0 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20  sult == NULL).. 
8a0b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8a0c0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
8a0d0 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  t);..  else..   
8a0e0 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74   {.../* builds t
8a0f0 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79  he BLOB geometry
8a100 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
8a110 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09  */...int len;...
8a120 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8a130 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
8a140 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d  ..result->Srid =
8a150 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61   geo->Srid;...ga
8a160 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
8a170 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74  obWkbEx2 (result
8a180 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
8a190 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67  n,......    gpkg
8a1a0 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e  _mode, tiny_poin
8a1b0 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  t);...sqlite3_re
8a1c0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
8a1d0 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
8a1e0 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61  n, free);...gaia
8a1f0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65  FreeGeomColl (re
8a200 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20  sult);..    }.  
8a210 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
8a220 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
8a230 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
8a240 0a 66 6e 63 74 5f 43 6f 6c 6c 65 63 74 69 6f 6e  .fnct_Collection
8a250 45 78 74 72 61 63 74 20 28 73 71 6c 69 74 65 33  Extract (sqlite3
8a260 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
8a270 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
8a280 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
8a290 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
8a2a0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 6f 6c   function:./ Col
8a2b0 6c 65 63 74 69 6f 6e 45 78 74 72 61 63 74 28 42  lectionExtract(B
8a2c0 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  LOBencoded geome
8a2d0 74 72 79 2c 20 49 6e 74 65 67 65 72 20 74 79 70  try, Integer typ
8a2e0 65 29 0a 2f 0a 2f 20 45 78 74 72 61 63 74 73 20  e)././ Extracts 
8a2f0 66 72 6f 6d 20 61 20 47 45 4f 4d 45 54 52 59 43  from a GEOMETRYC
8a300 4f 4c 4c 45 43 54 49 4f 4e 20 61 6e 79 20 69 74  OLLECTION any it
8a310 65 6d 20 6f 66 20 74 68 65 20 72 65 71 75 69 72  em of the requir
8a320 65 64 20 54 59 50 45 0a 2f 20 31 3d 50 6f 69 6e  ed TYPE./ 1=Poin
8a330 74 20 2d 20 32 3d 4c 69 6e 65 73 74 72 69 6e 67  t - 2=Linestring
8a340 20 2d 20 33 3d 50 6f 6c 79 67 6f 6e 0a 2f 20 4e   - 3=Polygon./ N
8a350 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
8a360 66 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75  for invalid argu
8a370 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e 73  ments.*/.    uns
8a380 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
8a390 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
8a3a0 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 74 79 70  tes;.    int typ
8a3b0 65 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  e;.    gaiaGeomC
8a3c0 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
8a3d0 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
8a3e0 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 20 3d 20  ollPtr result = 
8a3f0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 67 70  NULL;.    int gp
8a400 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
8a410 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
8a420 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mode = 0;.    in
8a430 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
8a440 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
8a450 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
8a460 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
8a470 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
8a480 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
8a490 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
8a4a0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
8a4b0 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
8a4c0 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
8a4d0 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
8a4e0 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
8a4f0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
8a500 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
8a510 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
8a520 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69  ode;..  tiny_poi
8a530 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79  nt = cache->tiny
8a540 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20  PointEnabled;.  
8a550 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
8a560 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8a570 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
8a580 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
8a590 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
8a5a0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
8a5b0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
8a5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
8a5d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8a5e0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
8a5f0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
8a600 09 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  .type = sqlite3_
8a610 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
8a620 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  1]);.    else.  
8a630 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
8a640 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
8a650 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
8a660 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
8a670 66 20 28 74 79 70 65 20 3d 3d 20 31 20 7c 7c 20  f (type == 1 || 
8a680 74 79 70 65 20 3d 3d 20 32 20 7c 7c 20 74 79 70  type == 2 || typ
8a690 65 20 3d 3d 20 33 29 0a 09 3b 0a 20 20 20 20 65  e == 3)..;.    e
8a6a0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
8a6b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
8a6c0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
8a6d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8a6e0 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
8a6f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
8a700 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
8a710 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
8a720 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
8a730 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
8a740 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
8a750 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  eo =..gaiaFromSp
8a760 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
8a770 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
8a780 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
8a790 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
8a7a0 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
8a7b0 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 09   (geo == NULL)..
8a7c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
8a7d0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
8a7e0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
8a7f0 09 20 20 73 77 69 74 63 68 20 28 74 79 70 65 29  .  switch (type)
8a800 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73  ..    {..    cas
8a810 65 20 31 3a 0a 09 09 72 65 73 75 6c 74 20 3d 20  e 1:...result = 
8a820 67 61 69 61 45 78 74 72 61 63 74 50 6f 69 6e 74  gaiaExtractPoint
8a830 73 46 72 6f 6d 47 65 6f 6d 43 6f 6c 6c 20 28 67  sFromGeomColl (g
8a840 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  eo);...break;.. 
8a850 20 20 20 63 61 73 65 20 32 3a 0a 09 09 72 65 73     case 2:...res
8a860 75 6c 74 20 3d 20 67 61 69 61 45 78 74 72 61 63  ult = gaiaExtrac
8a870 74 4c 69 6e 65 73 74 72 69 6e 67 73 46 72 6f 6d  tLinestringsFrom
8a880 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
8a890 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
8a8a0 73 65 20 33 3a 0a 09 09 72 65 73 75 6c 74 20 3d  se 3:...result =
8a8b0 20 67 61 69 61 45 78 74 72 61 63 74 50 6f 6c 79   gaiaExtractPoly
8a8c0 67 6f 6e 73 46 72 6f 6d 47 65 6f 6d 43 6f 6c 6c  gonsFromGeomColl
8a8d0 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b   (geo);...break;
8a8e0 0a 09 20 20 20 20 7d 3b 0a 09 20 20 69 66 20 28  ..    };..  if (
8a8f0 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a  result == NULL).
8a900 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8a910 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
8a920 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ext);..  else.. 
8a930 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73     {.../* builds
8a940 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74   the BLOB geomet
8a950 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ry to be returne
8a960 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a  d */...int len;.
8a970 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
8a980 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
8a990 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64  ;...result->Srid
8a9a0 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09   = geo->Srid;...
8a9b0 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
8a9c0 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75  BlobWkbEx2 (resu
8a9d0 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  lt, &p_result, &
8a9e0 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70  len,......    gp
8a9f0 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f  kg_mode, tiny_po
8aa00 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  int);...sqlite3_
8aa10 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
8aa20 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
8aa30 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61  len, free);...ga
8aa40 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
8aa50 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a  result);..    }.
8aa60 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
8aa70 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
8aa80 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  o);.}..static vo
8aa90 69 64 0a 66 6e 63 74 5f 41 64 64 4d 65 61 73 75  id.fnct_AddMeasu
8aaa0 72 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  re (sqlite3_cont
8aab0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
8aac0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
8aad0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
8aae0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
8aaf0 6e 73 3a 0a 2f 20 53 54 5f 41 64 64 4d 65 61 73  ns:./ ST_AddMeas
8ab00 75 72 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  ure(BLOBencoded 
8ab10 67 65 6f 6d 65 74 72 79 2c 20 44 6f 75 62 6c 65  geometry, Double
8ab20 20 6d 5f 73 74 61 72 74 2c 20 44 6f 75 62 6c 65   m_start, Double
8ab30 20 6d 5f 65 6e 64 29 0a 2f 0a 2f 20 57 69 6c 6c   m_end)././ Will
8ab40 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 47 45   return a new GE
8ab50 4f 4d 45 54 52 59 20 28 73 75 70 70 6f 72 74 69  OMETRY (supporti
8ab60 6e 67 20 4d 29 20 77 69 74 68 20 6d 65 61 73 75  ng M) with measu
8ab70 72 65 73 20 6c 69 6e 65 61 72 6c 79 0a 2f 20 69  res linearly./ i
8ab80 6e 74 65 72 70 6f 6c 61 74 65 64 20 62 65 74 77  nterpolated betw
8ab90 65 65 6e 20 74 68 65 20 73 74 61 72 74 20 61 6e  een the start an
8aba0 64 20 65 6e 64 20 70 6f 69 6e 74 73 2e 0a 2f 20  d end points../ 
8abb0 74 68 65 20 69 6e 70 75 74 20 47 65 6f 6d 65 74  the input Geomet
8abc0 72 79 20 69 73 20 65 78 70 65 63 74 65 64 20 74  ry is expected t
8abd0 6f 20 62 65 20 61 20 4c 69 6e 65 73 74 72 69 6e  o be a Linestrin
8abe0 67 20 6f 72 20 4d 75 6c 74 69 4c 69 6e 65 73 74  g or MultiLinest
8abf0 72 69 6e 67 0a 2f 20 4e 55 4c 4c 20 69 73 20 72  ring./ NULL is r
8ac00 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76 61  eturned for inva
8ac10 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
8ac20 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
8ac30 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
8ac40 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
8ac50 20 64 6f 75 62 6c 65 20 6d 5f 73 74 61 72 74 3b   double m_start;
8ac60 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 5f 65 6e  .    double m_en
8ac70 64 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 76 61  d;.    int intva
8ac80 6c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  l;.    gaiaGeomC
8ac90 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
8aca0 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
8acb0 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20  ollPtr result;. 
8acc0 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
8acd0 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
8ace0 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
8acf0 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  0;.    int tiny_
8ad00 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
8ad10 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
8ad20 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
8ad30 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
8ad40 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
8ad50 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
8ad60 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
8ad70 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
8ad80 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
8ad90 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
8ada0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
8adb0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
8adc0 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
8add0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
8ade0 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20  e->gpkg_mode;.. 
8adf0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61   tiny_point = ca
8ae00 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e  che->tinyPointEn
8ae10 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  abled;.      }. 
8ae20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
8ae30 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
8ae40 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
8ae50 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
8ae60 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
8ae70 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
8ae80 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8ae90 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
8aea0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
8aeb0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
8aec0 46 4c 4f 41 54 29 0a 09 6d 5f 73 74 61 72 74 20  FLOAT)..m_start 
8aed0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8aee0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29  double (argv[1])
8aef0 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
8af00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8af10 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
8af20 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
8af30 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 76 61 6c       {..  intval
8af40 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8af50 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
8af60 09 20 20 6d 5f 73 74 61 72 74 20 3d 20 69 6e 74  .  m_start = int
8af70 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  val;.      }.   
8af80 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
8af90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8afa0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
8afb0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
8afc0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
8afd0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
8afe0 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
8aff0 45 5f 46 4c 4f 41 54 29 0a 09 6d 5f 65 6e 64 20  E_FLOAT)..m_end 
8b000 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8b010 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29  double (argv[2])
8b020 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
8b030 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8b040 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
8b050 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
8b060 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 76 61 6c       {..  intval
8b070 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8b080 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  _int (argv[2]);.
8b090 09 20 20 6d 5f 65 6e 64 20 3d 20 69 6e 74 76 61  .  m_end = intva
8b0a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  l;.      }.    e
8b0b0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
8b0c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
8b0d0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
8b0e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8b0f0 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
8b100 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
8b110 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
8b120 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
8b130 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
8b140 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
8b150 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
8b160 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  eo =..gaiaFromSp
8b170 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
8b180 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
8b190 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
8b1a0 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
8b1b0 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
8b1c0 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 09   (geo == NULL)..
8b1d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
8b1e0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
8b1f0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
8b200 09 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61  .  result = gaia
8b210 41 64 64 4d 65 61 73 75 72 65 20 28 67 65 6f 2c  AddMeasure (geo,
8b220 20 6d 5f 73 74 61 72 74 2c 20 6d 5f 65 6e 64 29   m_start, m_end)
8b230 3b 0a 09 20 20 69 66 20 28 72 65 73 75 6c 74 20  ;..  if (result 
8b240 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20  == NULL)..      
8b250 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
8b260 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
8b270 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
8b280 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c  /* builds the BL
8b290 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62  OB geometry to b
8b2a0 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09  e returned */...
8b2b0 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67  int len;...unsig
8b2c0 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
8b2d0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 73  lt = NULL;...res
8b2e0 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d  ult->Srid = geo-
8b2f0 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f 53  >Srid;...gaiaToS
8b300 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
8b310 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f  Ex2 (result, &p_
8b320 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09  result, &len,...
8b330 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65  ...    gpkg_mode
8b340 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09  , tiny_point);..
8b350 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
8b360 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
8b370 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
8b380 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47  ee);...gaiaFreeG
8b390 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29  eomColl (result)
8b3a0 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
8b3b0 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
8b3c0 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
8b3d0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
8b3e0 5f 49 6e 74 65 72 70 6f 6c 61 74 65 50 6f 69 6e  _InterpolatePoin
8b3f0 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  t (sqlite3_conte
8b400 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
8b410 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20  t argc,...      
8b420 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8b430 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
8b440 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20 53 54   functions:./ ST
8b450 5f 49 6e 74 65 72 70 6f 6c 61 74 65 50 6f 69 6e  _InterpolatePoin
8b460 74 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 6c 69  t(BLOBencoded li
8b470 6e 65 2d 67 65 6f 6d 65 74 72 79 2c 20 42 4c 4f  ne-geometry, BLO
8b480 42 65 6e 63 6f 64 65 64 20 70 6f 69 6e 74 2d 67  Bencoded point-g
8b490 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 57 69 6c  eometry)././ Wil
8b4a0 6c 20 72 65 74 75 72 6e 20 74 68 65 20 4d 2d 76  l return the M-v
8b4b0 61 6c 75 65 20 61 74 20 74 68 65 20 69 6e 74 65  alue at the inte
8b4c0 72 70 6f 6c 61 74 65 64 20 70 6f 69 6e 74 20 6e  rpolated point n
8b4d0 65 61 72 65 73 74 20 74 6f 20 74 68 65 20 67 69  earest to the gi
8b4e0 76 65 6e 20 70 6f 69 6e 74 0a 2f 20 74 68 65 20  ven point./ the 
8b4f0 66 69 72 73 74 20 69 6e 70 75 74 20 47 65 6f 6d  first input Geom
8b500 65 74 72 79 20 69 73 20 65 78 70 65 63 74 65 64  etry is expected
8b510 20 74 6f 20 62 65 20 61 20 4c 69 6e 65 73 74 72   to be a Linestr
8b520 69 6e 67 20 73 75 70 70 6f 72 74 69 6e 67 20 4d  ing supporting M
8b530 2c 0a 2f 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ,./ the second i
8b540 6e 70 75 74 20 47 65 6f 6d 65 74 72 79 20 69 73  nput Geometry is
8b550 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
8b560 61 20 50 6f 69 6e 74 0a 2f 20 4e 55 4c 4c 20 69  a Point./ NULL i
8b570 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 69  s returned for i
8b580 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
8b590 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
8b5a0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 31 3b 0a   char *p_blob1;.
8b5b0 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 31      int n_bytes1
8b5c0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
8b5d0 68 61 72 20 2a 70 5f 62 6c 6f 62 32 3b 0a 20 20  har *p_blob2;.  
8b5e0 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 32 3b 0a    int n_bytes2;.
8b5f0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
8b600 50 74 72 20 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b  Ptr line = NULL;
8b610 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
8b620 6c 50 74 72 20 70 6f 69 6e 74 20 3d 20 4e 55 4c  lPtr point = NUL
8b630 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 5f  L;.    double m_
8b640 76 61 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20 67  value;.    int g
8b650 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
8b660 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
8b670 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
8b680 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
8b690 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
8b6a0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
8b6b0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
8b6c0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
8b6d0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
8b6e0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
8b6f0 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
8b700 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
8b710 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
8b720 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
8b730 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
8b740 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
8b750 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
8b760 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
8b770 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b780 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
8b790 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
8b7a0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
8b7b0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
8b7c0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
8b7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
8b7e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8b7f0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
8b800 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
8b810 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
8b820 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
8b830 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
8b840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
8b850 62 6c 6f 62 31 20 3d 20 28 75 6e 73 69 67 6e 65  blob1 = (unsigne
8b860 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
8b870 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
8b880 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
8b890 74 65 73 31 20 3d 20 73 71 6c 69 74 65 33 5f 76  tes1 = sqlite3_v
8b8a0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
8b8b0 5b 30 5d 29 3b 0a 20 20 20 20 6c 69 6e 65 20 3d  [0]);.    line =
8b8c0 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
8b8d0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
8b8e0 5f 62 6c 6f 62 31 2c 20 6e 5f 62 79 74 65 73 31  _blob1, n_bytes1
8b8f0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
8b900 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
8b910 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c  bious);.    p_bl
8b920 6f 62 32 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ob2 = (unsigned 
8b930 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
8b940 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
8b950 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [1]);.    n_byte
8b960 73 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  s2 = sqlite3_val
8b970 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31  ue_bytes (argv[1
8b980 5d 29 3b 0a 20 20 20 20 70 6f 69 6e 74 20 3d 0a  ]);.    point =.
8b990 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
8b9a0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
8b9b0 62 6c 6f 62 32 2c 20 6e 5f 62 79 74 65 73 32 2c  blob2, n_bytes2,
8b9c0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
8b9d0 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
8b9e0 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 6c  ious);.    if (l
8b9f0 69 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70  ine == NULL || p
8ba00 6f 69 6e 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73  oint == NULL)..s
8ba10 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
8ba20 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
8ba30 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
8ba40 20 20 69 66 20 28 21 67 61 69 61 49 6e 74 65 72    if (!gaiaInter
8ba50 70 6f 6c 61 74 65 50 6f 69 6e 74 20 28 63 61 63  polatePoint (cac
8ba60 68 65 2c 20 6c 69 6e 65 2c 20 70 6f 69 6e 74 2c  he, line, point,
8ba70 20 26 6d 5f 76 61 6c 75 65 29 29 0a 09 20 20 20   &m_value))..   
8ba80 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8ba90 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
8baa0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
8bab0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8bac0 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
8bad0 20 6d 5f 76 61 6c 75 65 29 3b 0a 20 20 20 20 20   m_value);.     
8bae0 20 7d 0a 20 20 20 20 69 66 20 28 6c 69 6e 65 20   }.    if (line 
8baf0 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72  != NULL)..gaiaFr
8bb00 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6c 69 6e 65  eeGeomColl (line
8bb10 29 3b 0a 20 20 20 20 69 66 20 28 70 6f 69 6e 74  );.    if (point
8bb20 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46   != NULL)..gaiaF
8bb30 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 70 6f 69  reeGeomColl (poi
8bb40 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  nt);.}..static v
8bb50 6f 69 64 0a 66 6e 63 74 5f 4c 6f 63 61 74 65 42  oid.fnct_LocateB
8bb60 65 74 77 65 65 6e 4d 65 61 73 75 72 65 73 20 28  etweenMeasures (
8bb70 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8bb80 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
8bb90 72 67 63 2c 0a 09 09 09 20 20 20 20 73 71 6c 69  rgc,....    sqli
8bba0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
8bbb0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
8bbc0 74 69 6f 6e 73 3a 0a 2f 20 53 54 5f 4c 6f 63 61  tions:./ ST_Loca
8bbd0 74 65 5f 41 6c 6f 6e 67 5f 4d 65 61 73 75 72 65  te_Along_Measure
8bbe0 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
8bbf0 6d 65 74 72 79 2c 20 44 6f 75 62 6c 65 20 6d 5f  metry, Double m_
8bc00 76 61 6c 75 65 29 0a 2f 20 53 54 5f 4c 6f 63 61  value)./ ST_Loca
8bc10 74 65 41 6c 6f 6e 67 28 42 4c 4f 42 65 6e 63 6f  teAlong(BLOBenco
8bc20 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20 44 6f  ded geometry, Do
8bc30 75 62 6c 65 20 6d 5f 76 61 6c 75 65 29 0a 2f 20  uble m_value)./ 
8bc40 53 54 5f 4c 6f 63 61 74 65 5f 42 65 74 77 65 65  ST_Locate_Betwee
8bc50 6e 5f 4d 65 61 73 75 72 65 73 28 42 4c 4f 42 65  n_Measures(BLOBe
8bc60 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c  ncoded geometry,
8bc70 20 44 6f 75 62 6c 65 20 6d 5f 73 74 61 72 74 2c   Double m_start,
8bc80 20 44 6f 75 62 6c 65 20 6d 5f 65 6e 64 29 0a 2f   Double m_end)./
8bc90 20 53 54 5f 4c 6f 63 61 74 65 42 65 74 77 65 65   ST_LocateBetwee
8bca0 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  n(BLOBencoded ge
8bcb0 6f 6d 65 74 72 79 2c 20 44 6f 75 62 6c 65 20 6d  ometry, Double m
8bcc0 5f 73 74 61 72 74 2c 20 44 6f 75 62 6c 65 20 6d  _start, Double m
8bcd0 5f 65 6e 64 29 0a 2f 0a 2f 20 45 78 74 72 61 63  _end)././ Extrac
8bce0 74 73 20 66 72 6f 6d 20 61 20 47 45 4f 4d 45 54  ts from a GEOMET
8bcf0 52 59 20 28 73 75 70 70 6f 72 74 69 6e 67 20 4d  RY (supporting M
8bd00 29 20 61 6e 79 20 50 6f 69 6e 74 2f 4c 69 6e 65  ) any Point/Line
8bd10 73 74 72 69 6e 67 0a 2f 20 6d 61 74 63 68 69 6e  string./ matchin
8bd20 67 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 6d  g the range of m
8bd30 65 61 73 75 72 65 73 0a 2f 20 4e 55 4c 4c 20 69  easures./ NULL i
8bd40 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 69  s returned for i
8bd50 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
8bd60 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
8bd70 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
8bd80 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
8bd90 20 20 20 20 64 6f 75 62 6c 65 20 6d 5f 73 74 61      double m_sta
8bda0 72 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  rt;.    double m
8bdb0 5f 65 6e 64 3b 0a 20 20 20 20 69 6e 74 20 69 6e  _end;.    int in
8bdc0 74 76 61 6c 3b 0a 20 20 20 20 67 61 69 61 47 65  tval;.    gaiaGe
8bdd0 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
8bde0 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
8bdf0 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74  omCollPtr result
8be00 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
8be10 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
8be20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
8be30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69   = 0;.    int ti
8be40 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  ny_point = 0;.  
8be50 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
8be60 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
8be70 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
8be80 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
8be90 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
8bea0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
8beb0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
8bec0 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
8bed0 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
8bee0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
8bef0 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
8bf00 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
8bf10 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
8bf20 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
8bf30 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
8bf40 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
8bf50 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
8bf60 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
8bf70 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
8bf80 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
8bf90 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
8bfa0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8bfb0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
8bfc0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
8bfd0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
8bfe0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
8bff0 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
8c000 54 45 5f 46 4c 4f 41 54 29 0a 09 6d 5f 73 74 61  TE_FLOAT)..m_sta
8c010 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  rt = sqlite3_val
8c020 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
8c030 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  1]);.    else if
8c040 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
8c050 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
8c060 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
8c070 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
8c080 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
8c090 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
8c0a0 29 3b 0a 09 20 20 6d 5f 73 74 61 72 74 20 3d 20  );..  m_start = 
8c0b0 69 6e 74 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  intval;.      }.
8c0c0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
8c0d0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
8c0e0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
8c0f0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
8c100 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
8c110 67 63 20 3e 20 32 29 0a 20 20 20 20 20 20 7b 0a  gc > 2).      {.
8c120 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
8c130 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
8c140 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  2]) == SQLITE_FL
8c150 4f 41 54 29 0a 09 20 20 20 20 20 20 6d 5f 65 6e  OAT)..      m_en
8c160 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
8c170 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
8c180 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  ]);..  else if (
8c190 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8c1a0 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
8c1b0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
8c1c0 09 20 20 20 20 7b 0a 09 09 69 6e 74 76 61 6c 20  .    {...intval 
8c1d0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8c1e0 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09  int (argv[2]);..
8c1f0 09 6d 5f 65 6e 64 20 3d 20 69 6e 74 76 61 6c 3b  .m_end = intval;
8c200 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
8c210 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
8c220 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
8c230 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
8c240 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
8c250 0a 20 20 20 20 65 6c 73 65 0a 09 6d 5f 65 6e 64  .    else..m_end
8c260 20 3d 20 6d 5f 73 74 61 72 74 3b 0a 20 20 20 20   = m_start;.    
8c270 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
8c280 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
8c290 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
8c2a0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
8c2b0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
8c2c0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
8c2d0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
8c2e0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
8c2f0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
8c300 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
8c310 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
8c320 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
8c330 75 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  us);.    if (geo
8c340 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
8c350 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
8c360 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
8c370 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65  se.      {..  re
8c380 73 75 6c 74 20 3d 20 67 61 69 61 4c 6f 63 61 74  sult = gaiaLocat
8c390 65 42 65 74 77 65 65 6e 4d 65 61 73 75 72 65 73  eBetweenMeasures
8c3a0 20 28 67 65 6f 2c 20 6d 5f 73 74 61 72 74 2c 20   (geo, m_start, 
8c3b0 6d 5f 65 6e 64 29 3b 0a 09 20 20 69 66 20 28 72  m_end);..  if (r
8c3c0 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09  esult == NULL)..
8c3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8c3e0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
8c3f0 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  xt);..  else..  
8c400 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20    {.../* builds 
8c410 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72  the BLOB geometr
8c420 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  y to be returned
8c430 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09   */...int len;..
8c440 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
8c450 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
8c460 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20  ...result->Srid 
8c470 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67  = geo->Srid;...g
8c480 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
8c490 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c  lobWkbEx2 (resul
8c4a0 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c  t, &p_result, &l
8c4b0 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b  en,......    gpk
8c4c0 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69  g_mode, tiny_poi
8c4d0 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  nt);...sqlite3_r
8c4e0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
8c4f0 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
8c500 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69  en, free);...gai
8c510 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72  aFreeGeomColl (r
8c520 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20  esult);..    }. 
8c530 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
8c540 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
8c550 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
8c560 64 0a 66 6e 63 74 5f 49 73 56 61 6c 69 64 54 72  d.fnct_IsValidTr
8c570 61 6a 65 63 74 6f 72 79 20 28 73 71 6c 69 74 65  ajectory (sqlite
8c580 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
8c590 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
8c5a0 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  ..sqlite3_value 
8c5b0 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
8c5c0 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54  L function:./ ST
8c5d0 5f 49 73 56 61 6c 69 64 54 72 61 6a 65 63 74 6f  _IsValidTrajecto
8c5e0 72 79 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  ry(BLOBencoded g
8c5f0 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74  eometry)././ ret
8c600 75 72 6e 73 3a 0a 2f 20 31 20 69 66 20 74 68 69  urns:./ 1 if thi
8c610 73 20 47 45 4f 4d 45 54 52 59 20 69 73 20 61 20  s GEOMETRY is a 
8c620 4c 49 4e 45 53 54 52 49 4e 47 20 73 75 70 70 6f  LINESTRING suppo
8c630 72 74 69 6e 67 20 4d 2d 76 61 6c 75 65 73 20 61  rting M-values a
8c640 6e 64 0a 2f 20 20 20 70 72 65 73 65 6e 74 69 6e  nd./   presentin
8c650 67 20 4d 2d 76 61 6c 75 65 73 20 67 72 6f 77 69  g M-values growi
8c660 6e 67 20 66 72 6f 6d 20 6f 20 76 65 72 74 65 78  ng from o vertex
8c670 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2f 20 30   to the next./ 0
8c680 20 6f 74 68 65 72 77 69 73 65 0a 2f 20 6f 72 20   otherwise./ or 
8c690 2d 31 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  -1 if any error 
8c6a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
8c6b0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
8c6c0 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
8c6d0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
8c6e0 20 20 69 6e 74 20 69 6e 74 76 61 6c 3b 0a 20 20    int intval;.  
8c6f0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
8c700 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
8c710 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
8c720 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
8c730 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
8c740 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
8c750 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
8c760 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
8c770 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
8c780 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
8c790 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
8c7a0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
8c7b0 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
8c7c0 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
8c7d0 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
8c7e0 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
8c7f0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
8c800 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
8c810 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
8c820 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
8c830 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
8c840 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
8c850 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
8c860 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
8c870 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
8c880 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
8c890 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
8c8a0 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
8c8b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
8c8c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8c8d0 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
8c8e0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
8c8f0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8c900 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
8c910 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
8c920 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
8c930 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
8c940 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
8c950 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
8c960 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
8c970 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a  f (geo == NULL).
8c980 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
8c990 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
8c9a0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
8c9b0 20 20 7b 0a 09 20 20 69 6e 74 76 61 6c 20 3d 20    {..  intval = 
8c9c0 67 61 69 61 49 73 56 61 6c 69 64 54 72 61 6a 65  gaiaIsValidTraje
8c9d0 63 74 6f 72 79 20 28 67 65 6f 29 3b 0a 09 20 20  ctory (geo);..  
8c9e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
8c9f0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 69 6e 74  nt (context, int
8ca00 76 61 6c 29 3b 0a 09 20 20 67 61 69 61 46 72 65  val);..  gaiaFre
8ca10 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
8ca20 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74  .      }.}..stat
8ca30 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 72 61  ic void.fnct_Tra
8ca40 6a 65 63 74 6f 72 79 49 6e 74 65 72 70 6f 6c 61  jectoryInterpola
8ca50 74 65 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33  tePoint (sqlite3
8ca60 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
8ca70 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
8ca80 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .. sqlite3_value
8ca90 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
8caa0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
8cab0 54 5f 54 72 61 6a 65 63 74 6f 72 79 49 6e 74 65  T_TrajectoryInte
8cac0 72 70 6f 6c 61 74 65 50 6f 69 6e 74 28 42 4c 4f  rpolatePoint(BLO
8cad0 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72  Bencoded geometr
8cae0 79 2c 20 44 4f 55 42 4c 45 20 6d 29 0a 2f 0a 2f  y, DOUBLE m)././
8caf0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 67   returns a new g
8cb00 65 6f 6d 65 74 72 79 20 72 65 70 72 65 73 65 6e  eometry represen
8cb10 74 69 6e 67 20 61 20 70 6f 69 6e 74 20 69 6e 74  ting a point int
8cb20 65 72 70 6f 6c 61 74 65 64 20 61 6c 6f 6e 67 20  erpolated along 
8cb30 61 20 54 72 61 6a 65 63 74 6f 72 79 0a 2f 20 61  a Trajectory./ a
8cb40 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 67 69  ccordingly to gi
8cb50 76 65 6e 20 4d 2d 56 61 6c 75 65 0a 2f 20 6f 72  ven M-Value./ or
8cb60 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
8cb70 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
8cb80 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
8cb90 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
8cba0 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
8cbb0 0a 20 20 20 20 69 6e 74 20 69 6e 74 76 61 6c 3b  .    int intval;
8cbc0 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b 0a 20  .    double m;. 
8cbd0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
8cbe0 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
8cbf0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
8cc00 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 69  tr result;.    i
8cc10 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
8cc20 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
8cc30 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
8cc40 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
8cc50 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
8cc60 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
8cc70 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
8cc80 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
8cc90 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
8cca0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
8ccb0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
8ccc0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
8ccd0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
8cce0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
8ccf0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
8cd00 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
8cd10 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
8cd20 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
8cd30 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
8cd40 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
8cd50 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
8cd60 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
8cd70 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
8cd80 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
8cd90 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
8cda0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
8cdb0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
8cdc0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
8cdd0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
8cde0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
8cdf0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
8ce00 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
8ce10 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
8ce20 69 6e 74 76 61 6c 20 3d 20 73 71 6c 69 74 65 33  intval = sqlite3
8ce30 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
8ce40 5b 31 5d 29 3b 0a 09 20 20 6d 20 3d 20 69 6e 74  [1]);..  m = int
8ce50 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  val;.      }.   
8ce60 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
8ce70 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
8ce80 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
8ce90 5f 46 4c 4f 41 54 29 0a 09 6d 20 3d 20 73 71 6c  _FLOAT)..m = sql
8cea0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
8ceb0 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  e (argv[1]);.   
8cec0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
8ced0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8cee0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
8cef0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
8cf00 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
8cf10 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
8cf20 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
8cf30 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
8cf40 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
8cf50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8cf60 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
8cf70 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
8cf80 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
8cf90 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
8cfa0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
8cfb0 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
8cfc0 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
8cfd0 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29  if (geo == NULL)
8cfe0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
8cff0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
8d000 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  1);.    else.   
8d010 20 20 20 7b 0a 09 20 20 69 6e 74 76 61 6c 20 3d     {..  intval =
8d020 20 67 61 69 61 49 73 56 61 6c 69 64 54 72 61 6a   gaiaIsValidTraj
8d030 65 63 74 6f 72 79 20 28 67 65 6f 29 3b 0a 09 20  ectory (geo);.. 
8d040 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 54 72   result = gaiaTr
8d050 61 6a 65 63 74 6f 72 79 49 6e 74 65 72 70 6f 6c  ajectoryInterpol
8d060 61 74 65 50 6f 69 6e 74 20 28 67 65 6f 2c 20 6d  atePoint (geo, m
8d070 29 3b 0a 09 20 20 69 66 20 28 72 65 73 75 6c 74  );..  if (result
8d080 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   == NULL)..     
8d090 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8d0a0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
8d0b0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
8d0c0 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42  ./* builds the B
8d0d0 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20  LOB geometry to 
8d0e0 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09  be returned */..
8d0f0 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69  .int len;...unsi
8d100 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73  gned char *p_res
8d110 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65  ult = NULL;...re
8d120 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f  sult->Srid = geo
8d130 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f  ->Srid;...gaiaTo
8d140 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
8d150 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70  bEx2 (result, &p
8d160 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09  _result, &len,..
8d170 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64  ....    gpkg_mod
8d180 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a  e, tiny_point);.
8d190 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
8d1a0 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
8d1b0 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
8d1c0 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65  ree);...gaiaFree
8d1d0 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74  GeomColl (result
8d1e0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 67 61 69  );..    }..  gai
8d1f0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
8d200 65 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a  eo);.      }.}..
8d210 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 50 52 4f  #ifndef OMIT_PRO
8d220 4a 09 09 2f 2a 20 69 6e 63 6c 75 64 69 6e 67 20  J../* including 
8d230 50 52 4f 4a 2e 34 20 2a 2f 0a 0a 73 74 61 74 69  PROJ.4 */..stati
8d240 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 72 61 6e  c void.fnct_Tran
8d250 73 66 6f 72 6d 20 28 73 71 6c 69 74 65 33 5f 63  sform (sqlite3_c
8d260 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
8d270 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
8d280 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
8d290 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
8d2a0 74 69 6f 6e 3a 0a 2f 20 54 72 61 6e 73 66 6f 72  tion:./ Transfor
8d2b0 6d 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  m(BLOBencoded ge
8d2c0 6f 6d 65 74 72 79 2c 20 73 72 69 64 29 0a 2f 0a  ometry, srid)./.
8d2d0 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  / returns a new 
8d2e0 67 65 6f 6d 65 74 72 79 20 74 68 61 74 20 69 73  geometry that is
8d2f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e   the original on
8d300 65 20 72 65 63 65 69 76 65 64 2c 20 62 75 74 20  e received, but 
8d310 0a 2f 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 2f  ./ transformed /
8d320 20 74 72 61 6e 73 6c 61 74 65 64 20 74 6f 20 74   translated to t
8d330 68 65 20 6e 65 77 20 53 52 49 44 20 5b 63 6f 6f  he new SRID [coo
8d340 72 64 69 6e 61 74 65 73 20 74 72 61 6e 73 6c 61  rdinates transla
8d350 74 69 6f 6e 20 0a 2f 20 69 73 20 61 70 70 6c 69  tion ./ is appli
8d360 65 64 5d 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ed]./ or NULL if
8d370 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
8d380 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
8d390 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8d3a0 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
8d3b0 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
8d3c0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
8d3d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
8d3e0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73  aGeomCollPtr res
8d3f0 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 73 72 69  ult;.    int sri
8d400 64 5f 66 72 6f 6d 3b 0a 20 20 20 20 69 6e 74 20  d_from;.    int 
8d410 73 72 69 64 5f 74 6f 3b 0a 20 20 20 20 63 68 61  srid_to;.    cha
8d420 72 20 2a 70 72 6f 6a 5f 66 72 6f 6d 3b 0a 20 20  r *proj_from;.  
8d430 20 20 63 68 61 72 20 2a 70 72 6f 6a 5f 74 6f 3b    char *proj_to;
8d440 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20  .    void *data 
8d450 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
8d460 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
8d470 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
8d480 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
8d490 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
8d4a0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e  context);.    in
8d4b0 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
8d4c0 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
8d4d0 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
8d4e0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
8d4f0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
8d500 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
8d510 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
8d520 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
8d530 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
8d540 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
8d550 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
8d560 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
8d570 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
8d580 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
8d590 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
8d5a0 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
8d5b0 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
8d5c0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
8d5d0 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
8d5e0 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
8d5f0 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
8d600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
8d610 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
8d620 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
8d630 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
8d640 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
8d650 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
8d660 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
8d670 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8d680 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
8d690 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
8d6a0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
8d6b0 45 52 29 0a 09 73 72 69 64 5f 74 6f 20 3d 20 73  ER)..srid_to = s
8d6c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
8d6d0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
8d6e0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
8d6f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
8d700 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
8d710 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
8d720 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
8d730 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
8d740 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8d750 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
8d760 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
8d770 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8d780 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
8d790 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
8d7a0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
8d7b0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
8d7c0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
8d7d0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
8d7e0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
8d7f0 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
8d800 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
8d810 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
8d820 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 72 69  e.      {..  sri
8d830 64 5f 66 72 6f 6d 20 3d 20 67 65 6f 2d 3e 53 72  d_from = geo->Sr
8d840 69 64 3b 0a 09 20 20 67 65 74 50 72 6f 6a 50 61  id;..  getProjPa
8d850 72 61 6d 73 20 28 73 71 6c 69 74 65 2c 20 73 72  rams (sqlite, sr
8d860 69 64 5f 66 72 6f 6d 2c 20 26 70 72 6f 6a 5f 66  id_from, &proj_f
8d870 72 6f 6d 29 3b 0a 09 20 20 67 65 74 50 72 6f 6a  rom);..  getProj
8d880 50 61 72 61 6d 73 20 28 73 71 6c 69 74 65 2c 20  Params (sqlite, 
8d890 73 72 69 64 5f 74 6f 2c 20 26 70 72 6f 6a 5f 74  srid_to, &proj_t
8d8a0 6f 29 3b 0a 09 20 20 69 66 20 28 70 72 6f 6a 5f  o);..  if (proj_
8d8b0 74 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 72  to == NULL || pr
8d8c0 6f 6a 5f 66 72 6f 6d 20 3d 3d 20 4e 55 4c 4c 29  oj_from == NULL)
8d8d0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 72  ..    {...if (pr
8d8e0 6f 6a 5f 66 72 6f 6d 29 0a 09 09 20 20 20 20 66  oj_from)...    f
8d8f0 72 65 65 20 28 70 72 6f 6a 5f 66 72 6f 6d 29 3b  ree (proj_from);
8d900 0a 09 09 69 66 20 28 70 72 6f 6a 5f 74 6f 29 0a  ...if (proj_to).
8d910 09 09 20 20 20 20 66 72 65 65 20 28 70 72 6f 6a  ..    free (proj
8d920 5f 74 6f 29 3b 0a 09 09 67 61 69 61 46 72 65 65  _to);...gaiaFree
8d930 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
8d940 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
8d950 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
8d960 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
8d970 7d 0a 09 20 20 69 66 20 28 64 61 74 61 20 21 3d  }..  if (data !=
8d980 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65   NULL)..      re
8d990 73 75 6c 74 20 3d 20 67 61 69 61 54 72 61 6e 73  sult = gaiaTrans
8d9a0 66 6f 72 6d 5f 72 20 28 64 61 74 61 2c 20 67 65  form_r (data, ge
8d9b0 6f 2c 20 70 72 6f 6a 5f 66 72 6f 6d 2c 20 70 72  o, proj_from, pr
8d9c0 6f 6a 5f 74 6f 29 3b 0a 09 20 20 65 6c 73 65 0a  oj_to);..  else.
8d9d0 09 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
8d9e0 67 61 69 61 54 72 61 6e 73 66 6f 72 6d 20 28 67  gaiaTransform (g
8d9f0 65 6f 2c 20 70 72 6f 6a 5f 66 72 6f 6d 2c 20 70  eo, proj_from, p
8da00 72 6f 6a 5f 74 6f 29 3b 0a 09 20 20 66 72 65 65  roj_to);..  free
8da10 20 28 70 72 6f 6a 5f 66 72 6f 6d 29 3b 0a 09 20   (proj_from);.. 
8da20 20 66 72 65 65 20 28 70 72 6f 6a 5f 74 6f 29 3b   free (proj_to);
8da30 0a 09 20 20 69 66 20 28 21 72 65 73 75 6c 74 29  ..  if (!result)
8da40 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
8da50 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
8da60 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
8da70 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64      {.../* build
8da80 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65  s the BLOB geome
8da90 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e  try to be return
8daa0 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b  ed */...int len;
8dab0 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
8dac0 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
8dad0 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69  L;...result->Sri
8dae0 64 20 3d 20 73 72 69 64 5f 74 6f 3b 0a 09 09 67  d = srid_to;...g
8daf0 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
8db00 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c  lobWkbEx2 (resul
8db10 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c  t, &p_result, &l
8db20 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b  en,......    gpk
8db30 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69  g_mode, tiny_poi
8db40 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  nt);...sqlite3_r
8db50 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
8db60 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
8db70 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69  en, free);...gai
8db80 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72  aFreeGeomColl (r
8db90 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20  esult);..    }. 
8dba0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
8dbb0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
8dbc0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
8dbd0 64 0a 66 6e 63 74 5f 54 72 61 6e 73 66 6f 72 6d  d.fnct_Transform
8dbe0 58 59 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  XY (sqlite3_cont
8dbf0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
8dc00 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
8dc10 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
8dc20 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
8dc30 6e 3a 0a 2f 20 54 72 61 6e 73 66 6f 72 6d 58 59  n:./ TransformXY
8dc40 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
8dc50 6d 65 74 72 79 2c 20 73 72 69 64 29 0a 2f 0a 2f  metry, srid)././
8dc60 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 67   returns a new g
8dc70 65 6f 6d 65 74 72 79 20 74 68 61 74 20 69 73 20  eometry that is 
8dc80 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e 65  the original one
8dc90 20 72 65 63 65 69 76 65 64 2c 20 62 75 74 20 0a   received, but .
8dca0 2f 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 2f 20  / transformed / 
8dcb0 74 72 61 6e 73 6c 61 74 65 64 20 74 6f 20 74 68  translated to th
8dcc0 65 20 6e 65 77 20 53 52 49 44 20 5b 63 6f 6f 72  e new SRID [coor
8dcd0 64 69 6e 61 74 65 73 20 74 72 61 6e 73 6c 61 74  dinates translat
8dce0 69 6f 6e 20 0a 2f 20 69 73 20 61 70 70 6c 69 65  ion ./ is applie
8dcf0 64 5d 0a 2f 0a 2f 20 4e 4f 54 45 3a 20 74 68 69  d]././ NOTE: thi
8dd00 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 22  s is a special "
8dd10 66 6c 61 76 6f 72 22 20 6f 66 20 53 54 5f 54 72  flavor" of ST_Tr
8dd20 61 6e 73 66 6f 72 6d 28 29 0a 2f 20 20 20 20 20  ansform()./     
8dd30 20 20 6a 75 73 74 20 58 20 61 6e 64 20 59 20 63    just X and Y c
8dd40 6f 6f 72 64 69 6e 61 74 65 73 20 77 69 6c 6c 20  oordinates will 
8dd50 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 0a  be transformed,.
8dd60 2f 20 20 20 20 20 20 20 5a 20 61 6e 64 20 4d 20  /       Z and M 
8dd70 76 61 6c 75 65 73 20 28 69 66 20 65 76 65 6e 74  values (if event
8dd80 75 61 6c 6c 79 20 70 72 65 73 65 6e 74 29 20 77  ually present) w
8dd90 69 6c 6c 20 62 65 20 0a 2f 20 20 20 20 20 20 20  ill be ./       
8dda0 6c 65 66 74 20 75 6e 74 6f 75 63 68 65 64 2e 0a  left untouched..
8ddb0 2f 20 20 20 20 20 20 20 4d 61 69 6e 6c 79 20 69  /       Mainly i
8ddc0 6e 74 65 6e 64 65 64 20 61 73 20 61 20 77 6f 72  ntended as a wor
8ddd0 6b 61 72 6f 75 6e 64 20 70 6f 73 73 69 62 69 6c  karound possibil
8dde0 79 20 75 73 65 66 75 6c 0a 2f 20 20 20 20 20 20  y useful./      
8ddf0 20 77 68 65 6e 20 66 61 63 69 6e 67 20 70 61 72   when facing par
8de00 74 69 61 6c 6c 79 20 62 72 6f 6b 65 6e 20 50 52  tially broken PR
8de10 4f 4a 2e 34 20 64 65 66 69 6e 69 74 69 6f 6e 73  OJ.4 definitions
8de20 2e 0a 2f 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  .././ or NULL if
8de30 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
8de40 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
8de50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8de60 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
8de70 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
8de80 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
8de90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
8dea0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73  aGeomCollPtr res
8deb0 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 73 72 69  ult;.    int sri
8dec0 64 5f 66 72 6f 6d 3b 0a 20 20 20 20 69 6e 74 20  d_from;.    int 
8ded0 73 72 69 64 5f 74 6f 3b 0a 20 20 20 20 63 68 61  srid_to;.    cha
8dee0 72 20 2a 70 72 6f 6a 5f 66 72 6f 6d 3b 0a 20 20  r *proj_from;.  
8def0 20 20 63 68 61 72 20 2a 70 72 6f 6a 5f 74 6f 3b    char *proj_to;
8df00 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20  .    void *data 
8df10 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
8df20 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
8df30 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
8df40 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
8df50 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
8df60 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e  context);.    in
8df70 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
8df80 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
8df90 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
8dfa0 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
8dfb0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
8dfc0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
8dfd0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
8dfe0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
8dff0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
8e000 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
8e010 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
8e020 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
8e030 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
8e040 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
8e050 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
8e060 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
8e070 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
8e080 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
8e090 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
8e0a0 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
8e0b0 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
8e0c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
8e0d0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
8e0e0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
8e0f0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
8e100 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
8e110 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
8e120 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
8e130 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8e140 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
8e150 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
8e160 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
8e170 45 52 29 0a 09 73 72 69 64 5f 74 6f 20 3d 20 73  ER)..srid_to = s
8e180 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
8e190 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
8e1a0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
8e1b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
8e1c0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
8e1d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
8e1e0 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
8e1f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
8e200 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8e210 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
8e220 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
8e230 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8e240 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
8e250 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
8e260 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
8e270 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
8e280 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
8e290 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
8e2a0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
8e2b0 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
8e2c0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
8e2d0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
8e2e0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 72 69  e.      {..  sri
8e2f0 64 5f 66 72 6f 6d 20 3d 20 67 65 6f 2d 3e 53 72  d_from = geo->Sr
8e300 69 64 3b 0a 09 20 20 67 65 74 50 72 6f 6a 50 61  id;..  getProjPa
8e310 72 61 6d 73 20 28 73 71 6c 69 74 65 2c 20 73 72  rams (sqlite, sr
8e320 69 64 5f 66 72 6f 6d 2c 20 26 70 72 6f 6a 5f 66  id_from, &proj_f
8e330 72 6f 6d 29 3b 0a 09 20 20 67 65 74 50 72 6f 6a  rom);..  getProj
8e340 50 61 72 61 6d 73 20 28 73 71 6c 69 74 65 2c 20  Params (sqlite, 
8e350 73 72 69 64 5f 74 6f 2c 20 26 70 72 6f 6a 5f 74  srid_to, &proj_t
8e360 6f 29 3b 0a 09 20 20 69 66 20 28 70 72 6f 6a 5f  o);..  if (proj_
8e370 74 6f 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 72  to == NULL || pr
8e380 6f 6a 5f 66 72 6f 6d 20 3d 3d 20 4e 55 4c 4c 29  oj_from == NULL)
8e390 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 72  ..    {...if (pr
8e3a0 6f 6a 5f 66 72 6f 6d 29 0a 09 09 20 20 20 20 66  oj_from)...    f
8e3b0 72 65 65 20 28 70 72 6f 6a 5f 66 72 6f 6d 29 3b  ree (proj_from);
8e3c0 0a 09 09 69 66 20 28 70 72 6f 6a 5f 74 6f 29 0a  ...if (proj_to).
8e3d0 09 09 20 20 20 20 66 72 65 65 20 28 70 72 6f 6a  ..    free (proj
8e3e0 5f 74 6f 29 3b 0a 09 09 67 61 69 61 46 72 65 65  _to);...gaiaFree
8e3f0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
8e400 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
8e410 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
8e420 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
8e430 7d 0a 09 20 20 69 66 20 28 64 61 74 61 20 21 3d  }..  if (data !=
8e440 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65   NULL)..      re
8e450 73 75 6c 74 20 3d 20 67 61 69 61 54 72 61 6e 73  sult = gaiaTrans
8e460 66 6f 72 6d 58 59 5f 72 20 28 64 61 74 61 2c 20  formXY_r (data, 
8e470 67 65 6f 2c 20 70 72 6f 6a 5f 66 72 6f 6d 2c 20  geo, proj_from, 
8e480 70 72 6f 6a 5f 74 6f 29 3b 0a 09 20 20 65 6c 73  proj_to);..  els
8e490 65 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20  e..      result 
8e4a0 3d 20 67 61 69 61 54 72 61 6e 73 66 6f 72 6d 58  = gaiaTransformX
8e4b0 59 20 28 67 65 6f 2c 20 70 72 6f 6a 5f 66 72 6f  Y (geo, proj_fro
8e4c0 6d 2c 20 70 72 6f 6a 5f 74 6f 29 3b 0a 09 20 20  m, proj_to);..  
8e4d0 66 72 65 65 20 28 70 72 6f 6a 5f 66 72 6f 6d 29  free (proj_from)
8e4e0 3b 0a 09 20 20 66 72 65 65 20 28 70 72 6f 6a 5f  ;..  free (proj_
8e4f0 74 6f 29 3b 0a 09 20 20 69 66 20 28 21 72 65 73  to);..  if (!res
8e500 75 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ult)..      sqli
8e510 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
8e520 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
8e530 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62  se..    {.../* b
8e540 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67  uilds the BLOB g
8e550 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65  eometry to be re
8e560 74 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20  turned */...int 
8e570 6c 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20  len;...unsigned 
8e580 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
8e590 20 4e 55 4c 4c 3b 0a 09 09 72 65 73 75 6c 74 2d   NULL;...result-
8e5a0 3e 53 72 69 64 20 3d 20 73 72 69 64 5f 74 6f 3b  >Srid = srid_to;
8e5b0 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c  ...gaiaToSpatiaL
8e5c0 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 72  iteBlobWkbEx2 (r
8e5d0 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74  esult, &p_result
8e5e0 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20  , &len,......   
8e5f0 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79   gpkg_mode, tiny
8e600 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74  _point);...sqlit
8e610 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
8e620 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
8e630 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  t, len, free);..
8e640 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c  .gaiaFreeGeomCol
8e650 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20 20  l (result);..   
8e660 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
8e670 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
8e680 28 67 65 6f 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  (geo);.}..#endif
8e690 20 2f 2a 20 65 6e 64 20 69 6e 63 6c 75 64 69 6e   /* end includin
8e6a0 67 20 50 52 4f 4a 2e 34 20 2a 2f 0a 0a 23 69 66  g PROJ.4 */..#if
8e6b0 6e 64 65 66 20 4f 4d 49 54 5f 47 45 4f 53 09 09  ndef OMIT_GEOS..
8e6c0 2f 2a 20 69 6e 63 6c 75 64 69 6e 67 20 47 45 4f  /* including GEO
8e6d0 53 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  S */..static voi
8e6e0 64 0a 66 6e 63 74 5f 47 45 4f 53 5f 47 65 74 4c  d.fnct_GEOS_GetL
8e6f0 61 73 74 57 61 72 6e 69 6e 67 4d 73 67 20 28 73  astWarningMsg (s
8e700 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8e710 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
8e720 67 63 2c 0a 09 09 09 20 20 20 20 20 73 71 6c 69  gc,....     sqli
8e730 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
8e740 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
8e750 74 69 6f 6e 3a 0a 2f 20 47 45 4f 53 5f 47 65 74  tion:./ GEOS_Get
8e760 4c 61 73 74 57 61 72 6e 69 6e 67 4d 73 67 28 29  LastWarningMsg()
8e770 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 74 68 65 20  ././ return the 
8e780 6d 6f 73 74 20 72 65 63 65 6e 74 20 47 45 4f 53  most recent GEOS
8e790 20 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65   warning message
8e7a0 20 28 69 66 20 61 6e 79 29 0a 2f 20 72 65 74 75   (if any)./ retu
8e7b0 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20 6f  rn NULL on any o
8e7c0 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20  ther case.*/.   
8e7d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67   const char *msg
8e7e0 3b 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61  ;.    void *data
8e7f0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
8e800 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
8e810 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
8e820 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
8e830 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
8e840 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a   (data != NULL).
8e850 09 6d 73 67 20 3d 20 67 61 69 61 47 65 74 47 65  .msg = gaiaGetGe
8e860 6f 73 57 61 72 6e 69 6e 67 4d 73 67 5f 72 20 28  osWarningMsg_r (
8e870 64 61 74 61 29 3b 0a 20 20 20 20 65 6c 73 65 0a  data);.    else.
8e880 09 6d 73 67 20 3d 20 67 61 69 61 47 65 74 47 65  .msg = gaiaGetGe
8e890 6f 73 57 61 72 6e 69 6e 67 4d 73 67 20 28 29 3b  osWarningMsg ();
8e8a0 0a 20 20 20 20 69 66 20 28 6d 73 67 20 3d 3d 20  .    if (msg == 
8e8b0 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72  NULL)..sqlite3_r
8e8c0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
8e8d0 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  ext);.    else..
8e8e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
8e8f0 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ext (context, ms
8e900 67 2c 20 73 74 72 6c 65 6e 20 28 6d 73 67 29 2c  g, strlen (msg),
8e910 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
8e920 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
8e930 66 6e 63 74 5f 47 45 4f 53 5f 47 65 74 4c 61 73  fnct_GEOS_GetLas
8e940 74 45 72 72 6f 72 4d 73 67 20 28 73 71 6c 69 74  tErrorMsg (sqlit
8e950 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
8e960 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
8e970 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ...   sqlite3_va
8e980 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
8e990 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
8e9a0 2f 20 47 45 4f 53 5f 47 65 74 4c 61 73 74 45 72  / GEOS_GetLastEr
8e9b0 72 6f 72 4d 73 67 28 29 0a 2f 0a 2f 20 72 65 74  rorMsg()././ ret
8e9c0 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
8e9d0 65 6e 74 20 47 45 4f 53 20 65 72 72 6f 72 20 6d  ent GEOS error m
8e9e0 65 73 73 61 67 65 20 28 69 66 20 61 6e 79 29 0a  essage (if any).
8e9f0 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e  / return NULL on
8ea00 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a   any other case.
8ea10 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
8ea20 72 20 2a 6d 73 67 3b 0a 20 20 20 20 76 6f 69 64  r *msg;.    void
8ea30 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
8ea40 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
8ea50 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
8ea60 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
8ea70 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
8ea80 20 20 20 20 69 66 20 28 64 61 74 61 20 21 3d 20      if (data != 
8ea90 4e 55 4c 4c 29 0a 09 6d 73 67 20 3d 20 67 61 69  NULL)..msg = gai
8eaa0 61 47 65 74 47 65 6f 73 45 72 72 6f 72 4d 73 67  aGetGeosErrorMsg
8eab0 5f 72 20 28 64 61 74 61 29 3b 0a 20 20 20 20 65  _r (data);.    e
8eac0 6c 73 65 0a 09 6d 73 67 20 3d 20 67 61 69 61 47  lse..msg = gaiaG
8ead0 65 74 47 65 6f 73 45 72 72 6f 72 4d 73 67 20 28  etGeosErrorMsg (
8eae0 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 3d  );.    if (msg =
8eaf0 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
8eb00 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
8eb10 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
8eb20 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
8eb30 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
8eb40 6d 73 67 2c 20 73 74 72 6c 65 6e 20 28 6d 73 67  msg, strlen (msg
8eb50 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ), SQLITE_STATIC
8eb60 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
8eb70 64 0a 66 6e 63 74 5f 47 45 4f 53 5f 47 65 74 4c  d.fnct_GEOS_GetL
8eb80 61 73 74 41 75 78 45 72 72 6f 72 4d 73 67 20 28  astAuxErrorMsg (
8eb90 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8eba0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
8ebb0 72 67 63 2c 0a 09 09 09 20 20 20 20 20 20 73 71  rgc,....      sq
8ebc0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
8ebd0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
8ebe0 6e 63 74 69 6f 6e 3a 0a 2f 20 47 45 4f 53 5f 47  nction:./ GEOS_G
8ebf0 65 74 4c 61 73 74 41 75 78 45 72 72 6f 72 4d 73  etLastAuxErrorMs
8ec00 67 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 74  g()././ return t
8ec10 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 47  he most recent G
8ec20 45 4f 53 20 65 72 72 6f 72 20 6d 65 73 73 61 67  EOS error messag
8ec30 65 20 28 69 66 20 61 6e 79 29 0a 2f 20 72 65 74  e (if any)./ ret
8ec40 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20  urn NULL on any 
8ec50 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
8ec60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73    const char *ms
8ec70 67 3b 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74  g;.    void *dat
8ec80 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  a = sqlite3_user
8ec90 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
8eca0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
8ecb0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
8ecc0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
8ecd0 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29  f (data != NULL)
8ece0 0a 09 6d 73 67 20 3d 20 67 61 69 61 47 65 74 47  ..msg = gaiaGetG
8ecf0 65 6f 73 41 75 78 45 72 72 6f 72 4d 73 67 5f 72  eosAuxErrorMsg_r
8ed00 20 28 64 61 74 61 29 3b 0a 20 20 20 20 65 6c 73   (data);.    els
8ed10 65 0a 09 6d 73 67 20 3d 20 67 61 69 61 47 65 74  e..msg = gaiaGet
8ed20 47 65 6f 73 41 75 78 45 72 72 6f 72 4d 73 67 20  GeosAuxErrorMsg 
8ed30 28 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20  ();.    if (msg 
8ed40 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65  == NULL)..sqlite
8ed50 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
8ed60 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
8ed70 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
8ed80 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c  t_text (context,
8ed90 20 6d 73 67 2c 20 73 74 72 6c 65 6e 20 28 6d 73   msg, strlen (ms
8eda0 67 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  g), SQLITE_STATI
8edb0 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  C);.}..static vo
8edc0 69 64 0a 66 6e 63 74 5f 47 45 4f 53 5f 47 65 74  id.fnct_GEOS_Get
8edd0 43 72 69 74 69 63 61 6c 50 6f 69 6e 74 46 72 6f  CriticalPointFro
8ede0 6d 4d 73 67 20 28 73 71 6c 69 74 65 33 5f 63 6f  mMsg (sqlite3_co
8edf0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
8ee00 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20   int argc,..... 
8ee10 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8ee20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
8ee30 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 45  L function:./ GE
8ee40 4f 53 5f 47 65 74 43 72 69 74 69 63 61 6c 50 6f  OS_GetCriticalPo
8ee50 69 6e 74 46 72 6f 6d 4d 73 67 28 29 0a 2f 0a 2f  intFromMsg()././
8ee60 20 72 65 74 75 72 6e 20 61 20 50 6f 69 6e 74 20   return a Point 
8ee70 47 65 6f 6d 65 74 72 79 20 62 79 20 28 70 6f 73  Geometry by (pos
8ee80 73 69 62 6c 79 29 20 70 61 72 73 69 6e 67 20 74  sibly) parsing t
8ee90 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 47  he most recent G
8eea0 45 4f 53 20 65 72 72 6f 72 2f 77 61 72 6e 69 6e  EOS error/warnin
8eeb0 67 20 6d 65 73 73 61 67 65 20 0a 2f 20 72 65 74  g message ./ ret
8eec0 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20  urn NULL on any 
8eed0 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
8eee0 20 20 69 6e 74 20 73 72 69 64 20 3d 20 2d 31 3b    int srid = -1;
8eef0 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
8ef00 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20 76  lPtr geom;.    v
8ef10 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69  oid *data = sqli
8ef20 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
8ef30 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74  ontext);.    int
8ef40 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
8ef50 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
8ef60 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nt = 0;.    stru
8ef70 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
8ef80 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
8ef90 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
8efa0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
8efb0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
8efc0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
8efd0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
8efe0 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
8eff0 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
8f000 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
8f010 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
8f020 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
8f030 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
8f040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
8f050 20 28 61 72 67 63 20 3d 3d 20 31 29 0a 20 20 20   (argc == 1).   
8f060 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
8f070 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
8f080 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
8f090 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
8f0a0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
8f0b0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
8f0c0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
8f0d0 20 20 20 7d 0a 09 20 20 73 72 69 64 20 3d 20 73     }..  srid = s
8f0e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
8f0f0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
8f100 20 20 7d 0a 20 20 20 20 69 66 20 28 64 61 74 61    }.    if (data
8f110 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 65 6f 6d 20   != NULL)..geom 
8f120 3d 20 67 61 69 61 43 72 69 74 69 63 61 6c 50 6f  = gaiaCriticalPo
8f130 69 6e 74 46 72 6f 6d 47 45 4f 53 6d 73 67 5f 72  intFromGEOSmsg_r
8f140 20 28 64 61 74 61 29 3b 0a 20 20 20 20 65 6c 73   (data);.    els
8f150 65 0a 09 67 65 6f 6d 20 3d 20 67 61 69 61 43 72  e..geom = gaiaCr
8f160 69 74 69 63 61 6c 50 6f 69 6e 74 46 72 6f 6d 47  iticalPointFromG
8f170 45 4f 53 6d 73 67 20 28 29 3b 0a 20 20 20 20 69  EOSmsg ();.    i
8f180 66 20 28 67 65 6f 6d 20 3d 3d 20 4e 55 4c 4c 29  f (geom == NULL)
8f190 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
8f1a0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
8f1b0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
8f1c0 7b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 63 68  {..  unsigned ch
8f1d0 61 72 20 2a 62 6c 6f 62 3b 0a 09 20 20 69 6e 74  ar *blob;..  int
8f1e0 20 6c 65 6e 3b 0a 09 20 20 67 65 6f 6d 2d 3e 53   len;..  geom->S
8f1f0 72 69 64 20 3d 20 73 72 69 64 3b 0a 09 20 20 67  rid = srid;..  g
8f200 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
8f210 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 2c  lobWkbEx2 (geom,
8f220 20 26 62 6c 6f 62 2c 20 26 6c 65 6e 2c 20 67 70   &blob, &len, gp
8f230 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f  kg_mode, tiny_po
8f240 69 6e 74 29 3b 0a 09 20 20 67 61 69 61 46 72 65  int);..  gaiaFre
8f250 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29  eGeomColl (geom)
8f260 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
8f270 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
8f280 74 2c 20 62 6c 6f 62 2c 20 6c 65 6e 2c 20 66 72  t, blob, len, fr
8f290 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a  ee);.      }.}..
8f2a0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
8f2b0 5f 49 73 56 61 6c 69 64 52 65 61 73 6f 6e 20 28  _IsValidReason (
8f2c0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8f2d0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
8f2e0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
8f2f0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
8f300 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
8f310 20 49 73 56 61 6c 69 64 52 65 61 73 6f 6e 28 67   IsValidReason(g
8f320 65 6f 6d 20 5b 20 2c 20 65 73 72 69 5f 66 6c 61  eom [ , esri_fla
8f330 67 5d 20 29 0a 2f 20 53 54 5f 49 73 56 61 6c 69  g] )./ ST_IsVali
8f340 64 52 65 61 73 6f 6e 28 67 65 6f 6d 20 5b 20 2c  dReason(geom [ ,
8f350 20 65 73 72 69 5f 66 6c 61 67 5d 20 29 0a 2f 0a   esri_flag] )./.
8f360 2f 20 72 65 74 75 72 6e 20 61 20 54 45 58 54 20  / return a TEXT 
8f370 73 74 72 69 6e 67 20 73 74 61 74 69 6e 67 20 69  string stating i
8f380 66 20 61 20 47 65 6f 6d 65 74 72 79 20 69 73 20  f a Geometry is 
8f390 76 61 6c 69 64 0a 2f 20 61 6e 64 20 69 66 20 6e  valid./ and if n
8f3a0 6f 74 20 76 61 6c 69 64 2c 20 61 20 72 65 61 73  ot valid, a reas
8f3b0 6f 6e 20 77 68 79 0a 2f 20 72 65 74 75 72 6e 20  on why./ return 
8f3c0 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68 65  NULL on any othe
8f3d0 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 75 6e  r case.*/.    un
8f3e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
8f3f0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
8f400 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
8f410 6e 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  n;.    gaiaGeomC
8f420 6f 6c 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20  ollPtr geom;.   
8f430 20 69 6e 74 20 65 73 72 69 5f 66 6c 61 67 20 3d   int esri_flag =
8f440 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 74   0;.    char *st
8f450 72 3b 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74  r;.    void *dat
8f460 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  a = sqlite3_user
8f470 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
8f480 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
8f490 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
8f4a0 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
8f4b0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
8f4c0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
8f4d0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
8f4e0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
8f4f0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
8f500 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
8f510 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
8f520 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
8f530 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
8f540 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
8f550 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
8f560 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
8f570 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
8f580 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
8f590 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
8f5a0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
8f5b0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
8f5c0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
8f5d0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
8f5e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
8f5f0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
8f600 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
8f610 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
8f620 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
8f630 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8f640 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
8f650 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
8f660 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8f670 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
8f680 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20  if (argc >= 2). 
8f690 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
8f6a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8f6b0 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
8f6c0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
8f6d0 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
8f6e0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
8f6f0 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
8f700 09 20 20 20 20 7d 0a 09 20 20 65 73 72 69 5f 66  .    }..  esri_f
8f710 6c 61 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lag = sqlite3_va
8f720 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
8f730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
8f740 65 6f 6d 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  eom =..gaiaFromS
8f750 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
8f760 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
8f770 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
8f780 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
8f790 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
8f7a0 66 20 28 65 73 72 69 5f 66 6c 61 67 29 0a 20 20  f (esri_flag).  
8f7b0 20 20 20 20 7b 0a 09 20 20 67 61 69 61 47 65 6f      {..  gaiaGeo
8f7c0 6d 43 6f 6c 6c 50 74 72 20 64 65 74 61 69 6c 3b  mCollPtr detail;
8f7d0 0a 09 20 20 69 66 20 28 64 61 74 61 20 21 3d 20  ..  if (data != 
8f7e0 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 64 65 74  NULL)..      det
8f7f0 61 69 6c 20 3d 20 67 61 69 61 49 73 56 61 6c 69  ail = gaiaIsVali
8f800 64 44 65 74 61 69 6c 45 78 5f 72 20 28 64 61 74  dDetailEx_r (dat
8f810 61 2c 20 67 65 6f 6d 2c 20 65 73 72 69 5f 66 6c  a, geom, esri_fl
8f820 61 67 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  ag);..  else..  
8f830 20 20 20 20 64 65 74 61 69 6c 20 3d 20 67 61 69      detail = gai
8f840 61 49 73 56 61 6c 69 64 44 65 74 61 69 6c 45 78  aIsValidDetailEx
8f850 20 28 67 65 6f 6d 2c 20 65 73 72 69 5f 66 6c 61   (geom, esri_fla
8f860 67 29 3b 0a 09 20 20 69 66 20 28 64 65 74 61 69  g);..  if (detai
8f870 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  l == NULL)..    
8f880 7b 0a 09 09 2f 2a 20 70 65 72 66 6f 72 6d 69 6e  {.../* performin
8f890 67 20 65 78 74 72 61 20 63 68 65 63 6b 73 20 2a  g extra checks *
8f8a0 2f 0a 09 09 69 66 20 28 64 61 74 61 20 21 3d 20  /...if (data != 
8f8b0 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20  NULL)...  {...  
8f8c0 20 20 20 20 69 66 20 28 67 61 69 61 49 73 54 6f      if (gaiaIsTo
8f8d0 78 69 63 5f 72 20 28 64 61 74 61 2c 20 67 65 6f  xic_r (data, geo
8f8e0 6d 29 29 0a 09 09 09 20 20 73 71 6c 69 74 65 33  m))....  sqlite3
8f8f0 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f  _result_text (co
8f900 6e 74 65 78 74 2c 0a 09 09 09 09 09 20 20 20 20  ntext,......    
8f910 20 20 20 22 49 6e 76 61 6c 69 64 3a 20 54 6f 78     "Invalid: Tox
8f920 69 63 20 47 65 6f 6d 65 74 72 79 20 2e 2e 2e 20  ic Geometry ... 
8f930 74 6f 6f 20 66 65 77 20 70 6f 69 6e 74 73 22 2c  too few points",
8f940 0a 09 09 09 09 09 20 20 20 20 20 20 20 2d 31 2c  ......       -1,
8f950 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
8f960 54 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65  T);...      else
8f970 20 69 66 20 28 67 61 69 61 49 73 4e 6f 74 43 6c   if (gaiaIsNotCl
8f980 6f 73 65 64 47 65 6f 6d 43 6f 6c 6c 5f 72 20 28  osedGeomColl_r (
8f990 64 61 74 61 2c 20 67 65 6f 6d 29 29 0a 09 09 09  data, geom))....
8f9a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8f9b0 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 0a  _text (context,.
8f9c0 09 09 09 09 09 20 20 20 20 20 20 20 22 49 6e 76  .....       "Inv
8f9d0 61 6c 69 64 3a 20 55 6e 63 6c 6f 73 65 64 20 52  alid: Unclosed R
8f9e0 69 6e 67 73 20 77 65 72 65 20 64 65 74 65 63 74  ings were detect
8f9f0 65 64 22 2c 0a 09 09 09 09 09 20 20 20 20 20 20  ed",......      
8fa00 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
8fa10 53 49 45 4e 54 29 3b 0a 09 09 20 20 20 20 20 20  SIENT);...      
8fa20 65 6c 73 65 0a 09 09 09 20 20 73 71 6c 69 74 65  else....  sqlite
8fa30 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63  3_result_text (c
8fa40 6f 6e 74 65 78 74 2c 20 22 56 61 6c 69 64 20 47  ontext, "Valid G
8fa50 65 6f 6d 65 74 72 79 22 2c 20 2d 31 2c 0a 09 09  eometry", -1,...
8fa60 09 09 09 20 20 20 20 20 20 20 53 51 4c 49 54 45  ...       SQLITE
8fa70 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 09 09 20  _TRANSIENT);... 
8fa80 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a   }...else...  {.
8fa90 09 09 20 20 20 20 20 20 69 66 20 28 67 61 69 61  ..      if (gaia
8faa0 49 73 54 6f 78 69 63 20 28 67 65 6f 6d 29 29 0a  IsToxic (geom)).
8fab0 09 09 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ...  sqlite3_res
8fac0 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
8fad0 74 2c 0a 09 09 09 09 09 20 20 20 20 20 20 20 22  t,......       "
8fae0 49 6e 76 61 6c 69 64 3a 20 54 6f 78 69 63 20 47  Invalid: Toxic G
8faf0 65 6f 6d 65 74 72 79 20 2e 2e 2e 20 74 6f 6f 20  eometry ... too 
8fb00 66 65 77 20 70 6f 69 6e 74 73 22 2c 0a 09 09 09  few points",....
8fb10 09 09 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ..       -1, SQL
8fb20 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
8fb30 09 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20  ..      else if 
8fb40 28 67 61 69 61 49 73 4e 6f 74 43 6c 6f 73 65 64  (gaiaIsNotClosed
8fb50 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 29  GeomColl (geom))
8fb60 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f 72 65  ....  sqlite3_re
8fb70 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
8fb80 78 74 2c 0a 09 09 09 09 09 20 20 20 20 20 20 20  xt,......       
8fb90 22 49 6e 76 61 6c 69 64 3a 20 55 6e 63 6c 6f 73  "Invalid: Unclos
8fba0 65 64 20 52 69 6e 67 73 20 77 65 72 65 20 64 65  ed Rings were de
8fbb0 74 65 63 74 65 64 22 2c 0a 09 09 09 09 09 20 20  tected",......  
8fbc0 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
8fbd0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 09 09 20 20  TRANSIENT);...  
8fbe0 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 73 71      else....  sq
8fbf0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
8fc00 74 20 28 63 6f 6e 74 65 78 74 2c 20 22 56 61 6c  t (context, "Val
8fc10 69 64 20 47 65 6f 6d 65 74 72 79 22 2c 20 2d 31  id Geometry", -1
8fc20 2c 0a 09 09 09 09 09 20 20 20 20 20 20 20 53 51  ,......       SQ
8fc30 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
8fc40 0a 09 09 20 20 7d 0a 09 09 67 6f 74 6f 20 65 6e  ...  }...goto en
8fc50 64 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  d;..    }..  els
8fc60 65 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 65  e..      gaiaFre
8fc70 65 47 65 6f 6d 43 6f 6c 6c 20 28 64 65 74 61 69  eGeomColl (detai
8fc80 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
8fc90 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c  if (data != NULL
8fca0 29 0a 09 73 74 72 20 3d 20 67 61 69 61 49 73 56  )..str = gaiaIsV
8fcb0 61 6c 69 64 52 65 61 73 6f 6e 5f 72 20 28 64 61  alidReason_r (da
8fcc0 74 61 2c 20 67 65 6f 6d 29 3b 0a 20 20 20 20 65  ta, geom);.    e
8fcd0 6c 73 65 0a 09 73 74 72 20 3d 20 67 61 69 61 49  lse..str = gaiaI
8fce0 73 56 61 6c 69 64 52 65 61 73 6f 6e 20 28 67 65  sValidReason (ge
8fcf0 6f 6d 29 3b 0a 20 20 20 20 69 66 20 28 73 74 72  om);.    if (str
8fd00 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
8fd10 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
8fd20 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
8fd30 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 6c 65  se.      {..  le
8fd40 6e 20 3d 20 73 74 72 6c 65 6e 20 28 73 74 72 29  n = strlen (str)
8fd50 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
8fd60 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
8fd70 74 2c 20 73 74 72 2c 20 6c 65 6e 2c 20 66 72 65  t, str, len, fre
8fd80 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 65 6e  e);.      }.  en
8fd90 64 3a 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 20  d:.    if (geom 
8fda0 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72  != NULL)..gaiaFr
8fdb0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
8fdc0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
8fdd0 64 0a 66 6e 63 74 5f 49 73 56 61 6c 69 64 44 65  d.fnct_IsValidDe
8fde0 74 61 69 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f  tail (sqlite3_co
8fdf0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
8fe00 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
8fe10 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
8fe20 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
8fe30 69 6f 6e 3a 0a 2f 20 49 73 56 61 6c 69 64 44 65  ion:./ IsValidDe
8fe40 74 61 69 6c 28 67 65 6f 6d 20 5b 20 2c 20 65 73  tail(geom [ , es
8fe50 72 69 5f 66 6c 61 67 5d 20 29 0a 2f 20 53 54 5f  ri_flag] )./ ST_
8fe60 49 73 56 61 6c 69 64 44 65 74 61 69 6c 28 67 65  IsValidDetail(ge
8fe70 6f 6d 20 5b 20 2c 20 65 73 72 69 5f 66 6c 61 67  om [ , esri_flag
8fe80 5d 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 61  ] )././ return a
8fe90 20 47 65 6f 6d 65 74 72 79 20 64 65 74 61 69 6c   Geometry detail
8fea0 20 63 61 75 73 69 6e 67 20 61 20 47 65 6f 6d 65   causing a Geome
8feb0 74 72 79 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  try to be invali
8fec0 64 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  d./ return NULL 
8fed0 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73  on any other cas
8fee0 65 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  e.*/.    unsigne
8fef0 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
8ff00 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
8ff10 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
8ff20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
8ff30 72 20 67 65 6f 6d 3b 0a 20 20 20 20 67 61 69 61  r geom;.    gaia
8ff40 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 64 65 74 61  GeomCollPtr deta
8ff50 69 6c 3b 0a 20 20 20 20 69 6e 74 20 65 73 72 69  il;.    int esri
8ff60 5f 66 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  _flag = 0;.    u
8ff70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
8ff80 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
8ff90 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20     void *data = 
8ffa0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
8ffb0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
8ffc0 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
8ffd0 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
8ffe0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
8fff0 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
90000 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
90010 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
90020 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
90030 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
90040 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
90050 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
90060 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
90070 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
90080 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
90090 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
900a0 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
900b0 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
900c0 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
900d0 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
900e0 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
900f0 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
90100 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
90110 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
90120 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
90130 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
90140 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
90150 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
90160 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
90170 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
90180 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
90190 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
901a0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
901b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
901c0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
901d0 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
901e0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
901f0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[0]);.    if 
90200 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20 20  (argc >= 2).    
90210 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
90220 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
90230 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
90240 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
90250 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
90260 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
90270 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
90280 20 20 7d 0a 09 20 20 65 73 72 69 5f 66 6c 61 67    }..  esri_flag
90290 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
902a0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
902b0 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f 6d        }.    geom
902c0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
902d0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
902e0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
902f0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
90300 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
90310 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
90320 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 64  data != NULL)..d
90330 65 74 61 69 6c 20 3d 20 67 61 69 61 49 73 56 61  etail = gaiaIsVa
90340 6c 69 64 44 65 74 61 69 6c 45 78 5f 72 20 28 64  lidDetailEx_r (d
90350 61 74 61 2c 20 67 65 6f 6d 2c 20 65 73 72 69 5f  ata, geom, esri_
90360 66 6c 61 67 29 3b 0a 20 20 20 20 65 6c 73 65 0a  flag);.    else.
90370 09 64 65 74 61 69 6c 20 3d 20 67 61 69 61 49 73  .detail = gaiaIs
90380 56 61 6c 69 64 44 65 74 61 69 6c 45 78 20 28 67  ValidDetailEx (g
90390 65 6f 6d 2c 20 65 73 72 69 5f 66 6c 61 67 29 3b  eom, esri_flag);
903a0 0a 20 20 20 20 69 66 20 28 64 65 74 61 69 6c 20  .    if (detail 
903b0 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65  == NULL)..sqlite
903c0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
903d0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
903e0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 64 65 74  e.      {..  det
903f0 61 69 6c 2d 3e 53 72 69 64 20 3d 20 67 65 6f 6d  ail->Srid = geom
90400 2d 3e 53 72 69 64 3b 0a 09 20 20 67 61 69 61 54  ->Srid;..  gaiaT
90410 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
90420 6b 62 45 78 32 20 28 64 65 74 61 69 6c 2c 20 26  kbEx2 (detail, &
90430 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20  p_result, &len, 
90440 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
90450 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29       tiny_point)
90460 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
90470 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
90480 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
90490 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  , free);.      }
904a0 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 20 21 3d  .    if (geom !=
904b0 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65   NULL)..gaiaFree
904c0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b  GeomColl (geom);
904d0 0a 20 20 20 20 69 66 20 28 64 65 74 61 69 6c 20  .    if (detail 
904e0 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72  != NULL)..gaiaFr
904f0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 64 65 74 61  eeGeomColl (deta
90500 69 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  il);.}..static v
90510 6f 69 64 0a 66 6e 63 74 5f 42 6f 75 6e 64 61 72  oid.fnct_Boundar
90520 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  y (sqlite3_conte
90530 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
90540 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
90550 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
90560 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
90570 3a 0a 2f 20 42 6f 75 6e 64 61 72 79 28 42 4c 4f  :./ Boundary(BLO
90580 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  B encoded geomet
90590 72 79 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  ry)././ returns 
905a0 74 68 65 20 63 6f 6d 62 69 6e 61 74 6f 72 69 61  the combinatoria
905b0 6c 20 62 6f 75 6e 64 61 72 79 20 66 6f 72 20 63  l boundary for c
905c0 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20  urrent geometry 
905d0 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
905e0 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
905f0 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
90600 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
90610 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
90620 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ytes;.    int le
90630 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
90640 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
90650 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
90660 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
90670 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
90680 65 6f 6d 43 6f 6c 6c 50 74 72 20 62 6f 75 6e 64  eomCollPtr bound
90690 61 72 79 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ary;.    int gpk
906a0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
906b0 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
906c0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ode = 0;.    int
906d0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b   tiny_point = 0;
906e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
906f0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
90700 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
90710 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
90720 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
90730 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
90740 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
90750 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
90760 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
90770 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
90780 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
90790 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
907a0 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
907b0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
907c0 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
907d0 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
907e0 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
907f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
90800 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
90810 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
90820 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
90830 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
90840 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
90850 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
90860 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
90870 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
90880 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
90890 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
908a0 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
908b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
908c0 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
908d0 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
908e0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
908f0 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
90900 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
90910 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
90920 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
90930 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
90940 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
90950 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
90960 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
90970 20 20 69 66 20 28 67 61 69 61 49 73 45 6d 70 74    if (gaiaIsEmpt
90980 79 20 28 67 65 6f 29 29 0a 09 20 20 20 20 20 20  y (geo))..      
90990 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
909a0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
909b0 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
909c0 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c  void *data = sql
909d0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
909e0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 69 66 20 28  context);...if (
909f0 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09  data != NULL)...
90a00 20 20 20 20 62 6f 75 6e 64 61 72 79 20 3d 20 67      boundary = g
90a10 61 69 61 42 6f 75 6e 64 61 72 79 5f 72 20 28 64  aiaBoundary_r (d
90a20 61 74 61 2c 20 67 65 6f 29 3b 0a 09 09 65 6c 73  ata, geo);...els
90a30 65 0a 09 09 20 20 20 20 62 6f 75 6e 64 61 72 79  e...    boundary
90a40 20 3d 20 67 61 69 61 42 6f 75 6e 64 61 72 79 20   = gaiaBoundary 
90a50 28 67 65 6f 29 3b 0a 09 09 69 66 20 28 21 62 6f  (geo);...if (!bo
90a60 75 6e 64 61 72 79 29 0a 09 09 20 20 20 20 73 71  undary)...    sq
90a70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
90a80 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 65  l (context);...e
90a90 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  lse...  {...    
90aa0 20 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69    gaiaToSpatiaLi
90ab0 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 62 6f  teBlobWkbEx2 (bo
90ac0 75 6e 64 61 72 79 2c 20 26 70 5f 72 65 73 75 6c  undary, &p_resul
90ad0 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 09 20  t, &len,....... 
90ae0 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79   gpkg_mode, tiny
90af0 5f 70 6f 69 6e 74 29 3b 0a 09 09 20 20 20 20 20  _point);...     
90b00 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
90b10 6c 20 28 62 6f 75 6e 64 61 72 79 29 3b 0a 09 09  l (boundary);...
90b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
90b30 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
90b40 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
90b50 6e 2c 20 66 72 65 65 29 3b 0a 09 09 20 20 7d 0a  n, free);...  }.
90b60 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
90b70 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
90b80 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
90b90 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49  atic void.fnct_I
90ba0 73 43 6c 6f 73 65 64 20 28 73 71 6c 69 74 65 33  sClosed (sqlite3
90bb0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
90bc0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
90bd0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
90be0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
90bf0 6e 63 74 69 6f 6e 3a 0a 2f 20 49 73 43 6c 6f 73  nction:./ IsClos
90c00 65 64 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20  ed(BLOB encoded 
90c10 4c 49 4e 45 53 54 52 49 4e 47 20 6f 72 20 4d 55  LINESTRING or MU
90c20 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 67 65  LTILINESTRING ge
90c30 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
90c40 72 6e 73 3a 0a 2f 20 31 20 69 66 20 74 68 69 73  rns:./ 1 if this
90c50 20 4c 49 4e 45 53 54 52 49 4e 47 20 69 73 20 63   LINESTRING is c
90c60 6c 6f 73 65 64 20 5b 6f 72 20 69 66 20 74 68 69  losed [or if thi
90c70 73 20 69 73 20 61 20 4d 55 4c 54 49 4c 49 4e 45  s is a MULTILINE
90c80 53 54 52 49 4e 47 20 61 6e 64 20 65 76 65 72 79  STRING and every
90c90 20 4c 49 4e 45 53 54 52 49 4e 47 73 20 61 72 65   LINESTRINGs are
90ca0 20 63 6c 6f 73 65 64 5d 20 0a 2f 20 30 20 6f 74   closed] ./ 0 ot
90cb0 68 65 72 77 69 73 65 0a 2f 20 6f 72 20 2d 31 20  herwise./ or -1 
90cc0 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
90cd0 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
90ce0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
90cf0 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e   *p_blob;.    in
90d00 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67  t n_bytes;.    g
90d10 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
90d20 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  eo = NULL;.    i
90d30 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
90d40 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
90d50 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
90d60 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
90d70 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
90d80 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
90d90 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
90da0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
90db0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
90dc0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
90dd0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
90de0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
90df0 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
90e00 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
90e10 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
90e20 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
90e30 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
90e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
90e50 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
90e60 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
90e70 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
90e80 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
90e90 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
90ea0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
90eb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
90ec0 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
90ed0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
90ee0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
90ef0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
90f00 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
90f10 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
90f20 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
90f30 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
90f40 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
90f50 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
90f60 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
90f70 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
90f80 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
90f90 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
90fa0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
90fb0 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c 73  xt, -1);.    els
90fc0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
90fd0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
90fe0 28 63 6f 6e 74 65 78 74 2c 20 67 61 69 61 49 73  (context, gaiaIs
90ff0 43 6c 6f 73 65 64 47 65 6f 6d 20 28 67 65 6f 29  ClosedGeom (geo)
91000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  );.      }.    g
91010 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
91020 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
91030 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 53 69 6d   void.fnct_IsSim
91040 70 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ple (sqlite3_con
91050 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
91060 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
91070 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
91080 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
91090 6f 6e 3a 0a 2f 20 49 73 53 69 6d 70 6c 65 28 42  on:./ IsSimple(B
910a0 4c 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4f 4d  LOB encoded GEOM
910b0 45 54 52 59 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  ETRY)././ return
910c0 73 3a 0a 2f 20 31 20 69 66 20 74 68 69 73 20 47  s:./ 1 if this G
910d0 45 4f 4d 45 54 52 59 20 69 73 20 73 69 6d 70 6c  EOMETRY is simpl
910e0 65 0a 2f 20 30 20 6f 74 68 65 72 77 69 73 65 0a  e./ 0 otherwise.
910f0 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79 20 65  / or -1 if any e
91100 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
91110 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
91120 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
91130 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
91140 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  s;.    int ret;.
91150 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
91160 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a  Ptr geo = NULL;.
91170 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
91180 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
91190 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
911a0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
911b0 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
911c0 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
911d0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
911e0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
911f0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
91200 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
91210 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
91220 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
91230 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
91240 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
91250 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
91260 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
91270 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
91280 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _mode;.      }. 
91290 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
912a0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
912b0 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
912c0 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
912d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
912e0 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
912f0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
91300 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
91310 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
91320 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
91330 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
91340 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
91350 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
91360 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
91370 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f    geo =..gaiaFro
91380 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
91390 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
913a0 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
913b0 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
913c0 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
913d0 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69   if (!geo)..sqli
913e0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
913f0 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 20 20  context, -1);.  
91400 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
91410 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73    void *data = s
91420 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
91430 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69   (context);..  i
91440 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29  f (data != NULL)
91450 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61  ..      ret = ga
91460 69 61 49 73 53 69 6d 70 6c 65 5f 72 20 28 64 61  iaIsSimple_r (da
91470 74 61 2c 20 67 65 6f 29 3b 0a 09 20 20 65 6c 73  ta, geo);..  els
91480 65 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20 67  e..      ret = g
91490 61 69 61 49 73 53 69 6d 70 6c 65 20 28 67 65 6f  aiaIsSimple (geo
914a0 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3c 20  );..  if (ret < 
914b0 30 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  0)..      sqlite
914c0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
914d0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 65  ntext, -1);..  e
914e0 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lse..      sqlit
914f0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
91500 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 20 20  ontext, ret);.  
91510 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
91520 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
91530 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
91540 0a 66 6e 63 74 5f 49 73 52 69 6e 67 20 28 73 71  .fnct_IsRing (sq
91550 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
91560 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
91570 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
91580 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
91590 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49  QL function:./ I
915a0 73 52 69 6e 67 28 42 4c 4f 42 20 65 6e 63 6f 64  sRing(BLOB encod
915b0 65 64 20 4c 49 4e 45 53 54 52 49 4e 47 20 67 65  ed LINESTRING ge
915c0 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65 74 75  ometry)././ retu
915d0 72 6e 73 3a 0a 2f 20 31 20 69 66 20 74 68 69 73  rns:./ 1 if this
915e0 20 4c 49 4e 45 53 54 52 49 4e 47 20 69 73 20 61   LINESTRING is a
915f0 20 76 61 6c 69 64 20 52 49 4e 47 0a 2f 20 30 20   valid RING./ 0 
91600 6f 74 68 65 72 77 69 73 65 0a 2f 20 6f 72 20 2d  otherwise./ or -
91610 31 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  1 if any error i
91620 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
91630 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
91640 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
91650 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
91660 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 67 61   int ret;.    ga
91670 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
91680 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  o = NULL;.    ga
91690 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20  iaLinestringPtr 
916a0 6c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 67 70  line;.    int gp
916b0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
916c0 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
916d0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74  mode = 0;.    st
916e0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
916f0 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
91700 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
91710 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
91720 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
91730 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
91740 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
91750 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
91760 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
91770 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
91780 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
91790 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
917a0 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
917b0 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20  ->gpkg_mode;.   
917c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
917d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
917e0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
917f0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
91800 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
91810 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
91820 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
91830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
91840 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
91850 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
91860 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
91870 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
91880 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
91890 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
918a0 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
918b0 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
918c0 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
918d0 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
918e0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
918f0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
91900 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
91910 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
91920 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
91930 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  1);.    else.   
91940 20 20 20 7b 0a 09 20 20 6c 69 6e 65 20 3d 20 73     {..  line = s
91950 69 6d 70 6c 65 4c 69 6e 65 73 74 72 69 6e 67 20  impleLinestring 
91960 28 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 6c 69  (geo);..  if (li
91970 6e 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  ne == NULL)..   
91980 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
91990 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
919a0 2d 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  -1);..  else..  
919b0 20 20 7b 0a 09 09 76 6f 69 64 20 2a 64 61 74 61    {...void *data
919c0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
919d0 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
919e0 09 09 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55  ..if (data != NU
919f0 4c 4c 29 0a 09 09 20 20 20 20 72 65 74 20 3d 20  LL)...    ret = 
91a00 67 61 69 61 49 73 52 69 6e 67 5f 72 20 28 64 61  gaiaIsRing_r (da
91a10 74 61 2c 20 6c 69 6e 65 29 3b 0a 09 09 65 6c 73  ta, line);...els
91a20 65 0a 09 09 20 20 20 20 72 65 74 20 3d 20 67 61  e...    ret = ga
91a30 69 61 49 73 52 69 6e 67 20 28 6c 69 6e 65 29 3b  iaIsRing (line);
91a40 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
91a50 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
91a60 72 65 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ret);..    }.   
91a70 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
91a80 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
91a90 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
91aa0 66 6e 63 74 5f 49 73 56 61 6c 69 64 20 28 73 71  fnct_IsValid (sq
91ab0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
91ac0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
91ad0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
91ae0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
91af0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49  QL function:./ I
91b00 73 56 61 6c 69 64 28 42 4c 4f 42 20 65 6e 63 6f  sValid(BLOB enco
91b10 64 65 64 20 47 45 4f 4d 45 54 52 59 20 5b 20 2c  ded GEOMETRY [ ,
91b20 20 42 4f 4f 4c 45 41 4e 20 65 73 72 69 5f 66 6c   BOOLEAN esri_fl
91b30 61 67 5d 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  ag] )././ return
91b40 73 3a 0a 2f 20 31 20 69 66 20 74 68 69 73 20 47  s:./ 1 if this G
91b50 45 4f 4d 45 54 52 59 20 69 73 20 61 20 76 61 6c  EOMETRY is a val
91b60 69 64 20 6f 6e 65 0a 2f 20 30 20 6f 74 68 65 72  id one./ 0 other
91b70 77 69 73 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20  wise./ or -1 if 
91b80 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
91b90 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
91ba0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
91bb0 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
91bc0 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
91bd0 72 65 74 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ret;.    gaiaGeo
91be0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
91bf0 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 65 73 72  ULL;.    int esr
91c00 69 5f 66 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20  i_flag = 0;.    
91c10 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
91c20 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
91c30 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
91c40 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
91c50 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
91c60 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
91c70 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
91c80 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
91c90 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
91ca0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
91cb0 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
91cc0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
91cd0 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
91ce0 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
91cf0 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
91d00 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
91d10 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
91d20 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
91d30 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
91d40 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
91d50 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
91d60 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
91d70 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
91d80 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
91d90 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
91da0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
91db0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
91dc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
91dd0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
91de0 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
91df0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
91e00 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
91e10 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20   (argc >= 2).   
91e20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
91e30 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
91e40 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
91e50 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
91e60 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
91e70 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
91e80 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
91e90 20 20 20 7d 0a 09 20 20 65 73 72 69 5f 66 6c 61     }..  esri_fla
91ea0 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
91eb0 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b  e_int (argv[1]);
91ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f  .      }.    geo
91ed0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
91ee0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
91ef0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
91f00 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
91f10 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
91f20 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
91f30 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
91f40 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
91f50 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c 73  xt, -1);.    els
91f60 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69  e.      {..  voi
91f70 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65  d *data = sqlite
91f80 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
91f90 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 65 73  text);..  if (es
91fa0 72 69 5f 66 6c 61 67 29 0a 09 20 20 20 20 7b 0a  ri_flag)..    {.
91fb0 09 09 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74  ..gaiaGeomCollPt
91fc0 72 20 64 65 74 61 69 6c 3b 0a 09 09 69 66 20 28  r detail;...if (
91fd0 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09  data != NULL)...
91fe0 20 20 20 20 64 65 74 61 69 6c 20 3d 20 67 61 69      detail = gai
91ff0 61 49 73 56 61 6c 69 64 44 65 74 61 69 6c 45 78  aIsValidDetailEx
92000 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 2c 20 65  _r (data, geo, e
92010 73 72 69 5f 66 6c 61 67 29 3b 0a 09 09 65 6c 73  sri_flag);...els
92020 65 0a 09 09 20 20 20 20 64 65 74 61 69 6c 20 3d  e...    detail =
92030 20 67 61 69 61 49 73 56 61 6c 69 64 44 65 74 61   gaiaIsValidDeta
92040 69 6c 45 78 20 28 67 65 6f 2c 20 65 73 72 69 5f  ilEx (geo, esri_
92050 66 6c 61 67 29 3b 0a 09 09 69 66 20 28 64 65 74  flag);...if (det
92060 61 69 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 20  ail == NULL)... 
92070 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 65 78   {...      /* ex
92080 74 72 61 20 63 68 65 63 6b 73 20 2a 2f 0a 09 09  tra checks */...
92090 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
920a0 3d 20 30 3b 0a 09 09 20 20 20 20 20 20 69 66 20  = 0;...      if 
920b0 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09  (data != NULL)..
920c0 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28 67  ..{....    if (g
920d0 61 69 61 49 73 54 6f 78 69 63 5f 72 20 28 64 61  aiaIsToxic_r (da
920e0 74 61 2c 20 67 65 6f 29 29 0a 09 09 09 09 65 78  ta, geo)).....ex
920f0 74 72 61 20 3d 20 31 3b 0a 09 09 09 20 20 20 20  tra = 1;....    
92100 69 66 20 28 67 61 69 61 49 73 4e 6f 74 43 6c 6f  if (gaiaIsNotClo
92110 73 65 64 47 65 6f 6d 43 6f 6c 6c 5f 72 20 28 64  sedGeomColl_r (d
92120 61 74 61 2c 20 67 65 6f 29 29 0a 09 09 09 09 65  ata, geo)).....e
92130 78 74 72 61 20 3d 20 31 3b 0a 09 09 09 7d 0a 09  xtra = 1;....}..
92140 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b  .      else....{
92150 0a 09 09 09 20 20 20 20 69 66 20 28 67 61 69 61  ....    if (gaia
92160 49 73 54 6f 78 69 63 20 28 67 65 6f 29 29 0a 09  IsToxic (geo))..
92170 09 09 09 65 78 74 72 61 20 3d 20 31 3b 0a 09 09  ...extra = 1;...
92180 09 20 20 20 20 69 66 20 28 67 61 69 61 49 73 4e  .    if (gaiaIsN
92190 6f 74 43 6c 6f 73 65 64 47 65 6f 6d 43 6f 6c 6c  otClosedGeomColl
921a0 20 28 67 65 6f 29 29 0a 09 09 09 09 65 78 74 72   (geo)).....extr
921b0 61 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 20 20  a = 1;....}...  
921c0 20 20 20 20 69 66 20 28 65 78 74 72 61 29 0a 09      if (extra)..
921d0 09 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
921e0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
921f0 20 30 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73   0);...      els
92200 65 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f 72  e....  sqlite3_r
92210 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
92220 78 74 2c 20 31 29 3b 0a 09 09 20 20 7d 0a 09 09  xt, 1);...  }...
92230 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20  else...  {...   
92240 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
92250 6f 6c 6c 20 28 64 65 74 61 69 6c 29 3b 0a 09 09  oll (detail);...
92260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
92270 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
92280 74 2c 20 30 29 3b 0a 09 09 20 20 7d 0a 09 09 67  t, 0);...  }...g
92290 6f 74 6f 20 65 6e 64 3b 0a 09 20 20 20 20 7d 0a  oto end;..    }.
922a0 09 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e  .  if (data != N
922b0 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 74 20  ULL)..      ret 
922c0 3d 20 67 61 69 61 49 73 56 61 6c 69 64 5f 72 20  = gaiaIsValid_r 
922d0 28 64 61 74 61 2c 20 67 65 6f 29 3b 0a 09 20 20  (data, geo);..  
922e0 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 74 20  else..      ret 
922f0 3d 20 67 61 69 61 49 73 56 61 6c 69 64 20 28 67  = gaiaIsValid (g
92300 65 6f 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20  eo);..  if (ret 
92310 3c 20 30 29 0a 09 20 20 20 20 20 20 73 71 6c 69  < 0)..      sqli
92320 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
92330 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
92340 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c   else..      sql
92350 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
92360 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a  (context, ret);.
92370 20 20 20 20 20 20 7d 0a 20 20 65 6e 64 3a 0a 20        }.  end:. 
92380 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
92390 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
923a0 61 74 69 63 20 76 6f 69 64 0a 6c 65 6e 67 74 68  atic void.length
923b0 5f 63 6f 6d 6d 6f 6e 20 28 63 6f 6e 73 74 20 76  _common (const v
923c0 6f 69 64 20 2a 70 5f 63 61 63 68 65 2c 20 73 71  oid *p_cache, sq
923d0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
923e0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
923f0 63 2c 0a 09 20 20 20 20 20 20 20 73 71 6c 69 74  c,..       sqlit
92400 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
92410 2c 20 69 6e 74 20 69 73 5f 70 65 72 69 6d 65 74  , int is_perimet
92420 65 72 29 0a 7b 0a 2f 2a 20 63 6f 6d 6d 6f 6e 20  er).{./* common 
92430 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 73  implementation s
92440 75 70 70 6f 72 74 69 6e 67 20 62 6f 74 68 20 53  upporting both S
92450 54 5f 4c 65 6e 67 74 68 20 61 6e 64 20 53 54 5f  T_Length and ST_
92460 50 65 72 69 6d 65 74 65 72 20 2a 2f 0a 20 20 20  Perimeter */.   
92470 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
92480 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
92490 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 64 6f 75  n_bytes;.    dou
924a0 62 6c 65 20 6c 65 6e 67 74 68 20 3d 20 30 2e 30  ble length = 0.0
924b0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
924c0 20 20 20 69 6e 74 20 75 73 65 5f 65 6c 6c 69 70     int use_ellip
924d0 73 6f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 64  soid = -1;.    d
924e0 6f 75 62 6c 65 20 61 3b 0a 20 20 20 20 64 6f 75  ouble a;.    dou
924f0 62 6c 65 20 62 3b 0a 20 20 20 20 64 6f 75 62 6c  ble b;.    doubl
92500 65 20 72 66 3b 0a 20 20 20 20 67 61 69 61 47 65  e rf;.    gaiaGe
92510 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
92520 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74 65  NULL;.    sqlite
92530 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69  3 *sqlite = sqli
92540 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
92550 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b  andle (context);
92560 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
92570 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
92580 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
92590 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
925a0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
925b0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
925c0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
925d0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
925e0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
925f0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
92600 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
92610 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
92620 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
92630 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
92640 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
92650 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
92660 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
92670 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
92680 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
92690 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
926a0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
926b0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
926c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
926d0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
926e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
926f0 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
92700 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 2).      {..  
92710 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
92720 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
92730 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
92740 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  ER)..    {...sql
92750 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
92760 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
92770 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
92780 75 73 65 5f 65 6c 6c 69 70 73 6f 69 64 20 3d 20  use_ellipsoid = 
92790 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
927a0 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
927b0 69 66 20 28 75 73 65 5f 65 6c 6c 69 70 73 6f 69  if (use_ellipsoi
927c0 64 20 21 3d 20 30 29 0a 09 20 20 20 20 20 20 75  d != 0)..      u
927d0 73 65 5f 65 6c 6c 69 70 73 6f 69 64 20 3d 20 31  se_ellipsoid = 1
927e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
927f0 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
92800 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
92810 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
92820 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
92830 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
92840 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
92850 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
92860 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
92870 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
92880 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
92890 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
928a0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
928b0 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29  );.    if (!geo)
928c0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
928d0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
928e0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
928f0 7b 0a 09 20 20 69 66 20 28 75 73 65 5f 65 6c 6c  {..  if (use_ell
92900 69 70 73 6f 69 64 20 3e 3d 20 30 29 0a 09 20 20  ipsoid >= 0)..  
92910 20 20 7b 0a 09 09 2f 2a 20 61 74 74 65 6d 70 74    {.../* attempt
92920 69 6e 67 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ing to identify 
92930 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
92940 67 20 65 6c 6c 69 70 73 6f 69 64 20 2a 2f 0a 09  g ellipsoid */..
92950 09 69 66 20 28 67 65 74 45 6c 6c 69 70 73 6f 69  .if (getEllipsoi
92960 64 50 61 72 61 6d 73 20 28 73 71 6c 69 74 65 2c  dParams (sqlite,
92970 20 67 65 6f 2d 3e 53 72 69 64 2c 20 26 61 2c 20   geo->Srid, &a, 
92980 26 62 2c 20 26 72 66 29 29 0a 09 09 20 20 7b 0a  &b, &rf))...  {.
92990 09 09 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c  ..      double l
929a0 3b 0a 09 09 20 20 20 20 20 20 69 6e 74 20 69 62  ;...      int ib
929b0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 4c 69  ;...      gaiaLi
929c0 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 69 6e 65  nestringPtr line
929d0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 50 6f  ;...      gaiaPo
929e0 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 3b 0a  lygonPtr polyg;.
929f0 09 09 20 20 20 20 20 20 67 61 69 61 52 69 6e 67  ..      gaiaRing
92a00 50 74 72 20 72 69 6e 67 3b 0a 09 09 20 20 20 20  Ptr ring;...    
92a10 20 20 69 66 20 28 75 73 65 5f 65 6c 6c 69 70 73    if (use_ellips
92a20 6f 69 64 29 0a 09 09 09 7b 0a 09 09 09 20 20 20  oid)....{....   
92a30 20 2f 2a 20 6d 65 61 73 75 72 69 6e 67 20 6f 6e   /* measuring on
92a40 20 74 68 65 20 45 6c 6c 69 70 73 6f 69 64 20 2a   the Ellipsoid *
92a50 2f 0a 09 09 09 20 20 20 20 69 66 20 28 21 69 73  /....    if (!is
92a60 5f 70 65 72 69 6d 65 74 65 72 29 0a 09 09 09 20  _perimeter).... 
92a70 20 20 20 20 20 7b 0a 09 09 09 09 20 20 6c 69 6e       {.....  lin
92a80 65 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69  e = geo->FirstLi
92a90 6e 65 73 74 72 69 6e 67 3b 0a 09 09 09 09 20 20  nestring;.....  
92aa0 77 68 69 6c 65 20 28 6c 69 6e 65 29 0a 09 09 09  while (line)....
92ab0 09 20 20 20 20 7b 0a 09 09 09 09 09 2f 2a 20 4c  .    {....../* L
92ac0 69 6e 65 73 74 72 69 6e 67 73 20 2a 2f 0a 09 09  inestrings */...
92ad0 09 09 09 6c 20 3d 20 67 61 69 61 47 65 6f 64 65  ...l = gaiaGeode
92ae0 73 69 63 54 6f 74 61 6c 4c 65 6e 67 74 68 20 28  sicTotalLength (
92af0 61 2c 0a 09 09 09 09 09 09 09 09 20 20 20 20 20  a,.........     
92b00 62 2c 0a 09 09 09 09 09 09 09 09 20 20 20 20 20  b,.........     
92b10 72 66 2c 0a 09 09 09 09 09 09 09 09 20 20 20 20  rf,.........    
92b20 20 6c 69 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e   line->Dimension
92b30 4d 6f 64 65 6c 2c 0a 09 09 09 09 09 09 09 09 20  Model,......... 
92b40 20 20 20 20 6c 69 6e 65 2d 3e 0a 09 09 09 09 09      line->......
92b50 09 09 09 20 20 20 20 20 43 6f 6f 72 64 73 2c 0a  ...     Coords,.
92b60 09 09 09 09 09 09 09 09 20 20 20 20 20 6c 69 6e  ........     lin
92b70 65 2d 3e 0a 09 09 09 09 09 09 09 09 20 20 20 20  e->.........    
92b80 20 50 6f 69 6e 74 73 29 3b 0a 09 09 09 09 09 69   Points);......i
92b90 66 20 28 6c 20 3c 20 30 2e 30 29 0a 09 09 09 09  f (l < 0.0).....
92ba0 09 20 20 7b 0a 09 09 09 09 09 20 20 20 20 20 20  .  {......      
92bb0 6c 65 6e 67 74 68 20 3d 20 2d 31 2e 30 3b 0a 09  length = -1.0;..
92bc0 09 09 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b  ....      break;
92bd0 0a 09 09 09 09 09 20 20 7d 0a 09 09 09 09 09 6c  ......  }......l
92be0 65 6e 67 74 68 20 2b 3d 20 6c 3b 0a 09 09 09 09  ength += l;.....
92bf0 09 6c 69 6e 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65  .line = line->Ne
92c00 78 74 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09 09  xt;.....    }...
92c10 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20  .      }....    
92c20 69 66 20 28 6c 65 6e 67 74 68 20 3e 3d 20 30 29  if (length >= 0)
92c30 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09  ....      {.....
92c40 20 20 69 66 20 28 69 73 5f 70 65 72 69 6d 65 74    if (is_perimet
92c50 65 72 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09  er).....    {...
92c60 09 09 09 2f 2a 20 50 6f 6c 79 67 6f 6e 73 20 2a  .../* Polygons *
92c70 2f 0a 09 09 09 09 09 70 6f 6c 79 67 20 3d 20 67  /......polyg = g
92c80 65 6f 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e  eo->FirstPolygon
92c90 3b 0a 09 09 09 09 09 77 68 69 6c 65 20 28 70 6f  ;......while (po
92ca0 6c 79 67 29 0a 09 09 09 09 09 20 20 7b 0a 09 09  lyg)......  {...
92cb0 09 09 09 20 20 20 20 20 20 2f 2a 20 65 78 74 65  ...      /* exte
92cc0 72 69 6f 72 20 52 69 6e 67 20 2a 2f 0a 09 09 09  rior Ring */....
92cd0 09 09 20 20 20 20 20 20 72 69 6e 67 20 3d 20 70  ..      ring = p
92ce0 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a  olyg->Exterior;.
92cf0 09 09 09 09 09 20 20 20 20 20 20 6c 20 3d 20 67  .....      l = g
92d00 61 69 61 47 65 6f 64 65 73 69 63 54 6f 74 61 6c  aiaGeodesicTotal
92d10 4c 65 6e 67 74 68 20 28 61 2c 0a 09 09 09 09 09  Length (a,......
92d20 09 09 09 09 20 20 20 62 2c 0a 09 09 09 09 09 09  ....   b,.......
92d30 09 09 09 20 20 20 72 66 2c 0a 09 09 09 09 09 09  ...   rf,.......
92d40 09 09 09 20 20 20 72 69 6e 67 2d 3e 0a 09 09 09  ...   ring->....
92d50 09 09 09 09 09 09 20 20 20 44 69 6d 65 6e 73 69  ......   Dimensi
92d60 6f 6e 4d 6f 64 65 6c 2c 0a 09 09 09 09 09 09 09  onModel,........
92d70 09 09 20 20 20 72 69 6e 67 2d 3e 0a 09 09 09 09  ..   ring->.....
92d80 09 09 09 09 09 20 20 20 43 6f 6f 72 64 73 2c 0a  .....   Coords,.
92d90 09 09 09 09 09 09 09 09 09 20 20 20 72 69 6e 67  .........   ring
92da0 2d 3e 0a 09 09 09 09 09 09 09 09 09 20 20 20 50  ->..........   P
92db0 6f 69 6e 74 73 29 3b 0a 09 09 09 09 09 20 20 20  oints);......   
92dc0 20 20 20 69 66 20 28 6c 20 3c 20 30 2e 30 29 0a     if (l < 0.0).
92dd0 09 09 09 09 09 09 7b 0a 09 09 09 09 09 09 20 20  ......{.......  
92de0 20 20 6c 65 6e 67 74 68 20 3d 20 2d 31 2e 30 3b    length = -1.0;
92df0 0a 09 09 09 09 09 09 20 20 20 20 62 72 65 61 6b  .......    break
92e00 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 20  ;.......}...... 
92e10 20 20 20 20 20 6c 65 6e 67 74 68 20 2b 3d 20 6c       length += l
92e20 3b 0a 09 09 09 09 09 20 20 20 20 20 20 66 6f 72  ;......      for
92e30 20 28 69 62 20 3d 20 30 3b 0a 09 09 09 09 09 09   (ib = 0;.......
92e40 20 20 20 69 62 20 3c 0a 09 09 09 09 09 09 20 20     ib <.......  
92e50 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72   polyg->NumInter
92e60 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 09 09 09  iors; ib++).....
92e70 09 09 7b 0a 09 09 09 09 09 09 20 20 20 20 2f 2a  ..{.......    /*
92e80 20 69 6e 74 65 72 69 6f 72 20 52 69 6e 67 73 20   interior Rings 
92e90 2a 2f 0a 09 09 09 09 09 09 20 20 20 20 72 69 6e  */.......    rin
92ea0 67 20 3d 0a 09 09 09 09 09 09 09 70 6f 6c 79 67  g =........polyg
92eb0 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62  ->Interiors + ib
92ec0 3b 0a 09 09 09 09 09 09 20 20 20 20 6c 20 3d 20  ;.......    l = 
92ed0 67 61 69 61 47 65 6f 64 65 73 69 63 54 6f 74 61  gaiaGeodesicTota
92ee0 6c 4c 65 6e 67 74 68 0a 09 09 09 09 09 09 09 28  lLength........(
92ef0 61 2c 20 62 2c 20 72 66 2c 0a 09 09 09 09 09 09  a, b, rf,.......
92f00 09 20 72 69 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f  . ring->Dimensio
92f10 6e 4d 6f 64 65 6c 2c 0a 09 09 09 09 09 09 09 20  nModel,........ 
92f20 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 0a 09 09  ring->Coords,...
92f30 09 09 09 09 09 20 72 69 6e 67 2d 3e 50 6f 69 6e  ..... ring->Poin
92f40 74 73 29 3b 0a 09 09 09 09 09 09 20 20 20 20 69  ts);.......    i
92f50 66 20 28 6c 20 3c 20 30 2e 30 29 0a 09 09 09 09  f (l < 0.0).....
92f60 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 09 09  ..      {.......
92f70 09 20 20 6c 65 6e 67 74 68 20 3d 20 2d 31 2e 30  .  length = -1.0
92f80 3b 0a 09 09 09 09 09 09 09 20 20 62 72 65 61 6b  ;........  break
92f90 3b 0a 09 09 09 09 09 09 20 20 20 20 20 20 7d 0a  ;.......      }.
92fa0 09 09 09 09 09 09 20 20 20 20 6c 65 6e 67 74 68  ......    length
92fb0 20 2b 3d 20 6c 3b 0a 09 09 09 09 09 09 7d 0a 09   += l;.......}..
92fc0 09 09 09 09 20 20 20 20 20 20 69 66 20 28 6c 65  ....      if (le
92fd0 6e 67 74 68 20 3c 20 30 2e 30 29 0a 09 09 09 09  ngth < 0.0).....
92fe0 09 09 20 20 62 72 65 61 6b 3b 0a 09 09 09 09 09  ..  break;......
92ff0 20 20 20 20 20 20 70 6f 6c 79 67 20 3d 20 70 6f        polyg = po
93000 6c 79 67 2d 3e 4e 65 78 74 3b 0a 09 09 09 09 09  lyg->Next;......
93010 20 20 7d 0a 09 09 09 09 20 20 20 20 7d 0a 09 09    }.....    }...
93020 09 20 20 20 20 20 20 7d 0a 09 09 09 7d 0a 09 09  .      }....}...
93030 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a        else....{.
93040 09 09 09 20 20 20 20 2f 2a 20 6d 65 61 73 75 72  ...    /* measur
93050 69 6e 67 20 6f 6e 20 74 68 65 20 47 72 65 61 74  ing on the Great
93060 20 43 69 72 63 6c 65 20 2a 2f 0a 09 09 09 20 20   Circle */....  
93070 20 20 69 66 20 28 21 69 73 5f 70 65 72 69 6d 65    if (!is_perime
93080 74 65 72 29 0a 09 09 09 20 20 20 20 20 20 7b 0a  ter)....      {.
93090 09 09 09 09 20 20 6c 69 6e 65 20 3d 20 67 65 6f  ....  line = geo
930a0 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e  ->FirstLinestrin
930b0 67 3b 0a 09 09 09 09 20 20 77 68 69 6c 65 20 28  g;.....  while (
930c0 6c 69 6e 65 29 0a 09 09 09 09 20 20 20 20 7b 0a  line).....    {.
930d0 09 09 09 09 09 2f 2a 20 4c 69 6e 65 73 74 72 69  ...../* Linestri
930e0 6e 67 73 20 2a 2f 0a 09 09 09 09 09 6c 65 6e 67  ngs */......leng
930f0 74 68 20 2b 3d 0a 09 09 09 09 09 20 20 20 20 67  th +=......    g
93100 61 69 61 47 72 65 61 74 43 69 72 63 6c 65 54 6f  aiaGreatCircleTo
93110 74 61 6c 4c 65 6e 67 74 68 0a 09 09 09 09 09 20  talLength...... 
93120 20 20 20 28 61 2c 20 62 2c 20 6c 69 6e 65 2d 3e     (a, b, line->
93130 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 2c 0a  DimensionModel,.
93140 09 09 09 09 09 20 20 20 20 20 6c 69 6e 65 2d 3e  .....     line->
93150 43 6f 6f 72 64 73 2c 20 6c 69 6e 65 2d 3e 50 6f  Coords, line->Po
93160 69 6e 74 73 29 3b 0a 09 09 09 09 09 6c 69 6e 65  ints);......line
93170 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a 09   = line->Next;..
93180 09 09 09 20 20 20 20 7d 0a 09 09 09 20 20 20 20  ...    }....    
93190 20 20 7d 0a 09 09 09 20 20 20 20 69 66 20 28 6c    }....    if (l
931a0 65 6e 67 74 68 20 3e 3d 20 30 29 0a 09 09 09 20  ength >= 0).... 
931b0 20 20 20 20 20 7b 0a 09 09 09 09 20 20 69 66 20       {.....  if 
931c0 28 69 73 5f 70 65 72 69 6d 65 74 65 72 29 0a 09  (is_perimeter)..
931d0 09 09 09 20 20 20 20 7b 0a 09 09 09 09 09 2f 2a  ...    {....../*
931e0 20 50 6f 6c 79 67 6f 6e 73 20 2a 2f 0a 09 09 09   Polygons */....
931f0 09 09 70 6f 6c 79 67 20 3d 20 67 65 6f 2d 3e 46  ..polyg = geo->F
93200 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 09 09 09  irstPolygon;....
93210 09 09 77 68 69 6c 65 20 28 70 6f 6c 79 67 29 0a  ..while (polyg).
93220 09 09 09 09 09 20 20 7b 0a 09 09 09 09 09 20 20  .....  {......  
93230 20 20 20 20 2f 2a 20 65 78 74 65 72 69 6f 72 20      /* exterior 
93240 52 69 6e 67 20 2a 2f 0a 09 09 09 09 09 20 20 20  Ring */......   
93250 20 20 20 72 69 6e 67 20 3d 20 70 6f 6c 79 67 2d     ring = polyg-
93260 3e 45 78 74 65 72 69 6f 72 3b 0a 09 09 09 09 09  >Exterior;......
93270 20 20 20 20 20 20 6c 65 6e 67 74 68 20 2b 3d 0a        length +=.
93280 09 09 09 09 09 09 20 20 67 61 69 61 47 72 65 61  ......  gaiaGrea
93290 74 43 69 72 63 6c 65 54 6f 74 61 6c 4c 65 6e 67  tCircleTotalLeng
932a0 74 68 0a 09 09 09 09 09 09 20 20 28 61 2c 20 62  th.......  (a, b
932b0 2c 0a 09 09 09 09 09 09 20 20 20 72 69 6e 67 2d  ,.......   ring-
932c0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 2c  >DimensionModel,
932d0 0a 09 09 09 09 09 09 20 20 20 72 69 6e 67 2d 3e  .......   ring->
932e0 43 6f 6f 72 64 73 2c 20 72 69 6e 67 2d 3e 50 6f  Coords, ring->Po
932f0 69 6e 74 73 29 3b 0a 09 09 09 09 09 20 20 20 20  ints);......    
93300 20 20 66 6f 72 20 28 69 62 20 3d 20 30 3b 0a 09    for (ib = 0;..
93310 09 09 09 09 09 20 20 20 69 62 20 3c 20 70 6f 6c  .....   ib < pol
93320 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73  yg->NumInteriors
93330 3b 0a 09 09 09 09 09 09 20 20 20 69 62 2b 2b 29  ;.......   ib++)
93340 0a 09 09 09 09 09 09 7b 0a 09 09 09 09 09 09 20  .......{....... 
93350 20 20 20 2f 2a 20 69 6e 74 65 72 69 6f 72 20 52     /* interior R
93360 69 6e 67 73 20 2a 2f 0a 09 09 09 09 09 09 20 20  ings */.......  
93370 20 20 72 69 6e 67 20 3d 0a 09 09 09 09 09 09 09    ring =........
93380 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73  polyg->Interiors
93390 20 2b 20 69 62 3b 0a 09 09 09 09 09 09 20 20 20   + ib;.......   
933a0 20 6c 65 6e 67 74 68 20 2b 3d 0a 09 09 09 09 09   length +=......
933b0 09 09 67 61 69 61 47 72 65 61 74 43 69 72 63 6c  ..gaiaGreatCircl
933c0 65 54 6f 74 61 6c 4c 65 6e 67 74 68 0a 09 09 09  eTotalLength....
933d0 09 09 09 09 28 61 2c 20 62 2c 0a 09 09 09 09 09  ....(a, b,......
933e0 09 09 20 72 69 6e 67 2d 3e 44 69 6d 65 6e 73 69  .. ring->Dimensi
933f0 6f 6e 4d 6f 64 65 6c 2c 0a 09 09 09 09 09 09 09  onModel,........
93400 20 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 0a 09   ring->Coords,..
93410 09 09 09 09 09 09 20 72 69 6e 67 2d 3e 50 6f 69  ...... ring->Poi
93420 6e 74 73 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09  nts);.......}...
93430 09 09 09 20 20 20 20 20 20 70 6f 6c 79 67 20 3d  ...      polyg =
93440 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b 0a 09 09   polyg->Next;...
93450 09 09 09 20 20 7d 0a 09 09 09 09 20 20 20 20 7d  ...  }.....    }
93460 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 7d  ....      }....}
93470 0a 09 09 20 20 20 20 20 20 69 66 20 28 6c 65 6e  ...      if (len
93480 67 74 68 20 3c 20 30 2e 30 29 0a 09 09 09 7b 0a  gth < 0.0)....{.
93490 09 09 09 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69  ...    /* invali
934a0 64 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 09 09  d distance */...
934b0 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
934c0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
934d0 74 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  t);....}...     
934e0 20 65 6c 73 65 0a 09 09 09 20 20 73 71 6c 69 74   else....  sqlit
934f0 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
93500 20 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 67 74   (context, lengt
93510 68 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65  h);...  }...else
93520 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ...    sqlite3_r
93530 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
93540 65 78 74 29 3b 0a 09 09 67 6f 74 6f 20 73 74 6f  ext);...goto sto
93550 70 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  p;..    }..  els
93560 65 20 69 66 20 28 70 5f 63 61 63 68 65 20 21 3d  e if (p_cache !=
93570 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65   NULL)..      re
93580 74 20 3d 0a 09 09 20 20 67 61 69 61 47 65 6f 6d  t =...  gaiaGeom
93590 43 6f 6c 6c 4c 65 6e 67 74 68 4f 72 50 65 72 69  CollLengthOrPeri
935a0 6d 65 74 65 72 5f 72 20 28 70 5f 63 61 63 68 65  meter_r (p_cache
935b0 2c 20 67 65 6f 2c 20 69 73 5f 70 65 72 69 6d 65  , geo, is_perime
935c0 74 65 72 2c 0a 09 09 09 09 09 09 20 20 20 26 6c  ter,.......   &l
935d0 65 6e 67 74 68 29 3b 0a 09 20 20 65 6c 73 65 0a  ength);..  else.
935e0 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61 69  .      ret = gai
935f0 61 47 65 6f 6d 43 6f 6c 6c 4c 65 6e 67 74 68 4f  aGeomCollLengthO
93600 72 50 65 72 69 6d 65 74 65 72 20 28 67 65 6f 2c  rPerimeter (geo,
93610 20 69 73 5f 70 65 72 69 6d 65 74 65 72 2c 20 26   is_perimeter, &
93620 6c 65 6e 67 74 68 29 3b 0a 09 20 20 69 66 20 28  length);..  if (
93630 21 72 65 74 29 0a 09 20 20 20 20 20 20 73 71 6c  !ret)..      sql
93640 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
93650 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65   (context);..  e
93660 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lse..      sqlit
93670 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
93680 20 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 67 74   (context, lengt
93690 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 73 74  h);.      }.  st
936a0 6f 70 3a 0a 20 20 20 20 67 61 69 61 46 72 65 65  op:.    gaiaFree
936b0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
936c0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
936d0 6e 63 74 5f 4c 65 6e 67 74 68 20 28 73 71 6c 69  nct_Length (sqli
936e0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
936f0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
93700 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
93710 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
93720 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f   function:./ ST_
93730 4c 65 6e 67 74 68 28 42 4c 4f 42 20 65 6e 63 6f  Length(BLOB enco
93740 64 65 64 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  ded GEOMETRYCOLL
93750 45 43 54 49 4f 4e 29 0a 2f 20 53 54 5f 4c 65 6e  ECTION)./ ST_Len
93760 67 74 68 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  gth(BLOB encoded
93770 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54   GEOMETRYCOLLECT
93780 49 4f 4e 2c 20 42 6f 6f 6c 65 61 6e 20 75 73 65  ION, Boolean use
93790 5f 65 6c 6c 69 70 73 6f 69 64 29 0a 2f 0a 2f 20  _ellipsoid)././ 
937a0 72 65 74 75 72 6e 73 20 20 74 68 65 20 74 6f 74  returns  the tot
937b0 61 6c 20 6c 65 6e 67 74 68 20 66 6f 72 20 63 75  al length for cu
937c0 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 0a  rrent geometry .
937d0 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
937e0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
937f0 74 65 72 65 64 0a 2f 0a 2f 20 50 6c 65 61 73 65  tered././ Please
93800 20 6e 6f 74 65 3a 20 73 74 61 72 74 69 6e 67 20   note: starting 
93810 73 69 6e 63 65 20 34 2e 30 2e 30 20 74 68 69 73  since 4.0.0 this
93820 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 69   function will i
93830 67 6e 6f 72 65 0a 2f 20 61 6e 79 20 50 6f 6c 79  gnore./ any Poly
93840 67 6f 6e 20 28 6f 6e 6c 79 20 4c 69 6e 65 73 74  gon (only Linest
93850 72 69 6e 67 73 20 77 69 6c 6c 20 62 65 20 63 6f  rings will be co
93860 6e 73 69 64 65 72 65 64 29 0a 2f 0a 2a 2f 0a 20  nsidered)./.*/. 
93870 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20     void *data = 
93880 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
93890 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
938a0 20 6c 65 6e 67 74 68 5f 63 6f 6d 6d 6f 6e 20 28   length_common (
938b0 64 61 74 61 2c 20 63 6f 6e 74 65 78 74 2c 20 61  data, context, a
938c0 72 67 63 2c 20 61 72 67 76 2c 20 30 29 3b 0a 7d  rgc, argv, 0);.}
938d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
938e0 63 74 5f 50 65 72 69 6d 65 74 65 72 20 28 73 71  ct_Perimeter (sq
938f0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
93900 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
93910 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
93920 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
93930 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
93940 54 5f 50 65 72 69 6d 65 74 65 72 28 42 4c 4f 42  T_Perimeter(BLOB
93950 20 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45 54 52   encoded GEOMETR
93960 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 2f 20 53  YCOLLECTION)./ S
93970 54 5f 50 65 72 69 6d 65 74 65 72 28 42 4c 4f 42  T_Perimeter(BLOB
93980 20 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45 54 52   encoded GEOMETR
93990 59 43 4f 4c 4c 45 43 54 49 4f 4e 2c 20 42 6f 6f  YCOLLECTION, Boo
939a0 6c 65 61 6e 20 75 73 65 5f 65 6c 6c 69 70 73 6f  lean use_ellipso
939b0 69 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  id)././ returns 
939c0 20 74 68 65 20 74 6f 74 61 6c 20 70 65 72 69 6d   the total perim
939d0 65 74 65 72 20 6c 65 6e 67 74 68 20 66 6f 72 20  eter length for 
939e0 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
939f0 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
93a00 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
93a10 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 50 6c 65 61  untered././ Plea
93a20 73 65 20 6e 6f 74 65 3a 20 73 74 61 72 74 69 6e  se note: startin
93a30 67 20 73 69 6e 63 65 20 34 2e 30 2e 30 20 74 68  g since 4.0.0 th
93a40 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
93a50 20 69 67 6e 6f 72 65 0a 2f 20 61 6e 79 20 4c 69   ignore./ any Li
93a60 6e 65 73 74 72 69 6e 67 20 28 6f 6e 6c 79 20 50  nestring (only P
93a70 6f 6c 79 67 6f 6e 73 20 77 69 6c 6c 20 62 65 20  olygons will be 
93a80 63 6f 6e 73 69 64 65 72 65 64 29 0a 2f 0a 2a 2f  considered)./.*/
93a90 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20  .    void *data 
93aa0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
93ab0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
93ac0 20 20 20 6c 65 6e 67 74 68 5f 63 6f 6d 6d 6f 6e     length_common
93ad0 20 28 64 61 74 61 2c 20 63 6f 6e 74 65 78 74 2c   (data, context,
93ae0 20 61 72 67 63 2c 20 61 72 67 76 2c 20 31 29 3b   argc, argv, 1);
93af0 0a 7d 0a 0a 23 69 66 64 65 66 20 45 4e 41 42 4c  .}..#ifdef ENABL
93b00 45 5f 52 54 54 4f 50 4f 09 09 2f 2a 20 6f 6e 6c  E_RTTOPO../* onl
93b10 79 20 69 66 20 52 54 54 4f 50 4f 20 69 73 20 65  y if RTTOPO is e
93b20 6e 61 62 6c 65 64 20 2a 2f 0a 0a 73 74 61 74 69  nabled */..stati
93b30 63 20 76 6f 69 64 0a 66 6e 63 74 5f 33 64 4c 65  c void.fnct_3dLe
93b40 6e 67 74 68 20 28 73 71 6c 69 74 65 33 5f 63 6f  ngth (sqlite3_co
93b50 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
93b60 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
93b70 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
93b80 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
93b90 69 6f 6e 3a 0a 2f 20 53 54 5f 33 64 4c 65 6e 67  ion:./ ST_3dLeng
93ba0 74 68 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20  th(BLOB encoded 
93bb0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
93bc0 4f 4e 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  ON)././ returns 
93bd0 20 74 68 65 20 74 6f 74 61 6c 20 32 44 20 6f 72   the total 2D or
93be0 20 33 44 20 6c 65 6e 67 74 68 20 66 6f 72 20 63   3D length for c
93bf0 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 0a  urrent geometry.
93c00 2f 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f  / accordingly to
93c10 20 74 68 65 20 47 65 6f 6d 65 74 72 79 20 64 69   the Geometry di
93c20 6d 65 6e 73 69 6f 6e 73 20 0a 2f 20 72 65 74 75  mensions ./ retu
93c30 72 6e 73 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20  rns NULL if any 
93c40 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
93c50 65 72 65 64 0a 2f 0a 2f 20 50 6c 65 61 73 65 20  ered././ Please 
93c60 6e 6f 74 65 3a 20 74 68 69 73 20 66 75 6e 63 74  note: this funct
93c70 69 6f 6e 20 77 69 6c 6c 20 69 67 6e 6f 72 65 0a  ion will ignore.
93c80 2f 20 61 6e 79 20 50 6f 6c 79 67 6f 6e 20 28 6f  / any Polygon (o
93c90 6e 6c 79 20 4c 69 6e 65 73 74 72 69 6e 67 73 20  nly Linestrings 
93ca0 77 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72  will be consider
93cb0 65 64 29 0a 2f 0a 2a 2f 0a 20 20 20 20 75 6e 73  ed)./.*/.    uns
93cc0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
93cd0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
93ce0 74 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  tes;.    double 
93cf0 6c 65 6e 67 74 68 20 3d 20 30 2e 30 3b 0a 20 20  length = 0.0;.  
93d00 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 67    int ret;.    g
93d10 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
93d20 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  eo = NULL;.    i
93d30 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
93d40 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
93d50 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
93d60 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
93d70 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
93d80 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
93d90 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
93da0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
93db0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
93dc0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
93dd0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
93de0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
93df0 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
93e00 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
93e10 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
93e20 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
93e30 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
93e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
93e50 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
93e60 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
93e70 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
93e80 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
93e90 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
93ea0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
93eb0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
93ec0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
93ed0 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
93ee0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
93ef0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
93f00 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
93f10 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
93f20 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
93f30 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
93f40 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
93f50 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
93f60 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
93f70 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
93f80 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
93f90 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
93fa0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
93fb0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
93fc0 20 20 7b 0a 09 20 20 72 65 74 20 3d 20 67 61 69    {..  ret = gai
93fd0 61 33 64 4c 65 6e 67 74 68 20 28 63 61 63 68 65  a3dLength (cache
93fe0 2c 20 67 65 6f 2c 20 26 6c 65 6e 67 74 68 29 3b  , geo, &length);
93ff0 0a 09 20 20 69 66 20 28 21 72 65 74 29 0a 09 20  ..  if (!ret).. 
94000 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
94010 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
94020 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  t);..  else..   
94030 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
94040 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
94050 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20  t, length);.    
94060 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
94070 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
94080 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
94090 6e 63 74 5f 46 72 6f 6d 54 57 4b 42 20 28 73 71  nct_FromTWKB (sq
940a0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
940b0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
940c0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
940d0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
940e0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47  QL function:./ G
940f0 65 6f 6d 46 72 6f 6d 54 57 4b 42 28 54 57 4b 42  eomFromTWKB(TWKB
94100 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
94110 79 29 0a 2f 20 20 20 6f 72 0a 2f 20 47 65 6f 6d  y)./   or./ Geom
94120 46 72 6f 6d 54 57 4b 42 28 54 57 4b 42 20 65 6e  FromTWKB(TWKB en
94130 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20  coded geometry, 
94140 49 4e 54 20 73 72 69 64 29 0a 2f 0a 2f 20 72 65  INT srid)././ re
94150 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e  turns the curren
94160 74 20 67 65 6f 6d 65 74 72 79 20 62 79 20 70 61  t geometry by pa
94170 72 73 69 6e 67 20 61 20 54 57 4b 42 20 65 6e 63  rsing a TWKB enc
94180 6f 64 65 64 20 73 74 72 69 6e 67 20 0a 2f 20 6f  oded string ./ o
94190 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
941a0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
941b0 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65  ed.*/.    int le
941c0 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  n;.    unsigned 
941d0 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
941e0 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
941f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
94200 74 77 6b 62 3b 0a 20 20 20 20 69 6e 74 20 74 77  twkb;.    int tw
94210 6b 62 5f 73 69 7a 65 3b 0a 20 20 20 20 69 6e 74  kb_size;.    int
94220 20 73 72 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20   srid = -1;.    
94230 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
94240 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
94250 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
94260 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  0;.    int tiny_
94270 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
94280 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
94290 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
942a0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
942b0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
942c0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
942d0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
942e0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
942f0 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
94300 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
94310 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
94320 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
94330 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
94340 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
94350 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
94360 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
94370 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
94380 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
94390 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
943a0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
943b0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
943c0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
943d0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
943e0 09 20 20 74 77 6b 62 20 3d 20 73 71 6c 69 74 65  .  twkb = sqlite
943f0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
94400 67 76 5b 30 5d 29 3b 0a 09 20 20 74 77 6b 62 5f  gv[0]);..  twkb_
94410 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  size = sqlite3_v
94420 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
94430 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [0]);.      }.  
94440 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29    if (argc >= 2)
94450 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
94460 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
94470 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
94480 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
94490 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
944a0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
944b0 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
944c0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 72 69 64  ;..    }..  srid
944d0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
944e0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
944f0 09 20 20 69 66 20 28 73 72 69 64 20 3c 20 30 29  .  if (srid < 0)
94500 0a 09 20 20 20 20 20 20 73 72 69 64 20 3d 20 2d  ..      srid = -
94510 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67  1;.      }.    g
94520 65 6f 20 3d 20 67 61 69 61 46 72 6f 6d 54 57 4b  eo = gaiaFromTWK
94530 42 20 28 63 61 63 68 65 2c 20 74 77 6b 62 2c 20  B (cache, twkb, 
94540 74 77 6b 62 5f 73 69 7a 65 2c 20 73 72 69 64 29  twkb_size, srid)
94550 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d  ;.    if (geo ==
94560 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
94570 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
94580 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
94590 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
945a0 20 20 7d 0a 20 20 20 20 67 61 69 61 54 6f 53 70    }.    gaiaToSp
945b0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
945c0 78 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75  x2 (geo, &p_resu
945d0 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d  lt, &len, gpkg_m
945e0 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29  ode, tiny_point)
945f0 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
94600 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20 20  omColl (geo);.  
94610 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
94620 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
94630 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
94640 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ree);.}..static 
94650 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 54 57 4b 42  void.fnct_ToTWKB
94660 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
94670 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
94680 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
94690 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
946a0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
946b0 0a 2f 20 41 73 54 57 4b 42 28 42 4c 4f 42 20 65  ./ AsTWKB(BLOB e
946c0 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29  ncoded geometry)
946d0 0a 2f 20 20 20 6f 72 0a 2f 20 41 73 54 57 4b 42  ./   or./ AsTWKB
946e0 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
946f0 6f 6d 65 74 72 79 2c 20 49 4e 54 20 70 72 65 63  ometry, INT prec
94700 69 73 69 6f 6e 5f 78 79 29 0a 2f 20 20 20 6f 72  ision_xy)./   or
94710 0a 2f 20 41 73 54 57 4b 42 28 42 4c 4f 42 20 65  ./ AsTWKB(BLOB e
94720 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c  ncoded geometry,
94730 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e 5f 78   INT precision_x
94740 79 2c 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e  y, INT precision
94750 5f 7a 29 0a 2f 20 20 20 6f 72 0a 2f 20 41 73 54  _z)./   or./ AsT
94760 57 4b 42 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  WKB(BLOB encoded
94770 20 67 65 6f 6d 65 74 72 79 2c 20 49 4e 54 20 70   geometry, INT p
94780 72 65 63 69 73 69 6f 6e 5f 78 79 2c 20 49 4e 54  recision_xy, INT
94790 20 70 72 65 63 69 73 69 6f 6e 5f 7a 2c 20 0a 2f   precision_z, ./
947a0 20 20 20 20 20 20 20 20 49 4e 54 20 70 72 65 63          INT prec
947b0 69 73 69 6f 6e 5f 6d 29 0a 2f 20 20 20 6f 72 0a  ision_m)./   or.
947c0 2f 20 41 73 54 57 4b 42 28 42 4c 4f 42 20 65 6e  / AsTWKB(BLOB en
947d0 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20  coded geometry, 
947e0 49 4e 54 20 70 72 65 63 69 73 69 6f 6e 5f 78 79  INT precision_xy
947f0 2c 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e 5f  , INT precision_
94800 7a 2c 20 0a 2f 20 20 20 20 20 20 20 20 49 4e 54  z, ./        INT
94810 20 70 72 65 63 69 73 69 6f 6e 5f 6d 2c 20 49 4e   precision_m, IN
94820 54 20 77 69 74 68 5f 73 69 7a 65 29 0a 2f 20 20  T with_size)./  
94830 20 6f 72 0a 2f 20 41 73 54 57 4b 42 28 42 4c 4f   or./ AsTWKB(BLO
94840 42 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  B encoded geomet
94850 72 79 2c 20 49 4e 54 20 70 72 65 63 69 73 69 6f  ry, INT precisio
94860 6e 5f 78 79 2c 20 49 4e 54 20 70 72 65 63 69 73  n_xy, INT precis
94870 69 6f 6e 5f 7a 2c 20 0a 2f 20 20 20 20 20 20 20  ion_z, ./       
94880 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e 5f 6d   INT precision_m
94890 2c 20 49 4e 54 20 77 69 74 68 5f 73 69 7a 65 2c  , INT with_size,
948a0 20 49 4e 54 20 77 69 74 68 5f 62 62 6f 78 29 0a   INT with_bbox).
948b0 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 74 65  /./ returns a te
948c0 78 74 20 73 74 72 69 6e 67 20 63 6f 72 72 65 73  xt string corres
948d0 70 6f 6e 64 69 6e 67 20 74 6f 20 63 6f 6d 70 72  ponding to compr
948e0 65 73 73 65 64 20 54 57 4b 42 20 6e 6f 74 61 74  essed TWKB notat
948f0 69 6f 6e 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ion ./ or NULL i
94900 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
94910 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
94920 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
94930 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
94940 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
94950 74 20 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73  t value;.    uns
94960 69 67 6e 65 64 20 63 68 61 72 20 70 72 65 63 69  igned char preci
94970 73 69 6f 6e 5f 78 79 20 3d 20 30 3b 0a 20 20 20  sion_xy = 0;.   
94980 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
94990 72 65 63 69 73 69 6f 6e 5f 7a 20 3d 20 30 3b 0a  recision_z = 0;.
949a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
949b0 72 20 70 72 65 63 69 73 69 6f 6e 5f 6d 20 3d 20  r precision_m = 
949c0 30 3b 0a 20 20 20 20 69 6e 74 20 77 69 74 68 5f  0;.    int with_
949d0 73 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  size = 0;.    in
949e0 74 20 77 69 74 68 5f 62 62 6f 78 20 3d 20 30 3b  t with_bbox = 0;
949f0 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
94a00 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
94a10 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
94a20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
94a30 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
94a40 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
94a50 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
94a60 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
94a70 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
94a80 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
94a90 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
94aa0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
94ab0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
94ac0 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
94ad0 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
94ae0 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
94af0 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
94b00 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
94b10 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
94b20 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
94b30 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
94b40 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
94b50 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
94b60 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
94b70 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
94b80 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
94b90 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
94ba0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
94bb0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
94bc0 09 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73  .  p_blob = (uns
94bd0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
94be0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
94bf0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 6e   (argv[0]);..  n
94c00 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
94c10 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
94c20 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[0]);.      }.
94c30 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20      if (argc >= 
94c40 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  2).      {..  if
94c50 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
94c60 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
94c70 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
94c80 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
94c90 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
94ca0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
94cb0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 76 61  rn;..    }..  va
94cc0 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
94cd0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
94ce0 29 3b 0a 09 20 20 69 66 20 28 76 61 6c 75 65 20  );..  if (value 
94cf0 3c 20 30 29 0a 09 20 20 20 20 20 20 70 72 65 63  < 0)..      prec
94d00 69 73 69 6f 6e 5f 78 79 20 3d 20 30 3b 0a 09 20  ision_xy = 0;.. 
94d10 20 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65 20   else if (value 
94d20 3e 20 32 30 29 0a 09 20 20 20 20 20 20 70 72 65  > 20)..      pre
94d30 63 69 73 69 6f 6e 5f 78 79 20 3d 20 32 30 3b 0a  cision_xy = 20;.
94d40 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 70  .  else..      p
94d50 72 65 63 69 73 69 6f 6e 5f 78 79 20 3d 20 76 61  recision_xy = va
94d60 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lue;.      }.   
94d70 20 69 66 20 28 61 72 67 63 20 3e 3d 20 33 29 0a   if (argc >= 3).
94d80 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
94d90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
94da0 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53  e (argv[2]) != S
94db0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
94dc0 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
94dd0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
94de0 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
94df0 0a 09 20 20 20 20 7d 0a 09 20 20 76 61 6c 75 65  ..    }..  value
94e00 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
94e10 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  _int (argv[2]);.
94e20 09 20 20 69 66 20 28 76 61 6c 75 65 20 3c 20 30  .  if (value < 0
94e30 29 0a 09 20 20 20 20 20 20 70 72 65 63 69 73 69  )..      precisi
94e40 6f 6e 5f 7a 20 3d 20 30 3b 0a 09 20 20 65 6c 73  on_z = 0;..  els
94e50 65 20 69 66 20 28 76 61 6c 75 65 20 3e 20 32 30  e if (value > 20
94e60 29 0a 09 20 20 20 20 20 20 70 72 65 63 69 73 69  )..      precisi
94e70 6f 6e 5f 7a 20 3d 20 32 30 3b 0a 09 20 20 65 6c  on_z = 20;..  el
94e80 73 65 0a 09 20 20 20 20 20 20 70 72 65 63 69 73  se..      precis
94e90 69 6f 6e 5f 7a 20 3d 20 76 61 6c 75 65 3b 0a 20  ion_z = value;. 
94ea0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
94eb0 72 67 63 20 3e 3d 20 34 29 0a 20 20 20 20 20 20  rgc >= 4).      
94ec0 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
94ed0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
94ee0 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[3]) != SQLITE_
94ef0 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
94f00 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
94f10 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
94f20 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
94f30 7d 0a 09 20 20 76 61 6c 75 65 20 3d 20 73 71 6c  }..  value = sql
94f40 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
94f50 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 69 66 20  argv[3]);..  if 
94f60 28 76 61 6c 75 65 20 3c 20 30 29 0a 09 20 20 20  (value < 0)..   
94f70 20 20 20 70 72 65 63 69 73 69 6f 6e 5f 6d 20 3d     precision_m =
94f80 20 30 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28   0;..  else if (
94f90 76 61 6c 75 65 20 3e 20 32 30 29 0a 09 20 20 20  value > 20)..   
94fa0 20 20 20 70 72 65 63 69 73 69 6f 6e 5f 6d 20 3d     precision_m =
94fb0 20 32 30 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20   20;..  else..  
94fc0 20 20 20 20 70 72 65 63 69 73 69 6f 6e 5f 6d 20      precision_m 
94fd0 3d 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  = value;.      }
94fe0 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d  .    if (argc >=
94ff0 20 35 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   5).      {..  i
95000 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
95010 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20  _type (argv[4]) 
95020 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
95030 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  R)..    {...sqli
95040 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
95050 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
95060 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 77  urn;..    }..  w
95070 69 74 68 5f 73 69 7a 65 20 3d 20 73 71 6c 69 74  ith_size = sqlit
95080 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
95090 67 76 5b 34 5d 29 3b 0a 09 20 20 69 66 20 28 77  gv[4]);..  if (w
950a0 69 74 68 5f 73 69 7a 65 20 21 3d 20 30 29 0a 09  ith_size != 0)..
950b0 20 20 20 20 20 20 77 69 74 68 5f 73 69 7a 65 20        with_size 
950c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
950d0 20 69 66 20 28 61 72 67 63 20 3e 3d 20 36 29 0a   if (argc >= 6).
950e0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
950f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
95100 65 20 28 61 72 67 76 5b 35 5d 29 20 21 3d 20 53  e (argv[5]) != S
95110 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
95120 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
95130 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
95140 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
95150 0a 09 20 20 20 20 7d 0a 09 20 20 77 69 74 68 5f  ..    }..  with_
95160 62 62 6f 78 20 3d 20 73 71 6c 69 74 65 33 5f 76  bbox = sqlite3_v
95170 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 35  alue_int (argv[5
95180 5d 29 3b 0a 09 20 20 69 66 20 28 77 69 74 68 5f  ]);..  if (with_
95190 62 62 6f 78 20 21 3d 20 30 29 0a 09 20 20 20 20  bbox != 0)..    
951a0 20 20 77 69 74 68 5f 62 62 6f 78 20 3d 20 31 3b    with_bbox = 1;
951b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f  .      }.    geo
951c0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
951d0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
951e0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
951f0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
95200 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
95210 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
95220 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
95230 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
95240 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
95250 20 20 20 20 20 7b 0a 09 20 20 75 6e 73 69 67 6e       {..  unsign
95260 65 64 20 63 68 61 72 20 2a 74 77 6b 62 3b 0a 09  ed char *twkb;..
95270 20 20 69 6e 74 20 73 69 7a 65 5f 74 77 6b 62 3b    int size_twkb;
95280 0a 09 20 20 72 65 74 20 3d 0a 09 20 20 20 20 20  ..  ret =..     
95290 20 67 61 69 61 54 6f 54 57 4b 42 20 28 63 61 63   gaiaToTWKB (cac
952a0 68 65 2c 20 67 65 6f 2c 20 70 72 65 63 69 73 69  he, geo, precisi
952b0 6f 6e 5f 78 79 2c 20 70 72 65 63 69 73 69 6f 6e  on_xy, precision
952c0 5f 7a 2c 20 70 72 65 63 69 73 69 6f 6e 5f 6d 2c  _z, precision_m,
952d0 0a 09 09 09 20 20 77 69 74 68 5f 73 69 7a 65 2c  ....  with_size,
952e0 20 77 69 74 68 5f 62 62 6f 78 2c 20 26 74 77 6b   with_bbox, &twk
952f0 62 2c 20 26 73 69 7a 65 5f 74 77 6b 62 29 3b 0a  b, &size_twkb);.
95300 09 20 20 69 66 20 28 21 72 65 74 29 0a 09 20 20  .  if (!ret)..  
95310 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
95320 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
95330 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
95340 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
95350 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
95360 74 77 6b 62 2c 20 73 69 7a 65 5f 74 77 6b 62 2c  twkb, size_twkb,
95370 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a   free);.      }.
95380 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
95390 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73  Coll (geo);.}..s
953a0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
953b0 41 73 45 6e 63 6f 64 65 64 50 6f 6c 79 6c 69 6e  AsEncodedPolylin
953c0 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
953d0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
953e0 74 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74  t argc,....sqlit
953f0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
95400 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
95410 69 6f 6e 3a 0a 2f 20 53 54 5f 41 73 45 6e 63 6f  ion:./ ST_AsEnco
95420 64 65 64 50 6f 6c 79 6c 69 6e 65 28 42 4c 4f 42  dedPolyline(BLOB
95430 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
95440 79 29 0a 2f 20 20 20 6f 72 0a 2f 20 53 54 5f 41  y)./   or./ ST_A
95450 73 45 6e 63 6f 64 65 64 50 6f 6c 79 6c 69 6e 65  sEncodedPolyline
95460 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64 20 67 65  (BLOB encoded ge
95470 6f 6d 65 74 72 79 2c 20 49 4e 54 20 70 72 65 63  ometry, INT prec
95480 69 73 69 6f 6e 29 0a 2f 0a 2f 20 72 65 74 75 72  ision)././ retur
95490 6e 73 20 61 20 74 65 78 74 20 73 74 72 69 6e 67  ns a text string
954a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
954b0 6f 20 47 6f 6f 67 6c 65 4d 61 70 73 20 65 6e 63  o GoogleMaps enc
954c0 6f 64 65 64 20 50 6f 6c 79 6c 69 6e 65 0a 2f 20  oded Polyline./ 
954d0 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
954e0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
954f0 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
95500 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
95510 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
95520 73 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 75 65  s;.    int value
95530 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
95540 68 61 72 20 70 72 65 63 69 73 69 6f 6e 20 3d 20  har precision = 
95550 35 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  5;.    int ret;.
95560 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
95570 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a  Ptr geo = NULL;.
95580 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
95590 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
955a0 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
955b0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
955c0 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
955d0 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
955e0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
955f0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
95600 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
95610 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
95620 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  E */.    sqlite3
95630 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
95640 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
95650 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
95660 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
95670 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
95680 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
95690 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
956a0 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
956b0 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
956c0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
956d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
956e0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
956f0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
95700 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
95710 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
95720 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
95730 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
95740 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
95750 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
95760 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
95770 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
95780 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
95790 72 67 76 5b 30 5d 29 3b 0a 09 20 20 6e 5f 62 79  rgv[0]);..  n_by
957a0 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
957b0 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
957c0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0]);.      }.   
957d0 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a   if (argc >= 2).
957e0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
957f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
95800 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
95810 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
95820 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
95830 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
95840 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
95850 0a 09 20 20 20 20 7d 0a 09 20 20 76 61 6c 75 65  ..    }..  value
95860 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
95870 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
95880 09 20 20 69 66 20 28 76 61 6c 75 65 20 3c 20 30  .  if (value < 0
95890 29 0a 09 20 20 20 20 20 20 70 72 65 63 69 73 69  )..      precisi
958a0 6f 6e 20 3d 20 30 3b 0a 09 20 20 65 6c 73 65 20  on = 0;..  else 
958b0 69 66 20 28 76 61 6c 75 65 20 3e 20 32 30 29 0a  if (value > 20).
958c0 09 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e  .      precision
958d0 20 3d 20 32 30 3b 0a 09 20 20 65 6c 73 65 0a 09   = 20;..  else..
958e0 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
958f0 3d 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  = value;.      }
95900 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61  .    geo =..gaia
95910 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
95920 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
95930 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
95940 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
95950 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
95960 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09 73      if (!geo)..s
95970 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
95980 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
95990 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
959a0 20 20 69 6e 74 20 69 6e 76 61 6c 69 64 20 3d 20    int invalid = 
959b0 30 3b 0a 09 20 20 69 6e 74 20 67 65 6f 67 72 61  0;..  int geogra
959c0 70 68 69 63 20 3d 20 30 3b 0a 09 20 20 63 68 61  phic = 0;..  cha
959d0 72 20 2a 65 6e 63 6f 64 65 64 3b 0a 09 20 20 69  r *encoded;..  i
959e0 6e 74 20 73 69 7a 65 5f 65 6e 63 6f 64 65 64 3b  nt size_encoded;
959f0 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e 46 69 72  ..  if (geo->Fir
95a00 73 74 50 6f 69 6e 74 20 3d 3d 20 4e 55 4c 4c 20  stPoint == NULL 
95a10 26 26 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 6c  && geo->FirstPol
95a20 79 67 6f 6e 20 3d 3d 20 4e 55 4c 4c 0a 09 20 20  ygon == NULL..  
95a30 20 20 20 20 26 26 20 67 65 6f 2d 3e 46 69 72 73      && geo->Firs
95a40 74 4c 69 6e 65 73 74 72 69 6e 67 20 21 3d 20 4e  tLinestring != N
95a50 55 4c 4c 0a 09 20 20 20 20 20 20 26 26 20 67 65  ULL..      && ge
95a60 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  o->FirstLinestri
95a70 6e 67 20 3d 3d 20 67 65 6f 2d 3e 4c 61 73 74 4c  ng == geo->LastL
95a80 69 6e 65 73 74 72 69 6e 67 29 0a 09 20 20 20 20  inestring)..    
95a90 20 20 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    ;..  else..   
95aa0 20 20 20 69 6e 76 61 6c 69 64 20 3d 20 31 3b 0a     invalid = 1;.
95ab0 09 20 20 69 66 20 28 21 73 72 69 64 5f 69 73 5f  .  if (!srid_is_
95ac0 67 65 6f 67 72 61 70 68 69 63 20 28 73 71 6c 69  geographic (sqli
95ad0 74 65 2c 20 67 65 6f 2d 3e 53 72 69 64 2c 20 26  te, geo->Srid, &
95ae0 67 65 6f 67 72 61 70 68 69 63 29 29 0a 09 20 20  geographic))..  
95af0 20 20 20 20 69 6e 76 61 6c 69 64 20 3d 20 31 3b      invalid = 1;
95b00 0a 09 20 20 69 66 20 28 21 67 65 6f 67 72 61 70  ..  if (!geograp
95b10 68 69 63 29 0a 09 20 20 20 20 20 20 69 6e 76 61  hic)..      inva
95b20 6c 69 64 20 3d 20 31 3b 0a 09 20 20 69 66 20 28  lid = 1;..  if (
95b30 69 6e 76 61 6c 69 64 29 0a 09 20 20 20 20 7b 0a  invalid)..    {.
95b40 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
95b50 6c 6c 20 28 67 65 6f 29 3b 0a 09 09 73 71 6c 69  ll (geo);...sqli
95b60 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
95b70 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
95b80 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 72  urn;..    }..  r
95b90 65 74 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61  et =..      gaia
95ba0 41 73 45 6e 63 6f 64 65 64 50 6f 6c 79 4c 69 6e  AsEncodedPolyLin
95bb0 65 20 28 63 61 63 68 65 2c 20 67 65 6f 2c 20 70  e (cache, geo, p
95bc0 72 65 63 69 73 69 6f 6e 2c 20 26 65 6e 63 6f 64  recision, &encod
95bd0 65 64 2c 0a 09 09 09 09 20 20 20 20 20 26 73 69  ed,.....     &si
95be0 7a 65 5f 65 6e 63 6f 64 65 64 29 3b 0a 09 20 20  ze_encoded);..  
95bf0 69 66 20 28 21 72 65 74 29 0a 09 20 20 20 20 20  if (!ret)..     
95c00 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
95c10 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
95c20 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
95c30 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
95c40 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 65 6e 63  xt (context, enc
95c50 6f 64 65 64 2c 20 73 69 7a 65 5f 65 6e 63 6f 64  oded, size_encod
95c60 65 64 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20  ed, free);.     
95c70 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
95c80 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d  eomColl (geo);.}
95c90 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
95ca0 63 74 5f 4c 69 6e 65 46 72 6f 6d 45 6e 63 6f 64  ct_LineFromEncod
95cb0 65 64 50 6f 6c 79 6c 69 6e 65 20 28 73 71 6c 69  edPolyline (sqli
95cc0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
95cd0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
95ce0 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  ....      sqlite
95cf0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
95d00 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
95d10 6f 6e 3a 0a 2f 20 53 54 5f 4c 69 6e 65 46 72 6f  on:./ ST_LineFro
95d20 6d 45 6e 63 6f 64 65 64 50 6f 6c 79 6c 69 6e 65  mEncodedPolyline
95d30 28 54 45 58 54 20 65 6e 63 6f 64 65 64 20 67 65  (TEXT encoded ge
95d40 6f 6d 65 74 72 79 29 0a 2f 20 20 20 6f 72 0a 2f  ometry)./   or./
95d50 20 53 54 5f 4c 69 6e 65 46 72 6f 6d 45 6e 63 6f   ST_LineFromEnco
95d60 64 65 64 50 6f 6c 79 6c 69 6e 65 28 54 45 58 54  dedPolyline(TEXT
95d70 20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72   encoded geometr
95d80 79 2c 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e  y, INT precision
95d90 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20  )././ returns a 
95da0 4c 69 6e 65 73 74 72 69 6e 67 20 47 65 6f 6d 65  Linestring Geome
95db0 74 72 79 20 66 72 6f 6d 20 61 20 74 65 78 74 20  try from a text 
95dc0 73 74 72 69 6e 67 20 63 6f 72 72 65 73 70 6f 6e  string correspon
95dd0 64 69 6e 67 20 74 6f 0a 2f 20 47 6f 6f 67 6c 65  ding to./ Google
95de0 4d 61 70 73 20 65 6e 63 6f 64 65 64 20 50 6f 6c  Maps encoded Pol
95df0 79 6c 69 6e 65 0a 2f 20 6f 72 20 4e 55 4c 4c 20  yline./ or NULL 
95e00 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
95e10 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
95e20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
95e30 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
95e40 4c 3b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  L;.    int size;
95e50 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
95e60 2a 65 6e 63 6f 64 65 64 3b 0a 20 20 20 20 67 61  *encoded;.    ga
95e70 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
95e80 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
95e90 74 20 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73  t value;.    uns
95ea0 69 67 6e 65 64 20 63 68 61 72 20 70 72 65 63 69  igned char preci
95eb0 73 69 6f 6e 20 3d 20 35 3b 0a 20 20 20 20 69 6e  sion = 5;.    in
95ec0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
95ed0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
95ee0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
95ef0 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
95f00 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
95f10 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
95f20 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
95f30 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
95f40 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
95f50 21 3d 20 4e 55 4c 4c 29 0a 09 67 70 6b 67 5f 6d  != NULL)..gpkg_m
95f60 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
95f70 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 69 66 20 28  g_mode;.    if (
95f80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
95f90 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
95fa0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
95fb0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
95fc0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
95fd0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
95fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
95ff0 73 65 0a 09 65 6e 63 6f 64 65 64 20 3d 20 28 63  se..encoded = (c
96000 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
96010 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
96020 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
96030 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20  f (argc >= 2).  
96040 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
96050 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
96060 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
96070 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
96080 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
96090 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
960a0 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
960b0 20 20 20 20 7d 0a 09 20 20 76 61 6c 75 65 20 3d      }..  value =
960c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
960d0 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
960e0 20 69 66 20 28 76 61 6c 75 65 20 3c 20 30 29 0a   if (value < 0).
960f0 09 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e  .      precision
96100 20 3d 20 30 3b 0a 09 20 20 65 6c 73 65 20 69 66   = 0;..  else if
96110 20 28 76 61 6c 75 65 20 3e 20 32 30 29 0a 09 20   (value > 20).. 
96120 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d       precision =
96130 20 32 30 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20   20;..  else..  
96140 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
96150 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  value;.      }. 
96160 20 20 20 67 65 6f 20 3d 20 67 61 69 61 4c 69 6e     geo = gaiaLin
96170 65 46 72 6f 6d 45 6e 63 6f 64 65 64 50 6f 6c 79  eFromEncodedPoly
96180 6c 69 6e 65 20 28 63 61 63 68 65 2c 20 65 6e 63  line (cache, enc
96190 6f 64 65 64 2c 20 70 72 65 63 69 73 69 6f 6e 29  oded, precision)
961a0 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d  ;.    if (geo ==
961b0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
961c0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
961d0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
961e0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
961f0 20 20 7d 0a 20 20 20 20 67 61 69 61 54 6f 53 70    }.    gaiaToSp
96200 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
96210 78 32 20 28 67 65 6f 2c 20 26 70 5f 72 65 73 75  x2 (geo, &p_resu
96220 6c 74 2c 20 26 73 69 7a 65 2c 20 67 70 6b 67 5f  lt, &size, gpkg_
96230 6d 6f 64 65 2c 20 30 29 3b 0a 20 20 20 20 67 61  mode, 0);.    ga
96240 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
96250 67 65 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  geo);.    sqlite
96260 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
96270 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
96280 2c 20 73 69 7a 65 2c 20 66 72 65 65 29 3b 0a 7d  , size, free);.}
96290 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ..#endif /* end 
962a0 52 54 54 4f 50 4f 20 63 6f 6e 64 69 74 69 6f 6e  RTTOPO condition
962b0 61 6c 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  al */..static vo
962c0 69 64 0a 66 6e 63 74 5f 41 72 65 61 20 28 73 71  id.fnct_Area (sq
962d0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
962e0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
962f0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
96300 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
96310 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41  QL function:./ A
96320 72 65 61 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  rea(BLOB encoded
96330 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54   GEOMETRYCOLLECT
96340 49 4f 4e 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  ION)././ returns
96350 20 74 68 65 20 74 6f 74 61 6c 20 61 72 65 61 20   the total area 
96360 66 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f 6d  for current geom
96370 65 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20  etry ./ or NULL 
96380 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
96390 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
963a0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
963b0 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e   *p_blob;.    in
963c0 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 64  t n_bytes;.    d
963d0 6f 75 62 6c 65 20 61 72 65 61 20 3d 20 30 2e 30  ouble area = 0.0
963e0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
963f0 20 20 20 69 6e 74 20 75 73 65 5f 65 6c 6c 69 70     int use_ellip
96400 73 6f 69 64 20 3d 20 2d 31 3b 0a 23 69 66 64 65  soid = -1;.#ifde
96410 66 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09  f ENABLE_RTTOPO.
96420 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 52 54 54 4f  ./* only if RTTO
96430 50 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  PO is enabled */
96440 0a 20 20 20 20 64 6f 75 62 6c 65 20 61 3b 0a 20  .    double a;. 
96450 20 20 20 64 6f 75 62 6c 65 20 62 3b 0a 20 20 20     double b;.   
96460 20 64 6f 75 62 6c 65 20 72 66 3b 0a 20 20 20 20   double rf;.    
96470 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
96480 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
96490 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
964a0 74 65 78 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  text);.#endif /*
964b0 20 65 6e 64 20 52 54 54 4f 50 4f 20 63 6f 6e 64   end RTTOPO cond
964c0 69 74 69 6f 6e 61 6c 20 2a 2f 0a 20 20 20 20 67  itional */.    g
964d0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
964e0 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  eo = NULL;.    i
964f0 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
96500 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
96510 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
96520 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
96530 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
96540 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
96550 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
96560 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
96570 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
96580 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
96590 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
965a0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
965b0 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
965c0 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
965d0 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
965e0 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
965f0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
96600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
96610 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
96620 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
96630 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
96640 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
96650 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
96660 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
96670 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
96680 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29 0a 20  if (argc == 2). 
96690 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
966a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
966b0 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
966c0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
966d0 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
966e0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
966f0 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
96700 09 20 20 20 20 7d 0a 09 20 20 75 73 65 5f 65 6c  .    }..  use_el
96710 6c 69 70 73 6f 69 64 20 3d 20 73 71 6c 69 74 65  lipsoid = sqlite
96720 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
96730 76 5b 31 5d 29 3b 0a 09 20 20 69 66 20 28 75 73  v[1]);..  if (us
96740 65 5f 65 6c 6c 69 70 73 6f 69 64 20 21 3d 20 30  e_ellipsoid != 0
96750 29 0a 09 20 20 20 20 20 20 75 73 65 5f 65 6c 6c  )..      use_ell
96760 69 70 73 6f 69 64 20 3d 20 31 3b 0a 20 20 20 20  ipsoid = 1;.    
96770 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
96780 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
96790 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
967a0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
967b0 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
967c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
967d0 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
967e0 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f    geo =..gaiaFro
967f0 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
96800 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
96810 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
96820 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
96830 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
96840 20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69   if (!geo)..sqli
96850 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
96860 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
96870 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  lse.      {..  i
96880 66 20 28 75 73 65 5f 65 6c 6c 69 70 73 6f 69 64  f (use_ellipsoid
96890 20 3e 3d 20 30 29 0a 09 20 20 20 20 7b 0a 23 69   >= 0)..    {.#i
968a0 66 64 65 66 20 45 4e 41 42 4c 45 5f 52 54 54 4f  fdef ENABLE_RTTO
968b0 50 4f 09 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 52  PO../* only if R
968c0 54 54 4f 50 4f 20 69 73 20 65 6e 61 62 6c 65 64  TTOPO is enabled
968d0 20 2a 2f 0a 09 09 2f 2a 20 61 74 74 65 6d 70 74   */.../* attempt
968e0 69 6e 67 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ing to identify 
968f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
96900 67 20 65 6c 6c 69 70 73 6f 69 64 20 2a 2f 0a 09  g ellipsoid */..
96910 09 69 66 20 28 67 65 74 45 6c 6c 69 70 73 6f 69  .if (getEllipsoi
96920 64 50 61 72 61 6d 73 20 28 73 71 6c 69 74 65 2c  dParams (sqlite,
96930 20 67 65 6f 2d 3e 53 72 69 64 2c 20 26 61 2c 20   geo->Srid, &a, 
96940 26 62 2c 20 26 72 66 29 29 0a 09 09 20 20 20 20  &b, &rf))...    
96950 72 65 74 20 3d 0a 09 09 09 67 61 69 61 47 65 6f  ret =....gaiaGeo
96960 64 65 73 69 63 41 72 65 61 20 28 63 61 63 68 65  desicArea (cache
96970 2c 20 67 65 6f 2c 20 61 2c 20 62 2c 20 75 73 65  , geo, a, b, use
96980 5f 65 6c 6c 69 70 73 6f 69 64 2c 0a 09 09 09 09  _ellipsoid,.....
96990 09 20 20 26 61 72 65 61 29 3b 0a 09 09 65 6c 73  .  &area);...els
969a0 65 0a 09 09 20 20 20 20 72 65 74 20 3d 20 30 3b  e...    ret = 0;
969b0 0a 23 65 6c 73 65 0a 09 09 72 65 74 20 3d 20 30  .#else...ret = 0
969c0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ;.#endif /* end 
969d0 52 54 54 4f 50 4f 20 63 6f 6e 64 69 74 69 6f 6e  RTTOPO condition
969e0 61 6c 20 2a 2f 0a 09 20 20 20 20 7d 0a 09 20 20  al */..    }..  
969f0 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 76 6f  else..    {...vo
96a00 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74  id *data = sqlit
96a10 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
96a20 6e 74 65 78 74 29 3b 0a 09 09 69 66 20 28 64 61  ntext);...if (da
96a30 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20  ta != NULL)...  
96a40 20 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d    ret = gaiaGeom
96a50 43 6f 6c 6c 41 72 65 61 5f 72 20 28 64 61 74 61  CollArea_r (data
96a60 2c 20 67 65 6f 2c 20 26 61 72 65 61 29 3b 0a 09  , geo, &area);..
96a70 09 65 6c 73 65 0a 09 09 20 20 20 20 72 65 74 20  .else...    ret 
96a80 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 41 72  = gaiaGeomCollAr
96a90 65 61 20 28 67 65 6f 2c 20 26 61 72 65 61 29 3b  ea (geo, &area);
96aa0 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 21  ..    }..  if (!
96ab0 72 65 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ret)..      sqli
96ac0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
96ad0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
96ae0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
96af0 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
96b00 28 63 6f 6e 74 65 78 74 2c 20 61 72 65 61 29 3b  (context, area);
96b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
96b20 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
96b30 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 67  eo);.}..static g
96b40 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 0a 63  aiaGeomCollPtr.c
96b50 69 72 63 75 6c 61 72 69 74 79 5f 70 6f 6c 79 67  ircularity_polyg
96b60 6f 6e 20 28 69 6e 74 20 73 72 69 64 2c 20 69 6e  on (int srid, in
96b70 74 20 64 69 6d 73 2c 20 67 61 69 61 50 6f 6c 79  t dims, gaiaPoly
96b80 67 6f 6e 50 74 72 20 70 67 29 0a 7b 0a 2f 2a 20  gonPtr pg).{./* 
96b90 62 75 69 6c 64 69 6e 67 20 61 6e 20 69 6e 64 69  building an indi
96ba0 76 69 64 75 61 6c 20 50 6f 6c 79 67 6f 6e 20 66  vidual Polygon f
96bb0 6f 72 20 43 69 72 63 75 6c 61 72 69 74 79 20 2a  or Circularity *
96bc0 2f 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  /.    gaiaGeomCo
96bd0 6c 6c 50 74 72 20 67 65 6f 6d 20 3d 20 4e 55 4c  llPtr geom = NUL
96be0 4c 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67  L;.    gaiaPolyg
96bf0 6f 6e 50 74 72 20 70 67 32 3b 0a 20 20 20 20 67  onPtr pg2;.    g
96c00 61 69 61 52 69 6e 67 50 74 72 20 69 5f 72 6e 67  aiaRingPtr i_rng
96c10 3b 0a 20 20 20 20 67 61 69 61 52 69 6e 67 50 74  ;.    gaiaRingPt
96c20 72 20 6f 5f 72 6e 67 3b 0a 20 20 20 20 69 66 20  r o_rng;.    if 
96c30 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59  (dims == GAIA_XY
96c40 5f 5a 29 0a 09 67 65 6f 6d 20 3d 20 67 61 69 61  _Z)..geom = gaia
96c50 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a  AllocGeomCollXYZ
96c60 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66   ();.    else if
96c70 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58   (dims == GAIA_X
96c80 59 5f 4d 29 0a 09 67 65 6f 6d 20 3d 20 67 61 69  Y_M)..geom = gai
96c90 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59  aAllocGeomCollXY
96ca0 4d 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  M ();.    else i
96cb0 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f  f (dims == GAIA_
96cc0 58 59 5f 5a 5f 4d 29 0a 09 67 65 6f 6d 20 3d 20  XY_Z_M)..geom = 
96cd0 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c  gaiaAllocGeomCol
96ce0 6c 58 59 5a 4d 20 28 29 3b 0a 20 20 20 20 65 6c  lXYZM ();.    el
96cf0 73 65 0a 09 67 65 6f 6d 20 3d 20 67 61 69 61 41  se..geom = gaiaA
96d00 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b  llocGeomColl ();
96d10 0a 20 20 20 20 67 65 6f 6d 2d 3e 53 72 69 64 20  .    geom->Srid 
96d20 3d 20 73 72 69 64 3b 0a 20 20 20 20 69 5f 72 6e  = srid;.    i_rn
96d30 67 20 3d 20 70 67 2d 3e 45 78 74 65 72 69 6f 72  g = pg->Exterior
96d40 3b 0a 20 20 20 20 70 67 32 20 3d 20 67 61 69 61  ;.    pg2 = gaia
96d50 41 64 64 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d  AddPolygonToGeom
96d60 43 6f 6c 6c 20 28 67 65 6f 6d 2c 20 69 5f 72 6e  Coll (geom, i_rn
96d70 67 2d 3e 50 6f 69 6e 74 73 2c 20 30 29 3b 0a 20  g->Points, 0);. 
96d80 20 20 20 6f 5f 72 6e 67 20 3d 20 70 67 32 2d 3e     o_rng = pg2->
96d90 45 78 74 65 72 69 6f 72 3b 0a 20 20 20 20 2f 2a  Exterior;.    /*
96da0 20 63 6f 70 79 69 6e 67 20 70 6f 69 6e 74 73 20   copying points 
96db0 28 6f 6e 6c 79 20 45 58 54 45 52 49 4f 52 20 52  (only EXTERIOR R
96dc0 49 4e 47 29 20 2a 2f 0a 20 20 20 20 67 61 69 61  ING) */.    gaia
96dd0 43 6f 70 79 52 69 6e 67 43 6f 6f 72 64 73 20 28  CopyRingCoords (
96de0 6f 5f 72 6e 67 2c 20 69 5f 72 6e 67 29 3b 0a 20  o_rng, i_rng);. 
96df0 20 20 20 72 65 74 75 72 6e 20 67 65 6f 6d 3b 0a     return geom;.
96e00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
96e10 6e 63 74 5f 43 69 72 63 75 6c 61 72 69 74 79 20  nct_Circularity 
96e20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
96e30 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
96e40 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
96e50 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
96e60 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
96e70 2f 20 43 69 72 63 75 6c 61 72 69 74 79 28 42 4c  / Circularity(BL
96e80 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4f 4d 45  OB encoded GEOME
96e90 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 2f  TRYCOLLECTION)./
96ea0 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 43  ./ returns the C
96eb0 69 72 63 75 6c 61 72 69 74 79 20 49 6e 64 65 78  ircularity Index
96ec0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f   for current geo
96ed0 6d 65 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c  metry ./ or NULL
96ee0 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
96ef0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
96f00 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
96f10 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
96f20 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
96f30 64 6f 75 62 6c 65 20 70 69 20 3d 20 33 2e 31 34  double pi = 3.14
96f40 31 35 39 32 36 35 33 35 38 39 37 39 33 32 33 38  1592653589793238
96f50 34 36 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 61  46;.    double a
96f60 72 65 61 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64  rea = 0.0;.    d
96f70 6f 75 62 6c 65 20 70 65 72 69 6d 65 74 65 72 20  ouble perimeter 
96f80 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
96f90 65 20 73 75 6d 5f 61 72 65 61 20 3d 20 30 2e 30  e sum_area = 0.0
96fa0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 75 6d  ;.    double sum
96fb0 5f 70 65 72 69 6d 65 74 65 72 20 3d 20 30 2e 30  _perimeter = 0.0
96fc0 3b 0a 20 20 20 20 69 6e 74 20 6e 6c 6e 73 20 3d  ;.    int nlns =
96fd0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 70 67 73   0;.    int npgs
96fe0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
96ff0 74 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 5f 65  t;.    int use_e
97000 6c 6c 69 70 73 6f 69 64 20 3d 20 2d 31 3b 0a 23  llipsoid = -1;.#
97010 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 52 54 54  ifdef ENABLE_RTT
97020 4f 50 4f 09 09 2f 2a 20 6f 6e 6c 79 20 69 66 20  OPO../* only if 
97030 52 54 54 4f 50 4f 20 69 73 20 65 6e 61 62 6c 65  RTTOPO is enable
97040 64 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  d */.    double 
97050 61 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 3b  a;.    double b;
97060 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 66 3b 0a  .    double rf;.
97070 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
97080 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
97090 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
970a0 28 63 6f 6e 74 65 78 74 29 3b 0a 23 65 6e 64 69  (context);.#endi
970b0 66 20 2f 2a 20 65 6e 64 20 52 54 54 4f 50 4f 20  f /* end RTTOPO 
970c0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a 20  conditional */. 
970d0 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
970e0 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
970f0 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69 6e     gaiaLinestrin
97100 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61 69  gPtr ln;.    gai
97110 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b 0a  aPolygonPtr pg;.
97120 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
97130 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
97140 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
97150 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
97160 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
97170 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
97180 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
97190 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
971a0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
971b0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
971c0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
971d0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
971e0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
971f0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
97200 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
97210 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
97220 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
97230 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _mode;.      }. 
97240 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
97250 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
97260 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
97270 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
97280 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
97290 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
972a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
972b0 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
972c0 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   2).      {..  i
972d0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
972e0 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
972f0 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
97300 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  R)..    {...sqli
97310 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
97320 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
97330 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 75  urn;..    }..  u
97340 73 65 5f 65 6c 6c 69 70 73 6f 69 64 20 3d 20 73  se_ellipsoid = s
97350 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
97360 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 69   (argv[1]);..  i
97370 66 20 28 75 73 65 5f 65 6c 6c 69 70 73 6f 69 64  f (use_ellipsoid
97380 20 21 3d 20 30 29 0a 09 20 20 20 20 20 20 75 73   != 0)..      us
97390 65 5f 65 6c 6c 69 70 73 6f 69 64 20 3d 20 31 3b  e_ellipsoid = 1;
973a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
973b0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
973c0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
973d0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
973e0 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
973f0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
97400 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
97410 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61  );.    geo =..ga
97420 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
97430 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
97440 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
97450 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
97460 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
97470 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a  ;.    if (!geo).
97480 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
97490 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
974a0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
974b0 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  ..  void *data =
974c0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
974d0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ta (context);.. 
974e0 20 69 66 20 28 75 73 65 5f 65 6c 6c 69 70 73 6f   if (use_ellipso
974f0 69 64 20 3e 3d 20 30 29 0a 09 20 20 20 20 7b 0a  id >= 0)..    {.
97500 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 52 54  #ifdef ENABLE_RT
97510 54 4f 50 4f 09 09 2f 2a 20 6f 6e 6c 79 20 69 66  TOPO../* only if
97520 20 52 54 54 4f 50 4f 20 69 73 20 65 6e 61 62 6c   RTTOPO is enabl
97530 65 64 20 2a 2f 0a 09 09 2f 2a 20 61 74 74 65 6d  ed */.../* attem
97540 70 74 69 6e 67 20 74 6f 20 69 64 65 6e 74 69 66  pting to identif
97550 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  y the correspond
97560 69 6e 67 20 65 6c 6c 69 70 73 6f 69 64 20 2a 2f  ing ellipsoid */
97570 0a 09 09 69 66 20 28 67 65 74 45 6c 6c 69 70 73  ...if (getEllips
97580 6f 69 64 50 61 72 61 6d 73 20 28 73 71 6c 69 74  oidParams (sqlit
97590 65 2c 20 67 65 6f 2d 3e 53 72 69 64 2c 20 26 61  e, geo->Srid, &a
975a0 2c 20 26 62 2c 20 26 72 66 29 29 0a 09 09 20 20  , &b, &rf))...  
975b0 20 20 72 65 74 20 3d 20 31 3b 0a 09 09 65 6c 73    ret = 1;...els
975c0 65 0a 09 09 20 20 20 20 72 65 74 20 3d 20 30 3b  e...    ret = 0;
975d0 0a 23 65 6c 73 65 0a 09 09 72 65 74 20 3d 20 30  .#else...ret = 0
975e0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ;.#endif /* end 
975f0 52 54 54 4f 50 4f 20 63 6f 6e 64 69 74 69 6f 6e  RTTOPO condition
97600 61 6c 20 2a 2f 0a 09 09 69 66 20 28 21 72 65 74  al */...if (!ret
97610 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
97620 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
97630 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
97640 09 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 3b  .      goto end;
97650 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20  ...  }..    }.. 
97660 20 6c 6e 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74   ln = geo->First
97670 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09 20 20 77  Linestring;..  w
97680 68 69 6c 65 20 28 6c 6e 20 21 3d 20 4e 55 4c 4c  hile (ln != NULL
97690 29 0a 09 20 20 20 20 7b 0a 09 09 6e 6c 6e 73 2b  )..    {...nlns+
976a0 2b 3b 0a 09 09 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65  +;...ln = ln->Ne
976b0 78 74 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 70  xt;..    }...  p
976c0 67 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f  g = geo->FirstPo
976d0 6c 79 67 6f 6e 3b 0a 09 20 20 77 68 69 6c 65 20  lygon;..  while 
976e0 28 70 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  (pg != NULL)..  
976f0 20 20 7b 0a 09 09 2f 2a 20 6c 6f 6f 70 69 6e 67    {.../* looping
97700 20 6f 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 70   on individual p
97710 6f 6c 79 67 6f 6e 73 20 2a 2f 0a 09 09 67 61 69  olygons */...gai
97720 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
97730 32 20 3d 0a 09 09 20 20 20 20 63 69 72 63 75 6c  2 =...    circul
97740 61 72 69 74 79 5f 70 6f 6c 79 67 6f 6e 20 28 67  arity_polygon (g
97750 65 6f 2d 3e 53 72 69 64 2c 20 67 65 6f 2d 3e 44  eo->Srid, geo->D
97760 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 2c 20 70  imensionModel, p
97770 67 29 3b 0a 09 09 69 66 20 28 75 73 65 5f 65 6c  g);...if (use_el
97780 6c 69 70 73 6f 69 64 20 3e 3d 20 30 29 0a 09 09  lipsoid >= 0)...
97790 20 20 7b 0a 23 69 66 64 65 66 20 45 4e 41 42 4c    {.#ifdef ENABL
977a0 45 5f 52 54 54 4f 50 4f 09 09 2f 2a 20 6f 6e 6c  E_RTTOPO../* onl
977b0 79 20 69 66 20 52 54 54 4f 50 4f 20 69 73 20 65  y if RTTOPO is e
977c0 6e 61 62 6c 65 64 20 2a 2f 0a 09 09 20 20 20 20  nabled */...    
977d0 20 20 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20    /* attempting 
977e0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
977f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6c  corresponding el
97800 6c 69 70 73 6f 69 64 20 2a 2f 0a 09 09 20 20 20  lipsoid */...   
97810 20 20 20 72 65 74 20 3d 0a 09 09 09 20 20 67 61     ret =....  ga
97820 69 61 47 65 6f 64 65 73 69 63 41 72 65 61 20 28  iaGeodesicArea (
97830 63 61 63 68 65 2c 20 67 65 6f 32 2c 20 61 2c 20  cache, geo2, a, 
97840 62 2c 20 75 73 65 5f 65 6c 6c 69 70 73 6f 69 64  b, use_ellipsoid
97850 2c 0a 09 09 09 09 09 20 20 20 20 26 61 72 65 61  ,......    &area
97860 29 3b 0a 23 65 6c 73 65 0a 09 09 20 20 20 20 20  );.#else...     
97870 20 72 65 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66   ret = 0;.#endif
97880 20 2f 2a 20 65 6e 64 20 52 54 54 4f 50 4f 20 63   /* end RTTOPO c
97890 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a 09 09  onditional */...
978a0 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b    }...else...  {
978b0 0a 09 09 20 20 20 20 20 20 69 66 20 28 64 61 74  ...      if (dat
978c0 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 09 20 20  a != NULL)....  
978d0 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f  ret = gaiaGeomCo
978e0 6c 6c 41 72 65 61 5f 72 20 28 64 61 74 61 2c 20  llArea_r (data, 
978f0 67 65 6f 32 2c 20 26 61 72 65 61 29 3b 0a 09 09  geo2, &area);...
97900 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20        else....  
97910 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f  ret = gaiaGeomCo
97920 6c 6c 41 72 65 61 20 28 67 65 6f 32 2c 20 26 61  llArea (geo2, &a
97930 72 65 61 29 3b 0a 09 09 20 20 7d 0a 09 09 69 66  rea);...  }...if
97940 20 28 72 65 74 29 0a 09 09 20 20 7b 0a 09 09 20   (ret)...  {... 
97950 20 20 20 20 20 73 75 6d 5f 61 72 65 61 20 2b 3d       sum_area +=
97960 20 61 72 65 61 3b 0a 09 09 20 20 20 20 20 20 6e   area;...      n
97970 70 67 73 2b 2b 3b 0a 09 09 20 20 7d 0a 09 09 65  pgs++;...  }...e
97980 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  lse...  {...    
97990 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
979a0 6c 6c 20 28 67 65 6f 32 29 3b 0a 09 09 20 20 20  ll (geo2);...   
979b0 20 20 20 6e 70 67 73 20 3d 20 30 3b 0a 09 09 20     npgs = 0;... 
979c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20       break;...  
979d0 7d 0a 0a 09 09 69 66 20 28 75 73 65 5f 65 6c 6c  }....if (use_ell
979e0 69 70 73 6f 69 64 20 3e 3d 20 30 29 0a 09 09 20  ipsoid >= 0)... 
979f0 20 7b 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45   {.#ifdef ENABLE
97a00 5f 52 54 54 4f 50 4f 09 09 2f 2a 20 6f 6e 6c 79  _RTTOPO../* only
97a10 20 69 66 20 52 54 54 4f 50 4f 20 69 73 20 65 6e   if RTTOPO is en
97a20 61 62 6c 65 64 20 2a 2f 0a 09 09 20 20 20 20 20  abled */...     
97a30 20 70 65 72 69 6d 65 74 65 72 20 3d 20 67 61 69   perimeter = gai
97a40 61 47 65 6f 64 65 73 69 63 54 6f 74 61 6c 4c 65  aGeodesicTotalLe
97a50 6e 67 74 68 20 28 61 2c 20 62 2c 20 72 66 2c 0a  ngth (a, b, rf,.
97a60 09 09 09 09 09 09 09 20 20 20 70 67 2d 3e 45 78  .......   pg->Ex
97a70 74 65 72 69 6f 72 2d 3e 0a 09 09 09 09 09 09 09  terior->........
97a80 20 20 20 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65     DimensionMode
97a90 6c 2c 0a 09 09 09 09 09 09 09 20 20 20 70 67 2d  l,........   pg-
97aa0 3e 45 78 74 65 72 69 6f 72 2d 3e 43 6f 6f 72 64  >Exterior->Coord
97ab0 73 2c 0a 09 09 09 09 09 09 09 20 20 20 70 67 2d  s,........   pg-
97ac0 3e 45 78 74 65 72 69 6f 72 2d 3e 0a 09 09 09 09  >Exterior->.....
97ad0 09 09 09 20 20 20 50 6f 69 6e 74 73 29 3b 0a 09  ...   Points);..
97ae0 09 20 20 20 20 20 20 69 66 20 28 70 65 72 69 6d  .      if (perim
97af0 65 74 65 72 20 3c 20 30 2e 30 29 0a 09 09 09 20  eter < 0.0).... 
97b00 20 72 65 74 20 3d 20 30 3b 0a 09 09 20 20 20 20   ret = 0;...    
97b10 20 20 65 6c 73 65 0a 09 09 09 20 20 72 65 74 20    else....  ret 
97b20 3d 20 31 3b 0a 23 65 6c 73 65 0a 09 09 20 20 20  = 1;.#else...   
97b30 20 20 20 72 65 74 20 3d 20 30 3b 0a 23 65 6e 64     ret = 0;.#end
97b40 69 66 20 2f 2a 20 65 6e 64 20 52 54 54 4f 50 4f  if /* end RTTOPO
97b50 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a   conditional */.
97b60 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20  ..  }...else... 
97b70 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 64   {...      if (d
97b80 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 09  ata != NULL)....
97b90 20 20 72 65 74 20 3d 0a 09 09 09 20 20 20 20 20    ret =....     
97ba0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 4c 65 6e   gaiaGeomCollLen
97bb0 67 74 68 4f 72 50 65 72 69 6d 65 74 65 72 5f 72  gthOrPerimeter_r
97bc0 20 28 64 61 74 61 2c 20 67 65 6f 32 2c 20 31 2c   (data, geo2, 1,
97bd0 0a 09 09 09 09 09 09 09 20 20 20 20 20 20 20 26  ........       &
97be0 70 65 72 69 6d 65 74 65 72 29 3b 0a 09 09 20 20  perimeter);...  
97bf0 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 72 65      else....  re
97c00 74 20 3d 0a 09 09 09 20 20 20 20 20 20 67 61 69  t =....      gai
97c10 61 47 65 6f 6d 43 6f 6c 6c 4c 65 6e 67 74 68 4f  aGeomCollLengthO
97c20 72 50 65 72 69 6d 65 74 65 72 20 28 67 65 6f 32  rPerimeter (geo2
97c30 2c 20 31 2c 0a 09 09 09 09 09 09 09 20 20 20 20  , 1,........    
97c40 20 26 70 65 72 69 6d 65 74 65 72 29 3b 0a 09 09   &perimeter);...
97c50 20 20 7d 0a 09 09 69 66 20 28 72 65 74 29 0a 09    }...if (ret)..
97c60 09 20 20 20 20 73 75 6d 5f 70 65 72 69 6d 65 74  .    sum_perimet
97c70 65 72 20 2b 3d 20 70 65 72 69 6d 65 74 65 72 3b  er += perimeter;
97c80 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09  ...else...  {...
97c90 20 20 20 20 20 20 67 61 69 61 46 72 65 65 47 65        gaiaFreeGe
97ca0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 09  omColl (geo2);..
97cb0 09 20 20 20 20 20 20 6e 70 67 73 20 3d 20 30 3b  .      npgs = 0;
97cc0 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ...      break;.
97cd0 09 09 20 20 7d 0a 09 09 67 61 69 61 46 72 65 65  ..  }...gaiaFree
97ce0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b  GeomColl (geo2);
97cf0 0a 09 09 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74  ...pg = pg->Next
97d00 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28  ;..    }..  if (
97d10 21 6e 70 67 73 29 0a 09 20 20 20 20 7b 0a 09 09  !npgs)..    {...
97d20 69 66 20 28 6e 6c 6e 73 29 0a 09 09 20 20 20 20  if (nlns)...    
97d30 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
97d40 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
97d50 30 2e 30 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20  0.0);...else... 
97d60 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
97d70 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
97d80 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
97d90 0a 09 20 20 20 20 7b 0a 09 09 64 6f 75 62 6c 65  ..    {...double
97da0 20 69 6e 64 65 78 20 3d 0a 09 09 20 20 20 20 28   index =...    (
97db0 34 2e 30 20 2a 20 70 69 20 2a 20 73 75 6d 5f 61  4.0 * pi * sum_a
97dc0 72 65 61 29 20 2f 20 28 73 75 6d 5f 70 65 72 69  rea) / (sum_peri
97dd0 6d 65 74 65 72 20 2a 20 73 75 6d 5f 70 65 72 69  meter * sum_peri
97de0 6d 65 74 65 72 29 3b 0a 09 09 73 71 6c 69 74 65  meter);...sqlite
97df0 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
97e00 28 63 6f 6e 74 65 78 74 2c 20 69 6e 64 65 78 29  (context, index)
97e10 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
97e20 0a 20 20 65 6e 64 3a 0a 20 20 20 20 67 61 69 61  .  end:.    gaia
97e30 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
97e40 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  o);.}..static vo
97e50 69 64 0a 66 6e 63 74 5f 43 65 6e 74 72 6f 69 64  id.fnct_Centroid
97e60 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
97e70 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
97e80 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
97e90 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
97ea0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
97eb0 0a 2f 20 43 65 6e 74 72 6f 69 64 28 42 4c 4f 42  ./ Centroid(BLOB
97ec0 65 6e 63 6f 64 65 64 20 50 4f 4c 59 47 4f 4e 20  encoded POLYGON 
97ed0 6f 72 20 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 20  or MULTIPOLYGON 
97ee0 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 72 65  geometry)././ re
97ef0 74 75 72 6e 73 20 61 20 50 4f 49 4e 54 20 72 65  turns a POINT re
97f00 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 63  presenting the c
97f10 65 6e 74 72 6f 69 64 20 66 6f 72 20 63 75 72 72  entroid for curr
97f20 65 6e 74 20 50 4f 4c 59 47 4f 4e 20 2f 20 4d 55  ent POLYGON / MU
97f30 4c 54 49 50 4f 4c 59 47 4f 4e 20 67 65 6f 6d 65  LTIPOLYGON geome
97f40 74 72 79 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  try ./ or NULL i
97f50 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
97f60 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
97f70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
97f80 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
97f90 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
97fa0 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72  t len;.    int r
97fb0 65 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  et;.    double x
97fc0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a  ;.    double y;.
97fd0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
97fe0 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
97ff0 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
98000 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
98010 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
98020 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
98030 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
98040 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
98050 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
98060 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
98070 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
98080 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
98090 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
980a0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
980b0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
980c0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
980d0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
980e0 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
980f0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
98100 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
98110 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
98120 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
98130 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
98140 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
98150 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
98160 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
98170 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
98180 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
98190 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
981a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
981b0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
981c0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
981d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
981e0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
981f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
98200 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
98210 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
98220 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
98230 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
98240 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
98250 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
98260 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
98270 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
98280 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
98290 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
982a0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
982b0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
982c0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
982d0 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
982e0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
982f0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
98300 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  e.      {..  if 
98310 28 67 61 69 61 49 73 45 6d 70 74 79 20 28 67 65  (gaiaIsEmpty (ge
98320 6f 29 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  o))..      sqlit
98330 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
98340 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
98350 65 0a 09 20 20 20 20 7b 0a 09 09 76 6f 69 64 20  e..    {...void 
98360 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  *data = sqlite3_
98370 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
98380 78 74 29 3b 0a 09 09 69 66 20 28 64 61 74 61 20  xt);...if (data 
98390 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 20 20 72  != NULL)...    r
983a0 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c  et = gaiaGeomCol
983b0 6c 43 65 6e 74 72 6f 69 64 5f 72 20 28 64 61 74  lCentroid_r (dat
983c0 61 2c 20 67 65 6f 2c 20 26 78 2c 20 26 79 29 3b  a, geo, &x, &y);
983d0 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 72 65  ...else...    re
983e0 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c  t = gaiaGeomColl
983f0 43 65 6e 74 72 6f 69 64 20 28 67 65 6f 2c 20 26  Centroid (geo, &
98400 78 2c 20 26 79 29 3b 0a 09 09 69 66 20 28 21 72  x, &y);...if (!r
98410 65 74 29 0a 09 09 20 20 20 20 73 71 6c 69 74 65  et)...    sqlite
98420 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
98430 6f 6e 74 65 78 74 29 3b 0a 09 09 65 6c 73 65 0a  ontext);...else.
98440 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 72 65  ..  {...      re
98450 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63  sult = gaiaAlloc
98460 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 09 20  GeomColl ();... 
98470 20 20 20 20 20 72 65 73 75 6c 74 2d 3e 53 72 69       result->Sri
98480 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09  d = geo->Srid;..
98490 09 20 20 20 20 20 20 67 61 69 61 41 64 64 50 6f  .      gaiaAddPo
984a0 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 72  intToGeomColl (r
984b0 65 73 75 6c 74 2c 20 78 2c 20 79 29 3b 0a 09 09  esult, x, y);...
984c0 20 20 20 20 20 20 67 61 69 61 54 6f 53 70 61 74        gaiaToSpat
984d0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32  iaLiteBlobWkbEx2
984e0 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73   (result, &p_res
984f0 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09  ult, &len,......
98500 09 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69  .  gpkg_mode, ti
98510 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 20 20 20  ny_point);...   
98520 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
98530 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 09  oll (result);...
98540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
98550 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
98560 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
98570 6e 2c 20 66 72 65 65 29 3b 0a 09 09 20 20 7d 0a  n, free);...  }.
98580 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
98590 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
985a0 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
985b0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 50  atic void.fnct_P
985c0 6f 69 6e 74 4f 6e 53 75 72 66 61 63 65 20 28 73  ointOnSurface (s
985d0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
985e0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
985f0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
98600 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
98610 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
98620 50 6f 69 6e 74 4f 6e 53 75 72 66 61 63 65 28 42  PointOnSurface(B
98630 4c 4f 42 65 6e 63 6f 64 65 64 20 50 4f 4c 59 47  LOBencoded POLYG
98640 4f 4e 20 6f 72 20 4d 55 4c 54 49 50 4f 4c 59 47  ON or MULTIPOLYG
98650 4f 4e 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  ON geometry)././
98660 20 72 65 74 75 72 6e 73 20 61 20 50 4f 49 4e 54   returns a POINT
98670 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
98680 69 65 20 6f 6e 20 74 68 65 20 53 75 72 66 61 63  ie on the Surfac
98690 65 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61  e./ or NULL if a
986a0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
986b0 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75  untered.*/.    u
986c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
986d0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
986e0 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 6c  bytes;.    int l
986f0 65 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  en;.    double x
98700 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a  ;.    double y;.
98710 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
98720 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
98730 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
98740 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
98750 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
98760 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
98770 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
98780 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
98790 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
987a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
987b0 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
987c0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
987d0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
987e0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
987f0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
98800 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
98810 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
98820 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
98830 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
98840 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
98850 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
98860 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
98870 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
98880 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
98890 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
988a0 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
988b0 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
988c0 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
988d0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
988e0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
988f0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
98900 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
98910 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
98920 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
98930 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
98940 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
98950 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
98960 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
98970 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
98980 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
98990 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
989a0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
989b0 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
989c0 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
989d0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
989e0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
989f0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
98a00 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
98a10 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65  f (!geo)..sqlite
98a20 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
98a30 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
98a40 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69  e.      {..  voi
98a50 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65  d *data = sqlite
98a60 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
98a70 74 65 78 74 29 3b 0a 09 20 20 69 6e 74 20 70 6f  text);..  int po
98a80 73 72 65 74 3b 0a 09 20 20 69 66 20 28 64 61 74  sret;..  if (dat
98a90 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
98aa0 20 20 70 6f 73 72 65 74 20 3d 20 67 61 69 61 47    posret = gaiaG
98ab0 65 74 50 6f 69 6e 74 4f 6e 53 75 72 66 61 63 65  etPointOnSurface
98ac0 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 2c 20 26  _r (data, geo, &
98ad0 78 2c 20 26 79 29 3b 0a 09 20 20 65 6c 73 65 0a  x, &y);..  else.
98ae0 09 20 20 20 20 20 20 70 6f 73 72 65 74 20 3d 20  .      posret = 
98af0 67 61 69 61 47 65 74 50 6f 69 6e 74 4f 6e 53 75  gaiaGetPointOnSu
98b00 72 66 61 63 65 20 28 67 65 6f 2c 20 26 78 2c 20  rface (geo, &x, 
98b10 26 79 29 3b 0a 09 20 20 69 66 20 28 21 70 6f 73  &y);..  if (!pos
98b20 72 65 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ret)..      sqli
98b30 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
98b40 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
98b50 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28  se..    {...if (
98b60 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  geo->DimensionMo
98b70 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
98b80 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
98b90 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c 6c  result = gaiaAll
98ba0 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29  ocGeomCollXYZ ()
98bb0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 41 64  ;...      gaiaAd
98bc0 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
98bd0 58 59 5a 20 28 72 65 73 75 6c 74 2c 20 78 2c 20  XYZ (result, x, 
98be0 79 2c 20 30 2e 30 29 3b 0a 09 09 20 20 7d 0a 09  y, 0.0);...  }..
98bf0 09 65 6c 73 65 20 69 66 20 28 67 65 6f 2d 3e 44  .else if (geo->D
98c00 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
98c10 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20   GAIA_XY_M)...  
98c20 7b 0a 09 09 20 20 20 20 20 20 72 65 73 75 6c 74  {...      result
98c30 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
98c40 43 6f 6c 6c 58 59 4d 20 28 29 3b 0a 09 09 20 20  CollXYM ();...  
98c50 20 20 20 20 67 61 69 61 41 64 64 50 6f 69 6e 74      gaiaAddPoint
98c60 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 4d 20 28 72  ToGeomCollXYM (r
98c70 65 73 75 6c 74 2c 20 78 2c 20 79 2c 20 30 2e 30  esult, x, y, 0.0
98c80 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20  );...  }...else 
98c90 69 66 20 28 67 65 6f 2d 3e 44 69 6d 65 6e 73 69  if (geo->Dimensi
98ca0 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
98cb0 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 7b 0a 09 09  XY_Z_M)...  {...
98cc0 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67        result = g
98cd0 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c  aiaAllocGeomColl
98ce0 58 59 5a 4d 20 28 29 3b 0a 09 09 20 20 20 20 20  XYZM ();...     
98cf0 20 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47   gaiaAddPointToG
98d00 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20 28 72 65 73  eomCollXYZM (res
98d10 75 6c 74 2c 20 78 2c 20 79 2c 20 30 2e 30 2c 20  ult, x, y, 0.0, 
98d20 30 2e 30 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c  0.0);...  }...el
98d30 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  se...  {...     
98d40 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41 6c   result = gaiaAl
98d50 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a  locGeomColl ();.
98d60 09 09 20 20 20 20 20 20 67 61 69 61 41 64 64 50  ..      gaiaAddP
98d70 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28  ointToGeomColl (
98d80 72 65 73 75 6c 74 2c 20 78 2c 20 79 29 3b 0a 09  result, x, y);..
98d90 09 20 20 7d 0a 09 09 72 65 73 75 6c 74 2d 3e 53  .  }...result->S
98da0 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b  rid = geo->Srid;
98db0 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c  ...gaiaToSpatiaL
98dc0 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 72  iteBlobWkbEx2 (r
98dd0 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74  esult, &p_result
98de0 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20  , &len,......   
98df0 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79   gpkg_mode, tiny
98e00 5f 70 6f 69 6e 74 29 3b 0a 09 09 67 61 69 61 46  _point);...gaiaF
98e10 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
98e20 75 6c 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  ult);...sqlite3_
98e30 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
98e40 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
98e50 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20 20  len, free);..   
98e60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67   }.      }.    g
98e70 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
98e80 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (geo);.}..static
98e90 20 76 6f 69 64 0a 66 6e 63 74 5f 53 69 6d 70 6c   void.fnct_Simpl
98ea0 69 66 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ify (sqlite3_con
98eb0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
98ec0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
98ed0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
98ee0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
98ef0 6f 6e 3a 0a 2f 20 53 69 6d 70 6c 69 66 79 28 42  on:./ Simplify(B
98f00 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  LOBencoded geome
98f10 74 72 79 2c 20 74 6f 6c 65 72 61 6e 63 65 29 0a  try, tolerance).
98f20 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65  /./ returns a ne
98f30 77 20 67 65 6f 6d 65 74 72 79 20 74 68 61 74 20  w geometry that 
98f40 69 73 20 61 20 63 61 72 69 63 61 74 75 72 65 20  is a caricature 
98f50 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
98f60 6f 6e 65 20 72 65 63 65 69 76 65 64 2c 20 62 75  one received, bu
98f70 74 20 73 69 6d 70 6c 69 66 69 65 64 20 75 73 69  t simplified usi
98f80 6e 67 20 74 68 65 20 44 6f 75 67 6c 61 73 2d 50  ng the Douglas-P
98f90 65 75 6b 65 72 20 61 6c 67 6f 72 69 68 74 6d 0a  euker algorihtm.
98fa0 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
98fb0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
98fc0 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
98fd0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
98fe0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
98ff0 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  tes;.    gaiaGeo
99000 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
99010 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
99020 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b  mCollPtr result;
99030 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c  .    int int_val
99040 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74  ue;.    double t
99050 6f 6c 65 72 61 6e 63 65 3b 0a 20 20 20 20 69 6e  olerance;.    in
99060 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
99070 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
99080 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
99090 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
990a0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
990b0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
990c0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
990d0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
990e0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
990f0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
99100 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
99110 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
99120 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
99130 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
99140 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
99150 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
99160 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
99170 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
99180 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
99190 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
991a0 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
991b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
991c0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
991d0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
991e0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
991f0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
99200 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
99210 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
99220 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
99230 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
99240 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
99250 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
99260 29 0a 09 74 6f 6c 65 72 61 6e 63 65 20 3d 20 73  )..tolerance = s
99270 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
99280 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ble (argv[1]);. 
99290 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
992a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
992b0 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
992c0 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
992d0 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65    {..  int_value
992e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
992f0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
99300 09 20 20 74 6f 6c 65 72 61 6e 63 65 20 3d 20 69  .  tolerance = i
99310 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  nt_value;.      
99320 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
99330 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
99340 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
99350 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
99360 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
99370 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
99380 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
99390 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
993a0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
993b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
993c0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
993d0 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
993e0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
993f0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
99400 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
99410 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
99420 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
99430 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
99440 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
99450 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
99460 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
99470 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20  .  void *data = 
99480 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
99490 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  a (context);..  
994a0 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c  if (data != NULL
994b0 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20  )..      result 
994c0 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 53 69  = gaiaGeomCollSi
994d0 6d 70 6c 69 66 79 5f 72 20 28 64 61 74 61 2c 20  mplify_r (data, 
994e0 67 65 6f 2c 20 74 6f 6c 65 72 61 6e 63 65 29 3b  geo, tolerance);
994f0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
99500 72 65 73 75 6c 74 20 3d 20 67 61 69 61 47 65 6f  result = gaiaGeo
99510 6d 43 6f 6c 6c 53 69 6d 70 6c 69 66 79 20 28 67  mCollSimplify (g
99520 65 6f 2c 20 74 6f 6c 65 72 61 6e 63 65 29 3b 0a  eo, tolerance);.
99530 09 20 20 69 66 20 28 21 72 65 73 75 6c 74 29 0a  .  if (!result).
99540 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
99550 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
99560 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ext);..  else.. 
99570 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73     {.../* builds
99580 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74   the BLOB geomet
99590 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ry to be returne
995a0 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a  d */...int len;.
995b0 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
995c0 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
995d0 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61  ;...gaiaToSpatia
995e0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
995f0 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c  result, &p_resul
99600 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20  t, &len,......  
99610 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e    gpkg_mode, tin
99620 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69  y_point);...sqli
99630 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
99640 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
99650 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
99660 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
99670 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20  ll (result);..  
99680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
99690 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
996a0 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
996b0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 69 6d 70  c void.fnct_Simp
996c0 6c 69 66 79 50 72 65 73 65 72 76 65 54 6f 70 6f  lifyPreserveTopo
996d0 6c 6f 67 79 20 28 73 71 6c 69 74 65 33 5f 63 6f  logy (sqlite3_co
996e0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
996f0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20   int argc,....  
99700 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
99710 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
99720 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
99730 20 53 69 6d 70 6c 69 66 79 50 72 65 73 65 72 76   SimplifyPreserv
99740 65 54 6f 70 6f 6c 6f 67 79 28 42 4c 4f 42 65 6e  eTopology(BLOBen
99750 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20  coded geometry, 
99760 74 6f 6c 65 72 61 6e 63 65 29 0a 2f 0a 2f 20 72  tolerance)././ r
99770 65 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f  eturns a new geo
99780 6d 65 74 72 79 20 74 68 61 74 20 69 73 20 61 20  metry that is a 
99790 63 61 72 69 63 61 74 75 72 65 20 6f 66 20 74 68  caricature of th
997a0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e 65 20 72  e original one r
997b0 65 63 65 69 76 65 64 2c 20 62 75 74 20 73 69 6d  eceived, but sim
997c0 70 6c 69 66 69 65 64 20 75 73 69 6e 67 20 74 68  plified using th
997d0 65 20 44 6f 75 67 6c 61 73 2d 50 65 75 6b 65 72  e Douglas-Peuker
997e0 20 61 6c 67 6f 72 69 68 74 6d 20 5b 70 72 65 73   algorihtm [pres
997f0 65 72 76 69 6e 67 20 74 6f 70 6f 6c 6f 67 79 5d  erving topology]
99800 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
99810 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
99820 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
99830 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
99840 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
99850 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65  ytes;.    gaiaGe
99860 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20  omCollPtr geo = 
99870 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
99880 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74  omCollPtr result
99890 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  ;.    int int_va
998a0 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  lue;.    double 
998b0 74 6f 6c 65 72 61 6e 63 65 3b 0a 20 20 20 20 69  tolerance;.    i
998c0 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
998d0 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
998e0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
998f0 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
99900 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
99910 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
99920 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
99930 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
99940 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
99950 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
99960 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
99970 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
99980 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
99990 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
999a0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
999b0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
999c0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
999d0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
999e0 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
999f0 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
99a00 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
99a10 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
99a20 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
99a30 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
99a40 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
99a50 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
99a60 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
99a70 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
99a80 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
99a90 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
99aa0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
99ab0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
99ac0 54 29 0a 09 74 6f 6c 65 72 61 6e 63 65 20 3d 20  T)..tolerance = 
99ad0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
99ae0 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a  uble (argv[1]);.
99af0 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
99b00 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
99b10 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
99b20 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
99b30 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75     {..  int_valu
99b40 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
99b50 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b  e_int (argv[1]);
99b60 0a 09 20 20 74 6f 6c 65 72 61 6e 63 65 20 3d 20  ..  tolerance = 
99b70 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
99b80 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
99b90 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
99ba0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
99bb0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
99bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
99bd0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
99be0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
99bf0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
99c00 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
99c10 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
99c20 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
99c30 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61  );.    geo =..ga
99c40 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
99c50 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
99c60 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
99c70 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
99c80 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
99c90 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a  ;.    if (!geo).
99ca0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
99cb0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
99cc0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
99cd0 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  ..  void *data =
99ce0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
99cf0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ta (context);.. 
99d00 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c   if (data != NUL
99d10 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74  L)..      result
99d20 20 3d 0a 09 09 20 20 67 61 69 61 47 65 6f 6d 43   =...  gaiaGeomC
99d30 6f 6c 6c 53 69 6d 70 6c 69 66 79 50 72 65 73 65  ollSimplifyPrese
99d40 72 76 65 54 6f 70 6f 6c 6f 67 79 5f 72 20 28 64  rveTopology_r (d
99d50 61 74 61 2c 20 67 65 6f 2c 20 74 6f 6c 65 72 61  ata, geo, tolera
99d60 6e 63 65 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  nce);..  else.. 
99d70 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61       result = ga
99d80 69 61 47 65 6f 6d 43 6f 6c 6c 53 69 6d 70 6c 69  iaGeomCollSimpli
99d90 66 79 50 72 65 73 65 72 76 65 54 6f 70 6f 6c 6f  fyPreserveTopolo
99da0 67 79 20 28 67 65 6f 2c 20 74 6f 6c 65 72 61 6e  gy (geo, toleran
99db0 63 65 29 3b 0a 09 20 20 69 66 20 28 21 72 65 73  ce);..  if (!res
99dc0 75 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ult)..      sqli
99dd0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
99de0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
99df0 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62  se..    {.../* b
99e00 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67  uilds the BLOB g
99e10 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65  eometry to be re
99e20 74 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20  turned */...int 
99e30 6c 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20  len;...unsigned 
99e40 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
99e50 20 4e 55 4c 4c 3b 0a 09 09 67 61 69 61 54 6f 53   NULL;...gaiaToS
99e60 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
99e70 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f  Ex2 (result, &p_
99e80 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09  result, &len,...
99e90 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65  ...    gpkg_mode
99ea0 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09  , tiny_point);..
99eb0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
99ec0 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
99ed0 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
99ee0 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47  ee);...gaiaFreeG
99ef0 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29  eomColl (result)
99f00 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
99f10 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
99f20 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
99f30 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
99f40 5f 43 6f 6e 76 65 78 48 75 6c 6c 20 28 73 71 6c  _ConvexHull (sql
99f50 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
99f60 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
99f70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
99f80 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
99f90 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 6f  L function:./ Co
99fa0 6e 76 65 78 48 75 6c 6c 28 42 4c 4f 42 65 6e 63  nvexHull(BLOBenc
99fb0 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f  oded geometry)./
99fc0 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  ./ returns a new
99fd0 20 67 65 6f 6d 65 74 72 79 20 72 65 70 72 65 73   geometry repres
99fe0 65 6e 74 69 6e 67 20 74 68 65 20 43 4f 4e 56 45  enting the CONVE
99ff0 58 20 48 55 4c 4c 20 66 6f 72 20 63 75 72 72 65  X HULL for curre
9a000 6e 74 20 67 65 6f 6d 65 74 72 79 0a 2f 20 6f 72  nt geometry./ or
9a010 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
9a020 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
9a030 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
9a040 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
9a050 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
9a060 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
9a070 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9a080 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
9a090 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
9a0a0 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c  llPtr geo = NULL
9a0b0 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
9a0c0 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20  llPtr result;.  
9a0d0 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
9a0e0 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
9a0f0 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
9a100 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
9a110 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
9a120 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
9a130 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
9a140 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
9a150 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
9a160 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
9a170 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
9a180 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
9a190 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
9a1a0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
9a1b0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
9a1c0 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
9a1d0 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
9a1e0 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
9a1f0 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
9a200 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
9a210 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
9a220 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
9a230 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
9a240 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
9a250 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
9a260 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
9a270 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
9a280 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
9a290 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
9a2a0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
9a2b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
9a2c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
9a2d0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
9a2e0 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
9a2f0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
9a300 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
9a310 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  o =..gaiaFromSpa
9a320 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
9a330 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
9a340 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
9a350 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
9a360 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
9a370 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f  (!geo)..sqlite3_
9a380 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
9a390 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
9a3a0 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64 20        {..  void 
9a3b0 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  *data = sqlite3_
9a3c0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
9a3d0 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74 61  xt);..  if (data
9a3e0 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   != NULL)..     
9a3f0 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 43 6f   result = gaiaCo
9a400 6e 76 65 78 48 75 6c 6c 5f 72 20 28 64 61 74 61  nvexHull_r (data
9a410 2c 20 67 65 6f 29 3b 0a 09 20 20 65 6c 73 65 0a  , geo);..  else.
9a420 09 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
9a430 67 61 69 61 43 6f 6e 76 65 78 48 75 6c 6c 20 28  gaiaConvexHull (
9a440 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 21 72 65  geo);..  if (!re
9a450 73 75 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c  sult)..      sql
9a460 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
9a470 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65   (context);..  e
9a480 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 67 61 69  lse..    {...gai
9a490 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
9a4a0 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c  bWkbEx2 (result,
9a4b0 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
9a4c0 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f  ,......    gpkg_
9a4d0 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74  mode, tiny_point
9a4e0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
9a4f0 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
9a500 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
9a510 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46  , free);...gaiaF
9a520 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
9a530 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ult);..    }.   
9a540 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
9a550 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
9a560 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
9a570 66 6e 63 74 5f 42 75 66 66 65 72 20 28 73 71 6c  fnct_Buffer (sql
9a580 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
9a590 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
9a5a0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
9a5b0 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
9a5c0 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 42 75  L function:./ Bu
9a5d0 66 66 65 72 28 42 4c 4f 42 65 6e 63 6f 64 65 64  ffer(BLOBencoded
9a5e0 20 67 65 6f 6d 65 74 72 79 2c 20 72 61 64 69 75   geometry, radiu
9a5f0 73 29 0a 2f 20 42 75 66 66 65 72 28 42 4c 4f 42  s)./ Buffer(BLOB
9a600 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
9a610 2c 20 72 61 64 69 75 73 2c 20 71 75 61 64 72 61  , radius, quadra
9a620 6e 74 73 65 67 6d 65 6e 74 73 29 0a 2f 0a 2f 20  ntsegments)././ 
9a630 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65  returns a new ge
9a640 6f 6d 65 74 72 79 20 72 65 70 72 65 73 65 6e 74  ometry represent
9a650 69 6e 67 20 74 68 65 20 42 55 46 46 45 52 20 66  ing the BUFFER f
9a660 6f 72 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65  or current geome
9a670 74 72 79 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  try./ or NULL if
9a680 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
9a690 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
9a6a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9a6b0 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
9a6c0 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
9a6d0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
9a6e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
9a6f0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73  aGeomCollPtr res
9a700 75 6c 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ult;.    double 
9a710 72 61 64 69 75 73 3b 0a 20 20 20 20 69 6e 74 20  radius;.    int 
9a720 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 69  int_value;.    i
9a730 6e 74 20 71 75 61 64 72 61 6e 74 73 65 67 6d 65  nt quadrantsegme
9a740 6e 74 73 20 3d 20 33 30 3b 0a 20 20 20 20 69 6e  nts = 30;.    in
9a750 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
9a760 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
9a770 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
9a780 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
9a790 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
9a7a0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
9a7b0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
9a7c0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
9a7d0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
9a7e0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
9a7f0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
9a800 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
9a810 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
9a820 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
9a830 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
9a840 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
9a850 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
9a860 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
9a870 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
9a880 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
9a890 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
9a8a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
9a8b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
9a8c0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
9a8d0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
9a8e0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
9a8f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
9a900 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
9a910 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
9a920 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
9a930 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
9a940 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
9a950 29 0a 09 72 61 64 69 75 73 20 3d 20 73 71 6c 69  )..radius = sqli
9a960 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
9a970 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
9a980 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
9a990 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
9a9a0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
9a9b0 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
9a9c0 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20  ..  int_value = 
9a9d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
9a9e0 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
9a9f0 72 61 64 69 75 73 20 3d 20 69 6e 74 5f 76 61 6c  radius = int_val
9aa00 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
9aa10 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
9aa20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
9aa30 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
9aa40 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
9aa50 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
9aa60 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 3).      {..  
9aa70 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
9aa80 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
9aa90 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
9aaa0 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  ER)..    {...sql
9aab0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
9aac0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
9aad0 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
9aae0 71 75 61 64 72 61 6e 74 73 65 67 6d 65 6e 74 73  quadrantsegments
9aaf0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9ab00 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  _int (argv[2]);.
9ab10 09 20 20 69 66 20 28 71 75 61 64 72 61 6e 74 73  .  if (quadrants
9ab20 65 67 6d 65 6e 74 73 20 3c 3d 20 30 29 0a 09 20  egments <= 0).. 
9ab30 20 20 20 20 20 71 75 61 64 72 61 6e 74 73 65 67       quadrantseg
9ab40 6d 65 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  ments = 1;.     
9ab50 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
9ab60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
9ab70 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
9ab80 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
9ab90 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
9aba0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
9abb0 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
9abc0 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
9abd0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
9abe0 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
9abf0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
9ac00 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
9ac10 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
9ac20 69 66 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74  if (!geo)..sqlit
9ac30 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
9ac40 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
9ac50 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f  se.      {..  vo
9ac60 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74  id *data = sqlit
9ac70 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
9ac80 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64  ntext);..  if (d
9ac90 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ata != NULL)..  
9aca0 20 20 20 20 72 65 73 75 6c 74 20 3d 0a 09 09 20      result =... 
9acb0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 42 75 66   gaiaGeomCollBuf
9acc0 66 65 72 5f 72 20 28 64 61 74 61 2c 20 67 65 6f  fer_r (data, geo
9acd0 2c 20 72 61 64 69 75 73 2c 20 71 75 61 64 72 61  , radius, quadra
9ace0 6e 74 73 65 67 6d 65 6e 74 73 29 3b 0a 09 20 20  ntsegments);..  
9acf0 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 73 75  else..      resu
9ad00 6c 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c  lt = gaiaGeomCol
9ad10 6c 42 75 66 66 65 72 20 28 67 65 6f 2c 20 72 61  lBuffer (geo, ra
9ad20 64 69 75 73 2c 20 71 75 61 64 72 61 6e 74 73 65  dius, quadrantse
9ad30 67 6d 65 6e 74 73 29 3b 0a 09 20 20 69 66 20 28  gments);..  if (
9ad40 21 72 65 73 75 6c 74 29 0a 09 20 20 20 20 20 20  !result)..      
9ad50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
9ad60 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
9ad70 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
9ad80 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c  /* builds the BL
9ad90 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62  OB geometry to b
9ada0 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09  e returned */...
9adb0 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67  int len;...unsig
9adc0 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
9add0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 73  lt = NULL;...res
9ade0 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d  ult->Srid = geo-
9adf0 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f 53  >Srid;...gaiaToS
9ae00 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
9ae10 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f  Ex2 (result, &p_
9ae20 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09  result, &len,...
9ae30 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65  ...    gpkg_mode
9ae40 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09  , tiny_point);..
9ae50 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
9ae60 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
9ae70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72  _result, len, fr
9ae80 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47  ee);...gaiaFreeG
9ae90 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29  eomColl (result)
9aea0 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
9aeb0 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
9aec0 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a  mColl (geo);.}..
9aed0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
9aee0 5f 49 6e 74 65 72 73 65 63 74 69 6f 6e 20 28 73  _Intersection (s
9aef0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9af00 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
9af10 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
9af20 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
9af30 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
9af40 49 6e 74 65 72 73 65 63 74 69 6f 6e 28 42 4c 4f  Intersection(BLO
9af50 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31 2c 20  Bencoded geom1, 
9af60 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
9af70 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61  2)././ returns a
9af80 20 6e 65 77 20 67 65 6f 6d 65 74 72 79 20 72 65   new geometry re
9af90 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 49  presenting the I
9afa0 4e 54 45 52 53 45 43 54 49 4f 4e 20 6f 66 20 62  NTERSECTION of b
9afb0 6f 74 68 20 67 65 6f 6d 65 74 72 69 65 73 0a 2f  oth geometries./
9afc0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
9afd0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
9afe0 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ered.*/.    unsi
9aff0 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
9b000 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
9b010 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
9b020 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e  CollPtr geo1 = N
9b030 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
9b040 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20  mCollPtr geo2 = 
9b050 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65  NULL;.    gaiaGe
9b060 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74  omCollPtr result
9b070 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
9b080 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
9b090 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
9b0a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69   = 0;.    int ti
9b0b0 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  ny_point = 0;.  
9b0c0 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
9b0d0 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
9b0e0 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
9b0f0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
9b100 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
9b110 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
9b120 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
9b130 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
9b140 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
9b150 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
9b160 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
9b170 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
9b180 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
9b190 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
9b1a0 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  ..  tiny_point =
9b1b0 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e   cache->tinyPoin
9b1c0 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20  tEnabled;.      
9b1d0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
9b1e0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
9b1f0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
9b200 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
9b210 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9b220 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
9b230 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
9b240 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
9b250 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
9b260 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
9b270 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
9b280 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
9b290 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
9b2a0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
9b2b0 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
9b2c0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
9b2d0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
9b2e0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
9b2f0 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
9b300 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
9b310 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
9b320 20 20 20 20 67 65 6f 31 20 3d 0a 09 67 61 69 61      geo1 =..gaia
9b330 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
9b340 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
9b350 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
9b360 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
9b370 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
9b380 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
9b390 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
9b3a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
9b3b0 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  b (argv[1]);.   
9b3c0 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
9b3d0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
9b3e0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65  argv[1]);.    ge
9b3f0 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  o2 =..gaiaFromSp
9b400 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
9b410 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
9b420 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
9b430 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
9b440 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
9b450 20 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32   (!geo1 || !geo2
9b460 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
9b470 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
9b480 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
9b490 20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61   {..  void *data
9b4a0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
9b4b0 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
9b4c0 09 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e  .  if (data != N
9b4d0 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75  ULL)..      resu
9b4e0 6c 74 20 3d 20 67 61 69 61 47 65 6f 6d 65 74 72  lt = gaiaGeometr
9b4f0 79 49 6e 74 65 72 73 65 63 74 69 6f 6e 5f 72 20  yIntersection_r 
9b500 28 64 61 74 61 2c 20 67 65 6f 31 2c 20 67 65 6f  (data, geo1, geo
9b510 32 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  2);..  else..   
9b520 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61     result = gaia
9b530 47 65 6f 6d 65 74 72 79 49 6e 74 65 72 73 65 63  GeometryIntersec
9b540 74 69 6f 6e 20 28 67 65 6f 31 2c 20 67 65 6f 32  tion (geo1, geo2
9b550 29 3b 0a 09 20 20 69 66 20 28 21 72 65 73 75 6c  );..  if (!resul
9b560 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  t)..      sqlite
9b570 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
9b580 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65  ontext);..  else
9b590 20 69 66 20 28 67 61 69 61 49 73 45 6d 70 74 79   if (gaiaIsEmpty
9b5a0 20 28 72 65 73 75 6c 74 29 29 0a 09 20 20 20 20   (result))..    
9b5b0 7b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d  {...gaiaFreeGeom
9b5c0 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09  Coll (result);..
9b5d0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
9b5e0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
9b5f0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
9b600 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64      {.../* build
9b610 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65  s the BLOB geome
9b620 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e  try to be return
9b630 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b  ed */...int len;
9b640 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
9b650 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
9b660 4c 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69  L;...gaiaToSpati
9b670 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20  aLiteBlobWkbEx2 
9b680 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75  (result, &p_resu
9b690 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20  lt, &len,...... 
9b6a0 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69     gpkg_mode, ti
9b6b0 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c  ny_point);...sql
9b6c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
9b6d0 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73   (context, p_res
9b6e0 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b  ult, len, free);
9b6f0 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43  ...gaiaFreeGeomC
9b700 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20  oll (result);.. 
9b710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9b720 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
9b730 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20 67 61  l (geo1);.    ga
9b740 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
9b750 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  geo2);.}..static
9b760 20 69 6e 74 0a 67 61 69 61 5f 75 6e 69 6f 6e 5f   int.gaia_union_
9b770 70 6f 6c 79 67 73 20 28 67 61 69 61 47 65 6f 6d  polygs (gaiaGeom
9b780 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 29 0a 7b 0a  CollPtr geom).{.
9b790 2f 2a 20 74 65 73 74 69 6e 67 20 69 66 20 74 68  /* testing if th
9b7a0 69 73 20 67 65 6f 6d 65 74 72 79 20 73 69 6d 70  is geometry simp
9b7b0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 50 6f 6c 79  ly contains Poly
9b7c0 67 6f 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gons */.    int 
9b7d0 70 74 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  pts = 0;.    int
9b7e0 20 6c 6e 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e   lns = 0;.    in
9b7f0 74 20 70 67 73 20 3d 20 30 3b 0a 20 20 20 20 67  t pgs = 0;.    g
9b800 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
9b810 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
9b820 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
9b830 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b  iaPolygonPtr pg;
9b840 0a 20 20 20 20 70 74 20 3d 20 67 65 6f 6d 2d 3e  .    pt = geom->
9b850 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20 20  FirstPoint;.    
9b860 77 68 69 6c 65 20 28 70 74 29 0a 20 20 20 20 20  while (pt).     
9b870 20 7b 0a 09 20 20 70 74 73 2b 2b 3b 0a 09 20 20   {..  pts++;..  
9b880 70 74 20 3d 20 70 74 2d 3e 4e 65 78 74 3b 0a 20  pt = pt->Next;. 
9b890 20 20 20 20 20 7d 0a 20 20 20 20 6c 6e 20 3d 20       }.    ln = 
9b8a0 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73  geom->FirstLines
9b8b0 74 72 69 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65  tring;.    while
9b8c0 20 28 6c 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20   (ln).      {.. 
9b8d0 20 6c 6e 73 2b 2b 3b 0a 09 20 20 6c 6e 20 3d 20   lns++;..  ln = 
9b8e0 6c 6e 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20  ln->Next;.      
9b8f0 7d 0a 20 20 20 20 70 67 20 3d 20 67 65 6f 6d 2d  }.    pg = geom-
9b900 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 20  >FirstPolygon;. 
9b910 20 20 20 77 68 69 6c 65 20 28 70 67 29 0a 20 20     while (pg).  
9b920 20 20 20 20 7b 0a 09 20 20 70 67 73 2b 2b 3b 0a      {..  pgs++;.
9b930 09 20 20 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74  .  pg = pg->Next
9b940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
9b950 20 28 70 74 73 20 7c 7c 20 6c 6e 73 29 0a 09 72   (pts || lns)..r
9b960 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 20  eturn 0;.    if 
9b970 28 21 70 67 73 29 0a 09 72 65 74 75 72 6e 20 30  (!pgs)..return 0
9b980 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
9b990 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
9b9a0 6e 63 74 5f 55 6e 69 6f 6e 5f 73 74 65 70 20 28  nct_Union_step (
9b9b0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9b9c0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
9b9d0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
9b9e0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
9b9f0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
9ba00 20 55 6e 69 6f 6e 28 42 4c 4f 42 65 6e 63 6f 64   Union(BLOBencod
9ba10 65 64 20 67 65 6f 6d 29 0a 2f 0a 2f 20 61 67 67  ed geom)././ agg
9ba20 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
9ba30 2d 20 53 54 45 50 0a 2f 0a 2a 2f 0a 20 20 20 20  - STEP./.*/.    
9ba40 73 74 72 75 63 74 20 67 61 69 61 5f 67 65 6f 6d  struct gaia_geom
9ba50 5f 63 68 61 69 6e 20 2a 63 68 61 69 6e 3b 0a 20  _chain *chain;. 
9ba60 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f 67     struct gaia_g
9ba70 65 6f 6d 5f 63 68 61 69 6e 5f 69 74 65 6d 20 2a  eom_chain_item *
9ba80 69 74 65 6d 3b 0a 20 20 20 20 75 6e 73 69 67 6e  item;.    unsign
9ba90 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
9baa0 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
9bab0 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
9bac0 6c 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20  llPtr geom;.    
9bad0 73 74 72 75 63 74 20 67 61 69 61 5f 67 65 6f 6d  struct gaia_geom
9bae0 5f 63 68 61 69 6e 20 2a 2a 70 3b 0a 20 20 20 20  _chain **p;.    
9baf0 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
9bb00 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
9bb10 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
9bb20 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
9bb30 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
9bb40 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
9bb50 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
9bb60 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
9bb70 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
9bb80 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
9bb90 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
9bba0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
9bbb0 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
9bbc0 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
9bbd0 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
9bbe0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
9bbf0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
9bc00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
9bc10 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
9bc20 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
9bc30 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
9bc40 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
9bc50 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
9bc60 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
9bc70 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
9bc80 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
9bc90 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
9bca0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
9bcb0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
9bcc0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
9bcd0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
9bce0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 20  v[0]);.    geom 
9bcf0 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
9bd00 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
9bd10 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
9bd20 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
9bd30 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
9bd40 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
9bd50 67 65 6f 6d 29 0a 09 72 65 74 75 72 6e 3b 0a 20  geom)..return;. 
9bd60 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61     p = sqlite3_a
9bd70 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
9bd80 20 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f   (context, sizeo
9bd90 66 20 28 73 74 72 75 63 74 20 67 61 69 61 5f 67  f (struct gaia_g
9bda0 65 6f 6d 5f 63 68 61 69 6e 20 2a 2a 29 29 3b 0a  eom_chain **));.
9bdb0 20 20 20 20 69 66 20 28 21 28 2a 70 29 29 0a 20      if (!(*p)). 
9bdc0 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 74 68 69       {..  /* thi
9bdd0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  s is the first r
9bde0 6f 77 20 2a 2f 0a 09 20 20 63 68 61 69 6e 20 3d  ow */..  chain =
9bdf0 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20   malloc (sizeof 
9be00 28 73 74 72 75 63 74 20 67 61 69 61 5f 67 65 6f  (struct gaia_geo
9be10 6d 5f 63 68 61 69 6e 29 29 3b 0a 09 20 20 2a 70  m_chain));..  *p
9be20 20 3d 20 63 68 61 69 6e 3b 0a 09 20 20 69 74 65   = chain;..  ite
9be30 6d 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65  m = malloc (size
9be40 6f 66 20 28 73 74 72 75 63 74 20 67 61 69 61 5f  of (struct gaia_
9be50 67 65 6f 6d 5f 63 68 61 69 6e 5f 69 74 65 6d 29  geom_chain_item)
9be60 29 3b 0a 09 20 20 69 74 65 6d 2d 3e 67 65 6f 6d  );..  item->geom
9be70 20 3d 20 67 65 6f 6d 3b 0a 09 20 20 69 74 65 6d   = geom;..  item
9be80 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 09  ->next = NULL;..
9be90 20 20 63 68 61 69 6e 2d 3e 61 6c 6c 5f 70 6f 6c    chain->all_pol
9bea0 79 67 73 20 3d 20 67 61 69 61 5f 75 6e 69 6f 6e  ygs = gaia_union
9beb0 5f 70 6f 6c 79 67 73 20 28 67 65 6f 6d 29 3b 0a  _polygs (geom);.
9bec0 09 20 20 63 68 61 69 6e 2d 3e 66 69 72 73 74 20  .  chain->first 
9bed0 3d 20 69 74 65 6d 3b 0a 09 20 20 63 68 61 69 6e  = item;..  chain
9bee0 2d 3e 6c 61 73 74 20 3d 20 69 74 65 6d 3b 0a 20  ->last = item;. 
9bef0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
9bf00 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 75        {..  /* su
9bf10 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20 2a 2f  bsequent rows */
9bf20 0a 09 20 20 63 68 61 69 6e 20 3d 20 2a 70 3b 0a  ..  chain = *p;.
9bf30 09 20 20 69 74 65 6d 20 3d 20 6d 61 6c 6c 6f 63  .  item = malloc
9bf40 20 28 73 69 7a 65 6f 66 20 28 73 74 72 75 63 74   (sizeof (struct
9bf50 20 67 61 69 61 5f 67 65 6f 6d 5f 63 68 61 69 6e   gaia_geom_chain
9bf60 5f 69 74 65 6d 29 29 3b 0a 09 20 20 69 74 65 6d  _item));..  item
9bf70 2d 3e 67 65 6f 6d 20 3d 20 67 65 6f 6d 3b 0a 09  ->geom = geom;..
9bf80 20 20 69 74 65 6d 2d 3e 6e 65 78 74 20 3d 20 4e    item->next = N
9bf90 55 4c 4c 3b 0a 09 20 20 69 66 20 28 21 67 61 69  ULL;..  if (!gai
9bfa0 61 5f 75 6e 69 6f 6e 5f 70 6f 6c 79 67 73 20 28  a_union_polygs (
9bfb0 67 65 6f 6d 29 29 0a 09 20 20 20 20 20 20 63 68  geom))..      ch
9bfc0 61 69 6e 2d 3e 61 6c 6c 5f 70 6f 6c 79 67 73 20  ain->all_polygs 
9bfd0 3d 20 30 3b 0a 09 20 20 63 68 61 69 6e 2d 3e 6c  = 0;..  chain->l
9bfe0 61 73 74 2d 3e 6e 65 78 74 20 3d 20 69 74 65 6d  ast->next = item
9bff0 3b 0a 09 20 20 63 68 61 69 6e 2d 3e 6c 61 73 74  ;..  chain->last
9c000 20 3d 20 69 74 65 6d 3b 0a 20 20 20 20 20 20 7d   = item;.      }
9c010 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
9c020 67 61 69 61 5f 66 72 65 65 5f 67 65 6f 6d 5f 63  gaia_free_geom_c
9c030 68 61 69 6e 20 28 73 74 72 75 63 74 20 67 61 69  hain (struct gai
9c040 61 5f 67 65 6f 6d 5f 63 68 61 69 6e 20 2a 63 68  a_geom_chain *ch
9c050 61 69 6e 29 0a 7b 0a 20 20 20 20 73 74 72 75 63  ain).{.    struc
9c060 74 20 67 61 69 61 5f 67 65 6f 6d 5f 63 68 61 69  t gaia_geom_chai
9c070 6e 5f 69 74 65 6d 20 2a 70 20 3d 20 63 68 61 69  n_item *p = chai
9c080 6e 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 73 74  n->first;.    st
9c090 72 75 63 74 20 67 61 69 61 5f 67 65 6f 6d 5f 63  ruct gaia_geom_c
9c0a0 68 61 69 6e 5f 69 74 65 6d 20 2a 70 6e 3b 0a 20  hain_item *pn;. 
9c0b0 20 20 20 77 68 69 6c 65 20 28 70 29 0a 20 20 20     while (p).   
9c0c0 20 20 20 7b 0a 09 20 20 70 6e 20 3d 20 70 2d 3e     {..  pn = p->
9c0d0 6e 65 78 74 3b 0a 09 20 20 67 61 69 61 46 72 65  next;..  gaiaFre
9c0e0 65 47 65 6f 6d 43 6f 6c 6c 20 28 70 2d 3e 67 65  eGeomColl (p->ge
9c0f0 6f 6d 29 3b 0a 09 20 20 66 72 65 65 20 28 70 29  om);..  free (p)
9c100 3b 0a 09 20 20 70 20 3d 20 70 6e 3b 0a 20 20 20  ;..  p = pn;.   
9c110 20 20 20 7d 0a 20 20 20 20 66 72 65 65 20 28 63     }.    free (c
9c120 68 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  hain);.}..static
9c130 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e 69 6f 6e   void.fnct_Union
9c140 5f 66 69 6e 61 6c 20 28 73 71 6c 69 74 65 33 5f  _final (sqlite3_
9c150 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
9c160 74 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  t).{./* SQL func
9c170 74 69 6f 6e 3a 0a 2f 20 55 6e 69 6f 6e 28 42 4c  tion:./ Union(BL
9c180 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 29 0a  OBencoded geom).
9c190 2f 0a 2f 20 61 67 67 72 65 67 61 74 65 20 66 75  /./ aggregate fu
9c1a0 6e 63 74 69 6f 6e 20 2d 20 46 49 4e 41 4c 0a 2f  nction - FINAL./
9c1b0 0a 2a 2f 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  .*/.    gaiaGeom
9c1c0 43 6f 6c 6c 50 74 72 20 74 6d 70 3b 0a 20 20 20  CollPtr tmp;.   
9c1d0 20 73 74 72 75 63 74 20 67 61 69 61 5f 67 65 6f   struct gaia_geo
9c1e0 6d 5f 63 68 61 69 6e 20 2a 63 68 61 69 6e 3b 0a  m_chain *chain;.
9c1f0 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f      struct gaia_
9c200 67 65 6f 6d 5f 63 68 61 69 6e 5f 69 74 65 6d 20  geom_chain_item 
9c210 2a 69 74 65 6d 3b 0a 20 20 20 20 67 61 69 61 47  *item;.    gaiaG
9c220 65 6f 6d 43 6f 6c 6c 50 74 72 20 61 67 67 72 65  eomCollPtr aggre
9c230 67 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  gate = NULL;.   
9c240 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
9c250 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 76 6f 69   result;.    voi
9c260 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65  d *data = sqlite
9c270 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
9c280 74 65 78 74 29 3b 0a 20 20 20 20 73 74 72 75 63  text);.    struc
9c290 74 20 67 61 69 61 5f 67 65 6f 6d 5f 63 68 61 69  t gaia_geom_chai
9c2a0 6e 20 2a 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  n **p = sqlite3_
9c2b0 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
9c2c0 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
9c2d0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
9c2e0 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  e = 0;.    int t
9c2f0 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  iny_point = 0;. 
9c300 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
9c310 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
9c320 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
9c330 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
9c340 65 78 74 29 3b 0a 20 20 20 20 69 66 20 28 63 61  ext);.    if (ca
9c350 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
9c360 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64     {..  gpkg_mod
9c370 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
9c380 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
9c390 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
9c3a0 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
9c3b0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21       }.    if (!
9c3c0 70 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  p).      {..  sq
9c3d0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
9c3e0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
9c3f0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
9c400 20 20 20 20 63 68 61 69 6e 20 3d 20 2a 70 3b 0a      chain = *p;.
9c410 0a 2f 2a 20 61 70 70 6c 79 69 6e 67 20 55 6e 61  ./* applying Una
9c420 72 79 55 6e 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ryUnion */.    i
9c430 74 65 6d 20 3d 20 63 68 61 69 6e 2d 3e 66 69 72  tem = chain->fir
9c440 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 69  st;.    while (i
9c450 74 65 6d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  tem).      {..  
9c460 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
9c470 67 65 6f 6d 20 3d 20 69 74 65 6d 2d 3e 67 65 6f  geom = item->geo
9c480 6d 3b 0a 09 20 20 69 66 20 28 69 74 65 6d 20 3d  m;..  if (item =
9c490 3d 20 63 68 61 69 6e 2d 3e 66 69 72 73 74 29 0a  = chain->first).
9c4a0 09 20 20 20 20 7b 0a 09 09 2f 2a 20 69 6e 69 74  .    {.../* init
9c4b0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 61 67 67  ializing the agg
9c4c0 72 65 67 61 74 65 20 67 65 6f 6d 65 74 72 79 20  regate geometry 
9c4d0 2a 2f 0a 09 09 61 67 67 72 65 67 61 74 65 20 3d  */...aggregate =
9c4e0 20 67 65 6f 6d 3b 0a 09 09 69 74 65 6d 2d 3e 67   geom;...item->g
9c4f0 65 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 74  eom = NULL;...it
9c500 65 6d 20 3d 20 69 74 65 6d 2d 3e 6e 65 78 74 3b  em = item->next;
9c510 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20  ...continue;..  
9c520 20 20 7d 0a 09 20 20 69 66 20 28 64 61 74 61 20    }..  if (data 
9c530 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20  != NULL)..      
9c540 74 6d 70 20 3d 20 67 61 69 61 4d 65 72 67 65 47  tmp = gaiaMergeG
9c550 65 6f 6d 65 74 72 69 65 73 5f 72 20 28 64 61 74  eometries_r (dat
9c560 61 2c 20 61 67 67 72 65 67 61 74 65 2c 20 67 65  a, aggregate, ge
9c570 6f 6d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  om);..  else..  
9c580 20 20 20 20 74 6d 70 20 3d 20 67 61 69 61 4d 65      tmp = gaiaMe
9c590 72 67 65 47 65 6f 6d 65 74 72 69 65 73 20 28 61  rgeGeometries (a
9c5a0 67 67 72 65 67 61 74 65 2c 20 67 65 6f 6d 29 3b  ggregate, geom);
9c5b0 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d  ..  gaiaFreeGeom
9c5c0 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20  Coll (geom);..  
9c5d0 69 74 65 6d 2d 3e 67 65 6f 6d 20 3d 20 4e 55 4c  item->geom = NUL
9c5e0 4c 3b 0a 09 20 20 61 67 67 72 65 67 61 74 65 20  L;..  aggregate 
9c5f0 3d 20 74 6d 70 3b 0a 09 20 20 69 74 65 6d 20 3d  = tmp;..  item =
9c600 20 69 74 65 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20   item->next;.   
9c610 20 20 20 7d 0a 20 20 20 20 69 66 20 28 64 61 74     }.    if (dat
9c620 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 72 65 73 75  a != NULL)..resu
9c630 6c 74 20 3d 20 67 61 69 61 55 6e 61 72 79 55 6e  lt = gaiaUnaryUn
9c640 69 6f 6e 5f 72 20 28 64 61 74 61 2c 20 61 67 67  ion_r (data, agg
9c650 72 65 67 61 74 65 29 3b 0a 20 20 20 20 65 6c 73  regate);.    els
9c660 65 0a 09 72 65 73 75 6c 74 20 3d 20 67 61 69 61  e..result = gaia
9c670 55 6e 61 72 79 55 6e 69 6f 6e 20 28 61 67 67 72  UnaryUnion (aggr
9c680 65 67 61 74 65 29 3b 0a 20 20 20 20 67 61 69 61  egate);.    gaia
9c690 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 61 67  FreeGeomColl (ag
9c6a0 67 72 65 67 61 74 65 29 3b 0a 20 20 20 20 67 61  gregate);.    ga
9c6b0 69 61 5f 66 72 65 65 5f 67 65 6f 6d 5f 63 68 61  ia_free_geom_cha
9c6c0 69 6e 20 28 63 68 61 69 6e 29 3b 0a 0a 20 20 20  in (chain);..   
9c6d0 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e   if (result == N
9c6e0 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  ULL)..sqlite3_re
9c6f0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
9c700 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  xt);.    else if
9c710 20 28 67 61 69 61 49 73 45 6d 70 74 79 20 28 72   (gaiaIsEmpty (r
9c720 65 73 75 6c 74 29 29 0a 09 73 71 6c 69 74 65 33  esult))..sqlite3
9c730 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
9c740 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
9c750 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 62  .      {..  /* b
9c760 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67  uilds the BLOB g
9c770 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65  eometry to be re
9c780 74 75 72 6e 65 64 20 2a 2f 0a 09 20 20 69 6e 74  turned */..  int
9c790 20 6c 65 6e 3b 0a 09 20 20 75 6e 73 69 67 6e 65   len;..  unsigne
9c7a0 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
9c7b0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 67 61 69 61   = NULL;..  gaia
9c7c0 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
9c7d0 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20  WkbEx2 (result, 
9c7e0 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
9c7f0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
9c800 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74        tiny_point
9c810 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
9c820 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
9c830 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
9c840 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20  n, free);.      
9c850 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
9c860 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b  omColl (result);
9c870 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
9c880 66 6e 63 74 5f 55 6e 69 6f 6e 20 28 73 71 6c 69  fnct_Union (sqli
9c890 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
9c8a0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
9c8b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9c8c0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
9c8d0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 69   function:./ Uni
9c8e0 6f 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  on(BLOBencoded g
9c8f0 65 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65  eom1, BLOBencode
9c900 64 20 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74  d geom2)././ ret
9c910 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65  urns a new geome
9c920 74 72 79 20 72 65 70 72 65 73 65 6e 74 69 6e 67  try representing
9c930 20 74 68 65 20 55 4e 49 4f 4e 20 6f 66 20 62 6f   the UNION of bo
9c940 74 68 20 67 65 6f 6d 65 74 72 69 65 73 0a 2f 20  th geometries./ 
9c950 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
9c960 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
9c970 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
9c980 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
9c990 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
9c9a0 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  s;.    gaiaGeomC
9c9b0 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55  ollPtr geo1 = NU
9c9c0 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
9c9d0 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e  CollPtr geo2 = N
9c9e0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
9c9f0 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b  mCollPtr result;
9ca00 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
9ca10 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
9ca20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
9ca30 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
9ca40 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
9ca50 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
9ca60 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
9ca70 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
9ca80 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
9ca90 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
9caa0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
9cab0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
9cac0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
9cad0 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
9cae0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
9caf0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
9cb00 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
9cb10 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
9cb20 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
9cb30 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
9cb40 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
9cb50 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
9cb60 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
9cb70 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
9cb80 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
9cb90 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
9cba0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9cbb0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
9cbc0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
9cbd0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
9cbe0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
9cbf0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
9cc00 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
9cc10 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
9cc20 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
9cc30 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
9cc40 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
9cc50 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9cc60 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
9cc70 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
9cc80 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
9cc90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
9cca0 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
9ccb0 20 20 20 67 65 6f 31 20 3d 0a 09 67 61 69 61 46     geo1 =..gaiaF
9ccc0 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
9ccd0 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
9cce0 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
9ccf0 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
9cd00 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
9cd10 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
9cd20 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
9cd30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
9cd40 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
9cd50 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
9cd60 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
9cd70 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[1]);.    geo
9cd80 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  2 =..gaiaFromSpa
9cd90 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
9cda0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
9cdb0 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
9cdc0 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
9cdd0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
9cde0 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32 29  (!geo1 || !geo2)
9cdf0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
9ce00 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
9ce10 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
9ce20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20  {..  void *data 
9ce30 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
9ce40 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ata (context);..
9ce50 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55    if (data != NU
9ce60 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c  LL)..      resul
9ce70 74 20 3d 20 67 61 69 61 47 65 6f 6d 65 74 72 79  t = gaiaGeometry
9ce80 55 6e 69 6f 6e 5f 72 20 28 64 61 74 61 2c 20 67  Union_r (data, g
9ce90 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 65  eo1, geo2);..  e
9cea0 6c 73 65 0a 09 20 20 20 20 20 20 72 65 73 75 6c  lse..      resul
9ceb0 74 20 3d 20 67 61 69 61 47 65 6f 6d 65 74 72 79  t = gaiaGeometry
9cec0 55 6e 69 6f 6e 20 28 67 65 6f 31 2c 20 67 65 6f  Union (geo1, geo
9ced0 32 29 3b 0a 09 20 20 69 66 20 28 21 72 65 73 75  2);..  if (!resu
9cee0 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lt)..      sqlit
9cef0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
9cf00 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
9cf10 65 20 69 66 20 28 67 61 69 61 49 73 45 6d 70 74  e if (gaiaIsEmpt
9cf20 79 20 28 72 65 73 75 6c 74 29 29 0a 09 20 20 20  y (result))..   
9cf30 20 7b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f   {...gaiaFreeGeo
9cf40 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a  mColl (result);.
9cf50 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
9cf60 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
9cf70 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
9cf80 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c  .    {.../* buil
9cf90 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d  ds the BLOB geom
9cfa0 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72  etry to be retur
9cfb0 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e  ned */...int len
9cfc0 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ;...unsigned cha
9cfd0 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
9cfe0 4c 4c 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74  LL;...gaiaToSpat
9cff0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32  iaLiteBlobWkbEx2
9d000 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73   (result, &p_res
9d010 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09  ult, &len,......
9d020 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74      gpkg_mode, t
9d030 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71  iny_point);...sq
9d040 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9d050 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
9d060 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
9d070 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d  ;...gaiaFreeGeom
9d080 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09  Coll (result);..
9d090 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9d0a0 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
9d0b0 6c 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20 67  ll (geo1);.    g
9d0c0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
9d0d0 28 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  (geo2);.}..stati
9d0e0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 44 69 66 66  c void.fnct_Diff
9d0f0 65 72 65 6e 63 65 20 28 73 71 6c 69 74 65 33 5f  erence (sqlite3_
9d100 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
9d110 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
9d120 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
9d130 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
9d140 63 74 69 6f 6e 3a 0a 2f 20 44 69 66 66 65 72 65  ction:./ Differe
9d150 6e 63 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  nce(BLOBencoded 
9d160 67 65 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64  geom1, BLOBencod
9d170 65 64 20 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65  ed geom2)././ re
9d180 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d  turns a new geom
9d190 65 74 72 79 20 72 65 70 72 65 73 65 6e 74 69 6e  etry representin
9d1a0 67 20 74 68 65 20 44 49 46 46 45 52 45 4e 43 45  g the DIFFERENCE
9d1b0 20 6f 66 20 62 6f 74 68 20 67 65 6f 6d 65 74 72   of both geometr
9d1c0 69 65 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ies./ or NULL if
9d1d0 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
9d1e0 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
9d1f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9d200 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
9d210 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
9d220 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
9d230 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  1 = NULL;.    ga
9d240 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
9d250 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  o2 = NULL;.    g
9d260 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72  aiaGeomCollPtr r
9d270 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 67  esult;.    int g
9d280 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
9d290 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
9d2a0 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
9d2b0 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
9d2c0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
9d2d0 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
9d2e0 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
9d2f0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
9d300 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
9d310 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
9d320 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
9d330 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
9d340 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
9d350 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
9d360 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
9d370 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
9d380 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
9d390 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
9d3a0 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
9d3b0 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
9d3c0 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
9d3d0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
9d3e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
9d3f0 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
9d400 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
9d410 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
9d420 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
9d430 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
9d440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
9d450 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
9d460 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
9d470 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
9d480 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
9d490 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
9d4a0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
9d4b0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
9d4c0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
9d4d0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
9d4e0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
9d4f0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
9d500 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
9d510 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
9d520 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d 0a  0]);.    geo1 =.
9d530 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
9d540 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
9d550 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
9d560 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
9d570 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
9d580 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c 6f 62 20  us);.    p_blob 
9d590 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9d5a0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
9d5b0 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29  e_blob (argv[1])
9d5c0 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
9d5d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
9d5e0 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  tes (argv[1]);. 
9d5f0 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69 61 46     geo2 =..gaiaF
9d600 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
9d610 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
9d620 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
9d630 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
9d640 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
9d650 20 20 20 69 66 20 28 21 67 65 6f 31 20 7c 7c 20     if (!geo1 || 
9d660 21 67 65 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f  !geo2)..sqlite3_
9d670 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
9d680 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
9d690 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64 20        {..  void 
9d6a0 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  *data = sqlite3_
9d6b0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
9d6c0 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74 61  xt);..  if (data
9d6d0 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   != NULL)..     
9d6e0 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 47 65   result = gaiaGe
9d6f0 6f 6d 65 74 72 79 44 69 66 66 65 72 65 6e 63 65  ometryDifference
9d700 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 31 2c 20  _r (data, geo1, 
9d710 67 65 6f 32 29 3b 0a 09 20 20 65 6c 73 65 0a 09  geo2);..  else..
9d720 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67        result = g
9d730 61 69 61 47 65 6f 6d 65 74 72 79 44 69 66 66 65  aiaGeometryDiffe
9d740 72 65 6e 63 65 20 28 67 65 6f 31 2c 20 67 65 6f  rence (geo1, geo
9d750 32 29 3b 0a 09 20 20 69 66 20 28 21 72 65 73 75  2);..  if (!resu
9d760 6c 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  lt)..      sqlit
9d770 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
9d780 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
9d790 65 20 69 66 20 28 67 61 69 61 49 73 45 6d 70 74  e if (gaiaIsEmpt
9d7a0 79 20 28 72 65 73 75 6c 74 29 29 0a 09 20 20 20  y (result))..   
9d7b0 20 7b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f   {...gaiaFreeGeo
9d7c0 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a  mColl (result);.
9d7d0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
9d7e0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
9d7f0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
9d800 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c  .    {.../* buil
9d810 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d  ds the BLOB geom
9d820 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72  etry to be retur
9d830 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e  ned */...int len
9d840 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ;...unsigned cha
9d850 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
9d860 4c 4c 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74  LL;...gaiaToSpat
9d870 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32  iaLiteBlobWkbEx2
9d880 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73   (result, &p_res
9d890 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09  ult, &len,......
9d8a0 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74      gpkg_mode, t
9d8b0 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71  iny_point);...sq
9d8c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9d8d0 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
9d8e0 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
9d8f0 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d  ;...gaiaFreeGeom
9d900 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09  Coll (result);..
9d910 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9d920 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
9d930 6c 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20 67  ll (geo1);.    g
9d940 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
9d950 28 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  (geo2);.}..stati
9d960 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 79 6d 44  c void.fnct_SymD
9d970 69 66 66 65 72 65 6e 63 65 20 28 73 71 6c 69 74  ifference (sqlit
9d980 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
9d990 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
9d9a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
9d9b0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
9d9c0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 79 6d 44  function:./ SymD
9d9d0 69 66 66 65 72 65 6e 63 65 28 42 4c 4f 42 65 6e  ifference(BLOBen
9d9e0 63 6f 64 65 64 20 67 65 6f 6d 31 2c 20 42 4c 4f  coded geom1, BLO
9d9f0 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 32 29 0a  Bencoded geom2).
9da00 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65  /./ returns a ne
9da10 77 20 67 65 6f 6d 65 74 72 79 20 72 65 70 72 65  w geometry repre
9da20 73 65 6e 74 69 6e 67 20 74 68 65 20 53 59 4d 4d  senting the SYMM
9da30 45 54 52 49 43 20 44 49 46 46 45 52 45 4e 43 45  ETRIC DIFFERENCE
9da40 20 6f 66 20 62 6f 74 68 20 67 65 6f 6d 65 74 72   of both geometr
9da50 69 65 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  ies./ or NULL if
9da60 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
9da70 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
9da80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9da90 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
9daa0 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
9dab0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
9dac0 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  1 = NULL;.    ga
9dad0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
9dae0 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  o2 = NULL;.    g
9daf0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72  aiaGeomCollPtr r
9db00 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 67  esult;.    int g
9db10 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
9db20 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
9db30 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
9db40 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
9db50 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
9db60 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
9db70 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
9db80 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
9db90 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
9dba0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
9dbb0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
9dbc0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
9dbd0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
9dbe0 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
9dbf0 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
9dc00 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
9dc10 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
9dc20 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
9dc30 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
9dc40 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
9dc50 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
9dc60 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
9dc70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
9dc80 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
9dc90 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
9dca0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
9dcb0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
9dcc0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
9dcd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
9dce0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
9dcf0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
9dd00 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
9dd10 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
9dd20 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
9dd30 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
9dd40 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
9dd50 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
9dd60 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
9dd70 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
9dd80 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
9dd90 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
9dda0 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
9ddb0 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d 0a  0]);.    geo1 =.
9ddc0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
9ddd0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
9dde0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
9ddf0 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
9de00 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
9de10 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c 6f 62 20  us);.    p_blob 
9de20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9de30 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
9de40 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29  e_blob (argv[1])
9de50 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
9de60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
9de70 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  tes (argv[1]);. 
9de80 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69 61 46     geo2 =..gaiaF
9de90 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
9dea0 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
9deb0 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
9dec0 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
9ded0 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
9dee0 20 20 20 69 66 20 28 21 67 65 6f 31 20 7c 7c 20     if (!geo1 || 
9def0 21 67 65 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f  !geo2)..sqlite3_
9df00 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
9df10 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
9df20 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64 20        {..  void 
9df30 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  *data = sqlite3_
9df40 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
9df50 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74 61  xt);..  if (data
9df60 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   != NULL)..     
9df70 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 47 65   result = gaiaGe
9df80 6f 6d 65 74 72 79 53 79 6d 44 69 66 66 65 72 65  ometrySymDiffere
9df90 6e 63 65 5f 72 20 28 64 61 74 61 2c 20 67 65 6f  nce_r (data, geo
9dfa0 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 65 6c 73  1, geo2);..  els
9dfb0 65 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20  e..      result 
9dfc0 3d 20 67 61 69 61 47 65 6f 6d 65 74 72 79 53 79  = gaiaGeometrySy
9dfd0 6d 44 69 66 66 65 72 65 6e 63 65 20 28 67 65 6f  mDifference (geo
9dfe0 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 69 66 20  1, geo2);..  if 
9dff0 28 21 72 65 73 75 6c 74 29 0a 09 20 20 20 20 20  (!result)..     
9e000 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9e010 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
9e020 09 20 20 65 6c 73 65 20 69 66 20 28 67 61 69 61  .  else if (gaia
9e030 49 73 45 6d 70 74 79 20 28 72 65 73 75 6c 74 29  IsEmpty (result)
9e040 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 46  )..    {...gaiaF
9e050 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
9e060 75 6c 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  ult);...sqlite3_
9e070 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
9e080 74 65 78 74 29 3b 0a 09 20 20 20 20 7d 0a 09 20  text);..    }.. 
9e090 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f   else..    {.../
9e0a0 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c 4f  * builds the BLO
9e0b0 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62 65  B geometry to be
9e0c0 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09 69   returned */...i
9e0d0 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67 6e  nt len;...unsign
9e0e0 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c  ed char *p_resul
9e0f0 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 67 61 69 61  t = NULL;...gaia
9e100 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
9e110 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20  WkbEx2 (result, 
9e120 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
9e130 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d  ......    gpkg_m
9e140 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29  ode, tiny_point)
9e150 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
9e160 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
9e170 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c  , p_result, len,
9e180 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72   free);...gaiaFr
9e190 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75  eeGeomColl (resu
9e1a0 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  lt);..    }.    
9e1b0 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
9e1c0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b  GeomColl (geo1);
9e1d0 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
9e1e0 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a  mColl (geo2);.}.
9e1f0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
9e200 74 5f 45 71 75 61 6c 73 20 28 73 71 6c 69 74 65  t_Equals (sqlite
9e210 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
9e220 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
9e230 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
9e240 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
9e250 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45 71 75 61 6c  unction:./ Equal
9e260 73 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  s(BLOBencoded ge
9e270 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64  om1, BLOBencoded
9e280 20 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75   geom2)././ retu
9e290 72 6e 73 3a 0a 2f 20 31 20 69 66 20 74 68 65 20  rns:./ 1 if the 
9e2a0 74 77 6f 20 67 65 6f 6d 65 74 72 69 65 73 20 61  two geometries a
9e2b0 72 65 20 22 73 70 61 74 69 61 6c 6c 79 20 65 71  re "spatially eq
9e2c0 75 61 6c 22 0a 2f 20 30 20 6f 74 68 65 72 77 69  ual"./ 0 otherwi
9e2d0 73 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e  se./ or -1 if an
9e2e0 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
9e2f0 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
9e300 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
9e310 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
9e320 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65  ytes;.    gaiaGe
9e330 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d  omCollPtr geo1 =
9e340 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
9e350 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20  eomCollPtr geo2 
9e360 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
9e370 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ret;.    int gpk
9e380 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
9e390 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
9e3a0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  ode = 0;.    str
9e3b0 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
9e3c0 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
9e3d0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
9e3e0 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
9e3f0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
9e400 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
9e410 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
9e420 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
9e430 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
9e440 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
9e450 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
9e460 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
9e470 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
9e480 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20  >gpkg_mode;.    
9e490 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
9e4a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
9e4b0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
9e4c0 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
9e4d0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
9e4e0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
9e4f0 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
9e500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
9e510 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
9e520 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
9e530 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
9e540 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
9e550 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
9e560 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
9e570 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
9e580 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
9e590 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
9e5a0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
9e5b0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
9e5c0 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
9e5d0 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
9e5e0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31  gv[0]);.    geo1
9e5f0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
9e600 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
9e610 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
9e620 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
9e630 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
9e640 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c  bious);.    p_bl
9e650 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
9e660 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
9e670 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
9e680 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  1]);.    n_bytes
9e690 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9e6a0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
9e6b0 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61  ;.    geo2 =..ga
9e6c0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
9e6d0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
9e6e0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
9e6f0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
9e700 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
9e710 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 31 20  ;.    if (!geo1 
9e720 7c 7c 20 21 67 65 6f 32 29 0a 09 73 71 6c 69 74  || !geo2)..sqlit
9e730 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
9e740 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20  ontext, -1);.   
9e750 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
9e760 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71   void *data = sq
9e770 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
9e780 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69 66  (context);..  if
9e790 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a   (data != NULL).
9e7a0 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61 69  .      ret = gai
9e7b0 61 47 65 6f 6d 43 6f 6c 6c 45 71 75 61 6c 73 5f  aGeomCollEquals_
9e7c0 72 20 28 64 61 74 61 2c 20 67 65 6f 31 2c 20 67  r (data, geo1, g
9e7d0 65 6f 32 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  eo2);..  else.. 
9e7e0 20 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 47       ret = gaiaG
9e7f0 65 6f 6d 43 6f 6c 6c 45 71 75 61 6c 73 20 28 67  eomCollEquals (g
9e800 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 73  eo1, geo2);..  s
9e810 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
9e820 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
9e830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
9e840 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
9e850 67 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46  geo1);.    gaiaF
9e860 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
9e870 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
9e880 69 64 0a 66 6e 63 74 5f 49 6e 74 65 72 73 65 63  id.fnct_Intersec
9e890 74 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ts (sqlite3_cont
9e8a0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
9e8b0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
9e8c0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
9e8d0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
9e8e0 6e 3a 0a 2f 20 49 6e 74 65 72 73 65 63 74 73 28  n:./ Intersects(
9e8f0 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
9e900 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  1, BLOBencoded g
9e910 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  eom2)././ return
9e920 73 3a 0a 2f 20 31 20 69 66 20 74 68 65 20 74 77  s:./ 1 if the tw
9e930 6f 20 67 65 6f 6d 65 74 72 69 65 73 20 64 6f 20  o geometries do 
9e940 22 73 70 61 74 69 61 6c 6c 79 20 69 6e 74 65 72  "spatially inter
9e950 73 65 63 74 73 22 0a 2f 20 30 20 6f 74 68 65 72  sects"./ 0 other
9e960 77 69 73 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20  wise./ or -1 if 
9e970 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
9e980 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
9e990 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
9e9a0 6c 6f 62 31 3b 0a 20 20 20 20 75 6e 73 69 67 6e  lob1;.    unsign
9e9b0 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 32 3b 0a  ed char *blob2;.
9e9c0 20 20 20 20 69 6e 74 20 62 79 74 65 73 31 3b 0a      int bytes1;.
9e9d0 20 20 20 20 69 6e 74 20 62 79 74 65 73 32 3b 0a      int bytes2;.
9e9e0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
9e9f0 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b  Ptr geo1 = NULL;
9ea00 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
9ea10 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55 4c 4c  lPtr geo2 = NULL
9ea20 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  ;.    int ret;. 
9ea30 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
9ea40 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
9ea50 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
9ea60 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
9ea70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
9ea80 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
9ea90 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
9eaa0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
9eab0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
9eac0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
9ead0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
9eae0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
9eaf0 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
9eb00 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
9eb10 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
9eb20 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
9eb30 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
9eb40 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
9eb50 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
9eb60 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
9eb70 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
9eb80 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
9eb90 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
9eba0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
9ebb0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
9ebc0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
9ebd0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
9ebe0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
9ebf0 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
9ec00 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
9ec10 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
9ec20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  -1);..  return;.
9ec30 20 20 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62        }.    blob
9ec40 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
9ec50 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
9ec60 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
9ec70 5d 29 3b 0a 20 20 20 20 62 79 74 65 73 31 20 3d  ]);.    bytes1 =
9ec80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
9ec90 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
9eca0 20 20 20 20 67 65 6f 31 20 3d 0a 09 67 61 69 61      geo1 =..gaia
9ecb0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
9ecc0 6f 62 57 6b 62 45 78 20 28 62 6c 6f 62 31 2c 20  obWkbEx (blob1, 
9ecd0 62 79 74 65 73 31 2c 20 67 70 6b 67 5f 6d 6f 64  bytes1, gpkg_mod
9ece0 65 2c 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e, gpkg_amphibio
9ecf0 75 73 29 3b 0a 20 20 20 20 62 6c 6f 62 32 20 3d  us);.    blob2 =
9ed00 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
9ed10 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
9ed20 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b  _blob (argv[1]);
9ed30 0a 20 20 20 20 62 79 74 65 73 32 20 3d 20 73 71  .    bytes2 = sq
9ed40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
9ed50 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  s (argv[1]);.   
9ed60 20 67 65 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f   geo2 =..gaiaFro
9ed70 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
9ed80 6b 62 45 78 20 28 62 6c 6f 62 32 2c 20 62 79 74  kbEx (blob2, byt
9ed90 65 73 32 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20  es2, gpkg_mode, 
9eda0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
9edb0 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 31 20  ;.    if (!geo1 
9edc0 7c 7c 20 21 67 65 6f 32 29 0a 09 73 71 6c 69 74  || !geo2)..sqlit
9edd0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
9ede0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20  ontext, -1);.   
9edf0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
9ee00 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71   void *data = sq
9ee10 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
9ee20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69 66  (context);..  if
9ee30 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a   (data != NULL).
9ee40 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61 69  .      ret = gai
9ee50 61 47 65 6f 6d 43 6f 6c 6c 50 72 65 70 61 72 65  aGeomCollPrepare
9ee60 64 49 6e 74 65 72 73 65 63 74 73 20 28 64 61 74  dIntersects (dat
9ee70 61 2c 0a 09 09 09 09 09 09 20 20 20 20 67 65 6f  a,.......    geo
9ee80 31 2c 20 62 6c 6f 62 31 2c 20 62 79 74 65 73 31  1, blob1, bytes1
9ee90 2c 20 67 65 6f 32 2c 0a 09 09 09 09 09 09 20 20  , geo2,.......  
9eea0 20 20 62 6c 6f 62 32 2c 20 62 79 74 65 73 32 29    blob2, bytes2)
9eeb0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
9eec0 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43   ret = gaiaGeomC
9eed0 6f 6c 6c 49 6e 74 65 72 73 65 63 74 73 20 28 67  ollIntersects (g
9eee0 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 73  eo1, geo2);..  s
9eef0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
9ef00 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
9ef10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
9ef20 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
9ef30 67 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46  geo1);.    gaiaF
9ef40 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
9ef50 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
9ef60 69 64 0a 66 6e 63 74 5f 44 69 73 6a 6f 69 6e 74  id.fnct_Disjoint
9ef70 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
9ef80 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
9ef90 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
9efa0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
9efb0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
9efc0 0a 2f 20 44 69 73 6a 6f 69 6e 74 28 42 4c 4f 42  ./ Disjoint(BLOB
9efd0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31 2c 20 42  encoded geom1, B
9efe0 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 32  LOBencoded geom2
9eff0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f  )././ returns:./
9f000 20 31 20 69 66 20 74 68 65 20 74 77 6f 20 67 65   1 if the two ge
9f010 6f 6d 65 74 72 69 65 73 20 61 72 65 20 22 73 70  ometries are "sp
9f020 61 74 69 61 6c 6c 79 20 64 69 73 6a 6f 69 6e 74  atially disjoint
9f030 22 0a 2f 20 30 20 6f 74 68 65 72 77 69 73 65 0a  "./ 0 otherwise.
9f040 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79 20 65  / or -1 if any e
9f050 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
9f060 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
9f070 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 31 3b  ned char *blob1;
9f080 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
9f090 61 72 20 2a 62 6c 6f 62 32 3b 0a 20 20 20 20 69  ar *blob2;.    i
9f0a0 6e 74 20 62 79 74 65 73 31 3b 0a 20 20 20 20 69  nt bytes1;.    i
9f0b0 6e 74 20 62 79 74 65 73 32 3b 0a 20 20 20 20 67  nt bytes2;.    g
9f0c0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
9f0d0 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  eo1 = NULL;.    
9f0e0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
9f0f0 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  geo2 = NULL;.   
9f100 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e   int ret;.    in
9f110 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
9f120 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
9f130 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
9f140 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
9f150 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
9f160 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
9f170 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
9f180 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
9f190 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
9f1a0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
9f1b0 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20     if (cache != 
9f1c0 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
9f1d0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
9f1e0 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61   = cache->gpkg_a
9f1f0 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a  mphibious_mode;.
9f200 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63  .  gpkg_mode = c
9f210 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b  ache->gpkg_mode;
9f220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
9f230 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
9f240 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
9f250 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
9f260 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
9f270 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
9f280 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
9f290 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
9f2a0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
9f2b0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
9f2c0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
9f2d0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
9f2e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
9f2f0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
9f300 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
9f310 20 7d 0a 20 20 20 20 62 6c 6f 62 31 20 3d 20 28   }.    blob1 = (
9f320 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
9f330 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
9f340 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
9f350 20 20 20 62 79 74 65 73 31 20 3d 20 73 71 6c 69     bytes1 = sqli
9f360 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
9f370 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
9f380 65 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  eo1 =..gaiaFromS
9f390 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
9f3a0 45 78 20 28 62 6c 6f 62 31 2c 20 62 79 74 65 73  Ex (blob1, bytes
9f3b0 31 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 67 70  1, gpkg_mode, gp
9f3c0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
9f3d0 20 20 20 20 62 6c 6f 62 32 20 3d 20 28 75 6e 73      blob2 = (uns
9f3e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
9f3f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
9f400 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
9f410 62 79 74 65 73 32 20 3d 20 73 71 6c 69 74 65 33  bytes2 = sqlite3
9f420 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
9f430 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f 32  gv[1]);.    geo2
9f440 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
9f450 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
9f460 28 62 6c 6f 62 32 2c 20 62 79 74 65 73 32 2c 20  (blob2, bytes2, 
9f470 67 70 6b 67 5f 6d 6f 64 65 2c 20 67 70 6b 67 5f  gpkg_mode, gpkg_
9f480 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
9f490 20 69 66 20 28 21 67 65 6f 31 20 7c 7c 20 21 67   if (!geo1 || !g
9f4a0 65 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  eo2)..sqlite3_re
9f4b0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
9f4c0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c 73 65  t, -1);.    else
9f4d0 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64  .      {..  void
9f4e0 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
9f4f0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
9f500 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74  ext);..  if (dat
9f510 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
9f520 20 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d    ret = gaiaGeom
9f530 43 6f 6c 6c 50 72 65 70 61 72 65 64 44 69 73 6a  CollPreparedDisj
9f540 6f 69 6e 74 20 28 64 61 74 61 2c 0a 09 09 09 09  oint (data,.....
9f550 09 09 20 20 67 65 6f 31 2c 20 62 6c 6f 62 31 2c  ..  geo1, blob1,
9f560 20 62 79 74 65 73 31 2c 20 67 65 6f 32 2c 0a 09   bytes1, geo2,..
9f570 09 09 09 09 09 20 20 62 6c 6f 62 32 2c 20 62 79  .....  blob2, by
9f580 74 65 73 32 29 3b 0a 09 20 20 65 6c 73 65 0a 09  tes2);..  else..
9f590 20 20 20 20 20 20 72 65 74 20 3d 20 67 61 69 61        ret = gaia
9f5a0 47 65 6f 6d 43 6f 6c 6c 44 69 73 6a 6f 69 6e 74  GeomCollDisjoint
9f5b0 20 28 67 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09   (geo1, geo2);..
9f5c0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9f5d0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
9f5e0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
9f5f0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
9f600 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20 67 61  l (geo1);.    ga
9f610 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
9f620 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  geo2);.}..static
9f630 20 76 6f 69 64 0a 66 6e 63 74 5f 4f 76 65 72 6c   void.fnct_Overl
9f640 61 70 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  aps (sqlite3_con
9f650 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
9f660 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
9f670 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
9f680 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
9f690 6f 6e 3a 0a 2f 20 4f 76 65 72 6c 61 70 73 28 42  on:./ Overlaps(B
9f6a0 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31  LOBencoded geom1
9f6b0 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  , BLOBencoded ge
9f6c0 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  om2)././ returns
9f6d0 3a 0a 2f 20 31 20 69 66 20 74 68 65 20 74 77 6f  :./ 1 if the two
9f6e0 20 67 65 6f 6d 65 74 72 69 65 73 20 64 6f 20 22   geometries do "
9f6f0 73 70 61 74 69 61 6c 6c 79 20 6f 76 65 72 6c 61  spatially overla
9f700 70 73 22 0a 2f 20 30 20 6f 74 68 65 72 77 69 73  ps"./ 0 otherwis
9f710 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79  e./ or -1 if any
9f720 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
9f730 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
9f740 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
9f750 31 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  1;.    unsigned 
9f760 63 68 61 72 20 2a 62 6c 6f 62 32 3b 0a 20 20 20  char *blob2;.   
9f770 20 69 6e 74 20 62 79 74 65 73 31 3b 0a 20 20 20   int bytes1;.   
9f780 20 69 6e 74 20 62 79 74 65 73 32 3b 0a 20 20 20   int bytes2;.   
9f790 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
9f7a0 20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo1 = NULL;.  
9f7b0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
9f7c0 72 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20  r geo2 = NULL;. 
9f7d0 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
9f7e0 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
9f7f0 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
9f800 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
9f810 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
9f820 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
9f830 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
9f840 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
9f850 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
9f860 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
9f870 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
9f880 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
9f890 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
9f8a0 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
9f8b0 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
9f8c0 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
9f8d0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
9f8e0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
9f8f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
9f900 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
9f910 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
9f920 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
9f930 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
9f940 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
9f950 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
9f960 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
9f970 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
9f980 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
9f990 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [1]) != SQLITE_B
9f9a0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
9f9b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
9f9c0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
9f9d0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
9f9e0 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 31 20 3d     }.    blob1 =
9f9f0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
9fa00 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
9fa10 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
9fa20 0a 20 20 20 20 62 79 74 65 73 31 20 3d 20 73 71  .    bytes1 = sq
9fa30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
9fa40 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
9fa50 20 67 65 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f   geo1 =..gaiaFro
9fa60 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
9fa70 6b 62 45 78 20 28 62 6c 6f 62 31 2c 20 62 79 74  kbEx (blob1, byt
9fa80 65 73 31 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20  es1, gpkg_mode, 
9fa90 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
9faa0 3b 0a 20 20 20 20 62 6c 6f 62 32 20 3d 20 28 75  ;.    blob2 = (u
9fab0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
9fac0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
9fad0 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ob (argv[1]);.  
9fae0 20 20 62 79 74 65 73 32 20 3d 20 73 71 6c 69 74    bytes2 = sqlit
9faf0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
9fb00 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65  argv[1]);.    ge
9fb10 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  o2 =..gaiaFromSp
9fb20 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
9fb30 78 20 28 62 6c 6f 62 32 2c 20 62 79 74 65 73 32  x (blob2, bytes2
9fb40 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 67 70 6b  , gpkg_mode, gpk
9fb50 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
9fb60 20 20 20 69 66 20 28 21 67 65 6f 31 20 7c 7c 20     if (!geo1 || 
9fb70 21 67 65 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f  !geo2)..sqlite3_
9fb80 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
9fb90 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c  ext, -1);.    el
9fba0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f  se.      {..  vo
9fbb0 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74  id *data = sqlit
9fbc0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
9fbd0 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64  ntext);..  if (d
9fbe0 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ata != NULL)..  
9fbf0 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 47 65      ret = gaiaGe
9fc00 6f 6d 43 6f 6c 6c 50 72 65 70 61 72 65 64 4f 76  omCollPreparedOv
9fc10 65 72 6c 61 70 73 20 28 64 61 74 61 2c 0a 09 09  erlaps (data,...
9fc20 09 09 09 09 20 20 67 65 6f 31 2c 20 62 6c 6f 62  ....  geo1, blob
9fc30 31 2c 20 62 79 74 65 73 31 2c 20 67 65 6f 32 2c  1, bytes1, geo2,
9fc40 0a 09 09 09 09 09 09 20 20 62 6c 6f 62 32 2c 20  .......  blob2, 
9fc50 62 79 74 65 73 32 29 3b 0a 09 20 20 65 6c 73 65  bytes2);..  else
9fc60 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61  ..      ret = ga
9fc70 69 61 47 65 6f 6d 43 6f 6c 6c 4f 76 65 72 6c 61  iaGeomCollOverla
9fc80 70 73 20 28 67 65 6f 31 2c 20 67 65 6f 32 29 3b  ps (geo1, geo2);
9fc90 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
9fca0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
9fcb0 20 72 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20   ret);.      }. 
9fcc0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
9fcd0 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20  oll (geo1);.    
9fce0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
9fcf0 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74   (geo2);.}..stat
9fd00 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 72 6f  ic void.fnct_Cro
9fd10 73 73 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f  sses (sqlite3_co
9fd20 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
9fd30 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
9fd40 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
9fd50 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
9fd60 69 6f 6e 3a 0a 2f 20 43 72 6f 73 73 65 73 28 42  ion:./ Crosses(B
9fd70 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31  LOBencoded geom1
9fd80 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  , BLOBencoded ge
9fd90 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  om2)././ returns
9fda0 3a 0a 2f 20 31 20 69 66 20 74 68 65 20 74 77 6f  :./ 1 if the two
9fdb0 20 67 65 6f 6d 65 74 72 69 65 73 20 64 6f 20 22   geometries do "
9fdc0 73 70 61 74 69 61 6c 6c 79 20 63 72 6f 73 73 65  spatially crosse
9fdd0 73 22 0a 2f 20 30 20 6f 74 68 65 72 77 69 73 65  s"./ 0 otherwise
9fde0 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79 20  ./ or -1 if any 
9fdf0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
9fe00 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ered.*/.    unsi
9fe10 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 31  gned char *blob1
9fe20 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
9fe30 68 61 72 20 2a 62 6c 6f 62 32 3b 0a 20 20 20 20  har *blob2;.    
9fe40 69 6e 74 20 62 79 74 65 73 31 3b 0a 20 20 20 20  int bytes1;.    
9fe50 69 6e 74 20 62 79 74 65 73 32 3b 0a 20 20 20 20  int bytes2;.    
9fe60 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
9fe70 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  geo1 = NULL;.   
9fe80 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
9fe90 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo2 = NULL;.  
9fea0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69    int ret;.    i
9feb0 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
9fec0 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
9fed0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
9fee0 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
9fef0 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
9ff00 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
9ff10 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
9ff20 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
9ff30 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
9ff40 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
9ff50 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
9ff60 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
9ff70 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
9ff80 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
9ff90 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
9ffa0 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
9ffb0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
9ffc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
9ffd0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
9ffe0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
9fff0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
a0000 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
a0010 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
a0020 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
a0030 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
a0040 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
a0050 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
a0060 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  1]) != SQLITE_BL
a0070 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
a0080 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a0090 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
a00a0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
a00b0 20 20 7d 0a 20 20 20 20 62 6c 6f 62 31 20 3d 20    }.    blob1 = 
a00c0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
a00d0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
a00e0 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
a00f0 20 20 20 20 62 79 74 65 73 31 20 3d 20 73 71 6c      bytes1 = sql
a0100 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
a0110 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
a0120 67 65 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d  geo1 =..gaiaFrom
a0130 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
a0140 62 45 78 20 28 62 6c 6f 62 31 2c 20 62 79 74 65  bEx (blob1, byte
a0150 73 31 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 67  s1, gpkg_mode, g
a0160 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
a0170 0a 20 20 20 20 62 6c 6f 62 32 20 3d 20 28 75 6e  .    blob2 = (un
a0180 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
a0190 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
a01a0 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  b (argv[1]);.   
a01b0 20 62 79 74 65 73 32 20 3d 20 73 71 6c 69 74 65   bytes2 = sqlite
a01c0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
a01d0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[1]);.    geo
a01e0 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  2 =..gaiaFromSpa
a01f0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
a0200 20 28 62 6c 6f 62 32 2c 20 62 79 74 65 73 32 2c   (blob2, bytes2,
a0210 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 67 70 6b 67   gpkg_mode, gpkg
a0220 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
a0230 20 20 69 66 20 28 21 67 65 6f 31 20 7c 7c 20 21    if (!geo1 || !
a0240 67 65 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f 72  geo2)..sqlite3_r
a0250 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
a0260 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c 73  xt, -1);.    els
a0270 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69  e.      {..  voi
a0280 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65  d *data = sqlite
a0290 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
a02a0 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61  text);..  if (da
a02b0 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  ta != NULL)..   
a02c0 20 20 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f     ret = gaiaGeo
a02d0 6d 43 6f 6c 6c 50 72 65 70 61 72 65 64 43 72 6f  mCollPreparedCro
a02e0 73 73 65 73 20 28 64 61 74 61 2c 0a 09 09 09 09  sses (data,.....
a02f0 09 09 20 67 65 6f 31 2c 20 62 6c 6f 62 31 2c 20  .. geo1, blob1, 
a0300 62 79 74 65 73 31 2c 20 67 65 6f 32 2c 0a 09 09  bytes1, geo2,...
a0310 09 09 09 09 20 62 6c 6f 62 32 2c 20 62 79 74 65  .... blob2, byte
a0320 73 32 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  s2);..  else..  
a0330 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 47 65      ret = gaiaGe
a0340 6f 6d 43 6f 6c 6c 43 72 6f 73 73 65 73 20 28 67  omCollCrosses (g
a0350 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 73  eo1, geo2);..  s
a0360 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a0370 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
a0380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  ;.      }.    ga
a0390 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
a03a0 67 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46  geo1);.    gaiaF
a03b0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
a03c0 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
a03d0 69 64 0a 66 6e 63 74 5f 54 6f 75 63 68 65 73 20  id.fnct_Touches 
a03e0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
a03f0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
a0400 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
a0410 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
a0420 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
a0430 2f 20 54 6f 75 63 68 65 73 28 42 4c 4f 42 65 6e  / Touches(BLOBen
a0440 63 6f 64 65 64 20 67 65 6f 6d 31 2c 20 42 4c 4f  coded geom1, BLO
a0450 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 32 29 0a  Bencoded geom2).
a0460 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 31  /./ returns:./ 1
a0470 20 69 66 20 74 68 65 20 74 77 6f 20 67 65 6f 6d   if the two geom
a0480 65 74 72 69 65 73 20 64 6f 20 22 73 70 61 74 69  etries do "spati
a0490 61 6c 6c 79 20 74 6f 75 63 68 65 73 22 0a 2f 20  ally touches"./ 
a04a0 30 20 6f 74 68 65 72 77 69 73 65 0a 2f 20 6f 72  0 otherwise./ or
a04b0 20 2d 31 20 69 66 20 61 6e 79 20 65 72 72 6f 72   -1 if any error
a04c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
a04d0 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
a04e0 63 68 61 72 20 2a 62 6c 6f 62 31 3b 0a 20 20 20  char *blob1;.   
a04f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a0500 62 6c 6f 62 32 3b 0a 20 20 20 20 69 6e 74 20 62  blob2;.    int b
a0510 79 74 65 73 31 3b 0a 20 20 20 20 69 6e 74 20 62  ytes1;.    int b
a0520 79 74 65 73 32 3b 0a 20 20 20 20 67 61 69 61 47  ytes2;.    gaiaG
a0530 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20  eomCollPtr geo1 
a0540 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
a0550 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32  GeomCollPtr geo2
a0560 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
a0570 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 67 70   ret;.    int gp
a0580 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
a0590 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
a05a0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74  mode = 0;.    st
a05b0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
a05c0 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
a05d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
a05e0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
a05f0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
a0600 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
a0610 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
a0620 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
a0630 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
a0640 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
a0650 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
a0660 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
a0670 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
a0680 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20  ->gpkg_mode;.   
a0690 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
a06a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
a06b0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
a06c0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
a06d0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
a06e0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
a06f0 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
a0700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
a0710 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
a0720 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
a0730 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
a0740 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
a0750 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
a0760 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
a0770 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
a0780 20 20 20 62 6c 6f 62 31 20 3d 20 28 75 6e 73 69     blob1 = (unsi
a0790 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
a07a0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
a07b0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 62  (argv[0]);.    b
a07c0 79 74 65 73 31 20 3d 20 73 71 6c 69 74 65 33 5f  ytes1 = sqlite3_
a07d0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
a07e0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20  v[0]);.    geo1 
a07f0 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
a0800 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
a0810 62 6c 6f 62 31 2c 20 62 79 74 65 73 31 2c 20 67  blob1, bytes1, g
a0820 70 6b 67 5f 6d 6f 64 65 2c 20 67 70 6b 67 5f 61  pkg_mode, gpkg_a
a0830 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
a0840 62 6c 6f 62 32 20 3d 20 28 75 6e 73 69 67 6e 65  blob2 = (unsigne
a0850 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
a0860 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
a0870 67 76 5b 31 5d 29 3b 0a 20 20 20 20 62 79 74 65  gv[1]);.    byte
a0880 73 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  s2 = sqlite3_val
a0890 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31  ue_bytes (argv[1
a08a0 5d 29 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09  ]);.    geo2 =..
a08b0 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
a08c0 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 62 6c 6f  teBlobWkbEx (blo
a08d0 62 32 2c 20 62 79 74 65 73 32 2c 20 67 70 6b 67  b2, bytes2, gpkg
a08e0 5f 6d 6f 64 65 2c 20 67 70 6b 67 5f 61 6d 70 68  _mode, gpkg_amph
a08f0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
a0900 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32 29  (!geo1 || !geo2)
a0910 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
a0920 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
a0930 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  1);.    else.   
a0940 20 20 20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61     {..  void *da
a0950 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  ta = sqlite3_use
a0960 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
a0970 3b 0a 09 20 20 69 66 20 28 64 61 74 61 20 21 3d  ;..  if (data !=
a0980 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65   NULL)..      re
a0990 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c  t = gaiaGeomColl
a09a0 50 72 65 70 61 72 65 64 54 6f 75 63 68 65 73 20  PreparedTouches 
a09b0 28 64 61 74 61 2c 0a 09 09 09 09 09 09 20 67 65  (data,....... ge
a09c0 6f 31 2c 20 62 6c 6f 62 31 2c 20 62 79 74 65 73  o1, blob1, bytes
a09d0 31 2c 20 67 65 6f 32 2c 0a 09 09 09 09 09 09 20  1, geo2,....... 
a09e0 62 6c 6f 62 32 2c 20 62 79 74 65 73 32 29 3b 0a  blob2, bytes2);.
a09f0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72  .  else..      r
a0a00 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c  et = gaiaGeomCol
a0a10 6c 54 6f 75 63 68 65 73 20 28 67 65 6f 31 2c 20  lTouches (geo1, 
a0a20 67 65 6f 32 29 3b 0a 09 20 20 73 71 6c 69 74 65  geo2);..  sqlite
a0a30 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
a0a40 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 20 20 20  ntext, ret);.   
a0a50 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
a0a60 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29  eGeomColl (geo1)
a0a70 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
a0a80 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d  omColl (geo2);.}
a0a90 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
a0aa0 63 74 5f 57 69 74 68 69 6e 20 28 73 71 6c 69 74  ct_Within (sqlit
a0ab0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
a0ac0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
a0ad0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
a0ae0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
a0af0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 57 69 74 68  function:./ With
a0b00 69 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  in(BLOBencoded g
a0b10 65 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65  eom1, BLOBencode
a0b20 64 20 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74  d geom2)././ ret
a0b30 75 72 6e 73 3a 0a 2f 20 31 20 69 66 20 47 45 4f  urns:./ 1 if GEO
a0b40 4d 2d 31 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  M-1 is completel
a0b50 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  y contained with
a0b60 69 6e 20 47 45 4f 4d 2d 32 0a 2f 20 30 20 6f 74  in GEOM-2./ 0 ot
a0b70 68 65 72 77 69 73 65 0a 2f 20 6f 72 20 2d 31 20  herwise./ or -1 
a0b80 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
a0b90 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
a0ba0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
a0bb0 20 2a 62 6c 6f 62 31 3b 0a 20 20 20 20 75 6e 73   *blob1;.    uns
a0bc0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
a0bd0 32 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65 73  2;.    int bytes
a0be0 31 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65 73  1;.    int bytes
a0bf0 32 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  2;.    gaiaGeomC
a0c00 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55  ollPtr geo1 = NU
a0c10 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
a0c20 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e  CollPtr geo2 = N
a0c30 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
a0c40 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
a0c50 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
a0c60 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
a0c70 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
a0c80 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
a0c90 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
a0ca0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
a0cb0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
a0cc0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
a0cd0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
a0ce0 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
a0cf0 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
a0d00 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
a0d10 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
a0d20 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
a0d30 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
a0d40 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
a0d50 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d  kg_mode;.      }
a0d60 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
a0d70 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
a0d80 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
a0d90 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
a0da0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a0db0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
a0dc0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
a0dd0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
a0de0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
a0df0 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
a0e00 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
a0e10 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
a0e20 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
a0e30 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
a0e40 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 62  n;.      }.    b
a0e50 6c 6f 62 31 20 3d 20 28 75 6e 73 69 67 6e 65 64  lob1 = (unsigned
a0e60 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
a0e70 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
a0e80 76 5b 30 5d 29 3b 0a 20 20 20 20 62 79 74 65 73  v[0]);.    bytes
a0e90 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
a0ea0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
a0eb0 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d 0a 09 67  );.    geo1 =..g
a0ec0 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
a0ed0 65 42 6c 6f 62 57 6b 62 45 78 20 28 62 6c 6f 62  eBlobWkbEx (blob
a0ee0 31 2c 20 62 79 74 65 73 31 2c 20 67 70 6b 67 5f  1, bytes1, gpkg_
a0ef0 6d 6f 64 65 2c 20 67 70 6b 67 5f 61 6d 70 68 69  mode, gpkg_amphi
a0f00 62 69 6f 75 73 29 3b 0a 20 20 20 20 62 6c 6f 62  bious);.    blob
a0f10 32 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  2 = (unsigned ch
a0f20 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
a0f30 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31  lue_blob (argv[1
a0f40 5d 29 3b 0a 20 20 20 20 62 79 74 65 73 32 20 3d  ]);.    bytes2 =
a0f50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
a0f60 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a  ytes (argv[1]);.
a0f70 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69 61      geo2 =..gaia
a0f80 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
a0f90 6f 62 57 6b 62 45 78 20 28 62 6c 6f 62 32 2c 20  obWkbEx (blob2, 
a0fa0 62 79 74 65 73 32 2c 20 67 70 6b 67 5f 6d 6f 64  bytes2, gpkg_mod
a0fb0 65 2c 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e, gpkg_amphibio
a0fc0 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
a0fd0 6f 31 20 7c 7c 20 21 67 65 6f 32 29 0a 09 73 71  o1 || !geo2)..sq
a0fe0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
a0ff0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
a1000 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
a1010 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  ..  void *data =
a1020 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
a1030 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ta (context);.. 
a1040 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c   if (data != NUL
a1050 4c 29 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20  L)..      ret = 
a1060 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 72 65 70  gaiaGeomCollPrep
a1070 61 72 65 64 57 69 74 68 69 6e 20 28 64 61 74 61  aredWithin (data
a1080 2c 20 67 65 6f 31 2c 0a 09 09 09 09 09 09 62 6c  , geo1,.......bl
a1090 6f 62 31 2c 20 62 79 74 65 73 31 2c 20 67 65 6f  ob1, bytes1, geo
a10a0 32 2c 20 62 6c 6f 62 32 2c 0a 09 09 09 09 09 09  2, blob2,.......
a10b0 62 79 74 65 73 32 29 3b 0a 09 20 20 65 6c 73 65  bytes2);..  else
a10c0 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61  ..      ret = ga
a10d0 69 61 47 65 6f 6d 43 6f 6c 6c 57 69 74 68 69 6e  iaGeomCollWithin
a10e0 20 28 67 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09   (geo1, geo2);..
a10f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a1100 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
a1110 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
a1120 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
a1130 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20 67 61  l (geo1);.    ga
a1140 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
a1150 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  geo2);.}..static
a1160 20 76 6f 69 64 0a 66 6e 63 74 5f 43 6f 6e 74 61   void.fnct_Conta
a1170 69 6e 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ins (sqlite3_con
a1180 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
a1190 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
a11a0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
a11b0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
a11c0 6f 6e 3a 0a 2f 20 43 6f 6e 74 61 69 6e 73 28 42  on:./ Contains(B
a11d0 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31  LOBencoded geom1
a11e0 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  , BLOBencoded ge
a11f0 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  om2)././ returns
a1200 3a 0a 2f 20 31 20 69 66 20 47 45 4f 4d 2d 31 20  :./ 1 if GEOM-1 
a1210 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 74 61  completely conta
a1220 69 6e 73 20 47 45 4f 4d 2d 32 0a 2f 20 30 20 6f  ins GEOM-2./ 0 o
a1230 74 68 65 72 77 69 73 65 0a 2f 20 6f 72 20 2d 31  therwise./ or -1
a1240 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
a1250 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
a1260 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
a1270 72 20 2a 62 6c 6f 62 31 3b 0a 20 20 20 20 75 6e  r *blob1;.    un
a1280 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f  signed char *blo
a1290 62 32 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65  b2;.    int byte
a12a0 73 31 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65  s1;.    int byte
a12b0 73 32 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  s2;.    gaiaGeom
a12c0 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e  CollPtr geo1 = N
a12d0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
a12e0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20  mCollPtr geo2 = 
a12f0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65  NULL;.    int re
a1300 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  t;.    int gpkg_
a1310 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a  amphibious = 0;.
a1320 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
a1330 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  e = 0;.    struc
a1340 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
a1350 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
a1360 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
a1370 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
a1380 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
a1390 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
a13a0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
a13b0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
a13c0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
a13d0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
a13e0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
a13f0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
a1400 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
a1410 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20  pkg_mode;.      
a1420 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
a1430 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
a1440 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
a1450 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
a1460 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a1470 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
a1480 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
a1490 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
a14a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a14b0 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
a14c0 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
a14d0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
a14e0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
a14f0 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
a1500 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
a1510 62 6c 6f 62 31 20 3d 20 28 75 6e 73 69 67 6e 65  blob1 = (unsigne
a1520 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
a1530 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
a1540 67 76 5b 30 5d 29 3b 0a 20 20 20 20 62 79 74 65  gv[0]);.    byte
a1550 73 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  s1 = sqlite3_val
a1560 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
a1570 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d 0a 09  ]);.    geo1 =..
a1580 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
a1590 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 62 6c 6f  teBlobWkbEx (blo
a15a0 62 31 2c 20 62 79 74 65 73 31 2c 20 67 70 6b 67  b1, bytes1, gpkg
a15b0 5f 6d 6f 64 65 2c 20 67 70 6b 67 5f 61 6d 70 68  _mode, gpkg_amph
a15c0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 62 6c 6f  ibious);.    blo
a15d0 62 32 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  b2 = (unsigned c
a15e0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
a15f0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
a1600 31 5d 29 3b 0a 20 20 20 20 62 79 74 65 73 32 20  1]);.    bytes2 
a1610 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
a1620 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b  bytes (argv[1]);
a1630 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69  .    geo2 =..gai
a1640 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
a1650 6c 6f 62 57 6b 62 45 78 20 28 62 6c 6f 62 32 2c  lobWkbEx (blob2,
a1660 20 62 79 74 65 73 32 2c 20 67 70 6b 67 5f 6d 6f   bytes2, gpkg_mo
a1670 64 65 2c 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  de, gpkg_amphibi
a1680 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
a1690 65 6f 31 20 7c 7c 20 21 67 65 6f 32 29 0a 09 73  eo1 || !geo2)..s
a16a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a16b0 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
a16c0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
a16d0 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20  {..  void *data 
a16e0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
a16f0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ata (context);..
a1700 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55    if (data != NU
a1710 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 74 20 3d  LL)..      ret =
a1720 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 72 65   gaiaGeomCollPre
a1730 70 61 72 65 64 43 6f 6e 74 61 69 6e 73 20 28 64  paredContains (d
a1740 61 74 61 2c 0a 09 09 09 09 09 09 20 20 67 65 6f  ata,.......  geo
a1750 31 2c 20 62 6c 6f 62 31 2c 20 62 79 74 65 73 31  1, blob1, bytes1
a1760 2c 20 67 65 6f 32 2c 0a 09 09 09 09 09 09 20 20  , geo2,.......  
a1770 62 6c 6f 62 32 2c 20 62 79 74 65 73 32 29 3b 0a  blob2, bytes2);.
a1780 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72  .  else..      r
a1790 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c  et = gaiaGeomCol
a17a0 6c 43 6f 6e 74 61 69 6e 73 20 28 67 65 6f 31 2c  lContains (geo1,
a17b0 20 67 65 6f 32 29 3b 0a 09 20 20 73 71 6c 69 74   geo2);..  sqlit
a17c0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
a17d0 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 20 20  ontext, ret);.  
a17e0 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
a17f0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31  eeGeomColl (geo1
a1800 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  );.    gaiaFreeG
a1810 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a  eomColl (geo2);.
a1820 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
a1830 6e 63 74 5f 52 65 6c 61 74 65 20 28 73 71 6c 69  nct_Relate (sqli
a1840 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
a1850 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
a1860 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
a1870 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
a1880 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 6c   function:./ Rel
a1890 61 74 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  ate(BLOBencoded 
a18a0 67 65 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64  geom1, BLOBencod
a18b0 65 64 20 67 65 6f 6d 32 2c 20 73 74 72 69 6e 67  ed geom2, string
a18c0 20 70 61 74 74 65 72 6e 29 0a 2f 0a 2f 20 72 65   pattern)././ re
a18d0 74 75 72 6e 73 3a 0a 2f 20 31 20 69 66 20 47 45  turns:./ 1 if GE
a18e0 4f 4d 2d 31 20 61 6e 64 20 47 45 4f 4d 2d 32 20  OM-1 and GEOM-2 
a18f0 68 61 76 65 20 61 20 73 70 61 74 69 61 6c 20 72  have a spatial r
a1900 65 6c 61 74 69 6f 6e 73 68 69 70 20 61 73 20 73  elationship as s
a1910 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
a1920 70 61 74 74 65 72 6e 4d 61 74 72 69 78 20 0a 2f  patternMatrix ./
a1930 20 30 20 6f 74 68 65 72 77 69 73 65 0a 2f 20 6f   0 otherwise./ o
a1940 72 20 2d 31 20 69 66 20 61 6e 79 20 65 72 72 6f  r -1 if any erro
a1950 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
a1960 0a 2f 0a 2f 20 6f 72 20 61 6c 74 65 72 6e 61 74  ././ or alternat
a1970 69 76 65 6c 79 3a 0a 2f 0a 2f 20 52 65 6c 61 74  ively:././ Relat
a1980 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  e(BLOBencoded ge
a1990 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64  om1, BLOBencoded
a19a0 20 67 65 6f 6d 32 29 0a 2f 20 52 65 6c 61 74 65   geom2)./ Relate
a19b0 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
a19c0 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20  m1, BLOBencoded 
a19d0 67 65 6f 6d 32 2c 20 69 6e 74 20 62 6e 72 29 0a  geom2, int bnr).
a19e0 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 61  /./ returns:./ a
a19f0 6e 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6d  n intersection m
a1a00 61 74 72 69 78 20 5b 44 45 2d 39 49 4d 5d 0a 2f  atrix [DE-9IM]./
a1a10 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
a1a20 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
a1a30 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
a1a40 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
a1a50 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
a1a60 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
a1a70 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c 4c  lPtr geo1 = NULL
a1a80 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
a1a90 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55 4c  llPtr geo2 = NUL
a1aa0 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  L;.    int ret;.
a1ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a1ac0 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0a  pattern = NULL;.
a1ad0 20 20 20 20 69 6e 74 20 62 6e 72 20 3d 20 31 3b      int bnr = 1;
a1ae0 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 74 72 69  .    char *matri
a1af0 78 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  x;.    int gpkg_
a1b00 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a  amphibious = 0;.
a1b10 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
a1b20 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  e = 0;.    struc
a1b30 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
a1b40 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
a1b50 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
a1b60 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
a1b70 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
a1b80 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
a1b90 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
a1ba0 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
a1bb0 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
a1bc0 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
a1bd0 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
a1be0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
a1bf0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
a1c00 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20  pkg_mode;.      
a1c10 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
a1c20 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
a1c30 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
a1c40 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
a1c50 20 20 69 66 20 28 61 72 67 63 20 3c 20 33 29 0a    if (argc < 3).
a1c60 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
a1c70 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
a1c80 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ext);..  else.. 
a1c90 20 20 20 7b 0a 09 09 69 66 20 28 73 71 6c 69 74     {...if (sqlit
a1ca0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
a1cb0 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[2]) != SQLIT
a1cc0 45 5f 54 45 58 54 29 0a 09 09 20 20 20 20 73 71  E_TEXT)...    sq
a1cd0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a1ce0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 65  l (context);...e
a1cf0 6c 73 65 0a 09 09 20 20 20 20 73 71 6c 69 74 65  lse...    sqlite
a1d00 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
a1d10 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 20  ntext, -1);..   
a1d20 20 7d 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20   }..  return;.  
a1d30 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
a1d40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
a1d50 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
a1d60 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
a1d70 20 7b 0a 09 20 20 69 66 20 28 61 72 67 63 20 3c   {..  if (argc <
a1d80 20 33 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74   3)..      sqlit
a1d90 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
a1da0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
a1db0 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 73  e..    {...if (s
a1dc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a1dd0 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53  e (argv[2]) != S
a1de0 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 09 20 20  QLITE_TEXT)...  
a1df0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a1e00 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
a1e10 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71  ...else...    sq
a1e20 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
a1e30 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
a1e40 09 20 20 20 20 7d 0a 09 20 20 72 65 74 75 72 6e  .    }..  return
a1e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
a1e60 20 28 61 72 67 63 20 3e 3d 20 33 29 0a 20 20 20   (argc >= 3).   
a1e70 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
a1e80 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
a1e90 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
a1ea0 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20  TE_TEXT)..      
a1eb0 70 61 74 74 65 72 6e 20 3d 20 28 63 6f 6e 73 74  pattern = (const
a1ec0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
a1ed0 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
a1ee0 76 5b 32 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69  v[2]);..  else i
a1ef0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
a1f00 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
a1f10 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
a1f20 52 29 0a 09 20 20 20 20 20 20 62 6e 72 20 3d 20  R)..      bnr = 
a1f30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
a1f40 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20  t (argv[2]);..  
a1f50 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
a1f60 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a1f70 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
a1f80 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
a1f90 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
a1fa0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
a1fb0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
a1fc0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
a1fd0 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
a1fe0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
a1ff0 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
a2000 20 20 20 20 67 65 6f 31 20 3d 0a 09 67 61 69 61      geo1 =..gaia
a2010 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
a2020 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
a2030 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
a2040 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
a2050 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
a2060 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
a2070 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
a2080 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
a2090 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  b (argv[1]);.   
a20a0 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
a20b0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
a20c0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65  argv[1]);.    ge
a20d0 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  o2 =..gaiaFromSp
a20e0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
a20f0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
a2100 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
a2110 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
a2120 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
a2130 20 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32   (!geo1 || !geo2
a2140 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
a2150 28 70 61 74 74 65 72 6e 20 3d 3d 20 4e 55 4c 4c  (pattern == NULL
a2160 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
a2170 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a2180 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
a2190 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
a21a0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
a21b0 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  xt, -1);.      }
a21c0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
a21d0 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20  {..  void *data 
a21e0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
a21f0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ata (context);..
a2200 20 20 69 66 20 28 70 61 74 74 65 72 6e 20 21 3d    if (pattern !=
a2210 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09   NULL)..    {...
a2220 2f 2a 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  /* evaluating th
a2230 65 20 67 69 76 65 6e 20 69 6e 74 65 72 73 65 63  e given intersec
a2240 74 69 6f 6e 20 6d 61 74 72 69 78 20 70 61 74 74  tion matrix patt
a2250 65 72 6e 20 2a 2f 0a 09 09 69 66 20 28 64 61 74  ern */...if (dat
a2260 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 20  a != NULL)...   
a2270 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43   ret = gaiaGeomC
a2280 6f 6c 6c 52 65 6c 61 74 65 5f 72 20 28 64 61 74  ollRelate_r (dat
a2290 61 2c 20 67 65 6f 31 2c 20 67 65 6f 32 2c 20 70  a, geo1, geo2, p
a22a0 61 74 74 65 72 6e 29 3b 0a 09 09 65 6c 73 65 0a  attern);...else.
a22b0 09 09 20 20 20 20 72 65 74 20 3d 20 67 61 69 61  ..    ret = gaia
a22c0 47 65 6f 6d 43 6f 6c 6c 52 65 6c 61 74 65 20 28  GeomCollRelate (
a22d0 67 65 6f 31 2c 20 67 65 6f 32 2c 20 70 61 74 74  geo1, geo2, patt
a22e0 65 72 6e 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  ern);...sqlite3_
a22f0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
a2300 65 78 74 2c 20 72 65 74 29 3b 0a 09 20 20 20 20  ext, ret);..    
a2310 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
a2320 0a 09 09 2f 2a 20 72 65 74 75 72 6e 69 6e 67 20  .../* returning 
a2330 61 6e 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  an intersection 
a2340 6d 61 74 72 69 78 20 2a 2f 0a 09 09 69 66 20 28  matrix */...if (
a2350 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09  data != NULL)...
a2360 20 20 20 20 6d 61 74 72 69 78 20 3d 0a 09 09 09      matrix =....
a2370 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 52 65 6c 61  gaiaGeomCollRela
a2380 74 65 42 6f 75 6e 64 61 72 79 4e 6f 64 65 52 75  teBoundaryNodeRu
a2390 6c 65 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 31  le_r (data, geo1
a23a0 2c 0a 09 09 09 09 09 09 09 20 20 20 20 20 20 67  ,........      g
a23b0 65 6f 32 2c 20 62 6e 72 29 3b 0a 09 09 65 6c 73  eo2, bnr);...els
a23c0 65 0a 09 09 20 20 20 20 6d 61 74 72 69 78 20 3d  e...    matrix =
a23d0 0a 09 09 09 67 61 69 61 47 65 6f 6d 43 6f 6c 6c  ....gaiaGeomColl
a23e0 52 65 6c 61 74 65 42 6f 75 6e 64 61 72 79 4e 6f  RelateBoundaryNo
a23f0 64 65 52 75 6c 65 20 28 67 65 6f 31 2c 20 67 65  deRule (geo1, ge
a2400 6f 32 2c 20 62 6e 72 29 3b 0a 09 09 69 66 20 28  o2, bnr);...if (
a2410 6d 61 74 72 69 78 20 3d 3d 20 4e 55 4c 4c 29 0a  matrix == NULL).
a2420 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ..    sqlite3_re
a2430 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
a2440 78 74 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20  xt);...else...  
a2450 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a2460 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
a2470 6d 61 74 72 69 78 2c 20 73 74 72 6c 65 6e 20 28  matrix, strlen (
a2480 6d 61 74 72 69 78 29 2c 0a 09 09 09 09 09 20 66  matrix),...... f
a2490 72 65 65 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ree);..    }.   
a24a0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 67 65 6f     }.    if (geo
a24b0 31 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61  1 != NULL)..gaia
a24c0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
a24d0 6f 31 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  o1);.    if (geo
a24e0 32 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61  2 != NULL)..gaia
a24f0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
a2500 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  o2);.}..static v
a2510 6f 69 64 0a 66 6e 63 74 5f 52 65 6c 61 74 65 4d  oid.fnct_RelateM
a2520 61 74 63 68 20 28 73 71 6c 69 74 65 33 5f 63 6f  atch (sqlite3_co
a2530 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
a2540 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
a2550 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
a2560 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
a2570 69 6f 6e 3a 0a 2f 20 53 54 5f 52 65 6c 61 74 65  ion:./ ST_Relate
a2580 4d 61 74 63 68 28 73 74 72 69 6e 67 20 6d 61 74  Match(string mat
a2590 72 69 78 2c 20 73 74 72 69 6e 67 20 70 61 74 74  rix, string patt
a25a0 65 72 6e 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  ern)././ returns
a25b0 3a 0a 2f 20 31 20 69 66 20 74 68 65 20 69 6e 74  :./ 1 if the int
a25c0 65 72 73 65 63 74 69 6f 6e 20 6d 61 74 72 69 78  ersection matrix
a25d0 20 73 61 74 69 73 66 69 65 73 20 74 68 65 20 69   satisfies the i
a25e0 6e 74 65 72 73 65 63 74 69 6f 6e 20 70 61 74 74  ntersection patt
a25f0 65 72 6e 0a 2f 20 30 20 6f 74 68 65 72 77 69 73  ern./ 0 otherwis
a2600 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79  e./ or -1 if any
a2610 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
a2620 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74  tered.*/.    int
a2630 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20   ret;.    const 
a2640 63 68 61 72 20 2a 6d 61 74 72 69 78 3b 0a 20 20  char *matrix;.  
a2650 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
a2660 74 74 65 72 6e 3b 0a 20 20 20 20 76 6f 69 64 20  ttern;.    void 
a2670 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  *data = sqlite3_
a2680 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
a2690 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
a26a0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
a26b0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
a26c0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
a26d0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
a26e0 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  0]) != SQLITE_TE
a26f0 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
a2700 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a2710 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
a2720 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
a2730 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 6d 61    }.    else..ma
a2740 74 72 69 78 20 3d 20 28 63 68 61 72 20 2a 29 20  trix = (char *) 
a2750 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
a2760 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
a2770 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
a2780 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
a2790 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
a27a0 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
a27b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
a27c0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
a27d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
a27e0 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 70 61 74   }.    else..pat
a27f0 74 65 72 6e 20 3d 20 28 63 68 61 72 20 2a 29 20  tern = (char *) 
a2800 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
a2810 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  xt (argv[1]);.  
a2820 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55    if (data != NU
a2830 4c 4c 29 0a 09 72 65 74 20 3d 20 67 61 69 61 49  LL)..ret = gaiaI
a2840 6e 74 65 72 73 65 63 74 69 6f 6e 4d 61 74 72 69  ntersectionMatri
a2850 78 50 61 74 74 65 72 6e 4d 61 74 63 68 5f 72 20  xPatternMatch_r 
a2860 28 64 61 74 61 2c 20 6d 61 74 72 69 78 2c 20 70  (data, matrix, p
a2870 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 65 6c 73  attern);.    els
a2880 65 0a 09 72 65 74 20 3d 20 67 61 69 61 49 6e 74  e..ret = gaiaInt
a2890 65 72 73 65 63 74 69 6f 6e 4d 61 74 72 69 78 50  ersectionMatrixP
a28a0 61 74 74 65 72 6e 4d 61 74 63 68 20 28 6d 61 74  atternMatch (mat
a28b0 72 69 78 2c 20 70 61 74 74 65 72 6e 29 3b 0a 20  rix, pattern);. 
a28c0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a28d0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
a28e0 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
a28f0 76 6f 69 64 0a 66 6e 63 74 5f 44 69 73 74 61 6e  void.fnct_Distan
a2900 63 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ce (sqlite3_cont
a2910 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
a2920 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
a2930 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
a2940 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
a2950 6e 3a 0a 2f 20 44 69 73 74 61 6e 63 65 28 42 4c  n:./ Distance(BL
a2960 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31 2c  OBencoded geom1,
a2970 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f   BLOBencoded geo
a2980 6d 32 29 0a 2f 20 44 69 73 74 61 6e 63 65 28 42  m2)./ Distance(B
a2990 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 31  LOBencoded geom1
a29a0 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  , BLOBencoded ge
a29b0 6f 6d 32 2c 20 42 6f 6f 6c 65 6e 20 75 73 65 5f  om2, Boolen use_
a29c0 65 6c 6c 69 70 73 6f 69 64 29 0a 2f 0a 2f 20 72  ellipsoid)././ r
a29d0 65 74 75 72 6e 73 20 74 68 65 20 64 69 73 74 61  eturns the dista
a29e0 6e 63 65 20 62 65 74 77 65 65 6e 20 47 45 4f 4d  nce between GEOM
a29f0 2d 31 20 61 6e 64 20 47 45 4f 4d 2d 32 0a 2a 2f  -1 and GEOM-2.*/
a2a00 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
a2a10 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
a2a20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
a2a30 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
a2a40 20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo1 = NULL;.  
a2a50 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
a2a60 72 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20  r geo2 = NULL;. 
a2a70 20 20 20 64 6f 75 62 6c 65 20 64 69 73 74 3b 0a     double dist;.
a2a80 20 20 20 20 69 6e 74 20 75 73 65 5f 65 6c 6c 69      int use_elli
a2a90 70 73 6f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20  psoid = -1;.    
a2aa0 64 6f 75 62 6c 65 20 61 3b 0a 20 20 20 20 64 6f  double a;.    do
a2ab0 75 62 6c 65 20 62 3b 0a 20 20 20 20 64 6f 75 62  uble b;.    doub
a2ac0 6c 65 20 72 66 3b 0a 20 20 20 20 69 6e 74 20 72  le rf;.    int r
a2ad0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  et;.    sqlite3 
a2ae0 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
a2af0 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
a2b00 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
a2b10 20 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20     void *data = 
a2b20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
a2b30 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
a2b40 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
a2b50 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
a2b60 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
a2b70 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
a2b80 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
a2b90 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
a2ba0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
a2bb0 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
a2bc0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
a2bd0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
a2be0 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
a2bf0 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
a2c00 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
a2c10 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
a2c20 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
a2c30 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
a2c40 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
a2c50 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
a2c60 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
a2c70 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
a2c80 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
a2c90 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
a2ca0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
a2cb0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
a2cc0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
a2cd0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
a2ce0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
a2cf0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
a2d00 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
a2d10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a2d20 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
a2d30 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
a2d40 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
a2d50 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  3).      {..  if
a2d60 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
a2d70 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21  type (argv[2]) !
a2d80 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
a2d90 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
a2da0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
a2db0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
a2dc0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 75 73  rn;..    }..  us
a2dd0 65 5f 65 6c 6c 69 70 73 6f 69 64 20 3d 20 73 71  e_ellipsoid = sq
a2de0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
a2df0 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 69 66  (argv[2]);..  if
a2e00 20 28 75 73 65 5f 65 6c 6c 69 70 73 6f 69 64 20   (use_ellipsoid 
a2e10 21 3d 20 30 29 0a 09 20 20 20 20 20 20 75 73 65  != 0)..      use
a2e20 5f 65 6c 6c 69 70 73 6f 69 64 20 3d 20 31 3b 0a  _ellipsoid = 1;.
a2e30 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
a2e40 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
a2e50 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
a2e60 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
a2e70 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
a2e80 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
a2e90 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
a2ea0 3b 0a 20 20 20 20 67 65 6f 31 20 3d 0a 09 67 61  ;.    geo1 =..ga
a2eb0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
a2ec0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
a2ed0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
a2ee0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
a2ef0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
a2f00 3b 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  ;.    p_blob = (
a2f10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
a2f20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
a2f30 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  lob (argv[1]);. 
a2f40 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
a2f50 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
a2f60 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
a2f70 67 65 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d  geo2 =..gaiaFrom
a2f80 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
a2f90 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
a2fa0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
a2fb0 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
a2fc0 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
a2fd0 69 66 20 28 21 67 65 6f 31 20 7c 7c 20 21 67 65  if (!geo1 || !ge
a2fe0 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  o2)..sqlite3_res
a2ff0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
a3000 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
a3010 20 20 20 7b 0a 09 20 20 69 66 20 28 75 73 65 5f     {..  if (use_
a3020 65 6c 6c 69 70 73 6f 69 64 20 3e 3d 20 30 29 0a  ellipsoid >= 0).
a3030 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 68 65 63  .    {.../* chec
a3040 6b 69 6e 67 20 66 69 72 73 74 20 69 66 20 61 6e  king first if an
a3050 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 65 78   intersection ex
a3060 69 73 74 73 20 2a 2f 0a 09 09 69 66 20 28 64 61  ists */...if (da
a3070 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20  ta != NULL)...  
a3080 20 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d    ret = gaiaGeom
a3090 43 6f 6c 6c 49 6e 74 65 72 73 65 63 74 73 5f 72  CollIntersects_r
a30a0 20 28 64 61 74 61 2c 20 67 65 6f 31 2c 20 67 65   (data, geo1, ge
a30b0 6f 32 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20  o2);...else...  
a30c0 20 20 72 65 74 20 3d 20 67 61 69 61 47 65 6f 6d    ret = gaiaGeom
a30d0 43 6f 6c 6c 49 6e 74 65 72 73 65 63 74 73 20 28  CollIntersects (
a30e0 67 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09 09 69  geo1, geo2);...i
a30f0 66 20 28 72 65 74 29 0a 09 09 20 20 7b 0a 09 09  f (ret)...  {...
a3100 20 20 20 20 20 20 2f 2a 20 69 66 20 61 6e 20 69        /* if an i
a3110 6e 74 65 72 73 65 63 74 69 6f 6e 20 65 78 69 73  ntersection exis
a3120 74 73 20 74 68 65 20 64 69 73 74 61 6e 63 65 20  ts the distance 
a3130 69 73 20 61 6c 77 61 79 73 20 5a 45 52 4f 20 2a  is always ZERO *
a3140 2f 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  /...      sqlite
a3150 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
a3160 28 63 6f 6e 74 65 78 74 2c 20 30 2e 30 29 3b 0a  (context, 0.0);.
a3170 09 09 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6f  ..      goto sto
a3180 70 3b 0a 09 09 20 20 7d 0a 0a 09 09 2f 2a 20 61  p;...  }..../* a
a3190 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69 64 65  ttempting to ide
a31a0 6e 74 69 66 79 20 74 68 65 20 63 6f 72 72 65 73  ntify the corres
a31b0 70 6f 6e 64 69 6e 67 20 65 6c 6c 69 70 73 6f 69  ponding ellipsoi
a31c0 64 20 2a 2f 0a 09 09 69 66 20 28 67 65 74 45 6c  d */...if (getEl
a31d0 6c 69 70 73 6f 69 64 50 61 72 61 6d 73 20 28 73  lipsoidParams (s
a31e0 71 6c 69 74 65 2c 20 67 65 6f 31 2d 3e 53 72 69  qlite, geo1->Sri
a31f0 64 2c 20 26 61 2c 20 26 62 2c 20 26 72 66 29 29  d, &a, &b, &rf))
a3200 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67  ...  {...      g
a3210 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 73  aiaGeomCollPtr s
a3220 68 6f 72 74 65 73 74 3b 0a 09 09 20 20 20 20 20  hortest;...     
a3230 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c   if (data != NUL
a3240 4c 29 0a 09 09 09 20 20 73 68 6f 72 74 65 73 74  L)....  shortest
a3250 20 3d 20 67 61 69 61 53 68 6f 72 74 65 73 74 4c   = gaiaShortestL
a3260 69 6e 65 5f 72 20 28 64 61 74 61 2c 20 67 65 6f  ine_r (data, geo
a3270 31 2c 20 67 65 6f 32 29 3b 0a 09 09 20 20 20 20  1, geo2);...    
a3280 20 20 65 6c 73 65 0a 09 09 09 20 20 73 68 6f 72    else....  shor
a3290 74 65 73 74 20 3d 20 67 61 69 61 53 68 6f 72 74  test = gaiaShort
a32a0 65 73 74 4c 69 6e 65 20 28 67 65 6f 31 2c 20 67  estLine (geo1, g
a32b0 65 6f 32 29 3b 0a 09 09 20 20 20 20 20 20 69 66  eo2);...      if
a32c0 20 28 73 68 6f 72 74 65 73 74 20 3d 3d 20 4e 55   (shortest == NU
a32d0 4c 4c 29 0a 09 09 09 20 20 73 71 6c 69 74 65 33  LL)....  sqlite3
a32e0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a32f0 6e 74 65 78 74 29 3b 0a 09 09 20 20 20 20 20 20  ntext);...      
a3300 65 6c 73 65 20 69 66 20 28 73 68 6f 72 74 65 73  else if (shortes
a3310 74 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  t->FirstLinestri
a3320 6e 67 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 09 7b  ng == NULL)....{
a3330 0a 09 09 09 20 20 20 20 67 61 69 61 46 72 65 65  ....    gaiaFree
a3340 47 65 6f 6d 43 6f 6c 6c 20 28 73 68 6f 72 74 65  GeomColl (shorte
a3350 73 74 29 3b 0a 09 09 09 20 20 20 20 73 71 6c 69  st);....    sqli
a3360 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
a3370 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 09 7d 0a  (context);....}.
a3380 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09  ..      else....
a3390 7b 0a 09 09 09 20 20 20 20 2f 2a 20 63 6f 6d 70  {....    /* comp
a33a0 75 74 65 73 20 74 68 65 20 6d 65 74 72 69 63 20  utes the metric 
a33b0 64 69 73 74 61 6e 63 65 20 2a 2f 0a 09 09 09 20  distance */.... 
a33c0 20 20 20 64 6f 75 62 6c 65 20 78 30 3b 0a 09 09     double x0;...
a33d0 09 20 20 20 20 64 6f 75 62 6c 65 20 79 30 3b 0a  .    double y0;.
a33e0 09 09 09 20 20 20 20 64 6f 75 62 6c 65 20 78 31  ...    double x1
a33f0 3b 0a 09 09 09 20 20 20 20 64 6f 75 62 6c 65 20  ;....    double 
a3400 79 31 3b 0a 09 09 09 20 20 20 20 64 6f 75 62 6c  y1;....    doubl
a3410 65 20 7a 3b 0a 09 09 09 20 20 20 20 64 6f 75 62  e z;....    doub
a3420 6c 65 20 6d 3b 0a 09 09 09 20 20 20 20 67 61 69  le m;....    gai
a3430 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c  aLinestringPtr l
a3440 6e 20 3d 20 73 68 6f 72 74 65 73 74 2d 3e 46 69  n = shortest->Fi
a3450 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09  rstLinestring;..
a3460 09 09 20 20 20 20 64 69 73 74 20 3d 20 2d 31 2e  ..    dist = -1.
a3470 30 3b 0a 09 09 09 20 20 20 20 69 66 20 28 6c 6e  0;....    if (ln
a3480 2d 3e 50 6f 69 6e 74 73 20 3d 3d 20 32 29 0a 09  ->Points == 2)..
a3490 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20  ..      {.....  
a34a0 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f  if (ln->Dimensio
a34b0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
a34c0 59 5f 5a 29 0a 09 09 09 09 20 20 20 20 7b 0a 09  Y_Z).....    {..
a34d0 09 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74  ....gaiaGetPoint
a34e0 58 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  XYZ (ln->Coords,
a34f0 20 30 2c 0a 09 09 09 09 09 09 09 20 26 78 30 2c   0,........ &x0,
a3500 20 26 79 30 2c 20 26 7a 29 3b 0a 09 09 09 09 20   &y0, &z);..... 
a3510 20 20 20 7d 0a 09 09 09 09 20 20 65 6c 73 65 20     }.....  else 
a3520 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f  if (ln->Dimensio
a3530 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
a3540 59 5f 4d 29 0a 09 09 09 09 20 20 20 20 7b 0a 09  Y_M).....    {..
a3550 09 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74  ....gaiaGetPoint
a3560 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  XYM (ln->Coords,
a3570 20 30 2c 0a 09 09 09 09 09 09 09 20 26 78 30 2c   0,........ &x0,
a3580 20 26 79 30 2c 20 26 6d 29 3b 0a 09 09 09 09 20   &y0, &m);..... 
a3590 20 20 20 7d 0a 09 09 09 09 20 20 65 6c 73 65 20     }.....  else 
a35a0 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f  if (ln->Dimensio
a35b0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
a35c0 59 5f 5a 5f 4d 29 0a 09 09 09 09 20 20 20 20 7b  Y_Z_M).....    {
a35d0 0a 09 09 09 09 09 67 61 69 61 47 65 74 50 6f 69  ......gaiaGetPoi
a35e0 6e 74 58 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72  ntXYZM (ln->Coor
a35f0 64 73 2c 20 30 2c 0a 09 09 09 09 09 09 09 20 20  ds, 0,........  
a3600 26 78 30 2c 20 26 79 30 2c 20 26 7a 2c 20 26 6d  &x0, &y0, &z, &m
a3610 29 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09 09 09  );.....    }....
a3620 09 20 20 65 6c 73 65 0a 09 09 09 09 20 20 20 20  .  else.....    
a3630 7b 0a 09 09 09 09 09 67 61 69 61 47 65 74 50 6f  {......gaiaGetPo
a3640 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  int (ln->Coords,
a3650 20 30 2c 20 26 78 30 2c 20 26 79 30 29 3b 0a 09   0, &x0, &y0);..
a3660 09 09 09 20 20 20 20 7d 0a 09 09 09 09 20 20 69  ...    }.....  i
a3670 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e  f (ln->Dimension
a3680 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
a3690 5f 5a 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09  _Z).....    {...
a36a0 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
a36b0 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  YZ (ln->Coords, 
a36c0 31 2c 0a 09 09 09 09 09 09 09 20 26 78 31 2c 20  1,........ &x1, 
a36d0 26 79 31 2c 20 26 7a 29 3b 0a 09 09 09 09 20 20  &y1, &z);.....  
a36e0 20 20 7d 0a 09 09 09 09 20 20 65 6c 73 65 20 69    }.....  else i
a36f0 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e  f (ln->Dimension
a3700 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
a3710 5f 4d 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09  _M).....    {...
a3720 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
a3730 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  YM (ln->Coords, 
a3740 31 2c 0a 09 09 09 09 09 09 09 20 26 78 31 2c 20  1,........ &x1, 
a3750 26 79 31 2c 20 26 6d 29 3b 0a 09 09 09 09 20 20  &y1, &m);.....  
a3760 20 20 7d 0a 09 09 09 09 20 20 65 6c 73 65 20 69    }.....  else i
a3770 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e  f (ln->Dimension
a3780 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
a3790 5f 5a 5f 4d 29 0a 09 09 09 09 20 20 20 20 7b 0a  _Z_M).....    {.
a37a0 09 09 09 09 09 67 61 69 61 47 65 74 50 6f 69 6e  .....gaiaGetPoin
a37b0 74 58 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64  tXYZM (ln->Coord
a37c0 73 2c 20 31 2c 0a 09 09 09 09 09 09 09 20 20 26  s, 1,........  &
a37d0 78 31 2c 20 26 79 31 2c 20 26 7a 2c 20 26 6d 29  x1, &y1, &z, &m)
a37e0 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09 09 09 09  ;.....    }.....
a37f0 20 20 65 6c 73 65 0a 09 09 09 09 20 20 20 20 7b    else.....    {
a3800 0a 09 09 09 09 09 67 61 69 61 47 65 74 50 6f 69  ......gaiaGetPoi
a3810 6e 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  nt (ln->Coords, 
a3820 31 2c 20 26 78 31 2c 20 26 79 31 29 3b 0a 09 09  1, &x1, &y1);...
a3830 09 09 20 20 20 20 7d 0a 09 09 09 09 20 20 69 66  ..    }.....  if
a3840 20 28 75 73 65 5f 65 6c 6c 69 70 73 6f 69 64 29   (use_ellipsoid)
a3850 0a 09 09 09 09 20 20 20 20 20 20 64 69 73 74 20  .....      dist 
a3860 3d 0a 09 09 09 09 09 20 20 67 61 69 61 47 65 6f  =......  gaiaGeo
a3870 64 65 73 69 63 44 69 73 74 61 6e 63 65 20 28 61  desicDistance (a
a3880 2c 20 62 2c 0a 09 09 09 09 09 09 09 09 72 66 2c  , b,.........rf,
a3890 20 79 30 2c 0a 09 09 09 09 09 09 09 09 78 30 2c   y0,.........x0,
a38a0 20 79 31 2c 20 78 31 29 3b 0a 09 09 09 09 20 20   y1, x1);.....  
a38b0 65 6c 73 65 0a 09 09 09 09 20 20 20 20 7b 0a 09  else.....    {..
a38c0 09 09 09 09 61 20 3d 20 36 33 37 38 31 33 37 2e  ....a = 6378137.
a38d0 30 3b 0a 09 09 09 09 09 72 66 20 3d 20 32 39 38  0;......rf = 298
a38e0 2e 32 35 37 32 32 33 35 36 33 3b 0a 09 09 09 09  .257223563;.....
a38f0 09 62 20 3d 20 28 61 20 2a 20 28 31 2e 30 20 2d  .b = (a * (1.0 -
a3900 20 28 31 2e 30 20 2f 20 72 66 29 29 29 3b 0a 09   (1.0 / rf)));..
a3910 09 09 09 09 64 69 73 74 20 3d 0a 09 09 09 09 09  ....dist =......
a3920 20 20 20 20 67 61 69 61 47 72 65 61 74 43 69 72      gaiaGreatCir
a3930 63 6c 65 44 69 73 74 61 6e 63 65 20 28 61 2c 0a  cleDistance (a,.
a3940 09 09 09 09 09 09 09 09 20 20 20 20 20 62 2c 0a  ........     b,.
a3950 09 09 09 09 09 09 09 09 20 20 20 20 20 79 30 2c  ........     y0,
a3960 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 78 30  .........     x0
a3970 2c 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 79  ,.........     y
a3980 31 2c 20 78 31 29 3b 0a 09 09 09 09 20 20 20 20  1, x1);.....    
a3990 7d 0a 09 09 09 09 20 20 69 66 20 28 64 69 73 74  }.....  if (dist
a39a0 20 3c 20 30 2e 30 29 0a 09 09 09 09 20 20 20 20   < 0.0).....    
a39b0 7b 0a 09 09 09 09 09 2f 2a 20 69 6e 76 61 6c 69  {....../* invali
a39c0 64 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 09 09  d distance */...
a39d0 09 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
a39e0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
a39f0 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09 09 09 09  ;.....    }.....
a3a00 20 20 65 6c 73 65 0a 09 09 09 09 20 20 20 20 20    else.....     
a3a10 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a3a20 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
a3a30 20 64 69 73 74 29 3b 0a 09 09 09 20 20 20 20 20   dist);....     
a3a40 20 7d 0a 09 09 09 20 20 20 20 65 6c 73 65 0a 09   }....    else..
a3a50 09 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
a3a60 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
a3a70 3b 0a 09 09 09 20 20 20 20 67 61 69 61 46 72 65  ;....    gaiaFre
a3a80 65 47 65 6f 6d 43 6f 6c 6c 20 28 73 68 6f 72 74  eGeomColl (short
a3a90 65 73 74 29 3b 0a 09 09 09 7d 0a 09 09 20 20 7d  est);....}...  }
a3aa0 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71  ...else...    sq
a3ab0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a3ac0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 67  l (context);...g
a3ad0 6f 74 6f 20 73 74 6f 70 3b 0a 09 20 20 20 20 7d  oto stop;..    }
a3ae0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
a3af0 09 09 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55  ..if (data != NU
a3b00 4c 4c 29 0a 09 09 20 20 20 20 72 65 74 20 3d 20  LL)...    ret = 
a3b10 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 44 69 73 74  gaiaGeomCollDist
a3b20 61 6e 63 65 5f 72 20 28 64 61 74 61 2c 20 67 65  ance_r (data, ge
a3b30 6f 31 2c 20 67 65 6f 32 2c 20 26 64 69 73 74 29  o1, geo2, &dist)
a3b40 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 72  ;...else...    r
a3b50 65 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c  et = gaiaGeomCol
a3b60 6c 44 69 73 74 61 6e 63 65 20 28 67 65 6f 31 2c  lDistance (geo1,
a3b70 20 67 65 6f 32 2c 20 26 64 69 73 74 29 3b 0a 09   geo2, &dist);..
a3b80 09 69 66 20 28 21 72 65 74 29 0a 09 09 20 20 20  .if (!ret)...   
a3b90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a3ba0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
a3bb0 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71 6c  ..else...    sql
a3bc0 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
a3bd0 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 64 69 73  le (context, dis
a3be0 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  t);..    }.     
a3bf0 20 7d 0a 20 20 73 74 6f 70 3a 0a 20 20 20 20 67   }.  stop:.    g
a3c00 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
a3c10 28 67 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61  (geo1);.    gaia
a3c20 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
a3c30 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  o2);.}..static v
a3c40 6f 69 64 0a 66 6e 63 74 5f 50 74 44 69 73 74 57  oid.fnct_PtDistW
a3c50 69 74 68 69 6e 20 28 73 71 6c 69 74 65 33 5f 63  ithin (sqlite3_c
a3c60 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
a3c70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
a3c80 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
a3c90 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
a3ca0 74 69 6f 6e 3a 0a 2f 20 50 74 44 69 73 74 57 69  tion:./ PtDistWi
a3cb0 74 68 69 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64  thin(BLOBencoded
a3cc0 20 67 65 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f   geom1, BLOBenco
a3cd0 64 65 64 20 67 65 6f 6d 32 2c 20 64 6f 75 62 6c  ded geom2, doubl
a3ce0 65 20 64 69 73 74 20 0a 2f 20 5b 2c 20 62 6f 6f  e dist ./ [, boo
a3cf0 6c 65 6e 20 75 73 65 5f 73 70 68 65 72 6f 69 64  len use_spheroid
a3d00 5d 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 54  ])././ returns T
a3d10 52 55 45 20 69 66 20 74 68 65 20 64 69 73 74 61  RUE if the dista
a3d20 6e 63 65 20 62 65 74 77 65 65 6e 20 47 45 4f 4d  nce between GEOM
a3d30 2d 31 20 61 6e 64 20 47 45 4f 4d 2d 32 0a 2f 20  -1 and GEOM-2./ 
a3d40 69 73 20 6c 65 73 73 20 6f 72 20 65 71 75 61 6c  is less or equal
a3d50 20 74 6f 20 64 69 73 74 0a 2f 0a 2f 20 2d 20 69   to dist././ - i
a3d60 66 20 62 6f 74 68 20 67 65 6f 6d 31 20 61 6e 64  f both geom1 and
a3d70 20 67 65 6f 6d 32 20 61 72 65 20 69 6e 20 74 68   geom2 are in th
a3d80 65 20 34 33 32 36 20 28 57 47 53 38 34 29 20 53  e 4326 (WGS84) S
a3d90 52 49 44 2c 0a 2f 20 20 20 28 61 6e 64 20 64 6f  RID,./   (and do
a3da0 65 73 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74  es actually cont
a3db0 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 50 4f  ains a single PO
a3dc0 49 4e 54 20 65 61 63 68 20 6f 6e 65 29 0a 2f 20  INT each one)./ 
a3dd0 20 20 64 69 73 74 20 69 73 20 61 73 73 75 6d 65    dist is assume
a3de0 64 20 74 6f 20 62 65 20 6d 65 61 73 75 72 65 64  d to be measured
a3df0 20 69 6e 20 4d 65 74 65 72 73 0a 2f 20 2d 20 69   in Meters./ - i
a3e00 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
a3e10 6f 70 74 69 6f 6e 61 6c 20 61 72 67 20 75 73 65  optional arg use
a3e20 5f 73 70 68 65 72 6f 69 64 20 69 73 0a 2f 20 20  _spheroid is./  
a3e30 20 63 68 65 63 6b 65 64 20 74 6f 20 64 65 74 65   checked to dete
a3e40 72 6d 69 6e 65 20 69 66 20 67 65 6f 64 65 73 69  rmine if geodesi
a3e50 63 20 64 69 73 74 61 6e 63 65 20 68 61 73 20 74  c distance has t
a3e60 6f 20 62 65 0a 2f 20 20 20 63 6f 6d 70 75 74 65  o be./   compute
a3e70 64 20 6f 6e 20 74 68 65 20 73 70 68 65 72 65 20  d on the sphere 
a3e80 28 71 75 69 63 6b 65 73 74 29 20 6f 72 20 6f 6e  (quickest) or on
a3e90 20 74 68 65 20 73 70 68 65 72 6f 69 64 20 0a 2f   the spheroid ./
a3ea0 20 20 20 64 65 66 61 75 6c 74 3a 20 75 73 65 5f     default: use_
a3eb0 73 70 68 65 72 6f 69 64 20 3d 20 46 41 4c 53 45  spheroid = FALSE
a3ec0 0a 2f 20 0a 2f 20 69 6e 20 61 6e 79 20 6f 74 68  ./ ./ in any oth
a3ed0 65 72 20 63 61 73 65 20 74 68 65 20 22 70 6c 61  er case the "pla
a3ee0 69 6e 22 20 64 69 73 74 61 6e 63 65 20 69 73 20  in" distance is 
a3ef0 65 76 61 6c 75 61 74 65 64 0a 2a 2f 0a 20 20 20  evaluated.*/.   
a3f00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a3f10 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
a3f20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
a3f30 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
a3f40 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  1 = NULL;.    ga
a3f50 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
a3f60 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  o2 = NULL;.    g
a3f70 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
a3f80 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
a3f90 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
a3fa0 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b  iaPolygonPtr pg;
a3fb0 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 65 66 5f  .    double ref_
a3fc0 64 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 75 73  dist;.    int us
a3fd0 65 5f 73 70 68 65 72 6f 69 64 20 3d 20 30 3b 0a  e_spheroid = 0;.
a3fe0 20 20 20 20 64 6f 75 62 6c 65 20 78 30 20 3d 20      double x0 = 
a3ff0 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
a4000 79 30 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f  y0 = 0.0;.    do
a4010 75 62 6c 65 20 78 31 20 3d 20 30 2e 30 3b 0a 20  uble x1 = 0.0;. 
a4020 20 20 20 64 6f 75 62 6c 65 20 79 31 20 3d 20 30     double y1 = 0
a4030 2e 30 3b 0a 20 20 20 20 69 6e 74 20 70 74 30 20  .0;.    int pt0 
a4040 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 30  = 0;.    int ln0
a4050 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70 67   = 0;.    int pg
a4060 30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70  0 = 0;.    int p
a4070 74 31 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  t1 = 0;.    int 
a4080 6c 6e 31 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ln1 = 0;.    int
a4090 20 70 67 31 20 3d 20 30 3b 0a 20 20 20 20 64 6f   pg1 = 0;.    do
a40a0 75 62 6c 65 20 64 69 73 74 3b 0a 20 20 20 20 64  uble dist;.    d
a40b0 6f 75 62 6c 65 20 61 3b 0a 20 20 20 20 64 6f 75  ouble a;.    dou
a40c0 62 6c 65 20 62 3b 0a 20 20 20 20 64 6f 75 62 6c  ble b;.    doubl
a40d0 65 20 72 66 3b 0a 20 20 20 20 69 6e 74 20 72 65  e rf;.    int re
a40e0 74 3b 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74  t;.    void *dat
a40f0 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  a = sqlite3_user
a4100 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
a4110 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
a4120 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
a4130 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
a4140 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
a4150 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
a4160 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
a4170 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
a4180 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
a4190 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
a41a0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
a41b0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
a41c0 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
a41d0 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
a41e0 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
a41f0 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
a4200 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
a4210 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
a4220 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
a4230 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
a4240 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
a4250 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
a4260 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
a4270 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
a4280 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
a4290 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a42a0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
a42b0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
a42c0 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
a42d0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
a42e0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a42f0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
a4300 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
a4310 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
a4320 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
a4330 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
a4340 54 45 5f 49 4e 54 45 47 45 52 0a 09 7c 7c 20 73  TE_INTEGER..|| s
a4350 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a4360 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
a4370 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 3b 0a  QLITE_FLOAT)..;.
a4380 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
a4390 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
a43a0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
a43b0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
a43c0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
a43d0 67 63 20 3d 3d 20 34 29 0a 20 20 20 20 20 20 7b  gc == 4).      {
a43e0 0a 09 20 20 2f 2a 20 6f 70 74 69 6f 6e 61 6c 20  ..  /* optional 
a43f0 75 73 65 5f 73 70 68 65 72 6f 69 64 20 61 72 67  use_spheroid arg
a4400 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c 69 74   */..  if (sqlit
a4410 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
a4420 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[3]) != SQLIT
a4430 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
a4440 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
a4450 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
a4460 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
a4470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a4480 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
a4490 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
a44a0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
a44b0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
a44c0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
a44d0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
a44e0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d  [0]);.    geo1 =
a44f0 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
a4500 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
a4510 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
a4520 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
a4530 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
a4540 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c 6f 62  ous);.    p_blob
a4550 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
a4560 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
a4570 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d  ue_blob (argv[1]
a4580 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
a4590 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
a45a0 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a  ytes (argv[1]);.
a45b0 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69 61      geo2 =..gaia
a45c0 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
a45d0 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c  obWkbEx (p_blob,
a45e0 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d   n_bytes, gpkg_m
a45f0 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70  ode,.....     gp
a4600 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
a4610 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
a4620 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
a4630 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
a4640 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
a4650 09 20 20 69 6e 74 20 64 73 74 20 3d 20 73 71 6c  .  int dst = sql
a4660 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
a4670 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 72 65 66  argv[2]);..  ref
a4680 5f 64 69 73 74 20 3d 20 64 73 74 3b 0a 20 20 20  _dist = dst;.   
a4690 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 72     }.    else..r
a46a0 65 66 5f 64 69 73 74 20 3d 20 73 71 6c 69 74 65  ef_dist = sqlite
a46b0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
a46c0 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66  argv[2]);.    if
a46d0 20 28 61 72 67 63 20 3d 3d 20 34 29 0a 09 75 73   (argc == 4)..us
a46e0 65 5f 73 70 68 65 72 6f 69 64 20 3d 20 73 71 6c  e_spheroid = sql
a46f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
a4700 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69 66  argv[3]);.    if
a4710 20 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32   (!geo1 || !geo2
a4720 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
a4730 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
a4740 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
a4750 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 31 2d 3e   {..  if (geo1->
a4760 53 72 69 64 20 3d 3d 20 34 33 32 36 20 26 26 20  Srid == 4326 && 
a4770 67 65 6f 32 2d 3e 53 72 69 64 20 3d 3d 20 34 33  geo2->Srid == 43
a4780 32 36 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20  26)..    {.../* 
a4790 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 73 69 6e  checking for sin
a47a0 67 6c 65 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 09  gle points */...
a47b0 70 74 20 3d 20 67 65 6f 31 2d 3e 46 69 72 73 74  pt = geo1->First
a47c0 50 6f 69 6e 74 3b 0a 09 09 77 68 69 6c 65 20 28  Point;...while (
a47d0 70 74 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  pt)...  {...    
a47e0 20 20 78 30 20 3d 20 70 74 2d 3e 58 3b 0a 09 09    x0 = pt->X;...
a47f0 20 20 20 20 20 20 79 30 20 3d 20 70 74 2d 3e 59        y0 = pt->Y
a4800 3b 0a 09 09 20 20 20 20 20 20 70 74 30 2b 2b 3b  ;...      pt0++;
a4810 0a 09 09 20 20 20 20 20 20 70 74 20 3d 20 70 74  ...      pt = pt
a4820 2d 3e 4e 65 78 74 3b 0a 09 09 20 20 7d 0a 09 09  ->Next;...  }...
a4830 6c 6e 20 3d 20 67 65 6f 31 2d 3e 46 69 72 73 74  ln = geo1->First
a4840 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09 09 77 68  Linestring;...wh
a4850 69 6c 65 20 28 6c 6e 29 0a 09 09 20 20 7b 0a 09  ile (ln)...  {..
a4860 09 20 20 20 20 20 20 6c 6e 30 2b 2b 3b 0a 09 09  .      ln0++;...
a4870 20 20 20 20 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e        ln = ln->N
a4880 65 78 74 3b 0a 09 09 20 20 7d 0a 09 09 70 67 20  ext;...  }...pg 
a4890 3d 20 67 65 6f 31 2d 3e 46 69 72 73 74 50 6f 6c  = geo1->FirstPol
a48a0 79 67 6f 6e 3b 0a 09 09 77 68 69 6c 65 20 28 70  ygon;...while (p
a48b0 67 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  g)...  {...     
a48c0 20 70 67 30 2b 2b 3b 0a 09 09 20 20 20 20 20 20   pg0++;...      
a48d0 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a 09  pg = pg->Next;..
a48e0 09 20 20 7d 0a 09 09 70 74 20 3d 20 67 65 6f 32  .  }...pt = geo2
a48f0 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 09 09  ->FirstPoint;...
a4900 77 68 69 6c 65 20 28 70 74 29 0a 09 09 20 20 7b  while (pt)...  {
a4910 0a 09 09 20 20 20 20 20 20 78 31 20 3d 20 70 74  ...      x1 = pt
a4920 2d 3e 58 3b 0a 09 09 20 20 20 20 20 20 79 31 20  ->X;...      y1 
a4930 3d 20 70 74 2d 3e 59 3b 0a 09 09 20 20 20 20 20  = pt->Y;...     
a4940 20 70 74 31 2b 2b 3b 0a 09 09 20 20 20 20 20 20   pt1++;...      
a4950 70 74 20 3d 20 70 74 2d 3e 4e 65 78 74 3b 0a 09  pt = pt->Next;..
a4960 09 20 20 7d 0a 09 09 6c 6e 20 3d 20 67 65 6f 32  .  }...ln = geo2
a4970 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e  ->FirstLinestrin
a4980 67 3b 0a 09 09 77 68 69 6c 65 20 28 6c 6e 29 0a  g;...while (ln).
a4990 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 6c 6e  ..  {...      ln
a49a0 31 2b 2b 3b 0a 09 09 20 20 20 20 20 20 6c 6e 20  1++;...      ln 
a49b0 3d 20 6c 6e 2d 3e 4e 65 78 74 3b 0a 09 09 20 20  = ln->Next;...  
a49c0 7d 0a 09 09 70 67 20 3d 20 67 65 6f 32 2d 3e 46  }...pg = geo2->F
a49d0 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 09 09 77  irstPolygon;...w
a49e0 68 69 6c 65 20 28 70 67 29 0a 09 09 20 20 7b 0a  hile (pg)...  {.
a49f0 09 09 20 20 20 20 20 20 70 67 31 2b 2b 3b 0a 09  ..      pg1++;..
a4a00 09 20 20 20 20 20 20 70 67 20 3d 20 70 67 2d 3e  .      pg = pg->
a4a10 4e 65 78 74 3b 0a 09 09 20 20 7d 0a 09 09 69 66  Next;...  }...if
a4a20 20 28 70 74 30 20 3d 3d 20 31 20 26 26 20 70 74   (pt0 == 1 && pt
a4a30 31 20 3d 3d 20 31 20 26 26 20 6c 6e 30 20 3d 3d  1 == 1 && ln0 ==
a4a40 20 30 20 26 26 20 6c 6e 31 20 3d 3d 20 30 20 26   0 && ln1 == 0 &
a4a50 26 20 70 67 30 20 3d 3d 20 30 0a 09 09 20 20 20  & pg0 == 0...   
a4a60 20 26 26 20 70 67 31 20 3d 3d 20 30 29 0a 09 09   && pg1 == 0)...
a4a70 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 75    {...      /* u
a4a80 73 69 6e 67 20 67 65 6f 64 65 73 69 63 20 64 69  sing geodesic di
a4a90 73 74 61 6e 63 65 20 2a 2f 0a 09 09 20 20 20 20  stance */...    
a4aa0 20 20 61 20 3d 20 36 33 37 38 31 33 37 2e 30 3b    a = 6378137.0;
a4ab0 0a 09 09 20 20 20 20 20 20 72 66 20 3d 20 32 39  ...      rf = 29
a4ac0 38 2e 32 35 37 32 32 33 35 36 33 3b 0a 09 09 20  8.257223563;... 
a4ad0 20 20 20 20 20 62 20 3d 20 28 61 20 2a 20 28 31       b = (a * (1
a4ae0 2e 30 20 2d 20 28 31 2e 30 20 2f 20 72 66 29 29  .0 - (1.0 / rf))
a4af0 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 75  );...      if (u
a4b00 73 65 5f 73 70 68 65 72 6f 69 64 29 0a 09 09 09  se_spheroid)....
a4b10 7b 0a 09 09 09 20 20 20 20 64 69 73 74 20 3d 0a  {....    dist =.
a4b20 09 09 09 09 67 61 69 61 47 65 6f 64 65 73 69 63  ....gaiaGeodesic
a4b30 44 69 73 74 61 6e 63 65 20 28 61 2c 20 62 2c 20  Distance (a, b, 
a4b40 72 66 2c 20 79 30 2c 20 78 30 2c 20 79 31 2c 20  rf, y0, x0, y1, 
a4b50 78 31 29 3b 0a 09 09 09 20 20 20 20 69 66 20 28  x1);....    if (
a4b60 64 69 73 74 20 3c 3d 20 72 65 66 5f 64 69 73 74  dist <= ref_dist
a4b70 29 0a 09 09 09 09 73 71 6c 69 74 65 33 5f 72 65  ).....sqlite3_re
a4b80 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
a4b90 74 2c 20 31 29 3b 0a 09 09 09 20 20 20 20 65 6c  t, 1);....    el
a4ba0 73 65 0a 09 09 09 09 73 71 6c 69 74 65 33 5f 72  se.....sqlite3_r
a4bb0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
a4bc0 78 74 2c 20 30 29 3b 0a 09 09 09 7d 0a 09 09 20  xt, 0);....}... 
a4bd0 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a 09       else....{..
a4be0 09 09 20 20 20 20 64 69 73 74 20 3d 0a 09 09 09  ..    dist =....
a4bf0 09 67 61 69 61 47 72 65 61 74 43 69 72 63 6c 65  .gaiaGreatCircle
a4c00 44 69 73 74 61 6e 63 65 20 28 61 2c 20 62 2c 20  Distance (a, b, 
a4c10 79 30 2c 20 78 30 2c 20 79 31 2c 20 78 31 29 3b  y0, x0, y1, x1);
a4c20 0a 09 09 09 20 20 20 20 69 66 20 28 64 69 73 74  ....    if (dist
a4c30 20 3c 3d 20 72 65 66 5f 64 69 73 74 29 0a 09 09   <= ref_dist)...
a4c40 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
a4c50 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31  _int (context, 1
a4c60 29 3b 0a 09 09 09 20 20 20 20 65 6c 73 65 0a 09  );....    else..
a4c70 09 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
a4c80 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
a4c90 30 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  0);....}...     
a4ca0 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 09 20 20   goto stop;...  
a4cb0 7d 0a 09 20 20 20 20 7d 0a 2f 2a 20 64 65 66 61  }..    }./* defa
a4cc0 75 6c 74 69 6e 67 20 74 6f 20 66 6c 61 74 20 64  ulting to flat d
a4cd0 69 73 74 61 6e 63 65 20 2a 2f 0a 09 20 20 69 66  istance */..  if
a4ce0 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a   (data != NULL).
a4cf0 09 20 20 20 20 20 20 72 65 74 20 3d 20 67 61 69  .      ret = gai
a4d00 61 47 65 6f 6d 43 6f 6c 6c 44 69 73 74 61 6e 63  aGeomCollDistanc
a4d10 65 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 31 2c  e_r (data, geo1,
a4d20 20 67 65 6f 32 2c 20 26 64 69 73 74 29 3b 0a 09   geo2, &dist);..
a4d30 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65    else..      re
a4d40 74 20 3d 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c  t = gaiaGeomColl
a4d50 44 69 73 74 61 6e 63 65 20 28 67 65 6f 31 2c 20  Distance (geo1, 
a4d60 67 65 6f 32 2c 20 26 64 69 73 74 29 3b 0a 09 20  geo2, &dist);.. 
a4d70 20 69 66 20 28 21 72 65 74 29 0a 09 20 20 20 20   if (!ret)..    
a4d80 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a4d90 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
a4da0 0a 09 20 20 69 66 20 28 64 69 73 74 20 3c 3d 20  ..  if (dist <= 
a4db0 72 65 66 5f 64 69 73 74 29 0a 09 20 20 20 20 20  ref_dist)..     
a4dc0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a4dd0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29  int (context, 1)
a4de0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
a4df0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a4e00 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
a4e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 73 74 6f 70  ;.      }.  stop
a4e20 3a 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  :.    gaiaFreeGe
a4e30 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a 20  omColl (geo1);. 
a4e40 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
a4e50 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a 53  oll (geo2);.}..S
a4e60 50 41 54 49 41 4c 49 54 45 5f 50 52 49 56 41 54  PATIALITE_PRIVAT
a4e70 45 20 76 6f 69 64 0a 67 65 6f 73 5f 65 72 72 6f  E void.geos_erro
a4e80 72 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  r (const char *f
a4e90 6d 74 2c 20 2e 2e 2e 29 0a 7b 0a 2f 2a 20 72 65  mt, ...).{./* re
a4ea0 70 6f 72 74 69 6e 67 20 73 6f 6d 65 20 47 45 4f  porting some GEO
a4eb0 53 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 76  S error */.    v
a4ec0 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63  a_list ap;.    c
a4ed0 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20 20 76 61  har *msg;.    va
a4ee0 5f 73 74 61 72 74 20 28 61 70 2c 20 66 6d 74 29  _start (ap, fmt)
a4ef0 3b 0a 20 20 20 20 6d 73 67 20 3d 20 73 71 6c 69  ;.    msg = sqli
a4f00 74 65 33 5f 76 6d 70 72 69 6e 74 66 20 28 66 6d  te3_vmprintf (fm
a4f10 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
a4f20 6e 64 20 28 61 70 29 3b 0a 20 20 20 20 69 66 20  nd (ap);.    if 
a4f30 28 6d 73 67 29 0a 20 20 20 20 20 20 7b 0a 09 20  (msg).      {.. 
a4f40 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22   spatialite_e ("
a4f50 47 45 4f 53 20 65 72 72 6f 72 3a 20 25 73 5c 6e  GEOS error: %s\n
a4f60 22 2c 20 6d 73 67 29 3b 0a 09 20 20 67 61 69 61  ", msg);..  gaia
a4f70 53 65 74 47 65 6f 73 45 72 72 6f 72 4d 73 67 20  SetGeosErrorMsg 
a4f80 28 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65  (msg);..  sqlite
a4f90 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 20 20  3_free (msg);.  
a4fa0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09      }.    else..
a4fb0 67 61 69 61 53 65 74 47 65 6f 73 45 72 72 6f 72  gaiaSetGeosError
a4fc0 4d 73 67 20 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 53  Msg (NULL);.}..S
a4fd0 50 41 54 49 41 4c 49 54 45 5f 50 52 49 56 41 54  PATIALITE_PRIVAT
a4fe0 45 20 76 6f 69 64 0a 67 65 6f 73 5f 77 61 72 6e  E void.geos_warn
a4ff0 69 6e 67 20 28 63 6f 6e 73 74 20 63 68 61 72 20  ing (const char 
a5000 2a 66 6d 74 2c 20 2e 2e 2e 29 0a 7b 0a 2f 2a 20  *fmt, ...).{./* 
a5010 72 65 70 6f 72 74 69 6e 67 20 73 6f 6d 65 20 47  reporting some G
a5020 45 4f 53 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  EOS warning */. 
a5030 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
a5040 20 20 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20     char *msg;.  
a5050 20 20 76 61 5f 73 74 61 72 74 20 28 61 70 2c 20    va_start (ap, 
a5060 66 6d 74 29 3b 0a 20 20 20 20 6d 73 67 20 3d 20  fmt);.    msg = 
a5070 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
a5080 20 28 66 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20   (fmt, ap);.    
a5090 76 61 5f 65 6e 64 20 28 61 70 29 3b 0a 20 20 20  va_end (ap);.   
a50a0 20 69 66 20 28 6d 73 67 29 0a 20 20 20 20 20 20   if (msg).      
a50b0 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
a50c0 65 20 28 22 47 45 4f 53 20 77 61 72 6e 69 6e 67  e ("GEOS warning
a50d0 3a 20 25 73 5c 6e 22 2c 20 6d 73 67 29 3b 0a 09  : %s\n", msg);..
a50e0 20 20 67 61 69 61 53 65 74 47 65 6f 73 57 61 72    gaiaSetGeosWar
a50f0 6e 69 6e 67 4d 73 67 20 28 6d 73 67 29 3b 0a 09  ningMsg (msg);..
a5100 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
a5110 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  msg);.      }.  
a5120 20 20 65 6c 73 65 0a 09 67 61 69 61 53 65 74 47    else..gaiaSetG
a5130 65 6f 73 57 61 72 6e 69 6e 67 4d 73 67 20 28 4e  eosWarningMsg (N
a5140 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ULL);.}..static 
a5150 76 6f 69 64 0a 66 6e 63 74 5f 61 75 78 5f 70 6f  void.fnct_aux_po
a5160 6c 79 67 6f 6e 69 7a 65 20 28 73 71 6c 69 74 65  lygonize (sqlite
a5170 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
a5180 65 78 74 2c 20 67 61 69 61 47 65 6f 6d 43 6f 6c  ext, gaiaGeomCol
a5190 6c 50 74 72 20 67 65 6f 6d 5f 6f 72 67 2c 0a 09  lPtr geom_org,..
a51a0 09 20 20 20 20 20 69 6e 74 20 66 6f 72 63 65 5f  .     int force_
a51b0 6d 75 6c 74 69 70 6f 6c 79 67 6f 6e 2c 20 69 6e  multipolygon, in
a51c0 74 20 61 6c 6c 6f 77 5f 6d 75 6c 74 69 70 6f 6c  t allow_multipol
a51d0 79 67 6f 6e 29 0a 7b 0a 2f 2a 20 61 20 20 63 6f  ygon).{./* a  co
a51e0 6d 6d 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 65  mmon function pe
a51f0 72 66 6f 72 6d 69 6e 67 20 61 6e 79 20 6b 69 6e  rforming any kin
a5200 64 20 6f 66 20 70 6f 6c 79 67 6f 6e 69 7a 61 74  d of polygonizat
a5210 69 6f 6e 20 6f 70 20 2a 2f 0a 20 20 20 20 67 61  ion op */.    ga
a5220 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
a5230 6f 6d 5f 6e 65 77 20 3d 20 4e 55 4c 4c 3b 0a 20  om_new = NULL;. 
a5240 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
a5250 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
a5260 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
a5270 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50      gaiaPolygonP
a5280 74 72 20 70 67 3b 0a 20 20 20 20 69 6e 74 20 70  tr pg;.    int p
a5290 67 73 20 3d 20 30 3b 0a 20 20 20 20 76 6f 69 64  gs = 0;.    void
a52a0 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
a52b0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
a52c0 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67 70  ext);.    int gp
a52d0 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
a52e0 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
a52f0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
a5300 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
a5310 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
a5320 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
a5330 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
a5340 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
a5350 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
a5360 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
a5370 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
a5380 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
a5390 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
a53a0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
a53b0 20 69 66 20 28 21 67 65 6f 6d 5f 6f 72 67 29 0a   if (!geom_org).
a53c0 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 3b 0a 20  .goto invalid;. 
a53d0 20 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e     if (data != N
a53e0 55 4c 4c 29 0a 09 67 65 6f 6d 5f 6e 65 77 20 3d  ULL)..geom_new =
a53f0 20 67 61 69 61 50 6f 6c 79 67 6f 6e 69 7a 65 5f   gaiaPolygonize_
a5400 72 20 28 64 61 74 61 2c 20 67 65 6f 6d 5f 6f 72  r (data, geom_or
a5410 67 2c 20 66 6f 72 63 65 5f 6d 75 6c 74 69 70 6f  g, force_multipo
a5420 6c 79 67 6f 6e 29 3b 0a 20 20 20 20 65 6c 73 65  lygon);.    else
a5430 0a 09 67 65 6f 6d 5f 6e 65 77 20 3d 20 67 61 69  ..geom_new = gai
a5440 61 50 6f 6c 79 67 6f 6e 69 7a 65 20 28 67 65 6f  aPolygonize (geo
a5450 6d 5f 6f 72 67 2c 20 66 6f 72 63 65 5f 6d 75 6c  m_org, force_mul
a5460 74 69 70 6f 6c 79 67 6f 6e 29 3b 0a 20 20 20 20  tipolygon);.    
a5470 69 66 20 28 21 67 65 6f 6d 5f 6e 65 77 29 0a 09  if (!geom_new)..
a5480 67 6f 74 6f 20 69 6e 76 61 6c 69 64 3b 0a 20 20  goto invalid;.  
a5490 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
a54a0 6c 6c 20 28 67 65 6f 6d 5f 6f 72 67 29 3b 0a 20  ll (geom_org);. 
a54b0 20 20 20 70 67 20 3d 20 67 65 6f 6d 5f 6e 65 77     pg = geom_new
a54c0 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a  ->FirstPolygon;.
a54d0 20 20 20 20 77 68 69 6c 65 20 28 70 67 29 0a 20      while (pg). 
a54e0 20 20 20 20 20 7b 0a 09 20 20 70 67 73 2b 2b 3b       {..  pgs++;
a54f0 0a 09 20 20 70 67 20 3d 20 70 67 2d 3e 4e 65 78  ..  pg = pg->Nex
a5500 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  t;.      }.    i
a5510 66 20 28 70 67 73 20 3e 20 31 20 26 26 20 61 6c  f (pgs > 1 && al
a5520 6c 6f 77 5f 6d 75 6c 74 69 70 6f 6c 79 67 6f 6e  low_multipolygon
a5530 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09   == 0).      {..
a5540 20 20 2f 2a 20 69 6e 76 61 6c 69 64 3a 20 61 20    /* invalid: a 
a5550 50 4f 4c 59 47 4f 4e 20 69 73 20 65 78 70 65 63  POLYGON is expec
a5560 74 65 64 20 21 21 21 20 2a 2f 0a 09 20 20 67 61  ted !!! */..  ga
a5570 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
a5580 67 65 6f 6d 5f 6e 65 77 29 3b 0a 09 20 20 73 71  geom_new);..  sq
a5590 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a55a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
a55b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
a55c0 20 20 20 20 67 61 69 61 54 6f 53 70 61 74 69 61      gaiaToSpatia
a55d0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
a55e0 67 65 6f 6d 5f 6e 65 77 2c 20 26 70 5f 72 65 73  geom_new, &p_res
a55f0 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f  ult, &len, gpkg_
a5600 6d 6f 64 65 2c 0a 09 09 09 09 74 69 6e 79 5f 70  mode,.....tiny_p
a5610 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69 61 46  oint);.    gaiaF
a5620 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
a5630 6d 5f 6e 65 77 29 3b 0a 20 20 20 20 73 71 6c 69  m_new);.    sqli
a5640 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
a5650 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
a5660 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
a5670 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e      return;.  in
a5680 76 61 6c 69 64 3a 0a 20 20 20 20 69 66 20 28 67  valid:.    if (g
a5690 65 6f 6d 5f 6f 72 67 29 0a 09 67 61 69 61 46 72  eom_org)..gaiaFr
a56a0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
a56b0 5f 6f 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  _org);.    sqlit
a56c0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
a56d0 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a  context);.}../*.
a56e0 2f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  / the following 
a56f0 66 75 6e 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  functions perfor
a5700 6d 73 20 69 6e 69 74 69 61 6c 20 61 72 67 75 6d  ms initial argum
a5710 65 6e 74 20 63 68 65 63 6b 69 6e 67 2c 20 0a 2f  ent checking, ./
a5720 20 61 6e 64 20 74 68 65 6e 20 72 65 61 64 64 72   and then readdr
a5730 65 73 73 69 6e 67 20 74 68 65 20 72 65 71 75 65  essing the reque
a5740 73 74 20 74 6f 20 66 6e 63 74 5f 61 75 78 5f 70  st to fnct_aux_p
a5750 6f 6c 79 67 6f 6e 69 7a 65 28 29 0a 2f 20 66 6f  olygonize()./ fo
a5760 72 20 61 63 74 75 61 6c 20 70 72 6f 63 65 73 73  r actual process
a5770 69 6e 67 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76  ing.*/..static v
a5780 6f 69 64 0a 66 6e 63 74 5f 42 64 50 6f 6c 79 46  oid.fnct_BdPolyF
a5790 72 6f 6d 54 65 78 74 31 20 28 73 71 6c 69 74 65  romText1 (sqlite
a57a0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
a57b0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
a57c0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
a57d0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
a57e0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
a57f0 0a 2f 20 42 64 50 6f 6c 79 46 72 6f 6d 54 65 78  ./ BdPolyFromTex
a5800 74 28 57 4b 54 20 65 6e 63 6f 64 65 64 20 4d 55  t(WKT encoded MU
a5810 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 29 0a 2f  LTILINESTRING)./
a5820 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ./ returns the c
a5830 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20  urrent geometry 
a5840 5b 50 4f 4c 59 47 4f 4e 5d 20 62 79 20 70 61 72  [POLYGON] by par
a5850 73 69 6e 67 20 61 20 57 4b 54 20 65 6e 63 6f 64  sing a WKT encod
a5860 65 64 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  ed MULTILINESTRI
a5870 4e 47 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  NG ./ or NULL if
a5880 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
a5890 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2a 2f 0a 20  countered./.*/. 
a58a0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a58b0 64 20 63 68 61 72 20 2a 74 65 78 74 3b 0a 20 20  d char *text;.  
a58c0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
a58d0 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  r geo = NULL;.  
a58e0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
a58f0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
a5900 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
a5910 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
a5920 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
a5930 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
a5940 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
a5950 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
a5960 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
a5970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 65  ;.      }.    te
a5980 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  xt = sqlite3_val
a5990 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
a59a0 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69  );.    geo = gai
a59b0 61 50 61 72 73 65 57 6b 74 20 28 74 65 78 74 2c  aParseWkt (text,
a59c0 20 2d 31 29 3b 0a 20 20 20 20 69 66 20 28 67 65   -1);.    if (ge
a59d0 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  o == NULL).     
a59e0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
a59f0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
a5a00 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
a5a10 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
a5a20 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  geo->DeclaredTyp
a5a30 65 20 21 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  e != GAIA_MULTIL
a5a40 49 4e 45 53 54 52 49 4e 47 29 0a 20 20 20 20 20  INESTRING).     
a5a50 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65   {..  gaiaFreeGe
a5a60 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 20  omColl (geo);.. 
a5a70 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a5a80 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
a5a90 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
a5aa0 20 7d 0a 20 20 20 20 67 65 6f 2d 3e 53 72 69 64   }.    geo->Srid
a5ab0 20 3d 20 30 3b 0a 20 20 20 20 66 6e 63 74 5f 61   = 0;.    fnct_a
a5ac0 75 78 5f 70 6f 6c 79 67 6f 6e 69 7a 65 20 28 63  ux_polygonize (c
a5ad0 6f 6e 74 65 78 74 2c 20 67 65 6f 2c 20 30 2c 20  ontext, geo, 0, 
a5ae0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
a5af0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
a5b00 6e 63 74 5f 42 64 50 6f 6c 79 46 72 6f 6d 54 65  nct_BdPolyFromTe
a5b10 78 74 32 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  xt2 (sqlite3_con
a5b20 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
a5b30 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20  int argc,...    
a5b40 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a5b50 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
a5b60 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 42 64  L function:./ Bd
a5b70 50 6f 6c 79 46 72 6f 6d 54 65 78 74 28 57 4b 54  PolyFromText(WKT
a5b80 20 65 6e 63 6f 64 65 64 20 4d 55 4c 54 49 4c 49   encoded MULTILI
a5b90 4e 45 53 54 52 49 4e 47 2c 20 53 52 49 44 29 0a  NESTRING, SRID).
a5ba0 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20  /./ returns the 
a5bb0 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
a5bc0 20 5b 50 4f 4c 59 47 4f 4e 5d 20 62 79 20 70 61   [POLYGON] by pa
a5bd0 72 73 69 6e 67 20 61 20 57 4b 54 20 65 6e 63 6f  rsing a WKT enco
a5be0 64 65 64 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52  ded MULTILINESTR
a5bf0 49 4e 47 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ING ./ or NULL i
a5c00 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
a5c10 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2a 2f 0a  ncountered./.*/.
a5c20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
a5c30 65 64 20 63 68 61 72 20 2a 74 65 78 74 3b 0a 20  ed char *text;. 
a5c40 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
a5c50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20  tr geo = NULL;. 
a5c60 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
a5c70 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
a5c80 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
a5c90 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
a5ca0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
a5cb0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
a5cc0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
a5cd0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a5ce0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
a5cf0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
a5d00 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
a5d10 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
a5d20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
a5d30 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  R).      {..  sq
a5d40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a5d50 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
a5d60 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
a5d70 20 20 20 20 74 65 78 74 20 3d 20 73 71 6c 69 74      text = sqlit
a5d80 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
a5d90 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
a5da0 20 3d 20 67 61 69 61 50 61 72 73 65 57 6b 74 20   = gaiaParseWkt 
a5db0 28 74 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20  (text, -1);.    
a5dc0 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29  if (geo == NULL)
a5dd0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
a5de0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
a5df0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
a5e00 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
a5e10 20 20 69 66 20 28 67 65 6f 2d 3e 44 65 63 6c 61    if (geo->Decla
a5e20 72 65 64 54 79 70 65 20 21 3d 20 47 41 49 41 5f  redType != GAIA_
a5e30 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 29  MULTILINESTRING)
a5e40 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61  .      {..  gaia
a5e50 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
a5e60 6f 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  o);..  sqlite3_r
a5e70 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
a5e80 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
a5e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f  .      }.    geo
a5ea0 2d 3e 53 72 69 64 20 3d 20 73 71 6c 69 74 65 33  ->Srid = sqlite3
a5eb0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
a5ec0 5b 31 5d 29 3b 0a 20 20 20 20 66 6e 63 74 5f 61  [1]);.    fnct_a
a5ed0 75 78 5f 70 6f 6c 79 67 6f 6e 69 7a 65 20 28 63  ux_polygonize (c
a5ee0 6f 6e 74 65 78 74 2c 20 67 65 6f 2c 20 30 2c 20  ontext, geo, 0, 
a5ef0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
a5f00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
a5f10 6e 63 74 5f 42 64 4d 50 6f 6c 79 46 72 6f 6d 54  nct_BdMPolyFromT
a5f20 65 78 74 31 20 28 73 71 6c 69 74 65 33 5f 63 6f  ext1 (sqlite3_co
a5f30 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
a5f40 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
a5f50 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
a5f60 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
a5f70 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
a5f80 42 64 4d 50 6f 6c 79 46 72 6f 6d 54 65 78 74 28  BdMPolyFromText(
a5f90 57 4b 54 20 65 6e 63 6f 64 65 64 20 4d 55 4c 54  WKT encoded MULT
a5fa0 49 4c 49 4e 45 53 54 52 49 4e 47 29 0a 2f 0a 2f  ILINESTRING)././
a5fb0 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72   returns the cur
a5fc0 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20 5b 4d  rent geometry [M
a5fd0 55 4c 54 49 50 4f 4c 59 47 4f 4e 5d 20 62 79 20  ULTIPOLYGON] by 
a5fe0 70 61 72 73 69 6e 67 20 61 20 57 4b 54 20 65 6e  parsing a WKT en
a5ff0 63 6f 64 65 64 20 4d 55 4c 54 49 4c 49 4e 45 53  coded MULTILINES
a6000 54 52 49 4e 47 20 0a 2f 20 6f 72 20 4e 55 4c 4c  TRING ./ or NULL
a6010 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
a6020 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2a   encountered./.*
a6030 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
a6040 67 6e 65 64 20 63 68 61 72 20 2a 74 65 78 74 3b  gned char *text;
a6050 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
a6060 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
a6070 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
a6080 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
a6090 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
a60a0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
a60b0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
a60c0 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
a60d0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
a60e0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
a60f0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
a6100 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
a6110 20 74 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f   text = sqlite3_
a6120 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
a6130 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20  [0]);.    geo = 
a6140 67 61 69 61 50 61 72 73 65 57 6b 74 20 28 74 65  gaiaParseWkt (te
a6150 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 20  xt, -1);.    if 
a6160 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  (geo == NULL).  
a6170 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
a6180 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a6190 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
a61a0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
a61b0 66 20 28 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64  f (geo->Declared
a61c0 54 79 70 65 20 21 3d 20 47 41 49 41 5f 4d 55 4c  Type != GAIA_MUL
a61d0 54 49 4c 49 4e 45 53 54 52 49 4e 47 29 0a 20 20  TILINESTRING).  
a61e0 20 20 20 20 7b 0a 09 20 20 67 61 69 61 46 72 65      {..  gaiaFre
a61f0 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
a6200 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
a6210 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
a6220 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
a6230 20 20 20 20 7d 0a 20 20 20 20 67 65 6f 2d 3e 53      }.    geo->S
a6240 72 69 64 20 3d 20 30 3b 0a 20 20 20 20 66 6e 63  rid = 0;.    fnc
a6250 74 5f 61 75 78 5f 70 6f 6c 79 67 6f 6e 69 7a 65  t_aux_polygonize
a6260 20 28 63 6f 6e 74 65 78 74 2c 20 67 65 6f 2c 20   (context, geo, 
a6270 31 2c 20 31 29 3b 0a 20 20 20 20 72 65 74 75 72  1, 1);.    retur
a6280 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
a6290 64 0a 66 6e 63 74 5f 42 64 4d 50 6f 6c 79 46 72  d.fnct_BdMPolyFr
a62a0 6f 6d 54 65 78 74 32 20 28 73 71 6c 69 74 65 33  omText2 (sqlite3
a62b0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
a62c0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
a62d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
a62e0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
a62f0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
a6300 0a 2f 20 42 64 4d 50 6f 6c 79 46 72 6f 6d 54 65  ./ BdMPolyFromTe
a6310 78 74 28 57 4b 54 20 65 6e 63 6f 64 65 64 20 4d  xt(WKT encoded M
a6320 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 2c 20  ULTILINESTRING, 
a6330 53 52 49 44 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  SRID)././ return
a6340 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 65  s the current ge
a6350 6f 6d 65 74 72 79 20 5b 4d 55 4c 54 49 50 4f 4c  ometry [MULTIPOL
a6360 59 47 4f 4e 5d 20 62 79 20 70 61 72 73 69 6e 67  YGON] by parsing
a6370 20 61 20 57 4b 54 20 65 6e 63 6f 64 65 64 20 4d   a WKT encoded M
a6380 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 0a  ULTILINESTRING .
a6390 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
a63a0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
a63b0 74 65 72 65 64 0a 2f 0a 2a 2f 0a 20 20 20 20 63  tered./.*/.    c
a63c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
a63d0 61 72 20 2a 74 65 78 74 3b 0a 20 20 20 20 67 61  ar *text;.    ga
a63e0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
a63f0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41  o = NULL;.    GA
a6400 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
a6410 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
a6420 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
a6430 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
a6440 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
a6450 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
a6460 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
a6470 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
a6480 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
a6490 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
a64a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
a64b0 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
a64c0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
a64d0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
a64e0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a64f0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
a6500 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74  n;.      }.    t
a6510 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ext = sqlite3_va
a6520 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
a6530 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61  ]);.    geo = ga
a6540 69 61 50 61 72 73 65 57 6b 74 20 28 74 65 78 74  iaParseWkt (text
a6550 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 20 28 67  , -1);.    if (g
a6560 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  eo == NULL).    
a6570 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
a6580 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
a6590 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
a65a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
a65b0 28 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79  (geo->DeclaredTy
a65c0 70 65 20 21 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe != GAIA_MULTI
a65d0 4c 49 4e 45 53 54 52 49 4e 47 29 0a 20 20 20 20  LINESTRING).    
a65e0 20 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47    {..  gaiaFreeG
a65f0 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09  eomColl (geo);..
a6600 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a6610 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
a6620 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
a6630 20 20 7d 0a 20 20 20 20 67 65 6f 2d 3e 53 72 69    }.    geo->Sri
a6640 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
a6650 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b  e_int (argv[1]);
a6660 0a 20 20 20 20 66 6e 63 74 5f 61 75 78 5f 70 6f  .    fnct_aux_po
a6670 6c 79 67 6f 6e 69 7a 65 20 28 63 6f 6e 74 65 78  lygonize (contex
a6680 74 2c 20 67 65 6f 2c 20 31 2c 20 31 29 3b 0a 20  t, geo, 1, 1);. 
a6690 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74     return;.}..st
a66a0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 42  atic void.fnct_B
a66b0 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 31 20 28 73  dPolyFromWKB1 (s
a66c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a66d0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
a66e0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
a66f0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
a6700 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
a6710 42 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 28 57 4b  BdPolyFromWKB(WK
a6720 42 20 65 6e 63 6f 64 65 64 20 4d 55 4c 54 49 4c  B encoded MULTIL
a6730 49 4e 45 53 54 52 49 4e 47 29 0a 2f 0a 2f 20 72  INESTRING)././ r
a6740 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
a6750 6e 74 20 67 65 6f 6d 65 74 72 79 20 5b 50 4f 4c  nt geometry [POL
a6760 59 47 4f 4e 5d 20 62 79 20 70 61 72 73 69 6e 67  YGON] by parsing
a6770 20 61 20 57 4b 42 20 65 6e 63 6f 64 65 64 20 4d   a WKB encoded M
a6780 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 0a  ULTILINESTRING .
a6790 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
a67a0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
a67b0 74 65 72 65 64 0a 2f 0a 2a 2f 0a 20 20 20 20 69  tered./.*/.    i
a67c0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
a67d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
a67e0 68 61 72 20 2a 77 6b 62 3b 0a 20 20 20 20 67 61  har *wkb;.    ga
a67f0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
a6800 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41  o = NULL;.    GA
a6810 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
a6820 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
a6830 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
a6840 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
a6850 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
a6860 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
a6870 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
a6880 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
a6890 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
a68a0 20 20 20 20 7d 0a 20 20 20 20 77 6b 62 20 3d 20      }.    wkb = 
a68b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
a68c0 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
a68d0 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
a68e0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
a68f0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
a6900 66 20 28 21 63 68 65 63 6b 5f 77 6b 62 20 28 77  f (!check_wkb (w
a6910 6b 62 2c 20 6e 5f 62 79 74 65 73 2c 20 2d 31 29  kb, n_bytes, -1)
a6920 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 67  )..return;.    g
a6930 65 6f 20 3d 20 67 61 69 61 46 72 6f 6d 57 6b 62  eo = gaiaFromWkb
a6940 20 28 77 6b 62 2c 20 6e 5f 62 79 74 65 73 29 3b   (wkb, n_bytes);
a6950 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20  .    if (geo == 
a6960 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
a6970 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a6980 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
a6990 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
a69a0 20 7d 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e   }.    if (geo->
a69b0 44 65 63 6c 61 72 65 64 54 79 70 65 20 21 3d 20  DeclaredType != 
a69c0 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
a69d0 52 49 4e 47 29 0a 20 20 20 20 20 20 7b 0a 09 20  RING).      {.. 
a69e0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
a69f0 6c 20 28 67 65 6f 29 3b 0a 09 20 20 73 71 6c 69  l (geo);..  sqli
a6a00 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
a6a10 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
a6a20 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
a6a30 20 20 67 65 6f 2d 3e 53 72 69 64 20 3d 20 30 3b    geo->Srid = 0;
a6a40 0a 20 20 20 20 66 6e 63 74 5f 61 75 78 5f 70 6f  .    fnct_aux_po
a6a50 6c 79 67 6f 6e 69 7a 65 20 28 63 6f 6e 74 65 78  lygonize (contex
a6a60 74 2c 20 67 65 6f 2c 20 30 2c 20 30 29 3b 0a 20  t, geo, 0, 0);. 
a6a70 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74     return;.}..st
a6a80 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 42  atic void.fnct_B
a6a90 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 32 20 28 73  dPolyFromWKB2 (s
a6aa0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a6ab0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
a6ac0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
a6ad0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
a6ae0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
a6af0 42 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 28 57 4b  BdPolyFromWKB(WK
a6b00 42 20 65 6e 63 6f 64 65 64 20 4d 55 4c 54 49 4c  B encoded MULTIL
a6b10 49 4e 45 53 54 52 49 4e 47 29 0a 2f 0a 2f 20 72  INESTRING)././ r
a6b20 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
a6b30 6e 74 20 67 65 6f 6d 65 74 72 79 20 5b 50 4f 4c  nt geometry [POL
a6b40 59 47 4f 4e 5d 20 62 79 20 70 61 72 73 69 6e 67  YGON] by parsing
a6b50 20 61 20 57 4b 42 20 65 6e 63 6f 64 65 64 20 4d   a WKB encoded M
a6b60 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 0a  ULTILINESTRING .
a6b70 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
a6b80 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
a6b90 74 65 72 65 64 0a 2f 0a 2a 2f 0a 20 20 20 20 69  tered./.*/.    i
a6ba0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
a6bb0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
a6bc0 68 61 72 20 2a 77 6b 62 3b 0a 20 20 20 20 67 61  har *wkb;.    ga
a6bd0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
a6be0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41  o = NULL;.    GA
a6bf0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
a6c00 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
a6c10 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
a6c20 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
a6c30 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
a6c40 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
a6c50 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
a6c60 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
a6c70 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
a6c80 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
a6c90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
a6ca0 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
a6cb0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
a6cc0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
a6cd0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a6ce0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
a6cf0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77  n;.      }.    w
a6d00 6b 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  kb = sqlite3_val
a6d10 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
a6d20 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
a6d30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
a6d40 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
a6d50 20 20 20 20 69 66 20 28 21 63 68 65 63 6b 5f 77      if (!check_w
a6d60 6b 62 20 28 77 6b 62 2c 20 6e 5f 62 79 74 65 73  kb (wkb, n_bytes
a6d70 2c 20 2d 31 29 29 0a 09 72 65 74 75 72 6e 3b 0a  , -1))..return;.
a6d80 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 46 72      geo = gaiaFr
a6d90 6f 6d 57 6b 62 20 28 77 6b 62 2c 20 6e 5f 62 79  omWkb (wkb, n_by
a6da0 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65  tes);.    if (ge
a6db0 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  o == NULL).     
a6dc0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
a6dd0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
a6de0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
a6df0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
a6e00 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  geo->DeclaredTyp
a6e10 65 20 21 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  e != GAIA_MULTIL
a6e20 49 4e 45 53 54 52 49 4e 47 29 0a 20 20 20 20 20  INESTRING).     
a6e30 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65   {..  gaiaFreeGe
a6e40 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 20  omColl (geo);.. 
a6e50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a6e60 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
a6e70 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
a6e80 20 7d 0a 20 20 20 20 67 65 6f 2d 3e 53 72 69 64   }.    geo->Srid
a6e90 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
a6ea0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
a6eb0 20 20 20 20 66 6e 63 74 5f 61 75 78 5f 70 6f 6c      fnct_aux_pol
a6ec0 79 67 6f 6e 69 7a 65 20 28 63 6f 6e 74 65 78 74  ygonize (context
a6ed0 2c 20 67 65 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  , geo, 0, 0);.  
a6ee0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61    return;.}..sta
a6ef0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 42 64  tic void.fnct_Bd
a6f00 4d 50 6f 6c 79 46 72 6f 6d 57 4b 42 31 20 28 73  MPolyFromWKB1 (s
a6f10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a6f20 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
a6f30 67 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69  gc,...      sqli
a6f40 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
a6f50 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
a6f60 74 69 6f 6e 3a 0a 2f 20 42 64 4d 50 6f 6c 79 46  tion:./ BdMPolyF
a6f70 72 6f 6d 57 4b 42 28 57 4b 42 20 65 6e 63 6f 64  romWKB(WKB encod
a6f80 65 64 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  ed MULTILINESTRI
a6f90 4e 47 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  NG)././ returns 
a6fa0 74 68 65 20 63 75 72 72 65 6e 74 20 67 65 6f 6d  the current geom
a6fb0 65 74 72 79 20 5b 4d 55 4c 54 49 50 4f 4c 59 47  etry [MULTIPOLYG
a6fc0 4f 4e 5d 20 62 79 20 70 61 72 73 69 6e 67 20 61  ON] by parsing a
a6fd0 20 57 4b 42 20 65 6e 63 6f 64 65 64 20 4d 55 4c   WKB encoded MUL
a6fe0 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 0a 2f 20  TILINESTRING ./ 
a6ff0 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
a7000 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
a7010 72 65 64 0a 2f 0a 2a 2f 0a 20 20 20 20 69 6e 74  red./.*/.    int
a7020 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f   n_bytes;.    co
a7030 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
a7040 72 20 2a 77 6b 62 3b 0a 20 20 20 20 67 61 69 61  r *wkb;.    gaia
a7050 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
a7060 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49 41  = NULL;.    GAIA
a7070 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
a7080 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
a7090 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
a70a0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
a70b0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
a70c0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
a70d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a70e0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
a70f0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
a7100 20 20 7d 0a 20 20 20 20 77 6b 62 20 3d 20 73 71    }.    wkb = sq
a7110 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
a7120 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
a7130 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
a7140 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
a7150 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[0]);.    if 
a7160 28 21 63 68 65 63 6b 5f 77 6b 62 20 28 77 6b 62  (!check_wkb (wkb
a7170 2c 20 6e 5f 62 79 74 65 73 2c 20 2d 31 29 29 0a  , n_bytes, -1)).
a7180 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 67 65 6f  .return;.    geo
a7190 20 3d 20 67 61 69 61 46 72 6f 6d 57 6b 62 20 28   = gaiaFromWkb (
a71a0 77 6b 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20  wkb, n_bytes);. 
a71b0 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55     if (geo == NU
a71c0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  LL).      {..  s
a71d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
a71e0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
a71f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
a7200 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 44 65  .    if (geo->De
a7210 63 6c 61 72 65 64 54 79 70 65 20 21 3d 20 47 41  claredType != GA
a7220 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
a7230 4e 47 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  NG).      {..  g
a7240 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
a7250 28 67 65 6f 29 3b 0a 09 20 20 73 71 6c 69 74 65  (geo);..  sqlite
a7260 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
a7270 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
a7280 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
a7290 67 65 6f 2d 3e 53 72 69 64 20 3d 20 30 3b 0a 20  geo->Srid = 0;. 
a72a0 20 20 20 66 6e 63 74 5f 61 75 78 5f 70 6f 6c 79     fnct_aux_poly
a72b0 67 6f 6e 69 7a 65 20 28 63 6f 6e 74 65 78 74 2c  gonize (context,
a72c0 20 67 65 6f 2c 20 31 2c 20 31 29 3b 0a 20 20 20   geo, 1, 1);.   
a72d0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74   return;.}..stat
a72e0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 42 64 4d  ic void.fnct_BdM
a72f0 50 6f 6c 79 46 72 6f 6d 57 4b 42 32 20 28 73 71  PolyFromWKB2 (sq
a7300 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
a7310 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
a7320 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74  c,...      sqlit
a7330 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
a7340 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
a7350 69 6f 6e 3a 0a 2f 20 42 64 4d 50 6f 6c 79 46 72  ion:./ BdMPolyFr
a7360 6f 6d 57 4b 42 28 57 4b 42 20 65 6e 63 6f 64 65  omWKB(WKB encode
a7370 64 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  d MULTILINESTRIN
a7380 47 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74  G)././ returns t
a7390 68 65 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65  he current geome
a73a0 74 72 79 20 5b 4d 55 4c 54 49 50 4f 4c 59 47 4f  try [MULTIPOLYGO
a73b0 4e 5d 20 62 79 20 70 61 72 73 69 6e 67 20 61 20  N] by parsing a 
a73c0 57 4b 42 20 65 6e 63 6f 64 65 64 20 4d 55 4c 54  WKB encoded MULT
a73d0 49 4c 49 4e 45 53 54 52 49 4e 47 20 0a 2f 20 6f  ILINESTRING ./ o
a73e0 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
a73f0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
a7400 65 64 0a 2f 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ed./.*/.    int 
a7410 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f 6e  n_bytes;.    con
a7420 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
a7430 20 2a 77 6b 62 3b 0a 20 20 20 20 67 61 69 61 47   *wkb;.    gaiaG
a7440 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
a7450 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49 41 5f   NULL;.    GAIA_
a7460 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
a7470 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
a7480 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
a7490 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
a74a0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
a74b0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
a74c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a74d0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
a74e0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
a74f0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
a7500 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
a7510 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
a7520 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
a7530 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
a7540 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
a7550 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
a7560 20 20 20 20 20 20 7d 0a 20 20 20 20 77 6b 62 20        }.    wkb 
a7570 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
a7580 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
a7590 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
a75a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
a75b0 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
a75c0 20 69 66 20 28 21 63 68 65 63 6b 5f 77 6b 62 20   if (!check_wkb 
a75d0 28 77 6b 62 2c 20 6e 5f 62 79 74 65 73 2c 20 2d  (wkb, n_bytes, -
a75e0 31 29 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  1))..return;.   
a75f0 20 67 65 6f 20 3d 20 67 61 69 61 46 72 6f 6d 57   geo = gaiaFromW
a7600 6b 62 20 28 77 6b 62 2c 20 6e 5f 62 79 74 65 73  kb (wkb, n_bytes
a7610 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d  );.    if (geo =
a7620 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
a7630 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
a7640 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
a7650 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
a7660 20 20 20 7d 0a 20 20 20 20 69 66 20 28 67 65 6f     }.    if (geo
a7670 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 21  ->DeclaredType !
a7680 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  = GAIA_MULTILINE
a7690 53 54 52 49 4e 47 29 0a 20 20 20 20 20 20 7b 0a  STRING).      {.
a76a0 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43  .  gaiaFreeGeomC
a76b0 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09 20 20 73 71  oll (geo);..  sq
a76c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a76d0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
a76e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
a76f0 20 20 20 20 67 65 6f 2d 3e 53 72 69 64 20 3d 20      geo->Srid = 
a7700 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
a7710 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  t (argv[1]);.   
a7720 20 66 6e 63 74 5f 61 75 78 5f 70 6f 6c 79 67 6f   fnct_aux_polygo
a7730 6e 69 7a 65 20 28 63 6f 6e 74 65 78 74 2c 20 67  nize (context, g
a7740 65 6f 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 72  eo, 1, 1);.    r
a7750 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
a7760 20 76 6f 69 64 0a 66 6e 63 74 5f 4f 66 66 73 65   void.fnct_Offse
a7770 74 43 75 72 76 65 20 28 73 71 6c 69 74 65 33 5f  tCurve (sqlite3_
a7780 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
a7790 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
a77a0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
a77b0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
a77c0 63 74 69 6f 6e 3a 0a 2f 20 4f 66 66 73 65 74 43  ction:./ OffsetC
a77d0 75 72 76 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64  urve(BLOBencoded
a77e0 20 67 65 6f 6d 65 74 72 79 2c 20 44 4f 55 42 4c   geometry, DOUBL
a77f0 45 20 72 61 64 69 75 73 29 0a 2f 0a 2f 20 72 65  E radius)././ re
a7800 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d  turns a new geom
a7810 65 74 72 79 20 72 65 70 72 65 73 65 6e 74 69 6e  etry representin
a7820 67 20 74 68 65 20 4f 46 46 53 45 54 2d 43 55 52  g the OFFSET-CUR
a7830 56 45 20 66 6f 72 20 63 75 72 72 65 6e 74 20 67  VE for current g
a7840 65 6f 6d 65 74 72 79 0a 2f 20 5b 61 20 4c 49 4e  eometry./ [a LIN
a7850 45 53 54 52 49 4e 47 20 69 73 20 65 78 70 65 63  ESTRING is expec
a7860 74 65 64 5d 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ted]./ or NULL i
a7870 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
a7880 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 6e  ncountered././ n
a7890 65 67 61 74 69 76 65 20 72 61 64 69 75 73 3a 20  egative radius: 
a78a0 72 69 67 68 74 2d 73 69 64 65 20 2f 20 70 6f 73  right-side / pos
a78b0 69 74 69 76 65 20 72 61 64 69 75 73 3a 20 6c 65  itive radius: le
a78c0 66 74 2d 73 69 64 65 0a 2a 2f 0a 20 20 20 20 75  ft-side.*/.    u
a78d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
a78e0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
a78f0 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47  bytes;.    gaiaG
a7900 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d  eomCollPtr geo =
a7910 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
a7920 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c  eomCollPtr resul
a7930 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61  t;.    double ra
a7940 64 69 75 73 3b 0a 20 20 20 20 69 6e 74 20 69 6e  dius;.    int in
a7950 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 69 6e 74  t_value;.    int
a7960 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
a7970 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
a7980 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
a7990 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
a79a0 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
a79b0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
a79c0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
a79d0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
a79e0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
a79f0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
a7a00 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
a7a10 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
a7a20 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
a7a30 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
a7a40 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
a7a50 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
a7a60 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
a7a70 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
a7a80 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f  g_mode;..  tiny_
a7a90 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
a7aa0 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
a7ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
a7ac0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
a7ad0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
a7ae0 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20   SQLITE_BLOB).  
a7af0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
a7b00 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a7b10 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
a7b20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
a7b30 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
a7b40 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
a7b50 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
a7b60 0a 09 72 61 64 69 75 73 20 3d 20 73 71 6c 69 74  ..radius = sqlit
a7b70 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
a7b80 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65  (argv[1]);.    e
a7b90 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
a7ba0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
a7bb0 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [1]) == SQLITE_I
a7bc0 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
a7bd0 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  .  int_value = s
a7be0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
a7bf0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 72   (argv[1]);..  r
a7c00 61 64 69 75 73 20 3d 20 69 6e 74 5f 76 61 6c 75  adius = int_valu
a7c10 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  e;.      }.    e
a7c20 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
a7c30 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
a7c40 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
a7c50 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
a7c60 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
a7c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
a7c80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
a7c90 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
a7ca0 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
a7cb0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
a7cc0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
a7cd0 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  eo =..gaiaFromSp
a7ce0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
a7cf0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
a7d00 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
a7d10 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
a7d20 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
a7d30 20 28 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33   (!geo)..sqlite3
a7d40 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
a7d50 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
a7d60 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64  .      {..  void
a7d70 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
a7d80 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
a7d90 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74  ext);..  if (dat
a7da0 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
a7db0 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 4f    result = gaiaO
a7dc0 66 66 73 65 74 43 75 72 76 65 5f 72 20 28 64 61  ffsetCurve_r (da
a7dd0 74 61 2c 20 67 65 6f 2c 20 72 61 64 69 75 73 2c  ta, geo, radius,
a7de0 20 31 36 2c 20 30 29 3b 0a 09 20 20 65 6c 73 65   16, 0);..  else
a7df0 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  ..      result =
a7e00 20 67 61 69 61 4f 66 66 73 65 74 43 75 72 76 65   gaiaOffsetCurve
a7e10 20 28 67 65 6f 2c 20 72 61 64 69 75 73 2c 20 31   (geo, radius, 1
a7e20 36 2c 20 30 29 3b 0a 09 20 20 69 66 20 28 21 72  6, 0);..  if (!r
a7e30 65 73 75 6c 74 29 0a 09 20 20 20 20 20 20 73 71  esult)..      sq
a7e40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a7e50 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
a7e60 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a  else..    {.../*
a7e70 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42   builds the BLOB
a7e80 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20   geometry to be 
a7e90 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e  returned */...in
a7ea0 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65  t len;...unsigne
a7eb0 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
a7ec0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 73 75 6c   = NULL;...resul
a7ed0 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f 2d 3e 53  t->Srid = geo->S
a7ee0 72 69 64 3b 0a 09 09 67 61 69 61 54 6f 53 70 61  rid;...gaiaToSpa
a7ef0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
a7f00 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72 65  2 (result, &p_re
a7f10 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09  sult, &len,.....
a7f20 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20  .    gpkg_mode, 
a7f30 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73  tiny_point);...s
a7f40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
a7f50 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
a7f60 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
a7f70 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f  );...gaiaFreeGeo
a7f80 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a  mColl (result);.
a7f90 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
a7fa0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
a7fb0 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74  oll (geo);.}..st
a7fc0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53  atic void.fnct_S
a7fd0 69 6e 67 6c 65 53 69 64 65 64 42 75 66 66 65 72  ingleSidedBuffer
a7fe0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
a7ff0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
a8000 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65   argc,....sqlite
a8010 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
a8020 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
a8030 6f 6e 3a 0a 2f 20 53 69 6e 67 6c 65 53 69 64 65  on:./ SingleSide
a8040 64 42 75 66 66 65 72 28 42 4c 4f 42 65 6e 63 6f  dBuffer(BLOBenco
a8050 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20 72 61  ded geometry, ra
a8060 64 69 75 73 2c 20 6c 65 66 74 2d 6f 72 2d 72 69  dius, left-or-ri
a8070 67 68 74 2d 73 69 64 65 29 0a 2f 0a 2f 20 72 65  ght-side)././ re
a8080 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d  turns a new geom
a8090 65 74 72 79 20 72 65 70 72 65 73 65 6e 74 69 6e  etry representin
a80a0 67 20 74 68 65 20 53 69 6e 67 6c 65 53 69 64 65  g the SingleSide
a80b0 64 20 42 55 46 46 45 52 20 0a 2f 20 66 6f 72 20  d BUFFER ./ for 
a80c0 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
a80d0 20 5b 61 20 4c 49 4e 45 53 54 52 49 4e 47 20 69   [a LINESTRING i
a80e0 73 20 65 78 70 65 63 74 65 64 5d 0a 2f 20 6f 72  s expected]./ or
a80f0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
a8100 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
a8110 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
a8120 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
a8130 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
a8140 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
a8150 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
a8160 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
a8170 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20  lPtr result;.   
a8180 20 64 6f 75 62 6c 65 20 72 61 64 69 75 73 3b 0a   double radius;.
a8190 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75      int int_valu
a81a0 65 3b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 5f  e;.    int left_
a81b0 72 69 67 68 74 3b 0a 20 20 20 20 69 6e 74 20 67  right;.    int g
a81c0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
a81d0 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
a81e0 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
a81f0 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
a8200 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
a8210 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
a8220 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
a8230 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
a8240 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
a8250 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
a8260 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
a8270 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
a8280 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
a8290 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
a82a0 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
a82b0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
a82c0 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
a82d0 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
a82e0 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
a82f0 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
a8300 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
a8310 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
a8320 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a8330 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
a8340 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
a8350 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
a8360 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
a8370 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
a8380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
a8390 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
a83a0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
a83b0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
a83c0 72 61 64 69 75 73 20 3d 20 73 71 6c 69 74 65 33  radius = sqlite3
a83d0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
a83e0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[1]);.    els
a83f0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
a8400 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
a8410 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
a8420 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
a8430 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
a8440 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
a8450 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 72 61 64  argv[1]);..  rad
a8460 69 75 73 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b  ius = int_value;
a8470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
a8480 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
a8490 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
a84a0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
a84b0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
a84c0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
a84d0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
a84e0 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) == SQLITE_IN
a84f0 54 45 47 45 52 29 0a 09 6c 65 66 74 5f 72 69 67  TEGER)..left_rig
a8500 68 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ht = sqlite3_val
a8510 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
a8520 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
a8530 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
a8540 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
a8550 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
a8560 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
a8570 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
a8580 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
a8590 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
a85a0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
a85b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
a85c0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
a85d0 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
a85e0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
a85f0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
a8600 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
a8610 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
a8620 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
a8630 0a 20 20 20 20 69 66 20 28 21 67 65 6f 29 0a 09  .    if (!geo)..
a8640 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
a8650 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
a8660 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
a8670 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20  .  void *data = 
a8680 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
a8690 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  a (context);..  
a86a0 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c  if (data != NULL
a86b0 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20  )..      result 
a86c0 3d 0a 09 09 20 20 67 61 69 61 53 69 6e 67 6c 65  =...  gaiaSingle
a86d0 53 69 64 65 64 42 75 66 66 65 72 5f 72 20 28 64  SidedBuffer_r (d
a86e0 61 74 61 2c 20 67 65 6f 2c 20 72 61 64 69 75 73  ata, geo, radius
a86f0 2c 20 31 36 2c 20 6c 65 66 74 5f 72 69 67 68 74  , 16, left_right
a8700 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
a8710 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 53    result = gaiaS
a8720 69 6e 67 6c 65 53 69 64 65 64 42 75 66 66 65 72  ingleSidedBuffer
a8730 20 28 67 65 6f 2c 20 72 61 64 69 75 73 2c 20 31   (geo, radius, 1
a8740 36 2c 20 6c 65 66 74 5f 72 69 67 68 74 29 3b 0a  6, left_right);.
a8750 09 20 20 69 66 20 28 21 72 65 73 75 6c 74 29 0a  .  if (!result).
a8760 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
a8770 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
a8780 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ext);..  else.. 
a8790 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73     {.../* builds
a87a0 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74   the BLOB geomet
a87b0 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ry to be returne
a87c0 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a  d */...int len;.
a87d0 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
a87e0 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  *p_result = NULL
a87f0 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64  ;...result->Srid
a8800 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09   = geo->Srid;...
a8810 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
a8820 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75  BlobWkbEx2 (resu
a8830 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  lt, &p_result, &
a8840 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70  len,......    gp
a8850 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f  kg_mode, tiny_po
a8860 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f  int);...sqlite3_
a8870 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
a8880 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20  text, p_result, 
a8890 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61  len, free);...ga
a88a0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
a88b0 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a  result);..    }.
a88c0 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
a88d0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
a88e0 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  o);.}..static vo
a88f0 69 64 0a 66 6e 63 74 5f 48 61 75 73 64 6f 72 66  id.fnct_Hausdorf
a8900 66 44 69 73 74 61 6e 63 65 20 28 73 71 6c 69 74  fDistance (sqlit
a8910 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
a8920 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
a8930 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ...sqlite3_value
a8940 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
a8950 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 48  QL function:./ H
a8960 61 75 73 64 6f 72 66 66 44 69 73 74 61 6e 63 65  ausdorffDistance
a8970 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
a8980 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20  m1, BLOBencoded 
a8990 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72  geom2)././ retur
a89a0 6e 73 20 74 68 65 20 64 69 73 63 72 65 74 65 20  ns the discrete 
a89b0 48 61 75 73 64 6f 72 66 66 20 64 69 73 74 61 6e  Hausdorff distan
a89c0 63 65 20 62 65 74 77 65 65 6e 20 47 45 4f 4d 2d  ce between GEOM-
a89d0 31 20 61 6e 64 20 47 45 4f 4d 2d 32 0a 2a 2f 0a  1 and GEOM-2.*/.
a89e0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
a89f0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
a8a00 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
a8a10 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
a8a20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  geo1 = NULL;.   
a8a30 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
a8a40 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo2 = NULL;.  
a8a50 20 20 64 6f 75 62 6c 65 20 64 69 73 74 3b 0a 20    double dist;. 
a8a60 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
a8a70 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
a8a80 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
a8a90 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
a8aa0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
a8ab0 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
a8ac0 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
a8ad0 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
a8ae0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
a8af0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
a8b00 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
a8b10 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
a8b20 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
a8b30 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
a8b40 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
a8b50 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
a8b60 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
a8b70 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
a8b80 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
a8b90 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
a8ba0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
a8bb0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
a8bc0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
a8bd0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
a8be0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
a8bf0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
a8c00 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
a8c10 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
a8c20 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
a8c30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
a8c40 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
a8c50 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
a8c60 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
a8c70 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
a8c80 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
a8c90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
a8ca0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
a8cb0 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
a8cc0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
a8cd0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
a8ce0 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  1 =..gaiaFromSpa
a8cf0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
a8d00 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
a8d10 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
a8d20 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
a8d30 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62  ibious);.    p_b
a8d40 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
a8d50 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
a8d60 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
a8d70 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [1]);.    n_byte
a8d80 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
a8d90 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d  e_bytes (argv[1]
a8da0 29 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09 67  );.    geo2 =..g
a8db0 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
a8dc0 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
a8dd0 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
a8de0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
a8df0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
a8e00 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f 31  );.    if (!geo1
a8e10 20 7c 7c 20 21 67 65 6f 32 29 0a 09 73 71 6c 69   || !geo2)..sqli
a8e20 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
a8e30 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
a8e40 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76  lse.      {..  v
a8e50 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69  oid *data = sqli
a8e60 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
a8e70 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28  ontext);..  if (
a8e80 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  data != NULL).. 
a8e90 20 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 48       ret = gaiaH
a8ea0 61 75 73 64 6f 72 66 66 44 69 73 74 61 6e 63 65  ausdorffDistance
a8eb0 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 31 2c 20  _r (data, geo1, 
a8ec0 67 65 6f 32 2c 20 26 64 69 73 74 29 3b 0a 09 20  geo2, &dist);.. 
a8ed0 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 74   else..      ret
a8ee0 20 3d 20 67 61 69 61 48 61 75 73 64 6f 72 66 66   = gaiaHausdorff
a8ef0 44 69 73 74 61 6e 63 65 20 28 67 65 6f 31 2c 20  Distance (geo1, 
a8f00 67 65 6f 32 2c 20 26 64 69 73 74 29 3b 0a 09 20  geo2, &dist);.. 
a8f10 20 69 66 20 28 21 72 65 74 29 0a 09 20 20 20 20   if (!ret)..    
a8f20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a8f30 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
a8f40 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
a8f50 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65  lt_double (conte
a8f60 78 74 2c 20 64 69 73 74 29 3b 0a 20 20 20 20 20  xt, dist);.     
a8f70 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
a8f80 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a  eomColl (geo1);.
a8f90 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
a8fa0 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a  Coll (geo2);.}..
a8fb0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
a8fc0 5f 53 68 61 72 65 64 50 61 74 68 73 20 28 73 71  _SharedPaths (sq
a8fd0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
a8fe0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
a8ff0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
a9000 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
a9010 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
a9020 68 61 72 65 64 50 61 74 68 73 28 42 4c 4f 42 65  haredPaths(BLOBe
a9030 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 31  ncoded geometry1
a9040 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  , BLOBencoded ge
a9050 6f 6d 65 74 72 79 32 29 0a 2f 0a 2f 20 72 65 74  ometry2)././ ret
a9060 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f 6d 65  urns a new geome
a9070 74 72 79 20 72 65 70 72 65 73 65 6e 74 69 6e 67  try representing
a9080 20 63 6f 6d 6d 6f 6e 20 28 73 68 61 72 65 64 29   common (shared)
a9090 20 45 64 67 65 73 0a 2f 20 5b 74 77 6f 20 4c 49   Edges./ [two LI
a90a0 4e 45 53 54 52 49 4e 47 73 2f 4d 55 4c 54 49 4c  NESTRINGs/MULTIL
a90b0 49 4e 45 53 54 52 49 4e 47 73 20 61 72 65 20 65  INESTRINGs are e
a90c0 78 70 65 63 74 65 64 5d 0a 2f 20 6f 72 20 4e 55  xpected]./ or NU
a90d0 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
a90e0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
a90f0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
a9100 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
a9110 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
a9120 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
a9130 72 20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20  r geo1 = NULL;. 
a9140 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
a9150 74 72 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a  tr geo2 = NULL;.
a9160 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
a9170 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20 20  Ptr result;.    
a9180 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
a9190 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
a91a0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
a91b0 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
a91c0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  nt = 0;.    stru
a91d0 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
a91e0 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
a91f0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
a9200 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
a9210 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
a9220 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
a9230 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
a9240 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
a9250 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
a9260 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
a9270 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
a9280 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
a9290 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
a92a0 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69  gpkg_mode;..  ti
a92b0 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65  ny_point = cache
a92c0 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c  ->tinyPointEnabl
a92d0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
a92e0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
a92f0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
a9300 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
a9310 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
a9320 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
a9330 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
a9340 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
a9350 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
a9360 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
a9370 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
a9380 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
a9390 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
a93a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
a93b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
a93c0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
a93d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
a93e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
a93f0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
a9400 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
a9410 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
a9420 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
a9430 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  o1 =..gaiaFromSp
a9440 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
a9450 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
a9460 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
a9470 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
a9480 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f  hibious);.    p_
a9490 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
a94a0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
a94b0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
a94c0 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[1]);.    n_byt
a94d0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
a94e0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31  ue_bytes (argv[1
a94f0 5d 29 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09  ]);.    geo2 =..
a9500 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
a9510 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
a9520 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
a9530 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
a9540 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
a9550 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 31  s);.    if (geo1
a9560 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 67 65 6f 32   == NULL || geo2
a9570 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
a9580 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
a9590 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
a95a0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f  se.      {..  vo
a95b0 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74  id *data = sqlit
a95c0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
a95d0 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64  ntext);..  if (d
a95e0 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ata != NULL)..  
a95f0 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69      result = gai
a9600 61 53 68 61 72 65 64 50 61 74 68 73 5f 72 20 28  aSharedPaths_r (
a9610 64 61 74 61 2c 20 67 65 6f 31 2c 20 67 65 6f 32  data, geo1, geo2
a9620 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
a9630 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 53    result = gaiaS
a9640 68 61 72 65 64 50 61 74 68 73 20 28 67 65 6f 31  haredPaths (geo1
a9650 2c 20 67 65 6f 32 29 3b 0a 09 20 20 69 66 20 28  , geo2);..  if (
a9660 21 72 65 73 75 6c 74 29 0a 09 20 20 20 20 20 20  !result)..      
a9670 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
a9680 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
a9690 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
a96a0 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c  /* builds the BL
a96b0 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62  OB geometry to b
a96c0 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09  e returned */...
a96d0 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67  int len;...unsig
a96e0 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
a96f0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 73  lt = NULL;...res
a9700 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f 31  ult->Srid = geo1
a9710 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f  ->Srid;...gaiaTo
a9720 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
a9730 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70  bEx2 (result, &p
a9740 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09  _result, &len,..
a9750 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64  ....    gpkg_mod
a9760 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a  e, tiny_point);.
a9770 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
a9780 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
a9790 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
a97a0 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65  ree);...gaiaFree
a97b0 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74  GeomColl (result
a97c0 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  );..    }.      
a97d0 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
a97e0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a 20  omColl (geo1);. 
a97f0 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43     gaiaFreeGeomC
a9800 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a 73  oll (geo2);.}..s
a9810 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
a9820 43 6f 76 65 72 73 20 28 73 71 6c 69 74 65 33 5f  Covers (sqlite3_
a9830 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
a9840 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
a9850 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
a9860 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
a9870 63 74 69 6f 6e 3a 0a 2f 20 43 6f 76 65 72 73 28  ction:./ Covers(
a9880 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
a9890 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  1, BLOBencoded g
a98a0 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  eom2)././ return
a98b0 73 3a 0a 2f 20 31 20 69 66 20 47 45 4f 4d 2d 31  s:./ 1 if GEOM-1
a98c0 20 22 73 70 61 74 69 61 6c 6c 79 20 63 6f 76 65   "spatially cove
a98d0 72 73 22 20 47 45 4f 4d 2d 32 0a 2f 20 30 20 6f  rs" GEOM-2./ 0 o
a98e0 74 68 65 72 77 69 73 65 0a 2f 20 6f 72 20 2d 31  therwise./ or -1
a98f0 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
a9900 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
a9910 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
a9920 72 20 2a 62 6c 6f 62 31 3b 0a 20 20 20 20 75 6e  r *blob1;.    un
a9930 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f  signed char *blo
a9940 62 32 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65  b2;.    int byte
a9950 73 31 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 65  s1;.    int byte
a9960 73 32 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  s2;.    gaiaGeom
a9970 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e  CollPtr geo1 = N
a9980 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
a9990 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20  mCollPtr geo2 = 
a99a0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65  NULL;.    int re
a99b0 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  t;.    int gpkg_
a99c0 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a  amphibious = 0;.
a99d0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
a99e0 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  e = 0;.    struc
a99f0 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
a9a00 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
a9a10 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
a9a20 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
a9a30 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
a9a40 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
a9a50 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
a9a60 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
a9a70 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
a9a80 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
a9a90 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
a9aa0 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
a9ab0 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
a9ac0 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20  pkg_mode;.      
a9ad0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
a9ae0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
a9af0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
a9b00 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
a9b10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a9b20 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
a9b30 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
a9b40 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
a9b50 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a9b60 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
a9b70 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
a9b80 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
a9b90 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
a9ba0 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
a9bb0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
a9bc0 62 6c 6f 62 31 20 3d 20 28 75 6e 73 69 67 6e 65  blob1 = (unsigne
a9bd0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
a9be0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
a9bf0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 62 79 74 65  gv[0]);.    byte
a9c00 73 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  s1 = sqlite3_val
a9c10 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
a9c20 5d 29 3b 0a 20 20 20 20 67 65 6f 31 20 3d 0a 09  ]);.    geo1 =..
a9c30 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
a9c40 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 62 6c 6f  teBlobWkbEx (blo
a9c50 62 31 2c 20 62 79 74 65 73 31 2c 20 67 70 6b 67  b1, bytes1, gpkg
a9c60 5f 6d 6f 64 65 2c 20 67 70 6b 67 5f 61 6d 70 68  _mode, gpkg_amph
a9c70 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 62 6c 6f  ibious);.    blo
a9c80 62 32 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  b2 = (unsigned c
a9c90 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
a9ca0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
a9cb0 31 5d 29 3b 0a 20 20 20 20 62 79 74 65 73 32 20  1]);.    bytes2 
a9cc0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
a9cd0 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b  bytes (argv[1]);
a9ce0 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61 69  .    geo2 =..gai
a9cf0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
a9d00 6c 6f 62 57 6b 62 45 78 20 28 62 6c 6f 62 32 2c  lobWkbEx (blob2,
a9d10 20 62 79 74 65 73 32 2c 20 67 70 6b 67 5f 6d 6f   bytes2, gpkg_mo
a9d20 64 65 2c 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  de, gpkg_amphibi
a9d30 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
a9d40 65 6f 31 20 7c 7c 20 21 67 65 6f 32 29 0a 09 73  eo1 || !geo2)..s
a9d50 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a9d60 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
a9d70 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
a9d80 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20  {..  void *data 
a9d90 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
a9da0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ata (context);..
a9db0 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55    if (data != NU
a9dc0 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 74 20 3d  LL)..      ret =
a9dd0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 72 65   gaiaGeomCollPre
a9de0 70 61 72 65 64 43 6f 76 65 72 73 20 28 64 61 74  paredCovers (dat
a9df0 61 2c 20 67 65 6f 31 2c 0a 09 09 09 09 09 09 62  a, geo1,.......b
a9e00 6c 6f 62 31 2c 20 62 79 74 65 73 31 2c 20 67 65  lob1, bytes1, ge
a9e10 6f 32 2c 20 62 6c 6f 62 32 2c 0a 09 09 09 09 09  o2, blob2,......
a9e20 09 62 79 74 65 73 32 29 3b 0a 09 20 20 65 6c 73  .bytes2);..  els
a9e30 65 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20 67  e..      ret = g
a9e40 61 69 61 47 65 6f 6d 43 6f 6c 6c 43 6f 76 65 72  aiaGeomCollCover
a9e50 73 20 28 67 65 6f 31 2c 20 67 65 6f 32 29 3b 0a  s (geo1, geo2);.
a9e60 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
a9e70 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
a9e80 72 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ret);.      }.  
a9e90 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
a9ea0 6c 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20 20 67  ll (geo1);.    g
a9eb0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
a9ec0 28 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  (geo2);.}..stati
a9ed0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 6f 76 65  c void.fnct_Cove
a9ee0 72 65 64 42 79 20 28 73 71 6c 69 74 65 33 5f 63  redBy (sqlite3_c
a9ef0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
a9f00 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
a9f10 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
a9f20 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
a9f30 74 69 6f 6e 3a 0a 2f 20 43 6f 76 65 72 65 64 42  tion:./ CoveredB
a9f40 79 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  y(BLOBencoded ge
a9f50 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64  om1, BLOBencoded
a9f60 20 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75   geom2)././ retu
a9f70 72 6e 73 3a 0a 2f 20 31 20 69 66 20 47 45 4f 4d  rns:./ 1 if GEOM
a9f80 2d 31 20 69 73 20 22 73 70 61 74 69 61 6c 6c 79  -1 is "spatially
a9f90 20 63 6f 76 65 72 65 64 20 62 79 22 20 47 45 4f   covered by" GEO
a9fa0 4d 2d 32 0a 2f 20 30 20 6f 74 68 65 72 77 69 73  M-2./ 0 otherwis
a9fb0 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79  e./ or -1 if any
a9fc0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
a9fd0 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73  tered.*/.    uns
a9fe0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
a9ff0 31 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  1;.    unsigned 
aa000 63 68 61 72 20 2a 62 6c 6f 62 32 3b 0a 20 20 20  char *blob2;.   
aa010 20 69 6e 74 20 62 79 74 65 73 31 3b 0a 20 20 20   int bytes1;.   
aa020 20 69 6e 74 20 62 79 74 65 73 32 3b 0a 20 20 20   int bytes2;.   
aa030 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
aa040 20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo1 = NULL;.  
aa050 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
aa060 72 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20  r geo2 = NULL;. 
aa070 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
aa080 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
aa090 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
aa0a0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
aa0b0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
aa0c0 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
aa0d0 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
aa0e0 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
aa0f0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
aa100 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
aa110 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
aa120 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
aa130 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
aa140 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
aa150 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
aa160 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
aa170 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
aa180 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
aa190 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
aa1a0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
aa1b0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
aa1c0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
aa1d0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
aa1e0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
aa1f0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
aa200 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
aa210 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
aa220 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
aa230 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [1]) != SQLITE_B
aa240 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
aa250 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
aa260 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
aa270 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
aa280 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 31 20 3d     }.    blob1 =
aa290 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
aa2a0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
aa2b0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
aa2c0 0a 20 20 20 20 62 79 74 65 73 31 20 3d 20 73 71  .    bytes1 = sq
aa2d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
aa2e0 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
aa2f0 20 67 65 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f   geo1 =..gaiaFro
aa300 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
aa310 6b 62 45 78 20 28 62 6c 6f 62 31 2c 20 62 79 74  kbEx (blob1, byt
aa320 65 73 31 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20  es1, gpkg_mode, 
aa330 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
aa340 3b 0a 20 20 20 20 62 6c 6f 62 32 20 3d 20 28 75  ;.    blob2 = (u
aa350 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
aa360 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
aa370 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ob (argv[1]);.  
aa380 20 20 62 79 74 65 73 32 20 3d 20 73 71 6c 69 74    bytes2 = sqlit
aa390 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
aa3a0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65  argv[1]);.    ge
aa3b0 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  o2 =..gaiaFromSp
aa3c0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
aa3d0 78 20 28 62 6c 6f 62 32 2c 20 62 79 74 65 73 32  x (blob2, bytes2
aa3e0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 67 70 6b  , gpkg_mode, gpk
aa3f0 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
aa400 20 20 20 69 66 20 28 21 67 65 6f 31 20 7c 7c 20     if (!geo1 || 
aa410 21 67 65 6f 32 29 0a 09 73 71 6c 69 74 65 33 5f  !geo2)..sqlite3_
aa420 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
aa430 65 78 74 2c 20 2d 31 29 3b 0a 20 20 20 20 65 6c  ext, -1);.    el
aa440 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f  se.      {..  vo
aa450 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74  id *data = sqlit
aa460 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
aa470 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64  ntext);..  if (d
aa480 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ata != NULL)..  
aa490 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 47 65      ret = gaiaGe
aa4a0 6f 6d 43 6f 6c 6c 50 72 65 70 61 72 65 64 43 6f  omCollPreparedCo
aa4b0 76 65 72 65 64 42 79 20 28 64 61 74 61 2c 0a 09  veredBy (data,..
aa4c0 09 09 09 09 09 20 20 20 67 65 6f 31 2c 20 62 6c  .....   geo1, bl
aa4d0 6f 62 31 2c 20 62 79 74 65 73 31 2c 20 67 65 6f  ob1, bytes1, geo
aa4e0 32 2c 0a 09 09 09 09 09 09 20 20 20 62 6c 6f 62  2,.......   blob
aa4f0 32 2c 20 62 79 74 65 73 32 29 3b 0a 09 20 20 65  2, bytes2);..  e
aa500 6c 73 65 0a 09 20 20 20 20 20 20 72 65 74 20 3d  lse..      ret =
aa510 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 43 6f 76   gaiaGeomCollCov
aa520 65 72 65 64 42 79 20 28 67 65 6f 31 2c 20 67 65  eredBy (geo1, ge
aa530 6f 32 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  o2);..  sqlite3_
aa540 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
aa550 65 78 74 2c 20 72 65 74 29 3b 0a 20 20 20 20 20  ext, ret);.     
aa560 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
aa570 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a  eomColl (geo1);.
aa580 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
aa590 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a  Coll (geo2);.}..
aa5a0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
aa5b0 5f 4c 69 6e 65 49 6e 74 65 72 70 6f 6c 61 74 65  _LineInterpolate
aa5c0 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33 5f 63  Point (sqlite3_c
aa5d0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
aa5e0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
aa5f0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
aa600 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
aa610 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4c 69  L function:./ Li
aa620 6e 65 49 6e 74 65 72 70 6f 6c 61 74 65 50 6f 69  neInterpolatePoi
aa630 6e 74 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  nt(BLOBencoded g
aa640 65 6f 6d 65 74 72 79 31 2c 20 64 6f 75 62 6c 65  eometry1, double
aa650 20 66 72 61 63 74 69 6f 6e 29 0a 2f 0a 2f 20 72   fraction)././ r
aa660 65 74 75 72 6e 73 20 61 20 6e 65 77 20 67 65 6f  eturns a new geo
aa670 6d 65 74 72 79 20 72 65 70 72 65 73 65 6e 74 69  metry representi
aa680 6e 67 20 61 20 70 6f 69 6e 74 20 69 6e 74 65 72  ng a point inter
aa690 70 6f 6c 61 74 65 64 20 61 6c 6f 6e 67 20 61 20  polated along a 
aa6a0 6c 69 6e 65 0a 2f 20 5b 61 20 4c 49 4e 45 53 54  line./ [a LINEST
aa6b0 52 49 4e 47 20 69 73 20 65 78 70 65 63 74 65 64  RING is expected
aa6c0 20 2f 20 66 72 61 63 74 69 6f 6e 20 72 61 6e 67   / fraction rang
aa6d0 69 6e 67 20 66 72 6f 6d 20 30 2e 30 20 74 6f 20  ing from 0.0 to 
aa6e0 31 2e 30 5d 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  1.0]./ or NULL i
aa6f0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
aa700 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
aa710 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
aa720 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
aa730 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e   n_bytes;.    in
aa740 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  t int_value;.   
aa750 20 64 6f 75 62 6c 65 20 66 72 61 63 74 69 6f 6e   double fraction
aa760 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
aa770 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c  llPtr geo = NULL
aa780 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
aa790 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20  llPtr result;.  
aa7a0 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
aa7b0 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
aa7c0 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
aa7d0 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
aa7e0 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
aa7f0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
aa800 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
aa810 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
aa820 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
aa830 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
aa840 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
aa850 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
aa860 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
aa870 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
aa880 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
aa890 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
aa8a0 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
aa8b0 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
aa8c0 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
aa8d0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
aa8e0 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
aa8f0 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
aa900 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
aa910 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
aa920 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
aa930 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
aa940 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
aa950 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
aa960 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
aa970 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
aa980 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
aa990 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [1]) == SQLITE_F
aa9a0 4c 4f 41 54 29 0a 09 66 72 61 63 74 69 6f 6e 20  LOAT)..fraction 
aa9b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
aa9c0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d 29  double (argv[1])
aa9d0 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
aa9e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
aa9f0 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
aaa00 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
aaa10 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61       {..  int_va
aaa20 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
aaa30 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
aaa40 29 3b 0a 09 20 20 66 72 61 63 74 69 6f 6e 20 3d  );..  fraction =
aaa50 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
aaa60 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
aaa70 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
aaa80 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
aaa90 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
aaaa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
aaab0 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
aaac0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
aaad0 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
aaae0 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
aaaf0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
aab00 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
aab10 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67  ]);.    geo =..g
aab20 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
aab30 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
aab40 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
aab50 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
aab60 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
aab70 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d  );.    if (geo =
aab80 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
aab90 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
aaba0 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
aabb0 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64  .      {..  void
aabc0 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
aabd0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
aabe0 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74  ext);..  if (dat
aabf0 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
aac00 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 4c    result = gaiaL
aac10 69 6e 65 49 6e 74 65 72 70 6f 6c 61 74 65 50 6f  ineInterpolatePo
aac20 69 6e 74 5f 72 20 28 64 61 74 61 2c 20 67 65 6f  int_r (data, geo
aac30 2c 20 66 72 61 63 74 69 6f 6e 29 3b 0a 09 20 20  , fraction);..  
aac40 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 73 75  else..      resu
aac50 6c 74 20 3d 20 67 61 69 61 4c 69 6e 65 49 6e 74  lt = gaiaLineInt
aac60 65 72 70 6f 6c 61 74 65 50 6f 69 6e 74 20 28 67  erpolatePoint (g
aac70 65 6f 2c 20 66 72 61 63 74 69 6f 6e 29 3b 0a 09  eo, fraction);..
aac80 20 20 69 66 20 28 21 72 65 73 75 6c 74 29 0a 09    if (!result)..
aac90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
aaca0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
aacb0 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  xt);..  else..  
aacc0 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20    {.../* builds 
aacd0 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72  the BLOB geometr
aace0 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  y to be returned
aacf0 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09   */...int len;..
aad00 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
aad10 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
aad20 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20  ...result->Srid 
aad30 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67  = geo->Srid;...g
aad40 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
aad50 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c  lobWkbEx2 (resul
aad60 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c  t, &p_result, &l
aad70 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b  en,......    gpk
aad80 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69  g_mode, tiny_poi
aad90 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  nt);...sqlite3_r
aada0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
aadb0 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
aadc0 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69  en, free);...gai
aadd0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72  aFreeGeomColl (r
aade0 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20  esult);..    }. 
aadf0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
aae00 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
aae10 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
aae20 64 0a 66 6e 63 74 5f 4c 69 6e 65 49 6e 74 65 72  d.fnct_LineInter
aae30 70 6f 6c 61 74 65 45 71 75 69 64 69 73 74 61 6e  polateEquidistan
aae40 74 50 6f 69 6e 74 73 20 28 73 71 6c 69 74 65 33  tPoints (sqlite3
aae50 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
aae60 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
aae70 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  ..       sqlite3
aae80 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
aae90 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
aaea0 6e 3a 0a 2f 20 4c 69 6e 65 49 6e 74 65 72 70 6f  n:./ LineInterpo
aaeb0 6c 61 74 65 45 71 75 69 64 69 73 74 61 6e 74 50  lateEquidistantP
aaec0 6f 69 6e 74 53 28 42 4c 4f 42 65 6e 63 6f 64 65  ointS(BLOBencode
aaed0 64 20 67 65 6f 6d 65 74 72 79 31 2c 20 64 6f 75  d geometry1, dou
aaee0 62 6c 65 20 64 69 73 74 61 6e 63 65 29 0a 2f 0a  ble distance)./.
aaef0 2f 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  / returns a new 
aaf00 67 65 6f 6d 65 74 72 79 20 72 65 70 72 65 73 65  geometry represe
aaf10 6e 74 69 6e 67 20 61 20 70 6f 69 6e 74 20 69 6e  nting a point in
aaf20 74 65 72 70 6f 6c 61 74 65 64 20 61 6c 6f 6e 67  terpolated along
aaf30 20 61 20 6c 69 6e 65 0a 2f 20 5b 61 20 4c 49 4e   a line./ [a LIN
aaf40 45 53 54 52 49 4e 47 20 69 73 20 65 78 70 65 63  ESTRING is expec
aaf50 74 65 64 20 2f 20 66 72 61 63 74 69 6f 6e 20 72  ted / fraction r
aaf60 61 6e 67 69 6e 67 20 66 72 6f 6d 20 30 2e 30 20  anging from 0.0 
aaf70 74 6f 20 31 2e 30 5d 0a 2f 20 6f 72 20 4e 55 4c  to 1.0]./ or NUL
aaf80 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
aaf90 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
aafa0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
aafb0 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
aafc0 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
aafd0 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
aafe0 20 20 20 20 64 6f 75 62 6c 65 20 64 69 73 74 61      double dista
aaff0 6e 63 65 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  nce;.    gaiaGeo
ab000 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e  mCollPtr geo = N
ab010 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
ab020 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b  mCollPtr result;
ab030 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
ab040 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
ab050 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
ab060 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
ab070 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
ab080 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
ab090 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
ab0a0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
ab0b0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
ab0c0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
ab0d0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
ab0e0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
ab0f0 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
ab100 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
ab110 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
ab120 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
ab130 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
ab140 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
ab150 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
ab160 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
ab170 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
ab180 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
ab190 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
ab1a0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
ab1b0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
ab1c0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
ab1d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ab1e0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
ab1f0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
ab200 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
ab210 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
ab220 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
ab230 45 5f 46 4c 4f 41 54 29 0a 09 64 69 73 74 61 6e  E_FLOAT)..distan
ab240 63 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ce = sqlite3_val
ab250 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
ab260 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  1]);.    else if
ab270 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
ab280 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
ab290 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
ab2a0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
ab2b0 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
ab2c0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
ab2d0 5b 31 5d 29 3b 0a 09 20 20 64 69 73 74 61 6e 63  [1]);..  distanc
ab2e0 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  e = int_value;. 
ab2f0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
ab300 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
ab310 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
ab320 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
ab330 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
ab340 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
ab350 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
ab360 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
ab370 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
ab380 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
ab390 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
ab3a0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
ab3b0 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
ab3c0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
ab3d0 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
ab3e0 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
ab3f0 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
ab400 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65  ous);.    if (ge
ab410 6f 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69  o == NULL)..sqli
ab420 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
ab430 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
ab440 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76  lse.      {..  v
ab450 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69  oid *data = sqli
ab460 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
ab470 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28  ontext);..  if (
ab480 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  data != NULL).. 
ab490 20 20 20 20 20 72 65 73 75 6c 74 20 3d 0a 09 09       result =...
ab4a0 20 20 67 61 69 61 4c 69 6e 65 49 6e 74 65 72 70    gaiaLineInterp
ab4b0 6f 6c 61 74 65 45 71 75 69 64 69 73 74 61 6e 74  olateEquidistant
ab4c0 50 6f 69 6e 74 73 5f 72 20 28 64 61 74 61 2c 20  Points_r (data, 
ab4d0 67 65 6f 2c 20 64 69 73 74 61 6e 63 65 29 3b 0a  geo, distance);.
ab4e0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72  .  else..      r
ab4f0 65 73 75 6c 74 20 3d 20 67 61 69 61 4c 69 6e 65  esult = gaiaLine
ab500 49 6e 74 65 72 70 6f 6c 61 74 65 45 71 75 69 64  InterpolateEquid
ab510 69 73 74 61 6e 74 50 6f 69 6e 74 73 20 28 67 65  istantPoints (ge
ab520 6f 2c 20 64 69 73 74 61 6e 63 65 29 3b 0a 09 20  o, distance);.. 
ab530 20 69 66 20 28 21 72 65 73 75 6c 74 29 0a 09 20   if (!result).. 
ab540 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
ab550 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
ab560 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  t);..  else..   
ab570 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74   {.../* builds t
ab580 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79  he BLOB geometry
ab590 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
ab5a0 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09  */...int len;...
ab5b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
ab5c0 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  _result = NULL;.
ab5d0 09 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d  ..result->Srid =
ab5e0 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61   geo->Srid;...ga
ab5f0 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
ab600 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74  obWkbEx2 (result
ab610 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
ab620 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67  n,......    gpkg
ab630 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e  _mode, tiny_poin
ab640 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  t);...sqlite3_re
ab650 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
ab660 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
ab670 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61  n, free);...gaia
ab680 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65  FreeGeomColl (re
ab690 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20  sult);..    }.  
ab6a0 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
ab6b0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
ab6c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ab6d0 0a 66 6e 63 74 5f 4c 69 6e 65 4c 6f 63 61 74 65  .fnct_LineLocate
ab6e0 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33 5f 63  Point (sqlite3_c
ab6f0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
ab700 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20  , int argc,...  
ab710 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
ab720 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
ab730 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
ab740 4c 69 6e 65 4c 6f 63 61 74 65 50 6f 69 6e 74 28  LineLocatePoint(
ab750 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
ab760 65 74 72 79 31 2c 20 42 4c 4f 42 65 6e 63 6f 64  etry1, BLOBencod
ab770 65 64 20 67 65 6f 6d 65 74 72 79 32 29 0a 2f 0a  ed geometry2)./.
ab780 2f 20 72 65 74 75 72 6e 20 61 20 6e 75 6d 62 65  / return a numbe
ab790 72 20 28 62 65 74 77 65 65 6e 20 30 2e 30 20 61  r (between 0.0 a
ab7a0 6e 64 20 31 2e 30 29 20 72 65 70 72 65 73 65 6e  nd 1.0) represen
ab7b0 74 69 6e 67 20 74 68 65 20 6c 6f 63 61 74 69 6f  ting the locatio
ab7c0 6e 20 0a 2f 20 6f 66 20 74 68 65 20 63 6c 6f 73  n ./ of the clos
ab7d0 65 73 74 20 70 6f 69 6e 74 20 6f 6e 20 4c 69 6e  est point on Lin
ab7e0 65 53 74 72 69 6e 67 20 74 6f 20 74 68 65 20 67  eString to the g
ab7f0 69 76 65 6e 20 50 6f 69 6e 74 2c 20 61 73 20 61  iven Point, as a
ab800 20 66 72 61 63 74 69 6f 6e 20 0a 2f 20 6f 66 20   fraction ./ of 
ab810 74 6f 74 61 6c 20 32 64 20 6c 69 6e 65 20 6c 65  total 2d line le
ab820 6e 67 74 68 0a 2f 0a 2f 20 2d 20 67 65 6f 6d 31  ngth././ - geom1
ab830 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
ab840 72 65 70 72 65 73 65 6e 74 20 73 6f 6d 65 20 4c  represent some L
ab850 49 4e 45 53 54 52 49 4e 47 0a 2f 20 2d 20 67 65  INESTRING./ - ge
ab860 6f 6d 32 20 69 73 20 65 78 70 65 63 74 65 64 20  om2 is expected 
ab870 74 6f 20 72 65 70 72 65 73 65 6e 74 20 73 6f 6d  to represent som
ab880 65 20 50 4f 49 4e 54 0a 2a 2f 0a 20 20 20 20 75  e POINT.*/.    u
ab890 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
ab8a0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
ab8b0 62 79 74 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c  bytes;.    doubl
ab8c0 65 20 66 72 61 63 74 69 6f 6e 3b 0a 20 20 20 20  e fraction;.    
ab8d0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
ab8e0 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  geo1 = NULL;.   
ab8f0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
ab900 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo2 = NULL;.  
ab910 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
ab920 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
ab930 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
ab940 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
ab950 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
ab960 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
ab970 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
ab980 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
ab990 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
ab9a0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
ab9b0 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
ab9c0 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
ab9d0 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
ab9e0 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
ab9f0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
aba00 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
aba10 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
aba20 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
aba30 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
aba40 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
aba50 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
aba60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
aba70 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
aba80 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
aba90 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
abaa0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
abab0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
abac0 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  1]) != SQLITE_BL
abad0 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
abae0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
abaf0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
abb00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
abb10 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
abb20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
abb30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
abb40 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
abb50 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
abb60 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
abb70 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
abb80 65 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  eo1 =..gaiaFromS
abb90 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
abba0 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
abbb0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
abbc0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
abbd0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 70  phibious);.    p
abbe0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
abbf0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
abc00 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
abc10 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[1]);.    n_by
abc20 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
abc30 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
abc40 31 5d 29 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a  1]);.    geo2 =.
abc50 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
abc60 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
abc70 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
abc80 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
abc90 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
abca0 75 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  us);.    if (geo
abcb0 31 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 67 65 6f  1 == NULL || geo
abcc0 32 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69  2 == NULL)..sqli
abcd0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
abce0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
abcf0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76  lse.      {..  v
abd00 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69  oid *data = sqli
abd10 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
abd20 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28  ontext);..  if (
abd30 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  data != NULL).. 
abd40 20 20 20 20 20 66 72 61 63 74 69 6f 6e 20 3d 20       fraction = 
abd50 67 61 69 61 4c 69 6e 65 4c 6f 63 61 74 65 50 6f  gaiaLineLocatePo
abd60 69 6e 74 5f 72 20 28 64 61 74 61 2c 20 67 65 6f  int_r (data, geo
abd70 31 2c 20 67 65 6f 32 29 3b 0a 09 20 20 65 6c 73  1, geo2);..  els
abd80 65 0a 09 20 20 20 20 20 20 66 72 61 63 74 69 6f  e..      fractio
abd90 6e 20 3d 20 67 61 69 61 4c 69 6e 65 4c 6f 63 61  n = gaiaLineLoca
abda0 74 65 50 6f 69 6e 74 20 28 67 65 6f 31 2c 20 67  tePoint (geo1, g
abdb0 65 6f 32 29 3b 0a 09 20 20 69 66 20 28 66 72 61  eo2);..  if (fra
abdc0 63 74 69 6f 6e 20 3e 3d 20 30 2e 30 20 26 26 20  ction >= 0.0 && 
abdd0 66 72 61 63 74 69 6f 6e 20 3c 3d 20 31 2e 30 29  fraction <= 1.0)
abde0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
abdf0 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63  result_double (c
abe00 6f 6e 74 65 78 74 2c 20 66 72 61 63 74 69 6f 6e  ontext, fraction
abe10 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
abe20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
abe30 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
abe40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
abe50 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
abe60 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46 72  eo1);.    gaiaFr
abe70 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32  eeGeomColl (geo2
abe80 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
abe90 64 0a 66 6e 63 74 5f 4c 69 6e 65 53 75 62 73 74  d.fnct_LineSubst
abea0 72 69 6e 67 20 28 73 71 6c 69 74 65 33 5f 63 6f  ring (sqlite3_co
abeb0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
abec0 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
abed0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
abee0 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
abef0 69 6f 6e 3a 0a 2f 20 4c 69 6e 65 53 75 62 73 74  ion:./ LineSubst
abf00 72 69 6e 67 28 42 4c 4f 42 65 6e 63 6f 64 65 64  ring(BLOBencoded
abf10 20 67 65 6f 6d 65 74 72 79 31 2c 20 64 6f 75 62   geometry1, doub
abf20 6c 65 20 73 74 61 72 74 5f 66 72 61 63 74 69 6f  le start_fractio
abf30 6e 2c 20 64 6f 75 62 6c 65 20 65 6e 64 5f 66 72  n, double end_fr
abf40 61 63 74 69 6f 6e 29 0a 2f 0a 2f 20 52 65 74 75  action)././ Retu
abf50 72 6e 20 61 20 4c 69 6e 65 73 74 72 69 6e 67 20  rn a Linestring 
abf60 62 65 69 6e 67 20 61 20 73 75 62 73 74 72 69 6e  being a substrin
abf70 67 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6f  g of the input o
abf80 6e 65 20 73 74 61 72 74 69 6e 67 20 61 6e 64 20  ne starting and 
abf90 65 6e 64 69 6e 67 20 61 74 20 0a 2f 20 74 68 65  ending at ./ the
abfa0 20 67 69 76 65 6e 20 66 72 61 63 74 69 6f 6e 73   given fractions
abfb0 20 6f 66 20 74 6f 74 61 6c 20 32 64 20 6c 65 6e   of total 2d len
abfc0 67 74 68 20 5b 66 72 61 63 74 69 6f 6e 73 20 72  gth [fractions r
abfd0 61 6e 67 69 6e 67 20 66 72 6f 6d 20 30 2e 30 20  anging from 0.0 
abfe0 74 6f 20 31 2e 30 5d 0a 2f 20 6f 72 20 4e 55 4c  to 1.0]./ or NUL
abff0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
ac000 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
ac010 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
ac020 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
ac030 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
ac040 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
ac050 20 20 20 20 64 6f 75 62 6c 65 20 66 72 61 63 74      double fract
ac060 69 6f 6e 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  ion1;.    double
ac070 20 66 72 61 63 74 69 6f 6e 32 3b 0a 20 20 20 20   fraction2;.    
ac080 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
ac090 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
ac0a0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
ac0b0 72 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  result;.    int 
ac0c0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
ac0d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
ac0e0 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
ac0f0 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
ac100 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
ac110 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
ac120 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
ac130 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
ac140 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
ac150 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
ac160 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
ac170 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
ac180 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
ac190 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
ac1a0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
ac1b0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
ac1c0 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
ac1d0 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
ac1e0 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
ac1f0 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
ac200 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
ac210 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
ac220 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
ac230 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
ac240 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
ac250 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
ac260 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
ac270 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
ac280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
ac290 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
ac2a0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
ac2b0 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
ac2c0 09 66 72 61 63 74 69 6f 6e 31 20 3d 20 73 71 6c  .fraction1 = sql
ac2d0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
ac2e0 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  e (argv[1]);.   
ac2f0 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
ac300 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
ac310 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
ac320 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
ac330 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
ac340 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
ac350 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
ac360 20 66 72 61 63 74 69 6f 6e 31 20 3d 20 69 6e 74   fraction1 = int
ac370 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
ac380 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
ac390 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
ac3a0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
ac3b0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
ac3c0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
ac3d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
ac3e0 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
ac3f0 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 66 72 61  LITE_FLOAT)..fra
ac400 63 74 69 6f 6e 32 20 3d 20 73 71 6c 69 74 65 33  ction2 = sqlite3
ac410 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
ac420 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[2]);.    els
ac430 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
ac440 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
ac450 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
ac460 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
ac470 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
ac480 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
ac490 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 66 72 61  argv[2]);..  fra
ac4a0 63 74 69 6f 6e 32 20 3d 20 69 6e 74 5f 76 61 6c  ction2 = int_val
ac4b0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
ac4c0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
ac4d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ac4e0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
ac4f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ac500 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
ac510 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
ac520 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
ac530 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
ac540 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
ac550 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
ac560 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
ac570 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
ac580 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
ac590 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
ac5a0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
ac5b0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
ac5c0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
ac5d0 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a  f (geo == NULL).
ac5e0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
ac5f0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
ac600 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
ac610 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  ..  void *data =
ac620 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
ac630 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ta (context);.. 
ac640 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c   if (data != NUL
ac650 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74  L)..      result
ac660 20 3d 20 67 61 69 61 4c 69 6e 65 53 75 62 73 74   = gaiaLineSubst
ac670 72 69 6e 67 5f 72 20 28 64 61 74 61 2c 20 67 65  ring_r (data, ge
ac680 6f 2c 20 66 72 61 63 74 69 6f 6e 31 2c 20 66 72  o, fraction1, fr
ac690 61 63 74 69 6f 6e 32 29 3b 0a 09 20 20 65 6c 73  action2);..  els
ac6a0 65 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20  e..      result 
ac6b0 3d 20 67 61 69 61 4c 69 6e 65 53 75 62 73 74 72  = gaiaLineSubstr
ac6c0 69 6e 67 20 28 67 65 6f 2c 20 66 72 61 63 74 69  ing (geo, fracti
ac6d0 6f 6e 31 2c 20 66 72 61 63 74 69 6f 6e 32 29 3b  on1, fraction2);
ac6e0 0a 09 20 20 69 66 20 28 21 72 65 73 75 6c 74 29  ..  if (!result)
ac6f0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
ac700 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
ac710 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
ac720 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64      {.../* build
ac730 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65  s the BLOB geome
ac740 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e  try to be return
ac750 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b  ed */...int len;
ac760 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
ac770 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
ac780 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69  L;...result->Sri
ac790 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09  d = geo->Srid;..
ac7a0 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74  .gaiaToSpatiaLit
ac7b0 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73  eBlobWkbEx2 (res
ac7c0 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  ult, &p_result, 
ac7d0 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67  &len,......    g
ac7e0 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70  pkg_mode, tiny_p
ac7f0 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33  oint);...sqlite3
ac800 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
ac810 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
ac820 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67   len, free);...g
ac830 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
ac840 28 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d  (result);..    }
ac850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
ac860 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
ac870 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  eo);.}..static v
ac880 6f 69 64 0a 66 6e 63 74 5f 43 6c 6f 73 65 73 74  oid.fnct_Closest
ac890 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33 5f 63  Point (sqlite3_c
ac8a0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
ac8b0 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
ac8c0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
ac8d0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
ac8e0 74 69 6f 6e 3a 0a 2f 20 43 6c 6f 73 65 73 74 50  tion:./ ClosestP
ac8f0 6f 69 6e 74 28 42 4c 4f 42 65 6e 63 6f 64 65 64  oint(BLOBencoded
ac900 20 67 65 6f 6d 65 74 72 79 31 2c 20 42 4c 4f 42   geometry1, BLOB
ac910 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
ac920 32 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74  2)././ Returns t
ac930 68 65 20 50 6f 69 6e 74 20 6f 6e 20 67 65 6f 6d  he Point on geom
ac940 31 20 74 68 61 74 20 69 73 20 63 6c 6f 73 65 73  1 that is closes
ac950 74 20 74 6f 20 67 65 6f 6d 32 0a 2f 20 4e 55 4c  t to geom2./ NUL
ac960 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f  L is returned fo
ac970 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
ac980 6e 74 73 20 28 6f 72 20 69 66 20 64 69 73 74 61  nts (or if dista
ac990 6e 63 65 20 69 73 20 5a 45 52 4f 29 0a 2a 2f 0a  nce is ZERO).*/.
ac9a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
ac9b0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
ac9c0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
ac9d0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
ac9e0 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  geo1 = NULL;.   
ac9f0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
aca00 20 67 65 6f 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geo2 = NULL;.  
aca10 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
aca20 72 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e  r result;.    in
aca30 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
aca40 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
aca50 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
aca60 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
aca70 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
aca80 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
aca90 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
acaa0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
acab0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
acac0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
acad0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
acae0 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
acaf0 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
acb00 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
acb10 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
acb20 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
acb30 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
acb40 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
acb50 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
acb60 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
acb70 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
acb80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
acb90 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
acba0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
acbb0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
acbc0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
acbd0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
acbe0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
acbf0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
acc00 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
acc10 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
acc20 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
acc30 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
acc40 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
acc50 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
acc60 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
acc70 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
acc80 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
acc90 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
acca0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
accb0 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
accc0 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
accd0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 31  gv[0]);.    geo1
acce0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
accf0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
acd00 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
acd10 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
acd20 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
acd30 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c  bious);.    p_bl
acd40 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
acd50 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
acd60 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
acd70 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  1]);.    n_bytes
acd80 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
acd90 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
acda0 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09 67 61  ;.    geo2 =..ga
acdb0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
acdc0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
acdd0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
acde0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
acdf0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
ace00 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 31 20 3d  ;.    if (geo1 =
ace10 3d 20 4e 55 4c 4c 20 7c 7c 20 67 65 6f 32 20 3d  = NULL || geo2 =
ace20 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
ace30 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
ace40 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
ace50 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64  .      {..  void
ace60 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33   *data = sqlite3
ace70 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
ace80 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74  ext);..  if (dat
ace90 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  a != NULL)..    
acea0 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 53    result = gaiaS
aceb0 68 6f 72 74 65 73 74 4c 69 6e 65 5f 72 20 28 64  hortestLine_r (d
acec0 61 74 61 2c 20 67 65 6f 31 2c 20 67 65 6f 32 29  ata, geo1, geo2)
aced0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
acee0 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 53 68   result = gaiaSh
acef0 6f 72 74 65 73 74 4c 69 6e 65 20 28 67 65 6f 31  ortestLine (geo1
acf00 2c 20 67 65 6f 32 29 3b 0a 09 20 20 69 66 20 28  , geo2);..  if (
acf10 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a  result == NULL).
acf20 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
acf30 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
acf40 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  ext);..  else if
acf50 20 28 72 65 73 75 6c 74 2d 3e 46 69 72 73 74 4c   (result->FirstL
acf60 69 6e 65 73 74 72 69 6e 67 20 3d 3d 20 4e 55 4c  inestring == NUL
acf70 4c 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61  L)..    {...gaia
acf80 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65  FreeGeomColl (re
acf90 73 75 6c 74 29 3b 0a 09 09 73 71 6c 69 74 65 33  sult);...sqlite3
acfa0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
acfb0 6e 74 65 78 74 29 3b 0a 09 20 20 20 20 7d 0a 09  ntext);..    }..
acfc0 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
acfd0 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c  /* builds the BL
acfe0 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62  OB geometry to b
acff0 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09  e returned */...
ad000 64 6f 75 62 6c 65 20 78 3b 0a 09 09 64 6f 75 62  double x;...doub
ad010 6c 65 20 79 3b 0a 09 09 64 6f 75 62 6c 65 20 7a  le y;...double z
ad020 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 3b 0a 09 09  ;...double m;...
ad030 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67  int len;...unsig
ad040 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75  ned char *p_resu
ad050 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 67 61 69  lt = NULL;...gai
ad060 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 70 74 20  aGeomCollPtr pt 
ad070 3d 20 4e 55 4c 4c 3b 0a 09 09 67 61 69 61 4c 69  = NULL;...gaiaLi
ad080 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 6e 20 3d  nestringPtr ln =
ad090 20 72 65 73 75 6c 74 2d 3e 46 69 72 73 74 4c 69   result->FirstLi
ad0a0 6e 65 73 74 72 69 6e 67 3b 0a 09 09 69 66 20 28  nestring;...if (
ad0b0 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ln->DimensionMod
ad0c0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
ad0d0 0a 09 09 20 20 20 20 70 74 20 3d 20 67 61 69 61  ...    pt = gaia
ad0e0 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a  AllocGeomCollXYZ
ad0f0 20 28 29 3b 0a 09 09 65 6c 73 65 20 69 66 20 28   ();...else if (
ad100 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ln->DimensionMod
ad110 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
ad120 0a 09 09 20 20 20 20 70 74 20 3d 20 67 61 69 61  ...    pt = gaia
ad130 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 4d  AllocGeomCollXYM
ad140 20 28 29 3b 0a 09 09 65 6c 73 65 20 69 66 20 28   ();...else if (
ad150 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ln->DimensionMod
ad160 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
ad170 4d 29 0a 09 09 20 20 20 20 70 74 20 3d 20 67 61  M)...    pt = ga
ad180 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58  iaAllocGeomCollX
ad190 59 5a 4d 20 28 29 3b 0a 09 09 65 6c 73 65 0a 09  YZM ();...else..
ad1a0 09 20 20 20 20 70 74 20 3d 20 67 61 69 61 41 6c  .    pt = gaiaAl
ad1b0 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a  locGeomColl ();.
ad1c0 09 09 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73  ..if (ln->Dimens
ad1d0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
ad1e0 5f 58 59 5f 5a 29 0a 09 09 20 20 7b 0a 09 09 20  _XY_Z)...  {... 
ad1f0 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e       gaiaGetPoin
ad200 74 58 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73  tXYZ (ln->Coords
ad210 2c 20 30 2c 20 26 78 2c 20 26 79 2c 20 26 7a 29  , 0, &x, &y, &z)
ad220 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 41 64  ;...      gaiaAd
ad230 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
ad240 58 59 5a 20 28 70 74 2c 20 78 2c 20 79 2c 20 7a  XYZ (pt, x, y, z
ad250 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20  );...  }...else 
ad260 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f  if (ln->Dimensio
ad270 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
ad280 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  Y_M)...  {...   
ad290 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58     gaiaGetPointX
ad2a0 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  YM (ln->Coords, 
ad2b0 30 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a  0, &x, &y, &m);.
ad2c0 09 09 20 20 20 20 20 20 67 61 69 61 41 64 64 50  ..      gaiaAddP
ad2d0 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59  ointToGeomCollXY
ad2e0 4d 20 28 70 74 2c 20 78 2c 20 79 2c 20 6d 29 3b  M (pt, x, y, m);
ad2f0 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66  ...  }...else if
ad300 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d   (ln->DimensionM
ad310 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
ad320 5a 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  Z_M)...  {...   
ad330 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58     gaiaGetPointX
ad340 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c  YZM (ln->Coords,
ad350 20 30 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20   0, &x, &y, &z, 
ad360 26 6d 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69  &m);...      gai
ad370 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43  aAddPointToGeomC
ad380 6f 6c 6c 58 59 5a 4d 20 28 70 74 2c 20 78 2c 20  ollXYZM (pt, x, 
ad390 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 20 20 7d 0a  y, z, m);...  }.
ad3a0 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20  ..else...  {... 
ad3b0 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e       gaiaGetPoin
ad3c0 74 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 30  t (ln->Coords, 0
ad3d0 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 20 20 20  , &x, &y);...   
ad3e0 20 20 20 67 61 69 61 41 64 64 50 6f 69 6e 74 54     gaiaAddPointT
ad3f0 6f 47 65 6f 6d 43 6f 6c 6c 20 28 70 74 2c 20 78  oGeomColl (pt, x
ad400 2c 20 79 29 3b 0a 09 09 20 20 7d 0a 09 09 70 74  , y);...  }...pt
ad410 2d 3e 53 72 69 64 20 3d 20 67 65 6f 31 2d 3e 53  ->Srid = geo1->S
ad420 72 69 64 3b 0a 09 09 67 61 69 61 54 6f 53 70 61  rid;...gaiaToSpa
ad430 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
ad440 32 20 28 70 74 2c 20 26 70 5f 72 65 73 75 6c 74  2 (pt, &p_result
ad450 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64  , &len, gpkg_mod
ad460 65 2c 0a 09 09 09 09 09 20 20 20 20 74 69 6e 79  e,......    tiny
ad470 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74  _point);...sqlit
ad480 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
ad490 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c  context, p_resul
ad4a0 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09  t, len, free);..
ad4b0 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c  .gaiaFreeGeomCol
ad4c0 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 09 67 61  l (result);...ga
ad4d0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
ad4e0 70 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  pt);..    }.    
ad4f0 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
ad500 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31 29 3b  GeomColl (geo1);
ad510 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f  .    gaiaFreeGeo
ad520 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a  mColl (geo2);.}.
ad530 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
ad540 74 5f 53 68 6f 72 74 65 73 74 4c 69 6e 65 20 28  t_ShortestLine (
ad550 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ad560 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
ad570 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
ad580 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
ad590 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
ad5a0 20 53 68 6f 72 74 65 73 74 4c 69 6e 65 28 42 4c   ShortestLine(BL
ad5b0 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  OBencoded geomet
ad5c0 72 79 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64  ry1, BLOBencoded
ad5d0 20 67 65 6f 6d 65 74 72 79 32 29 0a 2f 0a 2f 20   geometry2)././ 
ad5e0 52 65 74 75 72 6e 73 20 74 68 65 20 73 68 6f 72  Returns the shor
ad5f0 74 65 73 74 20 6c 69 6e 65 20 62 65 74 77 65 65  test line betwee
ad600 6e 20 74 77 6f 20 67 65 6f 6d 65 74 72 69 65 73  n two geometries
ad610 0a 2f 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ./ NULL is retur
ad620 6e 65 64 20 66 6f 72 20 69 6e 76 61 6c 69 64 20  ned for invalid 
ad630 61 72 67 75 6d 65 6e 74 73 20 28 6f 72 20 69 66  arguments (or if
ad640 20 64 69 73 74 61 6e 63 65 20 69 73 20 5a 45 52   distance is ZER
ad650 4f 29 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  O).*/.    unsign
ad660 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b  ed char *p_blob;
ad670 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73  .    int n_bytes
ad680 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
ad690 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c  llPtr geo1 = NUL
ad6a0 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
ad6b0 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55  ollPtr geo2 = NU
ad6c0 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
ad6d0 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
ad6e0 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
ad6f0 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
ad700 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
ad710 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
ad720 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
ad730 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
ad740 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
ad750 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
ad760 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
ad770 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
ad780 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
ad790 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
ad7a0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
ad7b0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
ad7c0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
ad7d0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
ad7e0 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
ad7f0 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
ad800 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
ad810 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
ad820 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
ad830 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
ad840 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
ad850 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
ad860 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
ad870 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
ad880 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ad890 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
ad8a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ad8b0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
ad8c0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
ad8d0 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
ad8e0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
ad8f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ad900 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
ad910 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
ad920 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
ad930 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
ad940 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
ad950 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
ad960 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
ad970 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
ad980 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
ad990 20 20 67 65 6f 31 20 3d 0a 09 67 61 69 61 46 72    geo1 =..gaiaFr
ad9a0 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
ad9b0 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
ad9c0 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
ad9d0 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
ad9e0 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
ad9f0 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
ada00 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
ada10 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
ada20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e  (argv[1]);.    n
ada30 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
ada40 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
ada50 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f 32  gv[1]);.    geo2
ada60 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
ada70 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
ada80 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
ada90 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
adaa0 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
adab0 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
adac0 67 65 6f 31 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  geo1 == NULL || 
adad0 67 65 6f 32 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73  geo2 == NULL)..s
adae0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
adaf0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
adb00 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
adb10 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73    void *data = s
adb20 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
adb30 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 69   (context);..  i
adb40 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29  f (data != NULL)
adb50 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  ..      result =
adb60 20 67 61 69 61 53 68 6f 72 74 65 73 74 4c 69 6e   gaiaShortestLin
adb70 65 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 31 2c  e_r (data, geo1,
adb80 20 67 65 6f 32 29 3b 0a 09 20 20 65 6c 73 65 0a   geo2);..  else.
adb90 09 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
adba0 67 61 69 61 53 68 6f 72 74 65 73 74 4c 69 6e 65  gaiaShortestLine
adbb0 20 28 67 65 6f 31 2c 20 67 65 6f 32 29 3b 0a 09   (geo1, geo2);..
adbc0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
adbd0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
adbe0 0a 09 20 20 69 66 20 28 21 72 65 73 75 6c 74 29  ..  if (!result)
adbf0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
adc00 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
adc10 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
adc20 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64      {.../* build
adc30 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65  s the BLOB geome
adc40 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e  try to be return
adc50 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b  ed */...int len;
adc60 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
adc70 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
adc80 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69  L;...result->Sri
adc90 64 20 3d 20 67 65 6f 31 2d 3e 53 72 69 64 3b 0a  d = geo1->Srid;.
adca0 09 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69  ..gaiaToSpatiaLi
adcb0 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65  teBlobWkbEx2 (re
adcc0 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c  sult, &p_result,
adcd0 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20 20   &len,......    
adce0 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f  gpkg_mode, tiny_
adcf0 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65  point);...sqlite
add00 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
add10 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
add20 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09  , len, free);...
add30 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
add40 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20   (result);..    
add50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61  }.      }.    ga
add60 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
add70 67 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46  geo1);.    gaiaF
add80 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
add90 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
adda0 69 64 0a 66 6e 63 74 5f 53 6e 61 70 20 28 73 71  id.fnct_Snap (sq
addb0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
addc0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
addd0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
adde0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
addf0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
ade00 6e 61 70 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  nap(BLOBencoded 
ade10 67 65 6f 6d 65 74 72 79 31 2c 20 42 4c 4f 42 65  geometry1, BLOBe
ade20 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 32  ncoded geometry2
ade30 2c 20 64 6f 75 62 6c 65 20 74 6f 6c 65 72 61 6e  , double toleran
ade40 63 65 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20  ce)././ Returns 
ade50 61 20 6e 65 77 20 47 65 6f 6d 65 74 72 79 20 63  a new Geometry c
ade60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ade70 67 65 6f 6d 31 20 73 6e 61 70 70 65 64 20 74 6f  geom1 snapped to
ade80 20 67 65 6f 6d 32 0a 2f 20 61 6e 64 20 75 73 69   geom2./ and usi
ade90 6e 67 20 74 68 65 20 67 69 76 65 6e 20 74 6f 6c  ng the given tol
adea0 65 72 61 6e 63 65 0a 2f 20 4e 55 4c 4c 20 69 73  erance./ NULL is
adeb0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e   returned for in
adec0 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20  valid arguments 
aded0 28 6f 72 20 69 66 20 64 69 73 74 61 6e 63 65 20  (or if distance 
adee0 69 73 20 5a 45 52 4f 29 0a 2a 2f 0a 20 20 20 20  is ZERO).*/.    
adef0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
adf00 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
adf10 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
adf20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64  int_value;.    d
adf30 6f 75 62 6c 65 20 74 6f 6c 65 72 61 6e 63 65 3b  ouble tolerance;
adf40 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
adf50 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c 4c  lPtr geo1 = NULL
adf60 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
adf70 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55 4c  llPtr geo2 = NUL
adf80 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  L;.    gaiaGeomC
adf90 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20  ollPtr result;. 
adfa0 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
adfb0 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
adfc0 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
adfd0 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  0;.    int tiny_
adfe0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
adff0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
ae000 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
ae010 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
ae020 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
ae030 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
ae040 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
ae050 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
ae060 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
ae070 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
ae080 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
ae090 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
ae0a0 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
ae0b0 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
ae0c0 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20  e->gpkg_mode;.. 
ae0d0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61   tiny_point = ca
ae0e0 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e  che->tinyPointEn
ae0f0 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  abled;.      }. 
ae100 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
ae110 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
ae120 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
ae130 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
ae140 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ae150 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
ae160 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ae170 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
ae180 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
ae190 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
ae1a0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
ae1b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ae1c0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
ae1d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
ae1e0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
ae1f0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
ae200 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
ae210 45 5f 46 4c 4f 41 54 29 0a 09 74 6f 6c 65 72 61  E_FLOAT)..tolera
ae220 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  nce = sqlite3_va
ae230 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
ae240 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  [2]);.    else i
ae250 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
ae260 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
ae270 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
ae280 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e  R).      {..  in
ae290 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  t_value = sqlite
ae2a0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
ae2b0 76 5b 32 5d 29 3b 0a 09 20 20 74 6f 6c 65 72 61  v[2]);..  tolera
ae2c0 6e 63 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b  nce = int_value;
ae2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
ae2e0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
ae2f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
ae300 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
ae310 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
ae320 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
ae330 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
ae340 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
ae350 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
ae360 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
ae370 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
ae380 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
ae390 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  1 =..gaiaFromSpa
ae3a0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
ae3b0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
ae3c0 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
ae3d0 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
ae3e0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62  ibious);.    p_b
ae3f0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
ae400 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
ae410 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
ae420 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [1]);.    n_byte
ae430 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
ae440 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d  e_bytes (argv[1]
ae450 29 3b 0a 20 20 20 20 67 65 6f 32 20 3d 0a 09 67  );.    geo2 =..g
ae460 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
ae470 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
ae480 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
ae490 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
ae4a0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
ae4b0 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 31 20  );.    if (geo1 
ae4c0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 67 65 6f 32 20  == NULL || geo2 
ae4d0 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65  == NULL)..sqlite
ae4e0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
ae4f0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
ae500 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f 69  e.      {..  voi
ae510 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74 65  d *data = sqlite
ae520 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
ae530 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64 61  text);..  if (da
ae540 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  ta != NULL)..   
ae550 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61     result = gaia
ae560 53 6e 61 70 5f 72 20 28 64 61 74 61 2c 20 67 65  Snap_r (data, ge
ae570 6f 31 2c 20 67 65 6f 32 2c 20 74 6f 6c 65 72 61  o1, geo2, tolera
ae580 6e 63 65 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  nce);..  else.. 
ae590 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61       result = ga
ae5a0 69 61 53 6e 61 70 20 28 67 65 6f 31 2c 20 67 65  iaSnap (geo1, ge
ae5b0 6f 32 2c 20 74 6f 6c 65 72 61 6e 63 65 29 3b 0a  o2, tolerance);.
ae5c0 09 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  .  if (result ==
ae5d0 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 73 71   NULL)..      sq
ae5e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
ae5f0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
ae600 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a  else..    {.../*
ae610 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42   builds the BLOB
ae620 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20   geometry to be 
ae630 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e  returned */...in
ae640 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65  t len;...unsigne
ae650 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
ae660 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 73 75 6c   = NULL;...resul
ae670 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f 31 2d 3e  t->Srid = geo1->
ae680 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f 53 70  Srid;...gaiaToSp
ae690 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
ae6a0 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f 72  x2 (result, &p_r
ae6b0 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09 09 09  esult, &len,....
ae6c0 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64 65 2c  ..    gpkg_mode,
ae6d0 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 09   tiny_point);...
ae6e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
ae6f0 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f  lob (context, p_
ae700 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65  result, len, fre
ae710 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65  e);...gaiaFreeGe
ae720 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b  omColl (result);
ae730 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
ae740 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
ae750 43 6f 6c 6c 20 28 67 65 6f 31 29 3b 0a 20 20 20  Coll (geo1);.   
ae760 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
ae770 6c 20 28 67 65 6f 32 29 3b 0a 7d 0a 0a 73 74 61  l (geo2);.}..sta
ae780 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4c 69  tic void.fnct_Li
ae790 6e 65 4d 65 72 67 65 20 28 73 71 6c 69 74 65 33  neMerge (sqlite3
ae7a0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ae7b0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
ae7c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ae7d0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
ae7e0 6e 63 74 69 6f 6e 3a 0a 2f 20 4c 69 6e 65 4d 65  nction:./ LineMe
ae7f0 72 67 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  rge(BLOBencoded 
ae800 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 41 73  geometry)././ As
ae810 73 75 6d 69 6e 67 20 74 68 61 74 20 47 65 6f 6d  suming that Geom
ae820 65 74 72 79 20 72 65 70 72 65 73 65 6e 74 73 20  etry represents 
ae830 61 20 73 65 74 20 6f 66 20 73 70 61 72 73 65 20  a set of sparse 
ae840 4c 69 6e 65 73 74 72 69 6e 67 73 2c 0a 2f 20 74  Linestrings,./ t
ae850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
ae860 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  l attempt to rea
ae870 73 73 65 6d 62 6c 65 20 61 20 73 69 6e 67 6c 65  ssemble a single
ae880 20 6c 69 6e 65 0a 2f 20 28 6f 72 20 61 20 73 65   line./ (or a se
ae890 74 20 6f 66 20 6c 69 6e 65 73 29 0a 2f 20 4e 55  t of lines)./ NU
ae8a0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  LL is returned f
ae8b0 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  or invalid argum
ae8c0 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ents.*/.    unsi
ae8d0 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
ae8e0 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
ae8f0 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
ae900 43 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55  CollPtr geo = NU
ae910 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  LL;.    gaiaGeom
ae920 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a  CollPtr result;.
ae930 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
ae940 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
ae950 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
ae960 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
ae970 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
ae980 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
ae990 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
ae9a0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
ae9b0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
ae9c0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
ae9d0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
ae9e0 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
ae9f0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
aea00 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
aea10 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
aea20 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
aea30 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
aea40 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
aea50 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
aea60 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
aea70 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
aea80 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
aea90 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
aeaa0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
aeab0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
aeac0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
aead0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
aeae0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
aeaf0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
aeb00 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
aeb10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
aeb20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
aeb30 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
aeb40 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
aeb50 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
aeb60 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
aeb70 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  geo =..gaiaFromS
aeb80 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
aeb90 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
aeba0 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
aebb0 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
aebc0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
aebd0 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29 0a  f (geo == NULL).
aebe0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
aebf0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
aec00 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
aec10 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  ..  void *data =
aec20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
aec30 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ta (context);.. 
aec40 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55 4c   if (data != NUL
aec50 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c 74  L)..      result
aec60 20 3d 20 67 61 69 61 4c 69 6e 65 4d 65 72 67 65   = gaiaLineMerge
aec70 5f 72 20 28 64 61 74 61 2c 20 67 65 6f 29 3b 0a  _r (data, geo);.
aec80 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72  .  else..      r
aec90 65 73 75 6c 74 20 3d 20 67 61 69 61 4c 69 6e 65  esult = gaiaLine
aeca0 4d 65 72 67 65 20 28 67 65 6f 29 3b 0a 09 20 20  Merge (geo);..  
aecb0 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55  if (result == NU
aecc0 4c 4c 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  LL)..      sqlit
aecd0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
aece0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
aecf0 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75  e..    {.../* bu
aed00 69 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65  ilds the BLOB ge
aed10 6f 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65 74  ometry to be ret
aed20 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c  urned */...int l
aed30 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63  en;...unsigned c
aed40 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
aed50 4e 55 4c 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e  NULL;...result->
aed60 53 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64  Srid = geo->Srid
aed70 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61  ;...gaiaToSpatia
aed80 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
aed90 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c  result, &p_resul
aeda0 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20  t, &len,......  
aedb0 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e    gpkg_mode, tin
aedc0 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69  y_point);...sqli
aedd0 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
aede0 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
aedf0 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
aee00 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
aee10 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20  ll (result);..  
aee20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
aee30 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
aee40 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
aee50 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e 61 72  c void.fnct_Unar
aee60 79 55 6e 69 6f 6e 20 28 73 71 6c 69 74 65 33 5f  yUnion (sqlite3_
aee70 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
aee80 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
aee90 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
aeea0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
aeeb0 63 74 69 6f 6e 3a 0a 2f 20 55 6e 61 72 79 55 6e  ction:./ UnaryUn
aeec0 69 6f 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  ion(BLOBencoded 
aeed0 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 65 78  geometry)././ ex
aeee0 61 63 74 6c 79 20 6c 69 6b 65 20 55 6e 69 6f 6e  actly like Union
aeef0 2c 20 62 75 74 20 75 73 69 6e 67 20 61 20 73 69  , but using a si
aef00 6e 67 6c 65 20 43 6f 6c 6c 65 63 74 69 6f 6e 0a  ngle Collection.
aef10 2f 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  / NULL is return
aef20 65 64 20 66 6f 72 20 69 6e 76 61 6c 69 64 20 61  ed for invalid a
aef30 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
aef40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
aef50 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
aef60 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61  _bytes;.    gaia
aef70 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
aef80 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
aef90 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75  GeomCollPtr resu
aefa0 6c 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  lt;.    int gpkg
aefb0 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
aefc0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
aefd0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
aefe0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
aeff0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
af000 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
af010 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
af020 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
af030 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
af040 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
af050 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
af060 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
af070 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
af080 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
af090 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
af0a0 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
af0b0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
af0c0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
af0d0 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
af0e0 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
af0f0 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
af100 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
af110 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
af120 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
af130 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
af140 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
af150 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
af160 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
af170 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
af180 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
af190 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
af1a0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
af1b0 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
af1c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
af1d0 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
af1e0 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46      geo =..gaiaF
af1f0 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
af200 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
af210 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
af220 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
af230 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
af240 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55     if (geo == NU
af250 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
af260 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
af270 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
af280 20 20 20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61     {..  void *da
af290 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  ta = sqlite3_use
af2a0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
af2b0 3b 0a 09 20 20 69 66 20 28 64 61 74 61 20 21 3d  ;..  if (data !=
af2c0 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65   NULL)..      re
af2d0 73 75 6c 74 20 3d 20 67 61 69 61 55 6e 61 72 79  sult = gaiaUnary
af2e0 55 6e 69 6f 6e 5f 72 20 28 64 61 74 61 2c 20 67  Union_r (data, g
af2f0 65 6f 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  eo);..  else..  
af300 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69      result = gai
af310 61 55 6e 61 72 79 55 6e 69 6f 6e 20 28 67 65 6f  aUnaryUnion (geo
af320 29 3b 0a 09 20 20 69 66 20 28 72 65 73 75 6c 74  );..  if (result
af330 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20   == NULL)..     
af340 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
af350 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
af360 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
af370 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 42  ./* builds the B
af380 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f 20  LOB geometry to 
af390 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09  be returned */..
af3a0 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73 69  .int len;...unsi
af3b0 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73  gned char *p_res
af3c0 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65  ult = NULL;...re
af3d0 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65 6f  sult->Srid = geo
af3e0 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54 6f  ->Srid;...gaiaTo
af3f0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
af400 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70  bEx2 (result, &p
af410 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a 09  _result, &len,..
af420 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f 64  ....    gpkg_mod
af430 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a  e, tiny_point);.
af440 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
af450 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
af460 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66  p_result, len, f
af470 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65 65  ree);...gaiaFree
af480 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74  GeomColl (result
af490 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  );..    }.      
af4a0 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  }.    gaiaFreeGe
af4b0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 7d 0a  omColl (geo);.}.
af4c0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
af4d0 74 5f 53 71 75 61 72 65 47 72 69 64 20 28 73 71  t_SquareGrid (sq
af4e0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
af4f0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
af500 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
af510 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
af520 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
af530 54 5f 53 71 75 61 72 65 47 72 69 64 28 42 4c 4f  T_SquareGrid(BLO
af540 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 2c 20 64  Bencoded geom, d
af550 6f 75 62 6c 65 20 73 69 7a 65 29 0a 2f 20 53 54  ouble size)./ ST
af560 5f 53 71 75 61 72 65 47 72 69 64 28 42 4c 4f 42  _SquareGrid(BLOB
af570 65 6e 63 6f 64 65 64 20 67 65 6f 6d 2c 20 64 6f  encoded geom, do
af580 75 62 6c 65 20 73 69 7a 65 2c 20 69 6e 74 20 6d  uble size, int m
af590 6f 64 65 29 0a 2f 20 53 54 5f 53 71 75 61 72 65  ode)./ ST_Square
af5a0 47 72 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64  Grid(BLOBencoded
af5b0 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73 69   geom, double si
af5c0 7a 65 2c 20 69 6e 74 20 6d 6f 64 65 2c 20 42 4c  ze, int mode, BL
af5d0 4f 42 65 6e 63 6f 64 65 64 20 6f 72 69 67 69 6e  OBencoded origin
af5e0 29 0a 2f 0a 2f 20 6d 6f 64 65 20 69 6e 74 65 72  )././ mode inter
af5f0 70 72 65 74 61 74 69 6f 6e 3a 0a 2f 20 3d 3d 3d  pretation:./ ===
af600 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af610 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af620 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2f 20 70 6f  ===========./ po
af630 73 69 74 69 76 65 20 3d 20 61 20 4d 55 4c 54 49  sitive = a MULTI
af640 4c 49 4e 45 53 54 52 49 4e 47 20 77 69 6c 6c 20  LINESTRING will 
af650 62 65 20 72 65 74 75 72 6e 65 64 0a 2f 20 20 20  be returned./   
af660 20 20 20 20 20 30 20 3d 20 61 20 4d 55 4c 54 49       0 = a MULTI
af670 50 4f 4c 59 47 4f 4e 20 77 69 6c 6c 20 62 65 20  POLYGON will be 
af680 72 65 74 75 72 6e 65 64 0a 2f 20 6e 65 67 61 74  returned./ negat
af690 69 76 65 20 3d 20 61 20 4d 55 4c 54 49 50 4f 49  ive = a MULTIPOI
af6a0 4e 54 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  NT will be retur
af6b0 6e 65 64 0a 2f 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ned./ ==========
af6c0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af6d0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af6e0 3d 3d 3d 3d 0a 2f 0a 2f 20 42 75 69 6c 64 73 20  ====././ Builds 
af6f0 61 20 72 65 67 75 6c 61 72 20 67 72 69 64 20 28  a regular grid (
af700 53 71 75 61 72 65 20 63 65 6c 6c 73 29 20 63 6f  Square cells) co
af710 76 65 72 69 6e 67 20 74 68 65 20 67 65 6f 6d 2e  vering the geom.
af720 0a 2f 20 65 61 63 68 20 63 65 6c 6c 20 68 61 73  ./ each cell has
af730 20 74 68 65 20 65 64 67 65 73 27 73 20 6c 65 6e   the edges's len
af740 67 74 68 20 61 73 20 64 65 66 69 6e 65 64 20 62  gth as defined b
af750 79 20 74 68 65 20 73 69 7a 65 20 61 72 67 75 6d  y the size argum
af760 65 6e 74 0a 2f 20 61 6e 20 61 72 62 69 74 72 61  ent./ an arbitra
af770 72 79 20 6f 72 69 67 69 6e 20 69 73 20 73 75 70  ry origin is sup
af780 70 6f 72 74 65 64 20 28 30 2c 30 20 69 73 20 61  ported (0,0 is a
af790 73 73 75 6d 65 64 20 62 79 20 64 65 66 61 75 6c  ssumed by defaul
af7a0 74 29 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c  t)./ return NULL
af7b0 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
af7c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
af7d0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
af7e0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
af7f0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
af800 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  int int_value;. 
af810 20 20 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e     double origin
af820 5f 78 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f  _x = 0.0;.    do
af830 75 62 6c 65 20 6f 72 69 67 69 6e 5f 79 20 3d 20  uble origin_y = 
af840 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
af850 73 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  size;.    int mo
af860 64 65 20 3d 20 30 3b 0a 20 20 20 20 67 61 69 61  de = 0;.    gaia
af870 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
af880 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
af890 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 70 6f 69 6e  GeomCollPtr poin
af8a0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
af8b0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65  iaGeomCollPtr re
af8c0 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  sult = NULL;.   
af8d0 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
af8e0 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
af8f0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
af900 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
af910 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
af920 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
af930 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
af940 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
af950 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
af960 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
af970 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
af980 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
af990 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
af9a0 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
af9b0 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
af9c0 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
af9d0 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
af9e0 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
af9f0 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
afa00 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
afa10 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
afa20 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
afa30 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
afa40 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
afa50 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
afa60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
afa70 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
afa80 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
afa90 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
afaa0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
afab0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
afac0 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  1]) == SQLITE_IN
afad0 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
afae0 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71    int_value = sq
afaf0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
afb00 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 73 69  (argv[1]);..  si
afb10 7a 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a  ze = int_value;.
afb20 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
afb30 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
afb40 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
afb50 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
afb60 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 69  T).      {..  si
afb70 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ze = sqlite3_val
afb80 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
afb90 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
afba0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
afbb0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
afbc0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
afbd0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
afbe0 20 7d 0a 20 20 20 20 69 66 20 28 73 69 7a 65 20   }.    if (size 
afbf0 3c 3d 20 30 2e 30 29 0a 20 20 20 20 20 20 7b 0a  <= 0.0).      {.
afc00 09 20 20 2f 2a 20 6e 65 67 61 74 69 76 65 20 73  .  /* negative s
afc10 69 64 65 20 73 69 7a 65 20 2a 2f 0a 09 20 20 73  ide size */..  s
afc20 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
afc30 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
afc40 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
afc50 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d  .    if (argc >=
afc60 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   3).      {..  i
afc70 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
afc80 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
afc90 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
afca0 52 29 0a 09 20 20 20 20 20 20 6d 6f 64 65 20 3d  R)..      mode =
afcb0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
afcc0 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20  nt (argv[2]);.. 
afcd0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
afce0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
afcf0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
afd00 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20  return;..    }. 
afd10 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
afd20 72 67 63 20 3d 3d 20 34 29 0a 20 20 20 20 20 20  rgc == 4).      
afd30 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
afd40 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
afd50 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[3]) != SQLITE_
afd60 42 4c 4f 42 29 0a 09 20 20 20 20 7b 0a 09 09 73  BLOB)..    {...s
afd70 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
afd80 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
afd90 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
afda0 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
afdb0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
afdc0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
afdd0 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 6e 5f  (argv[3]);..  n_
afde0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
afdf0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
afe00 76 5b 33 5d 29 3b 0a 09 20 20 70 6f 69 6e 74 20  v[3]);..  point 
afe10 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 6f  =..      gaiaFro
afe20 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
afe30 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
afe40 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
afe50 2c 0a 09 09 09 09 09 20 20 20 67 70 6b 67 5f 61  ,......   gpkg_a
afe60 6d 70 68 69 62 69 6f 75 73 29 3b 0a 09 20 20 69  mphibious);..  i
afe70 66 20 28 21 70 6f 69 6e 74 29 0a 09 20 20 20 20  f (!point)..    
afe80 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
afe90 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
afea0 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
afeb0 20 20 7d 0a 09 20 20 69 66 20 28 70 6f 69 6e 74    }..  if (point
afec0 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e  ->FirstLinestrin
afed0 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  g != NULL)..    
afee0 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 69 6e 74 3b    goto no_point;
afef0 0a 09 20 20 69 66 20 28 70 6f 69 6e 74 2d 3e 46  ..  if (point->F
aff00 69 72 73 74 50 6f 6c 79 67 6f 6e 20 21 3d 20 4e  irstPolygon != N
aff10 55 4c 4c 29 0a 09 20 20 20 20 20 20 67 6f 74 6f  ULL)..      goto
aff20 20 6e 6f 5f 70 6f 69 6e 74 3b 0a 09 20 20 69 66   no_point;..  if
aff30 20 28 70 6f 69 6e 74 2d 3e 46 69 72 73 74 50 6f   (point->FirstPo
aff40 69 6e 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  int != NULL)..  
aff50 20 20 7b 0a 09 09 69 66 20 28 70 6f 69 6e 74 2d    {...if (point-
aff60 3e 46 69 72 73 74 50 6f 69 6e 74 20 3d 3d 20 70  >FirstPoint == p
aff70 6f 69 6e 74 2d 3e 4c 61 73 74 50 6f 69 6e 74 29  oint->LastPoint)
aff80 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 6f  ...  {...      o
aff90 72 69 67 69 6e 5f 78 20 3d 20 70 6f 69 6e 74 2d  rigin_x = point-
affa0 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 58 3b 0a  >FirstPoint->X;.
affb0 09 09 20 20 20 20 20 20 6f 72 69 67 69 6e 5f 79  ..      origin_y
affc0 20 3d 20 70 6f 69 6e 74 2d 3e 46 69 72 73 74 50   = point->FirstP
affd0 6f 69 6e 74 2d 3e 59 3b 0a 09 09 20 20 20 20 20  oint->Y;...     
affe0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
afff0 6c 20 28 70 6f 69 6e 74 29 3b 0a 09 09 20 20 7d  l (point);...  }
b0000 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67 6f  ...else...    go
b0010 74 6f 20 6e 6f 5f 70 6f 69 6e 74 3b 0a 09 20 20  to no_point;..  
b0020 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
b0030 20 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 69 6e 74     goto no_point
b0040 3b 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  ;..      }.    p
b0050 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
b0060 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
b0070 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
b0080 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
b0090 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
b00a0 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
b00b0 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09  0]);.    geo =..
b00c0 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
b00d0 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
b00e0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
b00f0 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
b0100 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
b0110 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65 6f  s);.    if (!geo
b0120 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
b0130 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b0140 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
b0150 20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61   {..  void *data
b0160 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
b0170 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
b0180 09 20 20 69 66 20 28 67 65 6f 2d 3e 46 69 72 73  .  if (geo->Firs
b0190 74 50 6f 69 6e 74 20 21 3d 20 4e 55 4c 4c 29 0a  tPoint != NULL).
b01a0 09 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 70  .      goto no_p
b01b0 6f 6c 79 67 6f 6e 3b 0a 09 20 20 69 66 20 28 67  olygon;..  if (g
b01c0 65 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72  eo->FirstLinestr
b01d0 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ing != NULL)..  
b01e0 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 6c 79      goto no_poly
b01f0 67 6f 6e 3b 0a 09 20 20 69 66 20 28 67 65 6f 2d  gon;..  if (geo-
b0200 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 20 3d 3d  >FirstPolygon ==
b0210 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 67 6f   NULL)..      go
b0220 74 6f 20 6e 6f 5f 70 6f 6c 79 67 6f 6e 3b 0a 09  to no_polygon;..
b0230 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55    if (data != NU
b0240 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c  LL)..      resul
b0250 74 20 3d 0a 09 09 20 20 67 61 69 61 53 71 75 61  t =...  gaiaSqua
b0260 72 65 47 72 69 64 5f 72 20 28 64 61 74 61 2c 20  reGrid_r (data, 
b0270 67 65 6f 2c 20 6f 72 69 67 69 6e 5f 78 2c 20 6f  geo, origin_x, o
b0280 72 69 67 69 6e 5f 79 2c 20 73 69 7a 65 2c 20 6d  rigin_y, size, m
b0290 6f 64 65 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ode);..  else.. 
b02a0 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61       result = ga
b02b0 69 61 53 71 75 61 72 65 47 72 69 64 20 28 67 65  iaSquareGrid (ge
b02c0 6f 2c 20 6f 72 69 67 69 6e 5f 78 2c 20 6f 72 69  o, origin_x, ori
b02d0 67 69 6e 5f 79 2c 20 73 69 7a 65 2c 20 6d 6f 64  gin_y, size, mod
b02e0 65 29 3b 0a 09 20 20 69 66 20 28 72 65 73 75 6c  e);..  if (resul
b02f0 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  t == NULL)..    
b0300 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b0310 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
b0320 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
b0330 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20  ../* builds the 
b0340 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74 6f  BLOB geometry to
b0350 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a   be returned */.
b0360 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e 73  ..int len;...uns
b0370 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65  igned char *p_re
b0380 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72  sult = NULL;...r
b0390 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67 65  esult->Srid = ge
b03a0 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61 54  o->Srid;...gaiaT
b03b0 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
b03c0 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26  kbEx2 (result, &
b03d0 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 0a  p_result, &len,.
b03e0 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d 6f  .....    gpkg_mo
b03f0 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b  de, tiny_point);
b0400 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
b0410 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
b0420 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
b0430 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72 65  free);...gaiaFre
b0440 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c  eGeomColl (resul
b0450 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  t);..    }.     
b0460 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65 47   }.    gaiaFreeG
b0470 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 20  eomColl (geo);. 
b0480 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 6e 6f     return;..  no
b0490 5f 70 6f 69 6e 74 3a 0a 20 20 20 20 67 61 69 61  _point:.    gaia
b04a0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 70 6f  FreeGeomColl (po
b04b0 69 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  int);.    sqlite
b04c0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
b04d0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74  ontext);.    ret
b04e0 75 72 6e 3b 0a 0a 20 20 6e 6f 5f 70 6f 6c 79 67  urn;..  no_polyg
b04f0 6f 6e 3a 0a 20 20 20 20 67 61 69 61 46 72 65 65  on:.    gaiaFree
b0500 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
b0510 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b0520 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b0530 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d  );.    return;.}
b0540 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
b0550 63 74 5f 54 72 69 61 6e 67 75 6c 61 72 47 72 69  ct_TriangularGri
b0560 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  d (sqlite3_conte
b0570 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
b0580 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
b0590 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
b05a0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
b05b0 3a 0a 2f 20 53 54 5f 54 72 69 61 6e 67 75 6c 61  :./ ST_Triangula
b05c0 72 47 72 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65  rGrid(BLOBencode
b05d0 64 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73  d geom, double s
b05e0 69 7a 65 29 0a 2f 20 53 54 5f 54 72 69 61 6e 67  ize)./ ST_Triang
b05f0 75 6c 61 72 47 72 69 64 28 42 4c 4f 42 65 6e 63  ularGrid(BLOBenc
b0600 6f 64 65 64 20 67 65 6f 6d 2c 20 64 6f 75 62 6c  oded geom, doubl
b0610 65 20 73 69 7a 65 2c 20 69 6e 74 20 6d 6f 64 65  e size, int mode
b0620 29 0a 2f 20 53 54 5f 54 72 69 61 6e 67 75 6c 61  )./ ST_Triangula
b0630 72 47 72 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65  rGrid(BLOBencode
b0640 64 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73  d geom, double s
b0650 69 7a 65 2c 20 69 6e 74 20 6d 6f 64 65 2c 20 42  ize, int mode, B
b0660 4c 4f 42 65 6e 63 6f 64 65 64 20 6f 72 69 67 69  LOBencoded origi
b0670 6e 29 0a 2f 0a 2f 20 6d 6f 64 65 20 69 6e 74 65  n)././ mode inte
b0680 72 70 72 65 74 61 74 69 6f 6e 3a 0a 2f 20 3d 3d  rpretation:./ ==
b0690 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b06a0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b06b0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2f 20 70  ============./ p
b06c0 6f 73 69 74 69 76 65 20 3d 20 61 20 4d 55 4c 54  ositive = a MULT
b06d0 49 4c 49 4e 45 53 54 52 49 4e 47 20 77 69 6c 6c  ILINESTRING will
b06e0 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2f 20 20   be returned./  
b06f0 20 20 20 20 20 20 30 20 3d 20 61 20 4d 55 4c 54        0 = a MULT
b0700 49 50 4f 4c 59 47 4f 4e 20 77 69 6c 6c 20 62 65  IPOLYGON will be
b0710 20 72 65 74 75 72 6e 65 64 0a 2f 20 6e 65 67 61   returned./ nega
b0720 74 69 76 65 20 3d 20 61 20 4d 55 4c 54 49 50 4f  tive = a MULTIPO
b0730 49 4e 54 20 77 69 6c 6c 20 62 65 20 72 65 74 75  INT will be retu
b0740 72 6e 65 64 0a 2f 20 3d 3d 3d 3d 3d 3d 3d 3d 3d  rned./ =========
b0750 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b0760 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b0770 3d 3d 3d 3d 3d 0a 2f 0a 2f 20 42 75 69 6c 64 73  =====././ Builds
b0780 20 61 20 72 65 67 75 6c 61 72 20 67 72 69 64 20   a regular grid 
b0790 28 54 72 69 61 6e 67 75 6c 61 72 20 63 65 6c 6c  (Triangular cell
b07a0 73 29 20 63 6f 76 65 72 69 6e 67 20 74 68 65 20  s) covering the 
b07b0 67 65 6f 6d 2e 0a 2f 20 65 61 63 68 20 63 65 6c  geom../ each cel
b07c0 6c 20 68 61 73 20 74 68 65 20 65 64 67 65 27 73  l has the edge's
b07d0 20 6c 65 6e 67 74 68 20 61 73 20 64 65 66 69 6e   length as defin
b07e0 65 64 20 62 79 20 74 68 65 20 73 69 7a 65 20 61  ed by the size a
b07f0 72 67 75 6d 65 6e 74 0a 2f 20 61 6e 20 61 72 62  rgument./ an arb
b0800 69 74 72 61 72 79 20 6f 72 69 67 69 6e 20 69 73  itrary origin is
b0810 20 73 75 70 70 6f 72 74 65 64 20 28 30 2c 30 20   supported (0,0 
b0820 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 64 65  is assumed by de
b0830 66 61 75 6c 74 29 0a 2f 20 72 65 74 75 72 6e 20  fault)./ return 
b0840 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
b0850 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
b0860 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
b0870 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
b0880 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
b0890 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75      int int_valu
b08a0 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6f 72  e;.    double or
b08b0 69 67 69 6e 5f 78 20 3d 20 30 2e 30 3b 0a 20 20  igin_x = 0.0;.  
b08c0 20 20 64 6f 75 62 6c 65 20 6f 72 69 67 69 6e 5f    double origin_
b08d0 79 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  y = 0.0;.    dou
b08e0 62 6c 65 20 73 69 7a 65 3b 0a 20 20 20 20 69 6e  ble size;.    in
b08f0 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
b0900 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
b0910 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
b0920 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
b0930 70 6f 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  point = NULL;.  
b0940 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
b0950 72 20 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  r result = NULL;
b0960 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
b0970 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
b0980 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
b0990 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e  = 0;.    int tin
b09a0 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  y_point = 0;.   
b09b0 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
b09c0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
b09d0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
b09e0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
b09f0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
b0a00 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
b0a10 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
b0a20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
b0a30 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
b0a40 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
b0a50 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
b0a60 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
b0a70 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
b0a80 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
b0a90 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  .  tiny_point = 
b0aa0 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74  cache->tinyPoint
b0ab0 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d  Enabled;.      }
b0ac0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
b0ad0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
b0ae0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
b0af0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
b0b00 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b0b10 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
b0b20 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
b0b30 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
b0b40 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
b0b50 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
b0b60 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
b0b70 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20   {..  int_value 
b0b80 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b0b90 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  int (argv[1]);..
b0ba0 20 20 73 69 7a 65 20 3d 20 69 6e 74 5f 76 61 6c    size = int_val
b0bb0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
b0bc0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
b0bd0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
b0be0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
b0bf0 46 4c 4f 41 54 29 0a 20 20 20 20 20 20 7b 0a 09  FLOAT).      {..
b0c00 20 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33    size = sqlite3
b0c10 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
b0c20 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[1]);.      }
b0c30 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
b0c40 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
b0c50 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
b0c60 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
b0c70 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
b0c80 69 7a 65 20 3c 3d 20 30 2e 30 29 0a 20 20 20 20  ize <= 0.0).    
b0c90 20 20 7b 0a 09 20 20 2f 2a 20 6e 65 67 61 74 69    {..  /* negati
b0ca0 76 65 20 73 69 64 65 20 73 69 7a 65 20 2a 2f 0a  ve side size */.
b0cb0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
b0cc0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b0cd0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
b0ce0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
b0cf0 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a  c >= 3).      {.
b0d00 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
b0d10 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
b0d20 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) == SQLITE_IN
b0d30 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 6d 6f  TEGER)..      mo
b0d40 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  de = sqlite3_val
b0d50 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
b0d60 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
b0d70 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
b0d80 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b0d90 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
b0da0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69   }.      }.    i
b0db0 66 20 28 61 72 67 63 20 3d 3d 20 34 29 0a 20 20  f (argc == 4).  
b0dc0 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
b0dd0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
b0de0 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c  (argv[3]) != SQL
b0df0 49 54 45 5f 42 4c 4f 42 29 0a 09 20 20 20 20 7b  ITE_BLOB)..    {
b0e00 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
b0e10 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b0e20 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
b0e30 20 7d 0a 09 20 20 70 5f 62 6c 6f 62 20 3d 20 28   }..  p_blob = (
b0e40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
b0e50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
b0e60 6c 6f 62 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09  lob (argv[3]);..
b0e70 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
b0e80 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
b0e90 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 70 6f  (argv[3]);..  po
b0ea0 69 6e 74 20 3d 0a 09 20 20 20 20 20 20 67 61 69  int =..      gai
b0eb0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
b0ec0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
b0ed0 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
b0ee0 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 20 67 70  mode,......   gp
b0ef0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a  kg_amphibious);.
b0f00 09 20 20 69 66 20 28 21 70 6f 69 6e 74 29 0a 09  .  if (!point)..
b0f10 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
b0f20 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b0f30 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
b0f40 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 70  ..    }..  if (p
b0f50 6f 69 6e 74 2d 3e 46 69 72 73 74 4c 69 6e 65 73  oint->FirstLines
b0f60 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09  tring != NULL)..
b0f70 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f        goto no_po
b0f80 69 6e 74 3b 0a 09 20 20 69 66 20 28 70 6f 69 6e  int;..  if (poin
b0f90 74 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 20  t->FirstPolygon 
b0fa0 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20  != NULL)..      
b0fb0 67 6f 74 6f 20 6e 6f 5f 70 6f 69 6e 74 3b 0a 09  goto no_point;..
b0fc0 20 20 69 66 20 28 70 6f 69 6e 74 2d 3e 46 69 72    if (point->Fir
b0fd0 73 74 50 6f 69 6e 74 20 21 3d 20 4e 55 4c 4c 29  stPoint != NULL)
b0fe0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 6f  ..    {...if (po
b0ff0 69 6e 74 2d 3e 46 69 72 73 74 50 6f 69 6e 74 20  int->FirstPoint 
b1000 3d 3d 20 70 6f 69 6e 74 2d 3e 4c 61 73 74 50 6f  == point->LastPo
b1010 69 6e 74 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  int)...  {...   
b1020 20 20 20 6f 72 69 67 69 6e 5f 78 20 3d 20 70 6f     origin_x = po
b1030 69 6e 74 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d  int->FirstPoint-
b1040 3e 58 3b 0a 09 09 20 20 20 20 20 20 6f 72 69 67  >X;...      orig
b1050 69 6e 5f 79 20 3d 20 70 6f 69 6e 74 2d 3e 46 69  in_y = point->Fi
b1060 72 73 74 50 6f 69 6e 74 2d 3e 59 3b 0a 09 09 20  rstPoint->Y;... 
b1070 20 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f       gaiaFreeGeo
b1080 6d 43 6f 6c 6c 20 28 70 6f 69 6e 74 29 3b 0a 09  mColl (point);..
b1090 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20  .  }...else...  
b10a0 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 69 6e 74 3b    goto no_point;
b10b0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
b10c0 09 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 70  .      goto no_p
b10d0 6f 69 6e 74 3b 0a 0a 20 20 20 20 20 20 7d 0a 20  oint;..      }. 
b10e0 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
b10f0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
b1100 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
b1110 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
b1120 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
b1130 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
b1140 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
b1150 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
b1160 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
b1170 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
b1180 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
b1190 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
b11a0 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
b11b0 21 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72  !geo)..sqlite3_r
b11c0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
b11d0 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
b11e0 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64 20 2a       {..  void *
b11f0 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 75  data = sqlite3_u
b1200 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
b1210 74 29 3b 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e  t);..  if (geo->
b1220 46 69 72 73 74 50 6f 69 6e 74 20 21 3d 20 4e 55  FirstPoint != NU
b1230 4c 4c 29 0a 09 20 20 20 20 20 20 67 6f 74 6f 20  LL)..      goto 
b1240 6e 6f 5f 70 6f 6c 79 67 6f 6e 3b 0a 09 20 20 69  no_polygon;..  i
b1250 66 20 28 67 65 6f 2d 3e 46 69 72 73 74 4c 69 6e  f (geo->FirstLin
b1260 65 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29  estring != NULL)
b1270 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  ..      goto no_
b1280 70 6f 6c 79 67 6f 6e 3b 0a 09 20 20 69 66 20 28  polygon;..  if (
b1290 67 65 6f 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f  geo->FirstPolygo
b12a0 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  n == NULL)..    
b12b0 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 6c 79 67 6f    goto no_polygo
b12c0 6e 3b 0a 09 20 20 69 66 20 28 64 61 74 61 20 21  n;..  if (data !
b12d0 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 72  = NULL)..      r
b12e0 65 73 75 6c 74 20 3d 0a 09 09 20 20 67 61 69 61  esult =...  gaia
b12f0 54 72 69 61 6e 67 75 6c 61 72 47 72 69 64 5f 72  TriangularGrid_r
b1300 20 28 64 61 74 61 2c 20 67 65 6f 2c 20 6f 72 69   (data, geo, ori
b1310 67 69 6e 5f 78 2c 20 6f 72 69 67 69 6e 5f 79 2c  gin_x, origin_y,
b1320 20 73 69 7a 65 2c 0a 09 09 09 09 09 6d 6f 64 65   size,......mode
b1330 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
b1340 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 54    result = gaiaT
b1350 72 69 61 6e 67 75 6c 61 72 47 72 69 64 20 28 67  riangularGrid (g
b1360 65 6f 2c 20 6f 72 69 67 69 6e 5f 78 2c 20 6f 72  eo, origin_x, or
b1370 69 67 69 6e 5f 79 2c 20 73 69 7a 65 2c 20 6d 6f  igin_y, size, mo
b1380 64 65 29 3b 0a 09 20 20 69 66 20 28 72 65 73 75  de);..  if (resu
b1390 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  lt == NULL)..   
b13a0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
b13b0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b13c0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
b13d0 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65  .../* builds the
b13e0 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74   BLOB geometry t
b13f0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
b1400 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e  ...int len;...un
b1410 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72  signed char *p_r
b1420 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09  esult = NULL;...
b1430 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67  result->Srid = g
b1440 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61  eo->Srid;...gaia
b1450 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
b1460 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20  WkbEx2 (result, 
b1470 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
b1480 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d  ......    gpkg_m
b1490 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29  ode, tiny_point)
b14a0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
b14b0 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
b14c0 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c  , p_result, len,
b14d0 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72   free);...gaiaFr
b14e0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75  eeGeomColl (resu
b14f0 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  lt);..    }.    
b1500 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
b1510 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
b1520 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 6e      return;..  n
b1530 6f 5f 70 6f 69 6e 74 3a 0a 20 20 20 20 67 61 69  o_point:.    gai
b1540 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 70  aFreeGeomColl (p
b1550 6f 69 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  oint);.    sqlit
b1560 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b1570 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65  context);.    re
b1580 74 75 72 6e 3b 0a 0a 20 20 6e 6f 5f 70 6f 6c 79  turn;..  no_poly
b1590 67 6f 6e 3a 0a 20 20 20 20 67 61 69 61 46 72 65  gon:.    gaiaFre
b15a0 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
b15b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
b15c0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
b15d0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
b15e0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
b15f0 6e 63 74 5f 48 65 78 61 67 6f 6e 61 6c 47 72 69  nct_HexagonalGri
b1600 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  d (sqlite3_conte
b1610 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
b1620 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
b1630 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
b1640 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
b1650 3a 0a 2f 20 53 54 5f 48 65 78 61 67 6f 6e 61 6c  :./ ST_Hexagonal
b1660 47 72 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64  Grid(BLOBencoded
b1670 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73 69   geom, double si
b1680 7a 65 29 0a 2f 20 53 54 5f 48 65 78 61 67 6f 6e  ze)./ ST_Hexagon
b1690 61 6c 47 72 69 64 28 42 4c 4f 42 65 6e 63 6f 64  alGrid(BLOBencod
b16a0 65 64 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20  ed geom, double 
b16b0 73 69 7a 65 2c 20 69 6e 74 20 6d 6f 64 65 29 0a  size, int mode).
b16c0 2f 20 53 54 5f 48 65 78 61 67 6f 6e 61 6c 47 72  / ST_HexagonalGr
b16d0 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  id(BLOBencoded g
b16e0 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 73 69 7a 65  eom, double size
b16f0 2c 20 69 6e 74 20 6d 6f 64 65 2c 20 42 4c 4f 42  , int mode, BLOB
b1700 65 6e 63 6f 64 65 64 20 6f 72 69 67 69 6e 29 0a  encoded origin).
b1710 2f 0a 2f 20 6d 6f 64 65 20 69 6e 74 65 72 70 72  /./ mode interpr
b1720 65 74 61 74 69 6f 6e 3a 0a 2f 20 3d 3d 3d 3d 3d  etation:./ =====
b1730 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b1740 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b1750 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2f 20 70 6f 73 69  =========./ posi
b1760 74 69 76 65 20 3d 20 61 20 4d 55 4c 54 49 4c 49  tive = a MULTILI
b1770 4e 45 53 54 52 49 4e 47 20 77 69 6c 6c 20 62 65  NESTRING will be
b1780 20 72 65 74 75 72 6e 65 64 0a 2f 20 20 20 20 20   returned./     
b1790 20 20 20 30 20 3d 20 61 20 4d 55 4c 54 49 50 4f     0 = a MULTIPO
b17a0 4c 59 47 4f 4e 20 77 69 6c 6c 20 62 65 20 72 65  LYGON will be re
b17b0 74 75 72 6e 65 64 0a 2f 20 6e 65 67 61 74 69 76  turned./ negativ
b17c0 65 20 3d 20 61 20 4d 55 4c 54 49 50 4f 49 4e 54  e = a MULTIPOINT
b17d0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
b17e0 64 0a 2f 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  d./ ============
b17f0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b1800 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b1810 3d 3d 0a 2f 0a 2f 20 42 75 69 6c 64 73 20 61 20  ==././ Builds a 
b1820 72 65 67 75 6c 61 72 20 67 72 69 64 20 28 48 65  regular grid (He
b1830 78 61 67 6f 6e 61 6c 20 63 65 6c 6c 73 29 20 63  xagonal cells) c
b1840 6f 76 65 72 69 6e 67 20 74 68 65 20 67 65 6f 6d  overing the geom
b1850 2e 0a 2f 20 65 61 63 68 20 63 65 6c 6c 20 68 61  ../ each cell ha
b1860 73 20 74 68 65 20 65 64 67 65 73 27 73 20 6c 65  s the edges's le
b1870 6e 67 74 68 20 61 73 20 64 65 66 69 6e 65 64 20  ngth as defined 
b1880 62 79 20 74 68 65 20 73 69 7a 65 20 61 72 67 75  by the size argu
b1890 6d 65 6e 74 0a 2f 20 61 6e 20 61 72 62 69 74 72  ment./ an arbitr
b18a0 61 72 79 20 6f 72 69 67 69 6e 20 69 73 20 73 75  ary origin is su
b18b0 70 70 6f 72 74 65 64 20 28 30 2c 30 20 69 73 20  pported (0,0 is 
b18c0 61 73 73 75 6d 65 64 20 62 79 20 64 65 66 61 75  assumed by defau
b18d0 6c 74 29 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c  lt)./ return NUL
b18e0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
b18f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
b1900 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
b1910 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
b1920 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
b1930 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
b1940 20 20 20 20 64 6f 75 62 6c 65 20 6f 72 69 67 69      double origi
b1950 6e 5f 78 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64  n_x = 0.0;.    d
b1960 6f 75 62 6c 65 20 6f 72 69 67 69 6e 5f 79 20 3d  ouble origin_y =
b1970 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
b1980 20 73 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 6d   size;.    int m
b1990 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 67 61 69  ode = 0;.    gai
b19a0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
b19b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
b19c0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 70 6f 69  aGeomCollPtr poi
b19d0 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  nt = NULL;.    g
b19e0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72  aiaGeomCollPtr r
b19f0 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  esult = NULL;.  
b1a00 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
b1a10 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
b1a20 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
b1a30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
b1a40 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
b1a50 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
b1a60 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
b1a70 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
b1a80 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
b1a90 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
b1aa0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
b1ab0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
b1ac0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
b1ad0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
b1ae0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
b1af0 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
b1b00 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
b1b10 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
b1b20 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
b1b30 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
b1b40 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
b1b50 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
b1b60 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
b1b70 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
b1b80 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
b1b90 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
b1ba0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
b1bb0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
b1bc0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
b1bd0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
b1be0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
b1bf0 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [1]) == SQLITE_I
b1c00 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
b1c10 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  .  int_value = s
b1c20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
b1c30 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 73   (argv[1]);..  s
b1c40 69 7a 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b  ize = int_value;
b1c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
b1c60 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
b1c70 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
b1c80 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
b1c90 41 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  AT).      {..  s
b1ca0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ize = sqlite3_va
b1cb0 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
b1cc0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [1]);.      }.  
b1cd0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
b1ce0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b1cf0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
b1d00 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
b1d10 20 20 7d 0a 20 20 20 20 69 66 20 28 73 69 7a 65    }.    if (size
b1d20 20 3c 3d 20 30 2e 30 29 0a 20 20 20 20 20 20 7b   <= 0.0).      {
b1d30 0a 09 20 20 2f 2a 20 6e 65 67 61 74 69 76 65 20  ..  /* negative 
b1d40 73 69 64 65 20 73 69 7a 65 20 2a 2f 0a 09 20 20  side size */..  
b1d50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b1d60 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
b1d70 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
b1d80 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e  }.    if (argc >
b1d90 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 3).      {..  
b1da0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
b1db0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
b1dc0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
b1dd0 45 52 29 0a 09 20 20 20 20 20 20 6d 6f 64 65 20  ER)..      mode 
b1de0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b1df0 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09  int (argv[2]);..
b1e00 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
b1e10 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b1e20 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
b1e30 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
b1e40 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
b1e50 61 72 67 63 20 3d 3d 20 34 29 0a 20 20 20 20 20  argc == 4).     
b1e60 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
b1e70 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
b1e80 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[3]) != SQLITE
b1e90 5f 42 4c 4f 42 29 0a 09 20 20 20 20 7b 0a 09 09  _BLOB)..    {...
b1ea0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b1eb0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
b1ec0 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
b1ed0 09 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73  .  p_blob = (uns
b1ee0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
b1ef0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
b1f00 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 6e   (argv[3]);..  n
b1f10 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
b1f20 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
b1f30 67 76 5b 33 5d 29 3b 0a 09 20 20 70 6f 69 6e 74  gv[3]);..  point
b1f40 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72   =..      gaiaFr
b1f50 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
b1f60 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
b1f70 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
b1f80 65 2c 0a 09 09 09 09 09 20 20 20 67 70 6b 67 5f  e,......   gpkg_
b1f90 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 09 20 20  amphibious);..  
b1fa0 69 66 20 28 21 70 6f 69 6e 74 29 0a 09 20 20 20  if (!point)..   
b1fb0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
b1fc0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
b1fd0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
b1fe0 20 20 20 7d 0a 09 20 20 69 66 20 28 70 6f 69 6e     }..  if (poin
b1ff0 74 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  t->FirstLinestri
b2000 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  ng != NULL)..   
b2010 20 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 69 6e 74     goto no_point
b2020 3b 0a 09 20 20 69 66 20 28 70 6f 69 6e 74 2d 3e  ;..  if (point->
b2030 46 69 72 73 74 50 6f 6c 79 67 6f 6e 20 21 3d 20  FirstPolygon != 
b2040 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 67 6f 74  NULL)..      got
b2050 6f 20 6e 6f 5f 70 6f 69 6e 74 3b 0a 09 20 20 69  o no_point;..  i
b2060 66 20 28 70 6f 69 6e 74 2d 3e 46 69 72 73 74 50  f (point->FirstP
b2070 6f 69 6e 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  oint != NULL).. 
b2080 20 20 20 7b 0a 09 09 69 66 20 28 70 6f 69 6e 74     {...if (point
b2090 2d 3e 46 69 72 73 74 50 6f 69 6e 74 20 3d 3d 20  ->FirstPoint == 
b20a0 70 6f 69 6e 74 2d 3e 4c 61 73 74 50 6f 69 6e 74  point->LastPoint
b20b0 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
b20c0 6f 72 69 67 69 6e 5f 78 20 3d 20 70 6f 69 6e 74  origin_x = point
b20d0 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 58 3b  ->FirstPoint->X;
b20e0 0a 09 09 20 20 20 20 20 20 6f 72 69 67 69 6e 5f  ...      origin_
b20f0 79 20 3d 20 70 6f 69 6e 74 2d 3e 46 69 72 73 74  y = point->First
b2100 50 6f 69 6e 74 2d 3e 59 3b 0a 09 09 20 20 20 20  Point->Y;...    
b2110 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
b2120 6c 6c 20 28 70 6f 69 6e 74 29 3b 0a 09 09 20 20  ll (point);...  
b2130 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67  }...else...    g
b2140 6f 74 6f 20 6e 6f 5f 70 6f 69 6e 74 3b 0a 09 20  oto no_point;.. 
b2150 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
b2160 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 69 6e      goto no_poin
b2170 74 3b 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t;..      }.    
b2180 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
b2190 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
b21a0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
b21b0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
b21c0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
b21d0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
b21e0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
b21f0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
b2200 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
b2210 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
b2220 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
b2230 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
b2240 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67 65  us);.    if (!ge
b2250 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  o)..sqlite3_resu
b2260 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b2270 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
b2280 20 20 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74    {..  void *dat
b2290 61 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  a = sqlite3_user
b22a0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
b22b0 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e 46 69 72  ..  if (geo->Fir
b22c0 73 74 50 6f 69 6e 74 20 21 3d 20 4e 55 4c 4c 29  stPoint != NULL)
b22d0 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  ..      goto no_
b22e0 70 6f 6c 79 67 6f 6e 3b 0a 09 20 20 69 66 20 28  polygon;..  if (
b22f0 67 65 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74  geo->FirstLinest
b2300 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20  ring != NULL).. 
b2310 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 70 6f 6c       goto no_pol
b2320 79 67 6f 6e 3b 0a 09 20 20 69 66 20 28 67 65 6f  ygon;..  if (geo
b2330 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 20 3d  ->FirstPolygon =
b2340 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 67  = NULL)..      g
b2350 6f 74 6f 20 6e 6f 5f 70 6f 6c 79 67 6f 6e 3b 0a  oto no_polygon;.
b2360 09 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e  .  if (data != N
b2370 55 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75  ULL)..      resu
b2380 6c 74 20 3d 0a 09 09 20 20 67 61 69 61 48 65 78  lt =...  gaiaHex
b2390 61 67 6f 6e 61 6c 47 72 69 64 5f 72 20 28 64 61  agonalGrid_r (da
b23a0 74 61 2c 20 67 65 6f 2c 20 6f 72 69 67 69 6e 5f  ta, geo, origin_
b23b0 78 2c 20 6f 72 69 67 69 6e 5f 79 2c 20 73 69 7a  x, origin_y, siz
b23c0 65 2c 0a 09 09 09 09 20 20 20 20 20 20 20 6d 6f  e,.....       mo
b23d0 64 65 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  de);..  else..  
b23e0 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 61 69      result = gai
b23f0 61 48 65 78 61 67 6f 6e 61 6c 47 72 69 64 20 28  aHexagonalGrid (
b2400 67 65 6f 2c 20 6f 72 69 67 69 6e 5f 78 2c 20 6f  geo, origin_x, o
b2410 72 69 67 69 6e 5f 79 2c 20 73 69 7a 65 2c 20 6d  rigin_y, size, m
b2420 6f 64 65 29 3b 0a 09 20 20 69 66 20 28 72 65 73  ode);..  if (res
b2430 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  ult == NULL)..  
b2440 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b2450 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b2460 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
b2470 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68  {.../* builds th
b2480 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20  e BLOB geometry 
b2490 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
b24a0 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75  /...int len;...u
b24b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
b24c0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09  result = NULL;..
b24d0 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20  .result->Srid = 
b24e0 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69  geo->Srid;...gai
b24f0 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
b2500 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c  bWkbEx2 (result,
b2510 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
b2520 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f  ,......    gpkg_
b2530 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74  mode, tiny_point
b2540 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
b2550 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
b2560 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
b2570 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46  , free);...gaiaF
b2580 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
b2590 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ult);..    }.   
b25a0 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
b25b0 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
b25c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
b25d0 6e 6f 5f 70 6f 69 6e 74 3a 0a 20 20 20 20 67 61  no_point:.    ga
b25e0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
b25f0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  point);.    sqli
b2600 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
b2610 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  (context);.    r
b2620 65 74 75 72 6e 3b 0a 0a 20 20 6e 6f 5f 70 6f 6c  eturn;..  no_pol
b2630 79 67 6f 6e 3a 0a 20 20 20 20 67 61 69 61 46 72  ygon:.    gaiaFr
b2640 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29  eeGeomColl (geo)
b2650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
b2660 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
b2670 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  xt);.    return;
b2680 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
b2690 66 6e 63 74 5f 4c 69 6e 65 73 43 75 74 41 74 4e  fnct_LinesCutAtN
b26a0 6f 64 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f  odes (sqlite3_co
b26b0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
b26c0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
b26d0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
b26e0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
b26f0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4c  QL function:./ L
b2700 69 6e 65 73 43 75 74 41 74 4e 6f 64 65 73 28 42  inesCutAtNodes(B
b2710 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  LOBencoded geome
b2720 74 72 79 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65  try1, BLOBencode
b2730 64 20 67 65 6f 6d 65 74 72 79 32 29 0a 2f 0a 2f  d geometry2)././
b2740 20 41 73 73 75 6d 69 6e 67 20 74 68 61 74 20 47   Assuming that G
b2750 65 6f 6d 65 74 72 79 2d 31 20 72 65 70 72 65 73  eometry-1 repres
b2760 65 6e 74 73 20 61 20 73 65 74 20 6f 66 20 61 72  ents a set of ar
b2770 62 69 74 72 61 79 20 4c 69 6e 65 73 74 72 69 6e  bitray Linestrin
b2780 67 73 2c 0a 2f 20 61 6e 64 20 74 68 61 74 20 47  gs,./ and that G
b2790 65 6f 6d 65 74 72 79 2d 32 20 72 65 70 72 65 73  eometry-2 repres
b27a0 65 6e 74 73 20 6f 66 20 61 72 62 69 74 72 61 72  ents of arbitrar
b27b0 79 20 50 6f 69 6e 74 73 2c 20 74 68 69 73 20 66  y Points, this f
b27c0 75 6e 63 74 69 6f 6e 20 0a 2f 20 77 69 6c 6c 20  unction ./ will 
b27d0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
b27e0 63 75 74 20 6c 69 6e 65 73 20 61 63 63 6f 72 64  cut lines accord
b27f0 69 6e 67 6c 79 20 74 6f 20 67 69 76 65 6e 20 6e  ingly to given n
b2800 6f 64 65 73 2e 0a 2f 20 4e 55 4c 4c 20 69 73 20  odes../ NULL is 
b2810 72 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76  returned for inv
b2820 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
b2830 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
b2840 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
b2850 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
b2860 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
b2870 72 20 67 65 6f 6d 31 20 3d 20 4e 55 4c 4c 3b 0a  r geom1 = NULL;.
b2880 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
b2890 50 74 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c  Ptr geom2 = NULL
b28a0 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
b28b0 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20  llPtr result;.  
b28c0 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
b28d0 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
b28e0 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
b28f0 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
b2900 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
b2910 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
b2920 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
b2930 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
b2940 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
b2950 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
b2960 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
b2970 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
b2980 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
b2990 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
b29a0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
b29b0 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
b29c0 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
b29d0 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
b29e0 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
b29f0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
b2a00 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
b2a10 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
b2a20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
b2a30 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
b2a40 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
b2a50 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
b2a60 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
b2a70 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
b2a80 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
b2a90 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
b2aa0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
b2ab0 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [1]) != SQLITE_B
b2ac0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
b2ad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b2ae0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
b2af0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
b2b00 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
b2b10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
b2b20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
b2b30 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
b2b40 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
b2b50 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
b2b60 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
b2b70 67 65 6f 6d 31 20 3d 0a 09 67 61 69 61 46 72 6f  geom1 =..gaiaFro
b2b80 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
b2b90 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
b2ba0 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
b2bb0 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
b2bc0 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
b2bd0 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
b2be0 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
b2bf0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
b2c00 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f  argv[1]);.    n_
b2c10 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
b2c20 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
b2c30 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 32  v[1]);.    geom2
b2c40 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
b2c50 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
b2c60 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
b2c70 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
b2c80 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
b2c90 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
b2ca0 67 65 6f 6d 31 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  geom1 == NULL ||
b2cb0 20 67 65 6f 6d 32 20 3d 3d 20 4e 55 4c 4c 29 0a   geom2 == NULL).
b2cc0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67        {..  if (g
b2cd0 65 6f 6d 31 29 0a 09 20 20 20 20 20 20 67 61 69  eom1)..      gai
b2ce0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
b2cf0 65 6f 6d 31 29 3b 0a 09 20 20 69 66 20 28 67 65  eom1);..  if (ge
b2d00 6f 6d 32 29 0a 09 20 20 20 20 20 20 67 61 69 61  om2)..      gaia
b2d10 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
b2d20 6f 6d 32 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  om2);..  sqlite3
b2d30 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
b2d40 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
b2d50 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  n;.      }.    r
b2d60 65 73 75 6c 74 20 3d 20 67 61 69 61 4c 69 6e 65  esult = gaiaLine
b2d70 73 43 75 74 41 74 4e 6f 64 65 73 20 28 67 65 6f  sCutAtNodes (geo
b2d80 6d 31 2c 20 67 65 6f 6d 32 29 3b 0a 20 20 20 20  m1, geom2);.    
b2d90 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55  if (result == NU
b2da0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  LL).      {..  s
b2db0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
b2dc0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
b2dd0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
b2de0 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 62 75 69       {..  /* bui
b2df0 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f  lds the BLOB geo
b2e00 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75  metry to be retu
b2e10 72 6e 65 64 20 2a 2f 0a 09 20 20 69 6e 74 20 6c  rned */..  int l
b2e20 65 6e 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20  en;..  unsigned 
b2e30 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d  char *p_result =
b2e40 20 4e 55 4c 4c 3b 0a 09 20 20 72 65 73 75 6c 74   NULL;..  result
b2e50 2d 3e 53 72 69 64 20 3d 20 67 65 6f 6d 31 2d 3e  ->Srid = geom1->
b2e60 53 72 69 64 3b 0a 09 20 20 67 61 69 61 54 6f 53  Srid;..  gaiaToS
b2e70 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
b2e80 45 78 32 20 28 72 65 73 75 6c 74 2c 20 26 70 5f  Ex2 (result, &p_
b2e90 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c 20 67 70  result, &len, gp
b2ea0 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
b2eb0 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a     tiny_point);.
b2ec0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
b2ed0 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
b2ee0 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20   p_result, len, 
b2ef0 66 72 65 65 29 3b 0a 09 20 20 67 61 69 61 46 72  free);..  gaiaFr
b2f00 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75  eeGeomColl (resu
b2f10 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lt);.      }.   
b2f20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
b2f30 6c 20 28 67 65 6f 6d 31 29 3b 0a 20 20 20 20 67  l (geom1);.    g
b2f40 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
b2f50 28 67 65 6f 6d 32 29 3b 0a 7d 0a 0a 73 74 61 74  (geom2);.}..stat
b2f60 69 63 20 69 6e 74 0a 63 6d 70 5f 70 74 5f 63 6f  ic int.cmp_pt_co
b2f70 6f 72 64 73 20 28 63 6f 6e 73 74 20 76 6f 69 64  ords (const void
b2f80 20 2a 70 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64   *p1, const void
b2f90 20 2a 70 32 29 0a 7b 0a 2f 2a 20 63 6f 6d 70 61   *p2).{./* compa
b2fa0 72 65 73 20 74 77 6f 20 6e 6f 64 65 73 20 20 62  res two nodes  b
b2fb0 79 20 49 44 20 5b 66 6f 72 20 51 53 4f 52 54 5d  y ID [for QSORT]
b2fc0 20 2a 2f 0a 20 20 20 20 67 61 69 61 50 6f 69 6e   */.    gaiaPoin
b2fd0 74 50 74 72 20 70 74 31 20 3d 20 2a 28 28 67 61  tPtr pt1 = *((ga
b2fe0 69 61 50 6f 69 6e 74 50 74 72 20 2a 29 20 70 31  iaPointPtr *) p1
b2ff0 29 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e 74  );.    gaiaPoint
b3000 50 74 72 20 70 74 32 20 3d 20 2a 28 28 67 61 69  Ptr pt2 = *((gai
b3010 61 50 6f 69 6e 74 50 74 72 20 2a 29 20 70 32 29  aPointPtr *) p2)
b3020 3b 0a 20 20 20 20 69 66 20 28 70 74 31 2d 3e 58  ;.    if (pt1->X
b3030 20 3d 3d 20 70 74 32 2d 3e 58 20 26 26 20 70 74   == pt2->X && pt
b3040 31 2d 3e 59 20 3d 3d 20 70 74 32 2d 3e 59 20 26  1->Y == pt2->Y &
b3050 26 20 70 74 31 2d 3e 5a 20 3d 3d 20 70 74 32 2d  & pt1->Z == pt2-
b3060 3e 5a 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  >Z)..return 0;. 
b3070 20 20 20 69 66 20 28 70 74 31 2d 3e 58 20 3e 20     if (pt1->X > 
b3080 70 74 32 2d 3e 58 29 0a 09 72 65 74 75 72 6e 20  pt2->X)..return 
b3090 31 3b 0a 20 20 20 20 69 66 20 28 70 74 31 2d 3e  1;.    if (pt1->
b30a0 58 20 3d 3d 20 70 74 32 2d 3e 58 20 26 26 20 70  X == pt2->X && p
b30b0 74 31 2d 3e 59 20 3e 20 70 74 32 2d 3e 59 29 0a  t1->Y > pt2->Y).
b30c0 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69  .return 1;.    i
b30d0 66 20 28 70 74 31 2d 3e 58 20 3d 3d 20 70 74 32  f (pt1->X == pt2
b30e0 2d 3e 58 20 26 26 20 70 74 31 2d 3e 59 20 3d 3d  ->X && pt1->Y ==
b30f0 20 70 74 32 2d 3e 59 20 26 26 20 70 74 31 2d 3e   pt2->Y && pt1->
b3100 5a 20 3e 20 70 74 32 2d 3e 5a 29 0a 09 72 65 74  Z > pt2->Z)..ret
b3110 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
b3120 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n -1;.}..static 
b3130 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 0a  gaiaGeomCollPtr.
b3140 61 75 78 50 6f 6c 79 67 4e 6f 64 65 73 20 28 67  auxPolygNodes (g
b3150 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
b3160 65 6f 6d 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70  eom).{./* attemp
b3170 74 69 6e 67 20 74 6f 20 69 64 65 6e 74 69 66 79  ting to identify
b3180 20 52 69 6e 67 2d 4e 6f 64 65 73 20 2a 2f 0a 20   Ring-Nodes */. 
b3190 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
b31a0 74 72 20 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  tr result = NULL
b31b0 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f  ;.    gaiaPolygo
b31c0 6e 50 74 72 20 70 67 3b 0a 20 20 20 20 67 61 69  nPtr pg;.    gai
b31d0 61 52 69 6e 67 50 74 72 20 72 6e 67 3b 0a 20 20  aRingPtr rng;.  
b31e0 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72 20 70    gaiaPointPtr p
b31f0 74 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e 74  t;.    gaiaPoint
b3200 50 74 72 20 70 72 65 76 5f 70 74 3b 0a 20 20 20  Ptr prev_pt;.   
b3210 20 67 61 69 61 50 6f 69 6e 74 50 74 72 20 2a 73   gaiaPointPtr *s
b3220 6f 72 74 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  orted = NULL;.  
b3230 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b    int count = 0;
b3240 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20  .    int iv;.   
b3250 20 69 6e 74 20 69 62 3b 0a 20 20 20 20 64 6f 75   int ib;.    dou
b3260 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c  ble x;.    doubl
b3270 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e y;.    double 
b3280 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b  z;.    double m;
b3290 0a 0a 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61  ../* inserting a
b32a0 6c 6c 20 50 6f 69 6e 74 73 20 69 6e 74 6f 20 61  ll Points into a
b32b0 20 44 79 6e 61 6d 69 63 20 4c 69 6e 65 20 2a 2f   Dynamic Line */
b32c0 0a 20 20 20 20 67 61 69 61 44 79 6e 61 6d 69 63  .    gaiaDynamic
b32d0 4c 69 6e 65 50 74 72 20 64 79 6e 20 3d 20 67 61  LinePtr dyn = ga
b32e0 69 61 41 6c 6c 6f 63 44 79 6e 61 6d 69 63 4c 69  iaAllocDynamicLi
b32f0 6e 65 20 28 29 3b 0a 20 20 20 20 70 67 20 3d 20  ne ();.    pg = 
b3300 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67  geom->FirstPolyg
b3310 6f 6e 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70  on;.    while (p
b3320 67 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 6e  g).      {..  rn
b3330 67 20 3d 20 70 67 2d 3e 45 78 74 65 72 69 6f 72  g = pg->Exterior
b3340 3b 0a 09 20 20 2f 2a 20 43 41 56 45 41 54 3a 20  ;..  /* CAVEAT: 
b3350 66 69 72 73 74 20 70 6f 69 6e 74 20 6e 65 65 64  first point need
b3360 73 20 74 6f 20 62 65 20 73 6b 69 70 70 65 64 20  s to be skipped 
b3370 28 63 6c 6f 73 65 64 20 72 69 6e 67 29 20 2a 2f  (closed ring) */
b3380 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 31 3b  ..  for (iv = 1;
b3390 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e 74   iv < rng->Point
b33a0 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b 0a  s; iv++)..    {.
b33b0 09 09 2f 2a 20 65 78 74 65 72 69 6f 72 20 72 69  ../* exterior ri
b33c0 6e 67 20 2a 2f 0a 09 09 69 66 20 28 67 65 6f 6d  ng */...if (geom
b33d0 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
b33e0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
b33f0 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69  .  {...      gai
b3400 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e  aGetPointXYZ (rn
b3410 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  g->Coords, iv, &
b3420 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 20 20  x, &y, &z);...  
b3430 20 20 20 20 67 61 69 61 41 70 70 65 6e 64 50 6f      gaiaAppendPo
b3440 69 6e 74 5a 54 6f 44 79 6e 61 6d 69 63 4c 69 6e  intZToDynamicLin
b3450 65 20 28 64 79 6e 2c 20 78 2c 20 79 2c 20 7a 29  e (dyn, x, y, z)
b3460 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69  ;...  }...else i
b3470 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
b3480 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
b3490 58 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20  XY_M)...  {...  
b34a0 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74      gaiaGetPoint
b34b0 58 59 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73  XYM (rng->Coords
b34c0 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d  , iv, &x, &y, &m
b34d0 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 41  );...      gaiaA
b34e0 70 70 65 6e 64 50 6f 69 6e 74 4d 54 6f 44 79 6e  ppendPointMToDyn
b34f0 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e 2c 20 78  amicLine (dyn, x
b3500 2c 20 79 2c 20 6d 29 3b 0a 09 09 20 20 7d 0a 09  , y, m);...  }..
b3510 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
b3520 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
b3530 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
b3540 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69  .  {...      gai
b3550 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 72  aGetPointXYZM (r
b3560 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
b3570 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b  &x, &y, &z, &m);
b3580 0a 09 09 20 20 20 20 20 20 67 61 69 61 41 70 70  ...      gaiaApp
b3590 65 6e 64 50 6f 69 6e 74 5a 4d 54 6f 44 79 6e 61  endPointZMToDyna
b35a0 6d 69 63 4c 69 6e 65 20 28 64 79 6e 2c 20 78 2c  micLine (dyn, x,
b35b0 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 20 20 7d   y, z, m);...  }
b35c0 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09  ...else...  {...
b35d0 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69        gaiaGetPoi
b35e0 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c  nt (rng->Coords,
b35f0 20 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09   iv, &x, &y);...
b3600 20 20 20 20 20 20 67 61 69 61 41 70 70 65 6e 64        gaiaAppend
b3610 50 6f 69 6e 74 54 6f 44 79 6e 61 6d 69 63 4c 69  PointToDynamicLi
b3620 6e 65 20 28 64 79 6e 2c 20 78 2c 20 79 29 3b 0a  ne (dyn, x, y);.
b3630 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 0a 09 20  ..  }..    }... 
b3640 20 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62   for (ib = 0; ib
b3650 20 3c 20 70 67 2d 3e 4e 75 6d 49 6e 74 65 72 69   < pg->NumInteri
b3660 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20 20 20  ors; ib++)..    
b3670 7b 0a 09 09 72 6e 67 20 3d 20 70 67 2d 3e 49 6e  {...rng = pg->In
b3680 74 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09  teriors + ib;...
b3690 2f 2a 20 43 41 56 45 41 54 3a 20 66 69 72 73 74  /* CAVEAT: first
b36a0 20 70 6f 69 6e 74 20 6e 65 65 64 73 20 74 6f 20   point needs to 
b36b0 62 65 20 73 6b 69 70 70 65 64 20 28 63 6c 6f 73  be skipped (clos
b36c0 65 64 20 72 69 6e 67 29 20 2a 2f 0a 09 09 66 6f  ed ring) */...fo
b36d0 72 20 28 69 76 20 3d 20 31 3b 20 69 76 20 3c 20  r (iv = 1; iv < 
b36e0 72 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b  rng->Points; iv+
b36f0 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  +)...  {...     
b3700 20 2f 2a 20 69 6e 74 65 72 69 6f 72 20 72 69 6e   /* interior rin
b3710 67 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 20  g */...      if 
b3720 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
b3730 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
b3740 5f 5a 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  _Z)....{....    
b3750 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20  gaiaGetPointXYZ 
b3760 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  (rng->Coords, iv
b3770 2c 20 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09  , &x, &y, &z);..
b3780 09 09 20 20 20 20 67 61 69 61 41 70 70 65 6e 64  ..    gaiaAppend
b3790 50 6f 69 6e 74 5a 54 6f 44 79 6e 61 6d 69 63 4c  PointZToDynamicL
b37a0 69 6e 65 20 28 64 79 6e 2c 20 78 2c 20 79 2c 20  ine (dyn, x, y, 
b37b0 7a 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  z);....}...     
b37c0 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e   else if (geom->
b37d0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
b37e0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09  = GAIA_XY_M)....
b37f0 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74  {....    gaiaGet
b3800 50 6f 69 6e 74 58 59 4d 20 28 72 6e 67 2d 3e 43  PointXYM (rng->C
b3810 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
b3820 79 2c 20 26 6d 29 3b 0a 09 09 09 20 20 20 20 67  y, &m);....    g
b3830 61 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 4d 54  aiaAppendPointMT
b3840 6f 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79  oDynamicLine (dy
b3850 6e 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 09 09  n, x, y, m);....
b3860 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 69  }...      else i
b3870 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
b3880 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
b3890 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b 0a 09 09 09  XY_Z_M)....{....
b38a0 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74      gaiaGetPoint
b38b0 58 59 5a 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64  XYZM (rng->Coord
b38c0 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  s, iv, &x, &y, &
b38d0 7a 2c 20 26 6d 29 3b 0a 09 09 09 20 20 20 20 67  z, &m);....    g
b38e0 61 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 5a 4d  aiaAppendPointZM
b38f0 54 6f 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64  ToDynamicLine (d
b3900 79 6e 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b  yn, x, y, z, m);
b3910 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c  ....}...      el
b3920 73 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67  se....{....    g
b3930 61 69 61 47 65 74 50 6f 69 6e 74 20 28 72 6e 67  aiaGetPoint (rng
b3940 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78  ->Coords, iv, &x
b3950 2c 20 26 79 29 3b 0a 09 09 09 20 20 20 20 67 61  , &y);....    ga
b3960 69 61 41 70 70 65 6e 64 50 6f 69 6e 74 54 6f 44  iaAppendPointToD
b3970 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e 2c  ynamicLine (dyn,
b3980 20 78 2c 20 79 29 3b 0a 09 09 09 7d 0a 09 09 20   x, y);....}... 
b3990 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 70 67 20   }..    }..  pg 
b39a0 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20  = pg->Next;.    
b39b0 20 20 7d 0a 0a 20 20 20 20 70 74 20 3d 20 64 79    }..    pt = dy
b39c0 6e 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 77 68  n->First;.    wh
b39d0 69 6c 65 20 28 70 74 29 0a 20 20 20 20 20 20 7b  ile (pt).      {
b39e0 0a 09 20 20 2f 2a 20 63 6f 75 6e 74 69 6e 67 20  ..  /* counting 
b39f0 68 6f 77 20 6d 61 6e 79 20 70 6f 69 6e 74 73 20  how many points 
b3a00 2a 2f 0a 09 20 20 63 6f 75 6e 74 2b 2b 3b 0a 09  */..  count++;..
b3a10 20 20 70 74 20 3d 20 70 74 2d 3e 4e 65 78 74 3b    pt = pt->Next;
b3a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
b3a30 28 63 6f 75 6e 74 20 3d 3d 20 30 29 0a 20 20 20  (count == 0).   
b3a40 20 20 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65     {..  gaiaFree
b3a50 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28 64 79 6e  DynamicLine (dyn
b3a60 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c  );..  return NUL
b3a70 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 61  L;.      }../* a
b3a80 6c 6c 6f 63 61 74 69 6e 67 20 61 6e 64 20 69 6e  llocating and in
b3a90 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20 61 72  itializing an ar
b3aa0 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
b3ab0 2a 2f 0a 20 20 20 20 73 6f 72 74 65 64 20 3d 20  */.    sorted = 
b3ac0 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28  malloc (sizeof (
b3ad0 67 61 69 61 50 6f 69 6e 74 50 74 72 29 20 2a 20  gaiaPointPtr) * 
b3ae0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 69 76 20 3d  count);.    iv =
b3af0 20 30 3b 0a 20 20 20 20 70 74 20 3d 20 64 79 6e   0;.    pt = dyn
b3b00 2d 3e 46 69 72 73 74 3b 0a 20 20 20 20 77 68 69  ->First;.    whi
b3b10 6c 65 20 28 70 74 29 0a 20 20 20 20 20 20 7b 0a  le (pt).      {.
b3b20 09 20 20 2a 28 73 6f 72 74 65 64 20 2b 20 69 76  .  *(sorted + iv
b3b30 2b 2b 29 20 3d 20 70 74 3b 0a 09 20 20 70 74 20  ++) = pt;..  pt 
b3b40 3d 20 70 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20  = pt->Next;.    
b3b50 20 20 7d 0a 0a 2f 2a 20 73 6f 72 74 69 6e 67 20    }../* sorting 
b3b60 70 6f 69 6e 74 73 20 62 79 20 63 6f 6f 72 64 73  points by coords
b3b70 20 2a 2f 0a 20 20 20 20 71 73 6f 72 74 20 28 73   */.    qsort (s
b3b80 6f 72 74 65 64 2c 20 63 6f 75 6e 74 2c 20 73 69  orted, count, si
b3b90 7a 65 6f 66 20 28 67 61 69 61 50 6f 69 6e 74 50  zeof (gaiaPointP
b3ba0 74 72 29 2c 20 63 6d 70 5f 70 74 5f 63 6f 6f 72  tr), cmp_pt_coor
b3bb0 64 73 29 3b 0a 0a 20 20 20 20 69 66 20 28 67 65  ds);..    if (ge
b3bc0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
b3bd0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
b3be0 0a 09 72 65 73 75 6c 74 20 3d 20 67 61 69 61 41  ..result = gaiaA
b3bf0 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20  llocGeomCollXYZ 
b3c00 28 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ();.    else if 
b3c10 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
b3c20 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
b3c30 5f 4d 29 0a 09 72 65 73 75 6c 74 20 3d 20 67 61  _M)..result = ga
b3c40 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58  iaAllocGeomCollX
b3c50 59 4d 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 20  YM ();.    else 
b3c60 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
b3c70 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
b3c80 5f 58 59 5f 5a 5f 4d 29 0a 09 72 65 73 75 6c 74  _XY_Z_M)..result
b3c90 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
b3ca0 43 6f 6c 6c 58 59 5a 4d 20 28 29 3b 0a 20 20 20  CollXYZM ();.   
b3cb0 20 65 6c 73 65 0a 09 72 65 73 75 6c 74 20 3d 20   else..result = 
b3cc0 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c  gaiaAllocGeomCol
b3cd0 6c 20 28 29 3b 0a 20 20 20 20 72 65 73 75 6c 74  l ();.    result
b3ce0 2d 3e 53 72 69 64 20 3d 20 67 65 6f 6d 2d 3e 53  ->Srid = geom->S
b3cf0 72 69 64 3b 0a 0a 2f 2a 20 69 64 65 6e 74 69 66  rid;../* identif
b3d00 79 69 6e 67 20 6e 6f 64 65 73 20 2a 2f 0a 20 20  ying nodes */.  
b3d10 20 20 70 72 65 76 5f 70 74 20 3d 20 4e 55 4c 4c    prev_pt = NULL
b3d20 3b 0a 20 20 20 20 66 6f 72 20 28 69 76 20 3d 20  ;.    for (iv = 
b3d30 30 3b 20 69 76 20 3c 20 63 6f 75 6e 74 3b 20 69  0; iv < count; i
b3d40 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  v++).      {..  
b3d50 70 74 20 3d 20 2a 28 73 6f 72 74 65 64 20 2b 20  pt = *(sorted + 
b3d60 69 76 29 3b 0a 09 20 20 69 66 20 28 70 72 65 76  iv);..  if (prev
b3d70 5f 70 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  _pt != NULL)..  
b3d80 20 20 7b 0a 09 09 69 66 20 28 70 72 65 76 5f 70    {...if (prev_p
b3d90 74 2d 3e 58 20 3d 3d 20 70 74 2d 3e 58 20 26 26  t->X == pt->X &&
b3da0 20 70 72 65 76 5f 70 74 2d 3e 59 20 3d 3d 20 70   prev_pt->Y == p
b3db0 74 2d 3e 59 0a 09 09 20 20 20 20 26 26 20 70 72  t->Y...    && pr
b3dc0 65 76 5f 70 74 2d 3e 5a 20 3d 3d 20 70 74 2d 3e  ev_pt->Z == pt->
b3dd0 5a 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  Z)...  {...     
b3de0 20 69 66 20 28 72 65 73 75 6c 74 2d 3e 4c 61 73   if (result->Las
b3df0 74 50 6f 69 6e 74 20 21 3d 20 4e 55 4c 4c 29 0a  tPoint != NULL).
b3e00 09 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28  ...{....    if (
b3e10 72 65 73 75 6c 74 2d 3e 4c 61 73 74 50 6f 69 6e  result->LastPoin
b3e20 74 2d 3e 58 20 3d 3d 20 70 74 2d 3e 58 0a 09 09  t->X == pt->X...
b3e30 09 09 26 26 20 72 65 73 75 6c 74 2d 3e 4c 61 73  ..&& result->Las
b3e40 74 50 6f 69 6e 74 2d 3e 59 20 3d 3d 20 70 74 2d  tPoint->Y == pt-
b3e50 3e 59 0a 09 09 09 09 26 26 20 72 65 73 75 6c 74  >Y.....&& result
b3e60 2d 3e 4c 61 73 74 50 6f 69 6e 74 2d 3e 5a 20 3d  ->LastPoint->Z =
b3e70 3d 20 70 74 2d 3e 5a 29 0a 09 09 09 09 63 6f 6e  = pt->Z).....con
b3e80 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 09 09 20 20  tinue;....}...  
b3e90 20 20 20 20 2f 2a 20 4e 6f 64 65 20 66 6f 75 6e      /* Node foun
b3ea0 64 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 20  d */...      if 
b3eb0 28 72 65 73 75 6c 74 2d 3e 44 69 6d 65 6e 73 69  (result->Dimensi
b3ec0 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
b3ed0 58 59 5f 5a 29 0a 09 09 09 20 20 67 61 69 61 41  XY_Z)....  gaiaA
b3ee0 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c  ddPointToGeomCol
b3ef0 6c 58 59 5a 20 28 72 65 73 75 6c 74 2c 20 70 74  lXYZ (result, pt
b3f00 2d 3e 58 2c 20 70 74 2d 3e 59 2c 0a 09 09 09 09  ->X, pt->Y,.....
b3f10 09 09 20 20 20 20 20 70 74 2d 3e 5a 29 3b 0a 09  ..     pt->Z);..
b3f20 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28  .      else if (
b3f30 72 65 73 75 6c 74 2d 3e 44 69 6d 65 6e 73 69 6f  result->Dimensio
b3f40 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
b3f50 59 5f 4d 29 0a 09 09 09 20 20 67 61 69 61 41 64  Y_M)....  gaiaAd
b3f60 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
b3f70 58 59 4d 20 28 72 65 73 75 6c 74 2c 20 70 74 2d  XYM (result, pt-
b3f80 3e 58 2c 20 70 74 2d 3e 59 2c 0a 09 09 09 09 09  >X, pt->Y,......
b3f90 09 20 20 20 20 20 70 74 2d 3e 4d 29 3b 0a 09 09  .     pt->M);...
b3fa0 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 72        else if (r
b3fb0 65 73 75 6c 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e  esult->Dimension
b3fc0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
b3fd0 5f 5a 5f 4d 29 0a 09 09 09 20 20 67 61 69 61 41  _Z_M)....  gaiaA
b3fe0 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c  ddPointToGeomCol
b3ff0 6c 58 59 5a 4d 20 28 72 65 73 75 6c 74 2c 20 70  lXYZM (result, p
b4000 74 2d 3e 58 2c 0a 09 09 09 09 09 09 20 20 20 20  t->X,.......    
b4010 20 20 70 74 2d 3e 59 2c 20 70 74 2d 3e 5a 2c 20    pt->Y, pt->Z, 
b4020 70 74 2d 3e 4d 29 3b 0a 09 09 20 20 20 20 20 20  pt->M);...      
b4030 65 6c 73 65 0a 09 09 09 20 20 67 61 69 61 41 64  else....  gaiaAd
b4040 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
b4050 20 28 72 65 73 75 6c 74 2c 20 70 74 2d 3e 58 2c   (result, pt->X,
b4060 20 70 74 2d 3e 59 29 3b 0a 09 09 20 20 7d 0a 09   pt->Y);...  }..
b4070 20 20 20 20 7d 0a 09 20 20 70 72 65 76 5f 70 74      }..  prev_pt
b4080 20 3d 20 70 74 3b 0a 20 20 20 20 20 20 7d 0a 0a   = pt;.      }..
b4090 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 2d 3e      if (result->
b40a0 46 69 72 73 74 50 6f 69 6e 74 20 3d 3d 20 4e 55  FirstPoint == NU
b40b0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
b40c0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
b40d0 28 72 65 73 75 6c 74 29 3b 0a 09 20 20 72 65 73  (result);..  res
b40e0 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ult = NULL;.    
b40f0 20 20 7d 0a 20 20 20 20 66 72 65 65 20 28 73 6f    }.    free (so
b4100 72 74 65 64 29 3b 0a 20 20 20 20 67 61 69 61 46  rted);.    gaiaF
b4110 72 65 65 44 79 6e 61 6d 69 63 4c 69 6e 65 20 28  reeDynamicLine (
b4120 64 79 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  dyn);.    return
b4130 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 73 74 61 74   result;.}..stat
b4140 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 69 6e  ic void.fnct_Rin
b4150 67 73 43 75 74 41 74 4e 6f 64 65 73 20 28 73 71  gsCutAtNodes (sq
b4160 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
b4170 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
b4180 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74  c,...      sqlit
b4190 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
b41a0 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
b41b0 69 6f 6e 3a 0a 2f 20 52 69 6e 67 73 43 75 74 41  ion:./ RingsCutA
b41c0 74 4e 6f 64 65 73 28 42 4c 4f 42 65 6e 63 6f 64  tNodes(BLOBencod
b41d0 65 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  ed geometry)././
b41e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
b41f0 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 72  ill attempt to r
b4200 65 74 75 72 6e 20 61 20 63 6f 6c 6c 65 63 74 69  eturn a collecti
b4210 6f 6e 20 6f 66 20 6c 69 6e 65 73 0a 2f 20 72 65  on of lines./ re
b4220 70 72 65 73 65 6e 74 69 6e 67 20 50 6f 6c 79 67  presenting Polyg
b4230 6f 6e 2f 52 69 6e 67 73 3a 20 74 68 65 20 69 6e  on/Rings: the in
b4240 70 75 74 20 67 65 6f 6d 65 74 72 79 20 69 73 20  put geometry is 
b4250 65 78 70 65 63 74 65 64 0a 2f 20 74 6f 20 62 65  expected./ to be
b4260 20 61 20 50 6f 6c 79 67 6f 6e 20 6f 72 20 4d 75   a Polygon or Mu
b4270 6c 74 69 50 6f 6c 79 67 6f 6e 2e 0a 2f 20 45 61  ltiPolygon../ Ea
b4280 63 68 20 52 69 6e 67 20 77 69 6c 6c 20 62 65 20  ch Ring will be 
b4290 63 75 74 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  cut accordingly 
b42a0 74 6f 20 61 6e 79 20 69 64 65 6e 74 69 66 69 65  to any identifie
b42b0 64 20 22 6e 6f 64 65 22 0a 2f 20 69 2e 65 2e 20  d "node"./ i.e. 
b42c0 73 65 6c 66 2d 69 6e 74 65 72 73 65 63 74 69 6f  self-intersectio
b42d0 6e 73 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ns or intersecti
b42e0 6f 6e 73 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ons between two 
b42f0 52 69 6e 67 73 2e 0a 2f 0a 2f 20 4e 55 4c 4c 20  Rings.././ NULL 
b4300 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  is returned for 
b4310 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
b4320 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 70 74 73  s.*/.    int pts
b4330 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6e   = 0;.    int ln
b4340 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 70  s = 0;.    int p
b4350 67 73 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69  gs = 0;.    unsi
b4360 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
b4370 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
b4380 65 73 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e  es;.    gaiaPoin
b4390 74 50 74 72 20 70 74 3b 0a 20 20 20 20 67 61 69  tPtr pt;.    gai
b43a0 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c  aLinestringPtr l
b43b0 6e 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67  n;.    gaiaPolyg
b43c0 6f 6e 50 74 72 20 70 67 3b 0a 20 20 20 20 67 61  onPtr pg;.    ga
b43d0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
b43e0 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  om = NULL;.    g
b43f0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
b4400 65 6f 6d 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  eom1 = NULL;.   
b4410 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
b4420 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20   geom2 = NULL;. 
b4430 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
b4440 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 69  tr result;.    i
b4450 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
b4460 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
b4470 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
b4480 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e     int tiny_poin
b4490 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  t = 0;.    struc
b44a0 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
b44b0 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
b44c0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
b44d0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
b44e0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
b44f0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
b4500 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
b4510 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20  cache != NULL). 
b4520 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61       {..  gpkg_a
b4530 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68  mphibious = cach
b4540 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  e->gpkg_amphibio
b4550 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67  us_mode;..  gpkg
b4560 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67  _mode = cache->g
b4570 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e  pkg_mode;..  tin
b4580 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d  y_point = cache-
b4590 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65  >tinyPointEnable
b45a0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  d;.      }.    i
b45b0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
b45c0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
b45d0 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
b45e0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
b45f0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b4600 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
b4610 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
b4620 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
b4630 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
b4640 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
b4650 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
b4660 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
b4670 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
b4680 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 20  v[0]);.    geom 
b4690 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
b46a0 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
b46b0 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
b46c0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
b46d0 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
b46e0 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 67  ious);.    if (g
b46f0 65 6f 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  eom == NULL).   
b4700 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
b4710 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b4720 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
b4730 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 68  ;.      }../* ch
b4740 65 63 6b 69 6e 67 20 69 66 20 47 65 6f 6d 65 74  ecking if Geomet
b4750 72 79 20 69 73 20 61 20 50 6f 6c 79 67 6f 6e 20  ry is a Polygon 
b4760 6f 72 20 4d 75 6c 74 69 50 6f 6c 79 68 6f 6e 20  or MultiPolyhon 
b4770 2a 2f 0a 20 20 20 20 70 74 20 3d 20 67 65 6f 6d  */.    pt = geom
b4780 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20  ->FirstPoint;.  
b4790 20 20 77 68 69 6c 65 20 28 70 74 29 0a 20 20 20    while (pt).   
b47a0 20 20 20 7b 0a 09 20 20 70 74 73 2b 2b 3b 0a 09     {..  pts++;..
b47b0 20 20 70 74 20 3d 20 70 74 2d 3e 4e 65 78 74 3b    pt = pt->Next;
b47c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 6e 20  .      }.    ln 
b47d0 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e  = geom->FirstLin
b47e0 65 73 74 72 69 6e 67 3b 0a 20 20 20 20 77 68 69  estring;.    whi
b47f0 6c 65 20 28 6c 6e 29 0a 20 20 20 20 20 20 7b 0a  le (ln).      {.
b4800 09 20 20 6c 6e 73 2b 2b 3b 0a 09 20 20 6c 6e 20  .  lns++;..  ln 
b4810 3d 20 6c 6e 2d 3e 4e 65 78 74 3b 0a 20 20 20 20  = ln->Next;.    
b4820 20 20 7d 0a 20 20 20 20 70 67 20 3d 20 67 65 6f    }.    pg = geo
b4830 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b  m->FirstPolygon;
b4840 0a 20 20 20 20 77 68 69 6c 65 20 28 70 67 29 0a  .    while (pg).
b4850 20 20 20 20 20 20 7b 0a 09 20 20 70 67 73 2b 2b        {..  pgs++
b4860 3b 0a 09 20 20 70 67 20 3d 20 70 67 2d 3e 4e 65  ;..  pg = pg->Ne
b4870 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
b4880 69 66 20 28 70 74 73 20 3e 20 30 20 7c 7c 20 6c  if (pts > 0 || l
b4890 6e 73 20 3e 20 30 20 7c 7c 20 70 67 73 20 3d 3d  ns > 0 || pgs ==
b48a0 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f   0).      {..  /
b48b0 2a 20 6e 6f 74 20 50 6f 6c 79 67 6f 6e 2f 4d 75  * not Polygon/Mu
b48c0 6c 74 69 50 6f 6c 79 67 6f 6e 20 2a 2f 0a 09 20  ltiPolygon */.. 
b48d0 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
b48e0 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20 73 71 6c  l (geom);..  sql
b48f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
b4900 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
b4910 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  eturn;.      }..
b4920 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  /* transforming 
b4930 52 69 6e 67 73 20 69 6e 74 6f 20 4c 69 6e 65 73  Rings into Lines
b4940 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 67 65  trings */.    ge
b4950 6f 6d 31 20 3d 20 67 61 69 61 4c 69 6e 65 61 72  om1 = gaiaLinear
b4960 69 7a 65 20 28 67 65 6f 6d 2c 20 31 29 3b 0a 20  ize (geom, 1);. 
b4970 20 20 20 69 66 20 28 67 65 6f 6d 31 20 3d 3d 20     if (geom1 == 
b4980 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
b4990 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
b49a0 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20 73 71 6c  l (geom);..  sql
b49b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
b49c0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
b49d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  eturn;.      }..
b49e0 2f 2a 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  /* identifying t
b49f0 68 65 20 4e 6f 64 65 73 20 2a 2f 0a 20 20 20 20  he Nodes */.    
b4a00 67 65 6f 6d 32 20 3d 20 61 75 78 50 6f 6c 79 67  geom2 = auxPolyg
b4a10 4e 6f 64 65 73 20 28 67 65 6f 6d 29 3b 0a 20 20  Nodes (geom);.  
b4a20 20 20 69 66 20 28 67 65 6f 6d 32 20 3d 3d 20 4e    if (geom2 == N
b4a30 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
b4a40 2f 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  /* there is no n
b4a50 65 65 64 20 74 6f 20 63 75 74 20 61 6e 79 20 52  eed to cut any R
b4a60 69 6e 67 20 5b 6e 6f 20 4e 6f 64 65 73 5d 20 2a  ing [no Nodes] *
b4a70 2f 0a 09 20 20 69 6e 74 20 6c 65 6e 3b 0a 09 20  /..  int len;.. 
b4a80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b4a90 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b  p_result = NULL;
b4aa0 0a 09 20 20 67 65 6f 6d 31 2d 3e 53 72 69 64 20  ..  geom1->Srid 
b4ab0 3d 20 67 65 6f 6d 2d 3e 53 72 69 64 3b 0a 09 20  = geom->Srid;.. 
b4ac0 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74   gaiaToSpatiaLit
b4ad0 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f  eBlobWkbEx2 (geo
b4ae0 6d 31 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  m1, &p_result, &
b4af0 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  len, gpkg_mode,.
b4b00 09 09 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70  ....      tiny_p
b4b10 6f 69 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65  oint);..  sqlite
b4b20 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
b4b30 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74  ontext, p_result
b4b40 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20  , len, free);.. 
b4b50 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c   gaiaFreeGeomCol
b4b60 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20 67 61 69  l (geom);..  gai
b4b70 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
b4b80 65 6f 6d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  eom1);..  return
b4b90 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 61 74  ;.      }../* at
b4ba0 74 65 6d 70 74 69 6e 67 20 74 6f 20 63 75 74 20  tempting to cut 
b4bb0 52 69 6e 67 73 20 2a 2f 0a 20 20 20 20 72 65 73  Rings */.    res
b4bc0 75 6c 74 20 3d 20 67 61 69 61 4c 69 6e 65 73 43  ult = gaiaLinesC
b4bd0 75 74 41 74 4e 6f 64 65 73 20 28 67 65 6f 6d 31  utAtNodes (geom1
b4be0 2c 20 67 65 6f 6d 32 29 3b 0a 20 20 20 20 69 66  , geom2);.    if
b4bf0 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c   (result == NULL
b4c00 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
b4c10 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b4c20 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
b4c30 20 7b 0a 09 20 20 2f 2a 20 62 75 69 6c 64 73 20   {..  /* builds 
b4c40 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72  the BLOB geometr
b4c50 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  y to be returned
b4c60 20 2a 2f 0a 09 20 20 69 6e 74 20 6c 65 6e 3b 0a   */..  int len;.
b4c70 09 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b4c80 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
b4c90 4c 3b 0a 09 20 20 72 65 73 75 6c 74 2d 3e 53 72  L;..  result->Sr
b4ca0 69 64 20 3d 20 67 65 6f 6d 2d 3e 53 72 69 64 3b  id = geom->Srid;
b4cb0 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69 61  ..  gaiaToSpatia
b4cc0 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
b4cd0 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c  result, &p_resul
b4ce0 74 2c 20 26 6c 65 6e 2c 20 67 70 6b 67 5f 6d 6f  t, &len, gpkg_mo
b4cf0 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 74 69  de,.....      ti
b4d00 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 73 71  ny_point);..  sq
b4d10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
b4d20 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65  b (context, p_re
b4d30 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29  sult, len, free)
b4d40 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f  ;..  gaiaFreeGeo
b4d50 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a  mColl (result);.
b4d60 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
b4d70 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
b4d80 6f 6d 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65  om);.    gaiaFre
b4d90 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 31  eGeomColl (geom1
b4da0 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  );.    gaiaFreeG
b4db0 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b  eomColl (geom2);
b4dc0 0a 7d 0a 0a 23 69 66 64 65 66 20 47 45 4f 53 5f  .}..#ifdef GEOS_
b4dd0 41 44 56 41 4e 43 45 44 09 09 2f 2a 20 47 45 4f  ADVANCED../* GEO
b4de0 53 20 61 64 76 61 6e 63 65 64 20 66 65 61 74 75  S advanced featu
b4df0 72 65 73 20 2d 20 33 2e 34 2e 30 20 2a 2f 0a 0a  res - 3.4.0 */..
b4e00 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
b4e10 5f 44 65 6c 61 75 6e 61 79 54 72 69 61 6e 67 75  _DelaunayTriangu
b4e20 6c 61 74 69 6f 6e 20 28 73 71 6c 69 74 65 33 5f  lation (sqlite3_
b4e30 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
b4e40 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09  t, int argc,....
b4e50 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
b4e60 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
b4e70 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
b4e80 44 65 6c 61 75 6e 61 79 54 72 69 61 6e 67 75 6c  DelaunayTriangul
b4e90 61 74 69 6f 6e 28 42 4c 4f 42 65 6e 63 6f 64 65  ation(BLOBencode
b4ea0 64 20 67 65 6f 6d 65 74 72 79 29 0a 2f 20 44 65  d geometry)./ De
b4eb0 6c 61 75 6e 61 79 54 72 69 61 6e 67 75 6c 61 74  launayTriangulat
b4ec0 69 6f 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  ion(BLOBencoded 
b4ed0 67 65 6f 6d 65 74 72 79 2c 20 62 6f 6f 6c 65 61  geometry, boolea
b4ee0 6e 20 6f 6e 6c 79 45 64 67 65 73 29 0a 2f 20 44  n onlyEdges)./ D
b4ef0 65 6c 61 75 6e 61 79 54 72 69 61 6e 67 75 6c 61  elaunayTriangula
b4f00 74 69 6f 6e 28 42 4c 4f 42 65 6e 63 6f 64 65 64  tion(BLOBencoded
b4f10 20 67 65 6f 6d 65 74 72 79 2c 20 62 6f 6f 6c 65   geometry, boole
b4f20 61 6e 20 6f 6e 6c 79 45 64 67 65 73 2c 20 64 6f  an onlyEdges, do
b4f30 75 62 6c 65 20 74 6f 6c 65 72 61 6e 63 65 29 0a  uble tolerance).
b4f40 2f 0a 2f 20 41 74 74 65 6d 70 74 73 20 74 6f 20  /./ Attempts to 
b4f50 62 75 69 6c 64 20 61 20 44 65 6c 61 75 6e 61 79  build a Delaunay
b4f60 20 54 72 69 61 6e 67 75 6c 61 74 69 6f 6e 20 75   Triangulation u
b4f70 73 69 6e 67 20 61 6c 6c 20 70 6f 69 6e 74 73 2f  sing all points/
b4f80 76 65 72 74 69 63 65 73 20 0a 2f 20 66 6f 75 6e  vertices ./ foun
b4f90 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 67  d in the input g
b4fa0 65 6f 6d 65 74 72 79 2e 0a 2f 20 4e 55 4c 4c 20  eometry../ NULL 
b4fb0 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  is returned for 
b4fc0 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
b4fd0 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  s.*/.    unsigne
b4fe0 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
b4ff0 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
b5000 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
b5010 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
b5020 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
b5030 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20  lPtr result;.   
b5040 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
b5050 20 20 20 20 64 6f 75 62 6c 65 20 74 6f 6c 65 72      double toler
b5060 61 6e 63 65 20 3d 20 30 2e 30 3b 0a 20 20 20 20  ance = 0.0;.    
b5070 69 6e 74 20 6f 6e 6c 79 5f 65 64 67 65 73 20 3d  int only_edges =
b5080 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
b5090 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
b50a0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
b50b0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
b50c0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
b50d0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
b50e0 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
b50f0 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
b5100 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
b5110 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
b5120 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
b5130 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
b5140 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
b5150 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
b5160 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
b5170 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
b5180 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
b5190 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
b51a0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
b51b0 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
b51c0 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
b51d0 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
b51e0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
b51f0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
b5200 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
b5210 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
b5220 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
b5230 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b5240 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
b5250 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
b5260 67 63 20 3e 3d 20 32 29 0a 20 20 20 20 20 20 7b  gc >= 2).      {
b5270 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
b5280 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
b5290 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [1]) == SQLITE_I
b52a0 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 6f  NTEGER)..      o
b52b0 6e 6c 79 5f 65 64 67 65 73 20 3d 20 73 71 6c 69  nly_edges = sqli
b52c0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
b52d0 72 67 76 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65  rgv[1]);..  else
b52e0 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
b52f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
b5300 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
b5310 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
b5320 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
b5330 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 3).      {..  
b5340 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
b5350 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
b5360 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
b5370 29 0a 09 20 20 20 20 20 20 74 6f 6c 65 72 61 6e  )..      toleran
b5380 63 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ce = sqlite3_val
b5390 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
b53a0 32 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  2]);..  else if 
b53b0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
b53c0 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d  ype (argv[2]) ==
b53d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
b53e0 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61  ..    {...int_va
b53f0 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
b5400 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
b5410 29 3b 0a 09 09 74 6f 6c 65 72 61 6e 63 65 20 3d  );...tolerance =
b5420 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
b5430 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
b5440 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
b5450 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b5460 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
b5470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b5480 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
b5490 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
b54a0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
b54b0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
b54c0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
b54d0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
b54e0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
b54f0 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
b5500 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
b5510 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
b5520 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
b5530 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
b5540 75 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  us);.    if (geo
b5550 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
b5560 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b5570 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
b5580 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 76 6f  se.      {..  vo
b5590 69 64 20 2a 64 61 74 61 20 3d 20 73 71 6c 69 74  id *data = sqlit
b55a0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
b55b0 6e 74 65 78 74 29 3b 0a 09 20 20 69 66 20 28 64  ntext);..  if (d
b55c0 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20  ata != NULL)..  
b55d0 20 20 20 20 72 65 73 75 6c 74 20 3d 0a 09 09 20      result =... 
b55e0 20 67 61 69 61 44 65 6c 61 75 6e 61 79 54 72 69   gaiaDelaunayTri
b55f0 61 6e 67 75 6c 61 74 69 6f 6e 5f 72 20 28 64 61  angulation_r (da
b5600 74 61 2c 20 67 65 6f 2c 20 74 6f 6c 65 72 61 6e  ta, geo, toleran
b5610 63 65 2c 0a 09 09 09 09 09 20 20 20 20 20 20 20  ce,......       
b5620 6f 6e 6c 79 5f 65 64 67 65 73 29 3b 0a 09 20 20  only_edges);..  
b5630 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 73 75  else..      resu
b5640 6c 74 20 3d 20 67 61 69 61 44 65 6c 61 75 6e 61  lt = gaiaDelauna
b5650 79 54 72 69 61 6e 67 75 6c 61 74 69 6f 6e 20 28  yTriangulation (
b5660 67 65 6f 2c 20 74 6f 6c 65 72 61 6e 63 65 2c 20  geo, tolerance, 
b5670 6f 6e 6c 79 5f 65 64 67 65 73 29 3b 0a 09 20 20  only_edges);..  
b5680 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55  if (result == NU
b5690 4c 4c 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74  LL)..      sqlit
b56a0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b56b0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73  context);..  els
b56c0 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75  e..    {.../* bu
b56d0 69 6c 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65  ilds the BLOB ge
b56e0 6f 6d 65 74 72 79 20 74 6f 20 62 65 20 72 65 74  ometry to be ret
b56f0 75 72 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c  urned */...int l
b5700 65 6e 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63  en;...unsigned c
b5710 68 61 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20  har *p_result = 
b5720 4e 55 4c 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e  NULL;...result->
b5730 53 72 69 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64  Srid = geo->Srid
b5740 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61  ;...gaiaToSpatia
b5750 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
b5760 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c  result, &p_resul
b5770 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20  t, &len,......  
b5780 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e    gpkg_mode, tin
b5790 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69  y_point);...sqli
b57a0 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
b57b0 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
b57c0 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
b57d0 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
b57e0 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20  ll (result);..  
b57f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b5800 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
b5810 20 28 67 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69   (geo);.}..stati
b5820 63 20 76 6f 69 64 0a 66 6e 63 74 5f 56 6f 72 6f  c void.fnct_Voro
b5830 6e 6f 6a 44 69 61 67 72 61 6d 20 28 73 71 6c 69  nojDiagram (sqli
b5840 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
b5850 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
b5860 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b5870 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
b5880 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 56 6f 72   function:./ Vor
b5890 6f 6e 6f 6a 44 69 61 67 72 61 6d 28 42 4c 4f 42  onojDiagram(BLOB
b58a0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79  encoded geometry
b58b0 29 0a 2f 20 56 6f 72 6f 6e 6f 6a 44 69 61 67 72  )./ VoronojDiagr
b58c0 61 6d 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  am(BLOBencoded g
b58d0 65 6f 6d 65 74 72 79 2c 20 62 6f 6f 6c 65 61 6e  eometry, boolean
b58e0 20 6f 6e 6c 79 45 64 67 65 73 29 0a 2f 20 56 6f   onlyEdges)./ Vo
b58f0 72 6f 6e 6f 6a 44 69 61 67 72 61 6d 28 42 4c 4f  ronojDiagram(BLO
b5900 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72  Bencoded geometr
b5910 79 2c 20 62 6f 6f 6c 65 61 6e 20 6f 6e 6c 79 45  y, boolean onlyE
b5920 64 67 65 73 2c 20 0a 2f 20 20 20 20 20 20 20 20  dges, ./        
b5930 64 6f 75 62 6c 65 20 65 78 74 72 61 5f 66 72 61  double extra_fra
b5940 6d 65 5f 73 69 7a 65 29 0a 2f 20 56 6f 72 6f 6e  me_size)./ Voron
b5950 6f 6a 44 69 61 67 72 61 6d 28 42 4c 4f 42 65 6e  ojDiagram(BLOBen
b5960 63 6f 64 65 64 20 67 65 6f 6d 65 74 72 79 2c 20  coded geometry, 
b5970 62 6f 6f 6c 65 61 6e 20 6f 6e 6c 79 45 64 67 65  boolean onlyEdge
b5980 73 2c 0a 2f 20 20 20 20 20 20 20 20 64 6f 75 62  s,./        doub
b5990 6c 65 20 65 78 74 72 61 5f 66 72 61 6d 65 5f 73  le extra_frame_s
b59a0 69 7a 65 2c 20 64 6f 75 62 6c 65 20 74 6f 6c 65  ize, double tole
b59b0 72 61 6e 63 65 29 0a 2f 0a 2f 20 41 74 74 65 6d  rance)././ Attem
b59c0 70 74 73 20 74 6f 20 62 75 69 6c 64 20 61 20 56  pts to build a V
b59d0 6f 72 6f 6e 6f 6a 20 44 69 61 67 72 61 6d 20 75  oronoj Diagram u
b59e0 73 69 6e 67 20 61 6c 6c 20 70 6f 69 6e 74 73 2f  sing all points/
b59f0 76 65 72 74 69 63 65 73 20 0a 2f 20 66 6f 75 6e  vertices ./ foun
b5a00 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 67  d in the input g
b5a10 65 6f 6d 65 74 72 79 2e 0a 2f 20 4e 55 4c 4c 20  eometry../ NULL 
b5a20 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  is returned for 
b5a30 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
b5a40 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  s.*/.    unsigne
b5a50 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
b5a60 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
b5a70 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
b5a80 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c 4c 3b  lPtr geo = NULL;
b5a90 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
b5aa0 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20  lPtr result;.   
b5ab0 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   int int_value;.
b5ac0 20 20 20 20 64 6f 75 62 6c 65 20 74 6f 6c 65 72      double toler
b5ad0 61 6e 63 65 20 3d 20 30 2e 30 3b 0a 20 20 20 20  ance = 0.0;.    
b5ae0 64 6f 75 62 6c 65 20 65 78 74 72 61 5f 66 72 61  double extra_fra
b5af0 6d 65 5f 73 69 7a 65 20 3d 20 2d 31 2e 30 3b 0a  me_size = -1.0;.
b5b00 20 20 20 20 69 6e 74 20 6f 6e 6c 79 5f 65 64 67      int only_edg
b5b10 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  es = 0;.    int 
b5b20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
b5b30 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
b5b40 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
b5b50 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
b5b60 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
b5b70 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
b5b80 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
b5b90 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
b5ba0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
b5bb0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
b5bc0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
b5bd0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
b5be0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
b5bf0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
b5c00 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
b5c10 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
b5c20 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
b5c30 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
b5c40 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
b5c50 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
b5c60 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
b5c70 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
b5c80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
b5c90 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
b5ca0 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
b5cb0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
b5cc0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b5cd0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
b5ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
b5cf0 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20   (argc >= 2).   
b5d00 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
b5d10 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
b5d20 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
b5d30 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
b5d40 20 20 20 6f 6e 6c 79 5f 65 64 67 65 73 20 3d 20     only_edges = 
b5d50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
b5d60 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
b5d70 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
b5d80 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
b5d90 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
b5da0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
b5db0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
b5dc0 67 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20 7b  gc >= 3).      {
b5dd0 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
b5de0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
b5df0 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [2]) == SQLITE_F
b5e00 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 65 78 74  LOAT)..      ext
b5e10 72 61 5f 66 72 61 6d 65 5f 73 69 7a 65 20 3d 20  ra_frame_size = 
b5e20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
b5e30 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a  uble (argv[2]);.
b5e40 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69  .  else if (sqli
b5e50 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
b5e60 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
b5e70 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
b5e80 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d   {...int_value =
b5e90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
b5ea0 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 09  nt (argv[2]);...
b5eb0 65 78 74 72 61 5f 66 72 61 6d 65 5f 73 69 7a 65  extra_frame_size
b5ec0 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20   = int_value;.. 
b5ed0 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
b5ee0 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
b5ef0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
b5f00 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
b5f10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b5f20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 34 29    if (argc == 4)
b5f30 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
b5f40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
b5f50 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
b5f60 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20  SQLITE_FLOAT).. 
b5f70 20 20 20 20 20 74 6f 6c 65 72 61 6e 63 65 20 3d       tolerance =
b5f80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
b5f90 6f 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b  ouble (argv[3]);
b5fa0 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c  ..  else if (sql
b5fb0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
b5fc0 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c  (argv[3]) == SQL
b5fd0 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
b5fe0 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20    {...int_value 
b5ff0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b6000 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09  int (argv[3]);..
b6010 09 74 6f 6c 65 72 61 6e 63 65 20 3d 20 69 6e 74  .tolerance = int
b6020 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09  _value;..    }..
b6030 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
b6040 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b6050 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
b6060 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
b6070 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
b6080 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
b6090 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
b60a0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
b60b0 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
b60c0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b60d0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
b60e0 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69  ;.    geo =..gai
b60f0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
b6100 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
b6110 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
b6120 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
b6130 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
b6140 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20  .    if (geo == 
b6150 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72  NULL)..sqlite3_r
b6160 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
b6170 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ext);.    else. 
b6180 20 20 20 20 20 7b 0a 09 20 20 76 6f 69 64 20 2a       {..  void *
b6190 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 75  data = sqlite3_u
b61a0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
b61b0 74 29 3b 0a 09 20 20 69 66 20 28 64 61 74 61 20  t);..  if (data 
b61c0 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20  != NULL)..      
b61d0 72 65 73 75 6c 74 20 3d 0a 09 09 20 20 67 61 69  result =...  gai
b61e0 61 56 6f 72 6f 6e 6f 6a 44 69 61 67 72 61 6d 5f  aVoronojDiagram_
b61f0 72 20 28 64 61 74 61 2c 20 67 65 6f 2c 20 65 78  r (data, geo, ex
b6200 74 72 61 5f 66 72 61 6d 65 5f 73 69 7a 65 2c 0a  tra_frame_size,.
b6210 09 09 09 09 09 74 6f 6c 65 72 61 6e 63 65 2c 20  .....tolerance, 
b6220 6f 6e 6c 79 5f 65 64 67 65 73 29 3b 0a 09 20 20  only_edges);..  
b6230 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 73 75  else..      resu
b6240 6c 74 20 3d 0a 09 09 20 20 67 61 69 61 56 6f 72  lt =...  gaiaVor
b6250 6f 6e 6f 6a 44 69 61 67 72 61 6d 20 28 67 65 6f  onojDiagram (geo
b6260 2c 20 65 78 74 72 61 5f 66 72 61 6d 65 5f 73 69  , extra_frame_si
b6270 7a 65 2c 20 74 6f 6c 65 72 61 6e 63 65 2c 0a 09  ze, tolerance,..
b6280 09 09 09 20 20 20 20 20 20 6f 6e 6c 79 5f 65 64  ...      only_ed
b6290 67 65 73 29 3b 0a 09 20 20 69 66 20 28 72 65 73  ges);..  if (res
b62a0 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  ult == NULL)..  
b62b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b62c0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b62d0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
b62e0 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68  {.../* builds th
b62f0 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20  e BLOB geometry 
b6300 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
b6310 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75  /...int len;...u
b6320 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
b6330 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09  result = NULL;..
b6340 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20  .result->Srid = 
b6350 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69  geo->Srid;...gai
b6360 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
b6370 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c  bWkbEx2 (result,
b6380 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
b6390 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f  ,......    gpkg_
b63a0 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74  mode, tiny_point
b63b0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
b63c0 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
b63d0 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
b63e0 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46  , free);...gaiaF
b63f0 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
b6400 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ult);..    }.   
b6410 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
b6420 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
b6430 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
b6440 66 6e 63 74 5f 43 6f 6e 63 61 76 65 48 75 6c 6c  fnct_ConcaveHull
b6450 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
b6460 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
b6470 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
b6480 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
b6490 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
b64a0 0a 2f 20 43 6f 6e 63 61 76 65 48 75 6c 6c 28 42  ./ ConcaveHull(B
b64b0 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65  LOBencoded geome
b64c0 74 72 79 29 0a 2f 20 43 6f 6e 63 61 76 65 48 75  try)./ ConcaveHu
b64d0 6c 6c 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67  ll(BLOBencoded g
b64e0 65 6f 6d 65 74 72 79 2c 20 64 6f 75 62 6c 65 20  eometry, double 
b64f0 66 61 63 74 6f 72 29 0a 2f 20 43 6f 6e 63 61 76  factor)./ Concav
b6500 65 48 75 6c 6c 28 42 4c 4f 42 65 6e 63 6f 64 65  eHull(BLOBencode
b6510 64 20 67 65 6f 6d 65 74 72 79 2c 20 64 6f 75 62  d geometry, doub
b6520 6c 65 20 66 61 63 74 6f 72 2c 20 62 6f 6f 6c 65  le factor, boole
b6530 61 6e 20 61 6c 6c 6f 77 5f 68 6f 6c 65 73 29 0a  an allow_holes).
b6540 2f 20 43 6f 6e 63 61 76 65 48 75 6c 6c 28 42 4c  / ConcaveHull(BL
b6550 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74  OBencoded geomet
b6560 72 79 2c 20 64 6f 75 62 6c 65 20 66 61 63 74 6f  ry, double facto
b6570 72 2c 0a 2f 20 20 20 20 20 20 20 20 62 6f 6f 6c  r,./        bool
b6580 65 61 6e 20 61 6c 6c 6f 77 5f 68 6f 6c 65 73 2c  ean allow_holes,
b6590 20 64 6f 75 62 6c 65 20 74 6f 6c 65 72 61 6e 63   double toleranc
b65a0 65 29 0a 2f 0a 2f 20 41 74 74 65 6d 70 74 73 20  e)././ Attempts 
b65b0 74 6f 20 62 75 69 6c 64 20 61 20 43 6f 6e 63 61  to build a Conca
b65c0 76 65 48 75 6c 6c 20 75 73 69 6e 67 20 61 6c 6c  veHull using all
b65d0 20 70 6f 69 6e 74 73 2f 76 65 72 74 69 63 65 73   points/vertices
b65e0 20 0a 2f 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   ./ found in the
b65f0 20 69 6e 70 75 74 20 67 65 6f 6d 65 74 72 79 2e   input geometry.
b6600 0a 2f 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ./ NULL is retur
b6610 6e 65 64 20 66 6f 72 20 69 6e 76 61 6c 69 64 20  ned for invalid 
b6620 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20  arguments.*/.   
b6630 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b6640 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
b6650 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
b6660 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
b6670 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
b6680 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73  aGeomCollPtr res
b6690 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74  ult;.    int int
b66a0 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62  _value;.    doub
b66b0 6c 65 20 74 6f 6c 65 72 61 6e 63 65 20 3d 20 30  le tolerance = 0
b66c0 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66  .0;.    double f
b66d0 61 63 74 6f 72 20 3d 20 33 2e 30 3b 0a 20 20 20  actor = 3.0;.   
b66e0 20 69 6e 74 20 61 6c 6c 6f 77 5f 68 6f 6c 65 73   int allow_holes
b66f0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
b6700 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
b6710 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
b6720 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mode = 0;.    in
b6730 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
b6740 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
b6750 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
b6760 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
b6770 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
b6780 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
b6790 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
b67a0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
b67b0 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
b67c0 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
b67d0 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
b67e0 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
b67f0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
b6800 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
b6810 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
b6820 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69  ode;..  tiny_poi
b6830 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79  nt = cache->tiny
b6840 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20  PointEnabled;.  
b6850 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
b6860 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
b6870 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
b6880 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
b6890 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
b68a0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
b68b0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
b68c0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
b68d0 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20 20 20  argc >= 2).     
b68e0 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
b68f0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
b6900 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
b6910 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 66  _FLOAT)..      f
b6920 61 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 5f  actor = sqlite3_
b6930 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
b6940 67 76 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20  gv[1]);..  else 
b6950 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
b6960 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
b6970 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
b6980 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74  ER)..    {...int
b6990 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
b69a0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
b69b0 5b 31 5d 29 3b 0a 09 09 66 61 63 74 6f 72 20 3d  [1]);...factor =
b69c0 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
b69d0 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
b69e0 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
b69f0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b6a00 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
b6a10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b6a20 69 66 20 28 61 72 67 63 20 3e 3d 20 33 29 0a 20  if (argc >= 3). 
b6a30 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
b6a40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
b6a50 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
b6a60 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
b6a70 20 20 20 20 20 61 6c 6c 6f 77 5f 68 6f 6c 65 73       allow_holes
b6a80 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b6a90 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  _int (argv[2]);.
b6aa0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
b6ab0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
b6ac0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
b6ad0 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
b6ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
b6af0 28 61 72 67 63 20 3d 3d 20 34 29 0a 20 20 20 20  (argc == 4).    
b6b00 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
b6b10 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
b6b20 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
b6b30 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
b6b40 74 6f 6c 65 72 61 6e 63 65 20 3d 20 73 71 6c 69  tolerance = sqli
b6b50 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
b6b60 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 65   (argv[3]);..  e
b6b70 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
b6b80 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
b6b90 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [3]) == SQLITE_I
b6ba0 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
b6bb0 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c  .int_value = sql
b6bc0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
b6bd0 61 72 67 76 5b 33 5d 29 3b 0a 09 09 74 6f 6c 65  argv[3]);...tole
b6be0 72 61 6e 63 65 20 3d 20 69 6e 74 5f 76 61 6c 75  rance = int_valu
b6bf0 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  e;..    }..  els
b6c00 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
b6c10 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b6c20 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
b6c30 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20  rn;..    }.     
b6c40 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
b6c50 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
b6c60 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
b6c70 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
b6c80 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
b6c90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
b6ca0 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
b6cb0 20 67 65 6f 20 3d 0a 09 67 61 69 61 46 72 6f 6d   geo =..gaiaFrom
b6cc0 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
b6cd0 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
b6ce0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
b6cf0 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
b6d00 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
b6d10 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55 4c 4c 29  if (geo == NULL)
b6d20 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
b6d30 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
b6d40 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
b6d50 7b 0a 09 20 20 76 6f 69 64 20 2a 64 61 74 61 20  {..  void *data 
b6d60 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
b6d70 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ata (context);..
b6d80 20 20 69 66 20 28 64 61 74 61 20 21 3d 20 4e 55    if (data != NU
b6d90 4c 4c 29 0a 09 20 20 20 20 20 20 72 65 73 75 6c  LL)..      resul
b6da0 74 20 3d 0a 09 09 20 20 67 61 69 61 43 6f 6e 63  t =...  gaiaConc
b6db0 61 76 65 48 75 6c 6c 5f 72 20 28 64 61 74 61 2c  aveHull_r (data,
b6dc0 20 67 65 6f 2c 20 66 61 63 74 6f 72 2c 20 74 6f   geo, factor, to
b6dd0 6c 65 72 61 6e 63 65 2c 20 61 6c 6c 6f 77 5f 68  lerance, allow_h
b6de0 6f 6c 65 73 29 3b 0a 09 20 20 65 6c 73 65 0a 09  oles);..  else..
b6df0 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67        result = g
b6e00 61 69 61 43 6f 6e 63 61 76 65 48 75 6c 6c 20 28  aiaConcaveHull (
b6e10 67 65 6f 2c 20 66 61 63 74 6f 72 2c 20 74 6f 6c  geo, factor, tol
b6e20 65 72 61 6e 63 65 2c 20 61 6c 6c 6f 77 5f 68 6f  erance, allow_ho
b6e30 6c 65 73 29 3b 0a 09 20 20 69 66 20 28 72 65 73  les);..  if (res
b6e40 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  ult == NULL)..  
b6e50 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b6e60 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b6e70 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
b6e80 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68  {.../* builds th
b6e90 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20  e BLOB geometry 
b6ea0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
b6eb0 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75  /...int len;...u
b6ec0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
b6ed0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09  result = NULL;..
b6ee0 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20  .result->Srid = 
b6ef0 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69  geo->Srid;...gai
b6f00 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
b6f10 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c  bWkbEx2 (result,
b6f20 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
b6f30 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f  ,......    gpkg_
b6f40 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74  mode, tiny_point
b6f50 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
b6f60 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
b6f70 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
b6f80 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46  , free);...gaiaF
b6f90 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
b6fa0 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ult);..    }.   
b6fb0 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
b6fc0 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
b6fd0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e  .}..#endif /* en
b6fe0 64 20 47 45 4f 53 20 61 64 76 61 6e 63 65 64 20  d GEOS advanced 
b6ff0 66 65 61 74 75 72 65 73 20 2a 2f 0a 0a 23 69 66  features */..#if
b7000 64 65 66 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50  def ENABLE_RTTOP
b7010 4f 09 09 2f 2a 20 65 6e 61 62 6c 69 6e 67 20 52  O../* enabling R
b7020 54 54 4f 50 4f 20 73 75 70 70 6f 72 74 20 2a 2f  TTOPO support */
b7030 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
b7040 63 74 5f 52 54 54 4f 50 4f 5f 47 65 74 4c 61 73  ct_RTTOPO_GetLas
b7050 74 57 61 72 6e 69 6e 67 4d 73 67 20 28 73 71 6c  tWarningMsg (sql
b7060 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
b7070 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
b7080 2c 0a 09 09 09 20 20 20 20 20 20 20 73 71 6c 69  ,....       sqli
b7090 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
b70a0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
b70b0 74 69 6f 6e 3a 0a 2f 20 52 54 54 4f 50 4f 5f 47  tion:./ RTTOPO_G
b70c0 65 74 4c 61 73 74 57 61 72 6e 69 6e 67 4d 73 67  etLastWarningMsg
b70d0 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 74 68  ()././ return th
b70e0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 52 54  e most recent RT
b70f0 54 4f 50 4f 20 77 61 72 6e 69 6e 67 20 6d 65 73  TOPO warning mes
b7100 73 61 67 65 20 28 69 66 20 61 6e 79 29 0a 2f 20  sage (if any)./ 
b7110 72 65 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61  return NULL on a
b7120 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f  ny other case.*/
b7130 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b7140 2a 6d 73 67 3b 0a 20 20 20 20 73 74 72 75 63 74  *msg;.    struct
b7150 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
b7160 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
b7170 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
b7180 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
b7190 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
b71a0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
b71b0 49 4e 45 20 2a 2f 0a 20 20 20 20 6d 73 67 20 3d  INE */.    msg =
b71c0 20 67 61 69 61 47 65 74 52 74 54 6f 70 6f 57 61   gaiaGetRtTopoWa
b71d0 72 6e 69 6e 67 4d 73 67 20 28 63 61 63 68 65 29  rningMsg (cache)
b71e0 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 3d 3d  ;.    if (msg ==
b71f0 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f   NULL)..sqlite3_
b7200 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b7210 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
b7220 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
b7230 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 6d  text (context, m
b7240 73 67 2c 20 73 74 72 6c 65 6e 20 28 6d 73 67 29  sg, strlen (msg)
b7250 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
b7260 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
b7270 0a 66 6e 63 74 5f 52 54 54 4f 50 4f 5f 47 65 74  .fnct_RTTOPO_Get
b7280 4c 61 73 74 45 72 72 6f 72 4d 73 67 20 28 73 71  LastErrorMsg (sq
b7290 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
b72a0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
b72b0 63 2c 0a 09 09 09 20 20 20 20 20 73 71 6c 69 74  c,....     sqlit
b72c0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
b72d0 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
b72e0 69 6f 6e 3a 0a 2f 20 52 54 54 4f 50 4f 5f 47 65  ion:./ RTTOPO_Ge
b72f0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 29 0a  tLastErrorMsg().
b7300 2f 0a 2f 20 72 65 74 75 72 6e 20 74 68 65 20 6d  /./ return the m
b7310 6f 73 74 20 72 65 63 65 6e 74 20 52 54 45 4f 4d  ost recent RTEOM
b7320 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   error message (
b7330 69 66 20 61 6e 79 29 0a 2f 20 72 65 74 75 72 6e  if any)./ return
b7340 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68   NULL on any oth
b7350 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63  er case.*/.    c
b7360 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a  onst char *msg;.
b7370 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
b7380 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
b7390 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
b73a0 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
b73b0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
b73c0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
b73d0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
b73e0 0a 20 20 20 20 6d 73 67 20 3d 20 67 61 69 61 47  .    msg = gaiaG
b73f0 65 74 52 74 54 6f 70 6f 45 72 72 6f 72 4d 73 67  etRtTopoErrorMsg
b7400 20 28 63 61 63 68 65 29 3b 0a 20 20 20 20 69 66   (cache);.    if
b7410 20 28 6d 73 67 20 3d 3d 20 4e 55 4c 4c 29 0a 09   (msg == NULL)..
b7420 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b7430 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
b7440 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
b7450 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f  _result_text (co
b7460 6e 74 65 78 74 2c 20 6d 73 67 2c 20 73 74 72 6c  ntext, msg, strl
b7470 65 6e 20 28 6d 73 67 29 2c 20 53 51 4c 49 54 45  en (msg), SQLITE
b7480 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 73 74 61  _STATIC);.}..sta
b7490 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d 61  tic void.fnct_Ma
b74a0 6b 65 56 61 6c 69 64 20 28 73 71 6c 69 74 65 33  keValid (sqlite3
b74b0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
b74c0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
b74d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
b74e0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
b74f0 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 61 6b 65 56 61  nction:./ MakeVa
b7500 6c 69 64 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20  lid(BLOBencoded 
b7510 67 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f 20 41 74  geometry)././ At
b7520 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20 61  tempts to make a
b7530 6e 20 69 6e 76 61 6c 69 64 20 67 65 6f 6d 65 74  n invalid geomet
b7540 72 79 20 76 61 6c 69 64 20 77 69 74 68 6f 75 74  ry valid without
b7550 20 6c 6f 6f 73 69 6e 67 20 76 65 72 74 69 63 65   loosing vertice
b7560 73 2e 0a 2f 20 4e 55 4c 4c 20 69 73 20 72 65 74  s../ NULL is ret
b7570 75 72 6e 65 64 20 66 6f 72 20 69 6e 76 61 6c 69  urned for invali
b7580 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
b7590 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
b75a0 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e   *p_blob;.    in
b75b0 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67  t n_bytes;.    g
b75c0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
b75d0 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  eo = NULL;.    g
b75e0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72  aiaGeomCollPtr r
b75f0 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 67  esult;.    int g
b7600 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
b7610 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
b7620 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  _mode = 0;.    i
b7630 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20  nt tiny_point = 
b7640 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
b7650 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
b7660 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
b7670 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
b7680 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
b7690 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
b76a0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
b76b0 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
b76c0 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
b76d0 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
b76e0 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
b76f0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
b7700 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
b7710 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
b7720 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f  mode;..  tiny_po
b7730 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e  int = cache->tin
b7740 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20  yPointEnabled;. 
b7750 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
b7760 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
b7770 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
b7780 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
b7790 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
b77a0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
b77b0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
b77c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
b77d0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
b77e0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
b77f0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
b7800 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
b7810 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
b7820 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
b7830 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a 09 67 61  );.    geo =..ga
b7840 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
b7850 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
b7860 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
b7870 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
b7880 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
b7890 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 20 3d 3d  ;.    if (geo ==
b78a0 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f   NULL)..sqlite3_
b78b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b78c0 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
b78d0 20 20 20 20 20 20 7b 0a 09 20 20 72 65 73 75 6c        {..  resul
b78e0 74 20 3d 20 67 61 69 61 4d 61 6b 65 56 61 6c 69  t = gaiaMakeVali
b78f0 64 20 28 63 61 63 68 65 2c 20 67 65 6f 29 3b 0a  d (cache, geo);.
b7900 09 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  .  if (result ==
b7910 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09   NULL)..    {...
b7920 63 68 61 72 20 2a 6d 73 67 3b 0a 09 09 63 6f 6e  char *msg;...con
b7930 73 74 20 63 68 61 72 20 2a 6c 77 5f 65 72 72 20  st char *lw_err 
b7940 3d 20 67 61 69 61 47 65 74 52 74 54 6f 70 6f 45  = gaiaGetRtTopoE
b7950 72 72 6f 72 4d 73 67 20 28 63 61 63 68 65 29 3b  rrorMsg (cache);
b7960 0a 09 09 69 66 20 28 6c 77 5f 65 72 72 29 0a 09  ...if (lw_err)..
b7970 09 20 20 20 20 6d 73 67 20 3d 20 73 71 6c 69 74  .    msg = sqlit
b7980 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 09 28 22  e3_mprintf....("
b7990 4d 61 6b 65 56 61 6c 69 64 20 65 72 72 6f 72 20  MakeValid error 
b79a0 2d 20 52 54 54 4f 50 4f 20 72 65 70 6f 72 74 73  - RTTOPO reports
b79b0 3a 20 25 73 5c 6e 22 2c 20 6c 77 5f 65 72 72 29  : %s\n", lw_err)
b79c0 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 6d  ;...else...    m
b79d0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
b79e0 69 6e 74 66 0a 09 09 09 28 22 4d 61 6b 65 56 61  intf....("MakeVa
b79f0 6c 69 64 20 65 72 72 6f 72 20 2d 20 52 54 54 4f  lid error - RTTO
b7a00 50 4f 20 72 65 70 6f 72 74 73 3a 20 55 6e 6b 6e  PO reports: Unkn
b7a10 6f 77 6e 20 52 65 61 73 6f 6e 5c 6e 22 29 3b 0a  own Reason\n");.
b7a20 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
b7a30 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
b7a40 20 6d 73 67 2c 20 73 74 72 6c 65 6e 20 28 6d 73   msg, strlen (ms
b7a50 67 29 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66  g));...sqlite3_f
b7a60 72 65 65 20 28 6d 73 67 29 3b 0a 09 20 20 20 20  ree (msg);..    
b7a70 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
b7a80 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65  .../* builds the
b7a90 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74   BLOB geometry t
b7aa0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
b7ab0 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e  ...int len;...un
b7ac0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72  signed char *p_r
b7ad0 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09  esult = NULL;...
b7ae0 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 67  result->Srid = g
b7af0 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69 61  eo->Srid;...gaia
b7b00 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  ToSpatiaLiteBlob
b7b10 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c 20  WkbEx2 (result, 
b7b20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e 2c  &p_result, &len,
b7b30 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f 6d  ......    gpkg_m
b7b40 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74 29  ode, tiny_point)
b7b50 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ;...sqlite3_resu
b7b60 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
b7b70 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e 2c  , p_result, len,
b7b80 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46 72   free);...gaiaFr
b7b90 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75  eeGeomColl (resu
b7ba0 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  lt);..    }.    
b7bb0 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65 65    }.    gaiaFree
b7bc0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a  GeomColl (geo);.
b7bd0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
b7be0 6e 63 74 5f 4d 61 6b 65 56 61 6c 69 64 44 69 73  nct_MakeValidDis
b7bf0 63 61 72 64 65 64 20 28 73 71 6c 69 74 65 33 5f  carded (sqlite3_
b7c00 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
b7c10 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09  t, int argc,....
b7c20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b7c30 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
b7c40 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 61 6b   function:./ Mak
b7c50 65 56 61 6c 69 64 44 69 73 63 61 72 64 65 64 28  eValidDiscarded(
b7c60 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d  BLOBencoded geom
b7c70 65 74 72 79 29 0a 2f 0a 2f 20 53 74 72 69 63 74  etry)././ Strict
b7c80 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 4d 61  ly related to Ma
b7c90 6b 65 56 61 6c 69 64 28 29 3b 20 75 73 65 66 75  keValid(); usefu
b7ca0 6c 20 74 6f 20 63 6f 6c 6c 65 63 74 20 61 6e 79  l to collect any
b7cb0 20 6f 66 66 65 6e 64 69 6e 67 20 69 74 65 6d 0a   offending item.
b7cc0 2f 20 64 69 73 63 61 72 64 65 64 20 64 75 72 69  / discarded duri
b7cd0 6e 67 20 74 68 65 20 76 61 6c 69 64 61 74 69 6f  ng the validatio
b7ce0 6e 20 70 72 6f 63 65 73 73 2e 0a 2f 20 4e 55 4c  n process../ NUL
b7cf0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f  L is returned fo
b7d00 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
b7d10 6e 74 73 20 28 6f 72 20 69 66 20 6e 6f 20 64 69  nts (or if no di
b7d20 73 63 61 72 64 65 64 20 69 74 65 6d 73 20 61 72  scarded items ar
b7d30 65 20 66 6f 75 6e 64 29 0a 2a 2f 0a 20 20 20 20  e found).*/.    
b7d40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
b7d50 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
b7d60 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61  _bytes;.    gaia
b7d70 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 20  GeomCollPtr geo 
b7d80 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
b7d90 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75  GeomCollPtr resu
b7da0 6c 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  lt;.    int gpkg
b7db0 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
b7dc0 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
b7dd0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  de = 0;.    int 
b7de0 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a  tiny_point = 0;.
b7df0 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
b7e00 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
b7e10 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
b7e20 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
b7e30 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
b7e40 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
b7e50 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
b7e60 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
b7e70 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
b7e80 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
b7e90 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
b7ea0 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
b7eb0 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
b7ec0 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
b7ed0 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
b7ee0 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
b7ef0 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
b7f00 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
b7f10 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
b7f20 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
b7f30 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
b7f40 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
b7f50 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b7f60 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
b7f70 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
b7f80 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
b7f90 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
b7fa0 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
b7fb0 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
b7fc0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
b7fd0 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
b7fe0 20 20 20 20 67 65 6f 20 3d 0a 09 67 61 69 61 46      geo =..gaiaF
b7ff0 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
b8000 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
b8010 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
b8020 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
b8030 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
b8040 20 20 20 69 66 20 28 67 65 6f 20 3d 3d 20 4e 55     if (geo == NU
b8050 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
b8060 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
b8070 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
b8080 20 20 20 7b 0a 09 20 20 72 65 73 75 6c 74 20 3d     {..  result =
b8090 20 67 61 69 61 4d 61 6b 65 56 61 6c 69 64 44 69   gaiaMakeValidDi
b80a0 73 63 61 72 64 65 64 20 28 63 61 63 68 65 2c 20  scarded (cache, 
b80b0 67 65 6f 29 3b 0a 09 20 20 69 66 20 28 72 65 73  geo);..  if (res
b80c0 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  ult == NULL)..  
b80d0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b80e0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b80f0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
b8100 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68  {.../* builds th
b8110 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20  e BLOB geometry 
b8120 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
b8130 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75  /...int len;...u
b8140 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
b8150 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09  result = NULL;..
b8160 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20  .result->Srid = 
b8170 67 65 6f 2d 3e 53 72 69 64 3b 0a 09 09 67 61 69  geo->Srid;...gai
b8180 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
b8190 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74 2c  bWkbEx2 (result,
b81a0 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65 6e   &p_result, &len
b81b0 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67 5f  ,......    gpkg_
b81c0 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e 74  mode, tiny_point
b81d0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73  );...sqlite3_res
b81e0 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
b81f0 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
b8200 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61 46  , free);...gaiaF
b8210 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73  reeGeomColl (res
b8220 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20  ult);..    }.   
b8230 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72 65     }.    gaiaFre
b8240 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b  eGeomColl (geo);
b8250 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
b8260 66 6e 63 74 5f 53 65 67 6d 65 6e 74 69 7a 65 20  fnct_Segmentize 
b8270 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b8280 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
b8290 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
b82a0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
b82b0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
b82c0 2f 20 53 65 67 6d 65 6e 74 69 7a 65 28 42 4c 4f  / Segmentize(BLO
b82d0 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 65 74 72  Bencoded geometr
b82e0 79 2c 20 64 6f 75 62 6c 65 20 64 69 73 74 29 0a  y, double dist).
b82f0 2f 0a 2f 20 45 6e 73 75 72 65 20 65 76 65 72 79  /./ Ensure every
b8300 20 73 65 67 6d 65 6e 74 20 69 73 20 61 74 20 6d   segment is at m
b8310 6f 73 74 20 27 64 69 73 74 27 20 6c 6f 6e 67 0a  ost 'dist' long.
b8320 2f 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  / NULL is return
b8330 65 64 20 66 6f 72 20 69 6e 76 61 6c 69 64 20 61  ed for invalid a
b8340 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
b8350 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
b8360 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
b8370 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
b8380 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64  int_value;.    d
b8390 6f 75 62 6c 65 20 64 69 73 74 3b 0a 20 20 20 20  ouble dist;.    
b83a0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
b83b0 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
b83c0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
b83d0 72 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  result;.    int 
b83e0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
b83f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  = 0;.    int gpk
b8400 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  g_mode = 0;.    
b8410 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d  int tiny_point =
b8420 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
b8430 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
b8440 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
b8450 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
b8460 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
b8470 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
b8480 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
b8490 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
b84a0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
b84b0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
b84c0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
b84d0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
b84e0 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
b84f0 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
b8500 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70  _mode;..  tiny_p
b8510 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69  oint = cache->ti
b8520 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a  nyPointEnabled;.
b8530 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
b8540 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
b8550 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
b8560 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
b8570 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
b8580 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b8590 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
b85a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
b85b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
b85c0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
b85d0 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
b85e0 09 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  .dist = sqlite3_
b85f0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
b8600 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[1]);.    else
b8610 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
b8620 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
b8630 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
b8640 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
b8650 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
b8660 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
b8670 72 67 76 5b 31 5d 29 3b 0a 09 20 20 64 69 73 74  rgv[1]);..  dist
b8680 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20   = int_value;.  
b8690 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
b86a0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
b86b0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
b86c0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
b86d0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
b86e0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
b86f0 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
b8700 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
b8710 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
b8720 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
b8730 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
b8740 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d 0a  [0]);.    geo =.
b8750 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
b8760 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
b8770 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
b8780 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
b8790 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
b87a0 75 73 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  us);.    if (geo
b87b0 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
b87c0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b87d0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
b87e0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65  se.      {..  re
b87f0 73 75 6c 74 20 3d 20 67 61 69 61 53 65 67 6d 65  sult = gaiaSegme
b8800 6e 74 69 7a 65 20 28 63 61 63 68 65 2c 20 67 65  ntize (cache, ge
b8810 6f 2c 20 64 69 73 74 29 3b 0a 09 20 20 69 66 20  o, dist);..  if 
b8820 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29  (result == NULL)
b8830 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
b8840 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
b8850 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
b8860 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c 64      {.../* build
b8870 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d 65  s the BLOB geome
b8880 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72 6e  try to be return
b8890 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b  ed */...int len;
b88a0 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
b88b0 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c   *p_result = NUL
b88c0 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72 69  L;...result->Sri
b88d0 64 20 3d 20 67 65 6f 2d 3e 53 72 69 64 3b 0a 09  d = geo->Srid;..
b88e0 09 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74  .gaiaToSpatiaLit
b88f0 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73  eBlobWkbEx2 (res
b8900 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  ult, &p_result, 
b8910 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67  &len,......    g
b8920 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70  pkg_mode, tiny_p
b8930 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33  oint);...sqlite3
b8940 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
b8950 6e 74 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c  ntext, p_result,
b8960 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67   len, free);...g
b8970 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
b8980 28 72 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d  (result);..    }
b8990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
b89a0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
b89b0 65 6f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  eo);.}..static v
b89c0 6f 69 64 0a 66 6e 63 74 5f 53 70 6c 69 74 20 28  oid.fnct_Split (
b89d0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b89e0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
b89f0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
b8a00 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
b8a10 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
b8a20 20 53 70 6c 69 74 28 42 4c 4f 42 65 6e 63 6f 64   Split(BLOBencod
b8a30 65 64 20 69 6e 70 75 74 2c 20 42 4c 4f 42 65 6e  ed input, BLOBen
b8a40 63 6f 64 65 64 20 62 6c 61 64 65 29 0a 2f 0a 2f  coded blade)././
b8a50 20 52 65 74 75 72 6e 73 20 61 20 63 6f 6c 6c 65   Returns a colle
b8a60 63 74 69 6f 6e 20 6f 66 20 67 65 6f 6d 65 74 72  ction of geometr
b8a70 69 65 73 20 72 65 73 75 6c 74 69 6e 67 20 62 79  ies resulting by
b8a80 20 73 70 6c 69 74 74 69 6e 67 20 61 20 67 65 6f   splitting a geo
b8a90 6d 65 74 72 79 0a 2f 20 4e 55 4c 4c 20 69 73 20  metry./ NULL is 
b8aa0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76  returned for inv
b8ab0 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
b8ac0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
b8ad0 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
b8ae0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
b8af0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
b8b00 72 20 69 6e 70 75 74 20 3d 20 4e 55 4c 4c 3b 0a  r input = NULL;.
b8b10 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
b8b20 50 74 72 20 62 6c 61 64 65 20 3d 20 4e 55 4c 4c  Ptr blade = NULL
b8b30 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
b8b40 6c 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20  llPtr result;.  
b8b50 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
b8b60 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
b8b70 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
b8b80 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70  ;.    int tiny_p
b8b90 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  oint = 0;.    st
b8ba0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
b8bb0 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
b8bc0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
b8bd0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
b8be0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
b8bf0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
b8c00 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
b8c10 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
b8c20 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
b8c30 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
b8c40 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
b8c50 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
b8c60 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
b8c70 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20  ->gpkg_mode;..  
b8c80 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63  tiny_point = cac
b8c90 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61  he->tinyPointEna
b8ca0 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bled;.      }.  
b8cb0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
b8cc0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
b8cd0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
b8ce0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
b8cf0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
b8d00 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
b8d10 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
b8d20 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
b8d30 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
b8d40 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [1]) != SQLITE_B
b8d50 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
b8d60 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
b8d70 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
b8d80 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
b8d90 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
b8da0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
b8db0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
b8dc0 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
b8dd0 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
b8de0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
b8df0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
b8e00 69 6e 70 75 74 20 3d 0a 09 67 61 69 61 46 72 6f  input =..gaiaFro
b8e10 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
b8e20 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
b8e30 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
b8e40 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
b8e50 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
b8e60 20 69 66 20 28 69 6e 70 75 74 20 3d 3d 20 4e 55   if (input == NU
b8e70 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  LL).      {..  s
b8e80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
b8e90 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
b8ea0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
b8eb0 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
b8ec0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
b8ed0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
b8ee0 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ob (argv[1]);.  
b8ef0 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
b8f00 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
b8f10 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 62  (argv[1]);.    b
b8f20 6c 61 64 65 20 3d 0a 09 67 61 69 61 46 72 6f 6d  lade =..gaiaFrom
b8f30 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
b8f40 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
b8f50 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
b8f60 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
b8f70 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
b8f80 69 66 20 28 62 6c 61 64 65 20 3d 3d 20 4e 55 4c  if (blade == NUL
b8f90 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61  L).      {..  ga
b8fa0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
b8fb0 69 6e 70 75 74 29 3b 0a 09 20 20 73 71 6c 69 74  input);..  sqlit
b8fc0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
b8fd0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
b8fe0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
b8ff0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
b9000 20 72 65 73 75 6c 74 20 3d 20 67 61 69 61 53 70   result = gaiaSp
b9010 6c 69 74 20 28 63 61 63 68 65 2c 20 69 6e 70 75  lit (cache, inpu
b9020 74 2c 20 62 6c 61 64 65 29 3b 0a 09 20 20 69 66  t, blade);..  if
b9030 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c   (result == NULL
b9040 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
b9050 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
b9060 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
b9070 09 20 20 20 20 7b 0a 09 09 2f 2a 20 62 75 69 6c  .    {.../* buil
b9080 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d  ds the BLOB geom
b9090 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72  etry to be retur
b90a0 6e 65 64 20 2a 2f 0a 09 09 69 6e 74 20 6c 65 6e  ned */...int len
b90b0 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ;...unsigned cha
b90c0 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
b90d0 4c 4c 3b 0a 09 09 72 65 73 75 6c 74 2d 3e 53 72  LL;...result->Sr
b90e0 69 64 20 3d 20 69 6e 70 75 74 2d 3e 53 72 69 64  id = input->Srid
b90f0 3b 0a 09 09 67 61 69 61 54 6f 53 70 61 74 69 61  ;...gaiaToSpatia
b9100 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28  LiteBlobWkbEx2 (
b9110 72 65 73 75 6c 74 2c 20 26 70 5f 72 65 73 75 6c  result, &p_resul
b9120 74 2c 20 26 6c 65 6e 2c 0a 09 09 09 09 09 20 20  t, &len,......  
b9130 20 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e    gpkg_mode, tin
b9140 79 5f 70 6f 69 6e 74 29 3b 0a 09 09 73 71 6c 69  y_point);...sqli
b9150 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20  te3_result_blob 
b9160 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72 65 73 75  (context, p_resu
b9170 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65 29 3b 0a  lt, len, free);.
b9180 09 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
b9190 6c 6c 20 28 72 65 73 75 6c 74 29 3b 0a 09 20 20  ll (result);..  
b91a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b91b0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
b91c0 20 28 69 6e 70 75 74 29 3b 0a 20 20 20 20 67 61   (input);.    ga
b91d0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
b91e0 62 6c 61 64 65 29 3b 0a 7d 0a 0a 73 74 61 74 69  blade);.}..stati
b91f0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 70 6c 69  c void.fnct_Spli
b9200 74 4c 65 66 74 20 28 73 71 6c 69 74 65 33 5f 63  tLeft (sqlite3_c
b9210 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
b9220 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
b9230 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
b9240 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
b9250 74 69 6f 6e 3a 0a 2f 20 53 70 6c 69 74 4c 65 66  tion:./ SplitLef
b9260 74 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 69 6e  t(BLOBencoded in
b9270 70 75 74 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64  put, BLOBencoded
b9280 20 62 6c 61 64 65 29 0a 2f 0a 2f 20 52 65 74 75   blade)././ Retu
b9290 72 6e 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e  rns a collection
b92a0 20 6f 66 20 67 65 6f 6d 65 74 72 69 65 73 20 72   of geometries r
b92b0 65 73 75 6c 74 69 6e 67 20 62 79 20 73 70 6c 69  esulting by spli
b92c0 74 74 69 6e 67 20 61 20 67 65 6f 6d 65 74 72 79  tting a geometry
b92d0 20 5b 6c 65 66 74 20 68 61 6c 66 5d 0a 2f 20 4e   [left half]./ N
b92e0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
b92f0 66 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75  for invalid argu
b9300 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e 73  ments.*/.    uns
b9310 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
b9320 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
b9330 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  tes;.    gaiaGeo
b9340 6d 43 6f 6c 6c 50 74 72 20 69 6e 70 75 74 20 3d  mCollPtr input =
b9350 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
b9360 65 6f 6d 43 6f 6c 6c 50 74 72 20 62 6c 61 64 65  eomCollPtr blade
b9370 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
b9380 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73  aGeomCollPtr res
b9390 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b  ult;.    int gpk
b93a0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30  g_amphibious = 0
b93b0 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d  ;.    int gpkg_m
b93c0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ode = 0;.    int
b93d0 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b   tiny_point = 0;
b93e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
b93f0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
b9400 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
b9410 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
b9420 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
b9430 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
b9440 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
b9450 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
b9460 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
b9470 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
b9480 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
b9490 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
b94a0 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
b94b0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
b94c0 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
b94d0 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
b94e0 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
b94f0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
b9500 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
b9510 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
b9520 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
b9530 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
b9540 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
b9550 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
b9560 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
b9570 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
b9580 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
b9590 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
b95a0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
b95b0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
b95c0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
b95d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
b95e0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
b95f0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
b9600 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
b9610 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
b9620 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
b9630 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
b9640 29 3b 0a 20 20 20 20 69 6e 70 75 74 20 3d 0a 09  );.    input =..
b9650 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69  gaiaFromSpatiaLi
b9660 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62  teBlobWkbEx (p_b
b9670 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70  lob, n_bytes, gp
b9680 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20  kg_mode,.....   
b9690 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
b96a0 73 29 3b 0a 20 20 20 20 69 66 20 28 69 6e 70 75  s);.    if (inpu
b96b0 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  t == NULL).     
b96c0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
b96d0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
b96e0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
b96f0 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
b9700 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
b9710 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
b9720 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
b9730 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  1]);.    n_bytes
b9740 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b9750 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
b9760 3b 0a 20 20 20 20 62 6c 61 64 65 20 3d 0a 09 67  ;.    blade =..g
b9770 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
b9780 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
b9790 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
b97a0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
b97b0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
b97c0 29 3b 0a 20 20 20 20 69 66 20 28 62 6c 61 64 65  );.    if (blade
b97d0 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   == NULL).      
b97e0 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f  {..  gaiaFreeGeo
b97f0 6d 43 6f 6c 6c 20 28 69 6e 70 75 74 29 3b 0a 09  mColl (input);..
b9800 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b9810 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
b9820 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
b9830 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
b9840 20 20 20 7b 0a 09 20 20 72 65 73 75 6c 74 20 3d     {..  result =
b9850 20 67 61 69 61 53 70 6c 69 74 4c 65 66 74 20 28   gaiaSplitLeft (
b9860 63 61 63 68 65 2c 20 69 6e 70 75 74 2c 20 62 6c  cache, input, bl
b9870 61 64 65 29 3b 0a 09 20 20 69 66 20 28 72 65 73  ade);..  if (res
b9880 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  ult == NULL)..  
b9890 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b98a0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b98b0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
b98c0 7b 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68  {.../* builds th
b98d0 65 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20  e BLOB geometry 
b98e0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
b98f0 2f 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75  /...int len;...u
b9900 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
b9910 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09  result = NULL;..
b9920 09 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20  .result->Srid = 
b9930 69 6e 70 75 74 2d 3e 53 72 69 64 3b 0a 09 09 67  input->Srid;...g
b9940 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
b9950 6c 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c  lobWkbEx2 (resul
b9960 74 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c  t, &p_result, &l
b9970 65 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b  en,......    gpk
b9980 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69  g_mode, tiny_poi
b9990 6e 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  nt);...sqlite3_r
b99a0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
b99b0 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
b99c0 65 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69  en, free);...gai
b99d0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72  aFreeGeomColl (r
b99e0 65 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20  esult);..    }. 
b99f0 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46       }.    gaiaF
b9a00 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 69 6e 70  reeGeomColl (inp
b9a10 75 74 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65  ut);.    gaiaFre
b9a20 65 47 65 6f 6d 43 6f 6c 6c 20 28 62 6c 61 64 65  eGeomColl (blade
b9a30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
b9a40 64 0a 66 6e 63 74 5f 53 70 6c 69 74 52 69 67 68  d.fnct_SplitRigh
b9a50 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  t (sqlite3_conte
b9a60 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
b9a70 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
b9a80 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
b9a90 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
b9aa0 3a 0a 2f 20 53 70 6c 69 74 52 69 67 68 74 28 42  :./ SplitRight(B
b9ab0 4c 4f 42 65 6e 63 6f 64 65 64 20 69 6e 70 75 74  LOBencoded input
b9ac0 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20 62 6c  , BLOBencoded bl
b9ad0 61 64 65 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73  ade)././ Returns
b9ae0 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66   a collection of
b9af0 20 67 65 6f 6d 65 74 72 69 65 73 20 72 65 73 75   geometries resu
b9b00 6c 74 69 6e 67 20 62 79 20 73 70 6c 69 74 74 69  lting by splitti
b9b10 6e 67 20 61 20 67 65 6f 6d 65 74 72 79 20 5b 72  ng a geometry [r
b9b20 69 67 68 74 20 68 61 6c 66 5d 0a 2f 20 4e 55 4c  ight half]./ NUL
b9b30 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f  L is returned fo
b9b40 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
b9b50 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  nts.*/.    unsig
b9b60 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
b9b70 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
b9b80 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  s;.    gaiaGeomC
b9b90 6f 6c 6c 50 74 72 20 69 6e 70 75 74 20 3d 20 4e  ollPtr input = N
b9ba0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
b9bb0 6d 43 6f 6c 6c 50 74 72 20 62 6c 61 64 65 20 3d  mCollPtr blade =
b9bc0 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
b9bd0 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c  eomCollPtr resul
b9be0 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  t;.    int gpkg_
b9bf0 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a  amphibious = 0;.
b9c00 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64      int gpkg_mod
b9c10 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  e = 0;.    int t
b9c20 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  iny_point = 0;. 
b9c30 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
b9c40 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
b9c50 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
b9c60 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
b9c70 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
b9c80 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
b9c90 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
b9ca0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
b9cb0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
b9cc0 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
b9cd0 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
b9ce0 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
b9cf0 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
b9d00 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
b9d10 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20  ;..  tiny_point 
b9d20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69  = cache->tinyPoi
b9d30 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20  ntEnabled;.     
b9d40 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
b9d50 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
b9d60 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
b9d70 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
b9d80 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
b9d90 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
b9da0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
b9db0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
b9dc0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
b9dd0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
b9de0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
b9df0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
b9e00 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
b9e10 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
b9e20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
b9e30 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
b9e40 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
b9e50 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
b9e60 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
b9e70 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
b9e80 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
b9e90 0a 20 20 20 20 69 6e 70 75 74 20 3d 0a 09 67 61  .    input =..ga
b9ea0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
b9eb0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
b9ec0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
b9ed0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
b9ee0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
b9ef0 3b 0a 20 20 20 20 69 66 20 28 69 6e 70 75 74 20  ;.    if (input 
b9f00 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
b9f10 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
b9f20 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
b9f30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
b9f40 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
b9f50 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
b9f60 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
b9f70 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d  ue_blob (argv[1]
b9f80 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
b9f90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
b9fa0 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a  ytes (argv[1]);.
b9fb0 20 20 20 20 62 6c 61 64 65 20 3d 0a 09 67 61 69      blade =..gai
b9fc0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
b9fd0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
b9fe0 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
b9ff0 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
ba000 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
ba010 0a 20 20 20 20 69 66 20 28 62 6c 61 64 65 20 3d  .    if (blade =
ba020 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
ba030 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43  .  gaiaFreeGeomC
ba040 6f 6c 6c 20 28 69 6e 70 75 74 29 3b 0a 09 20 20  oll (input);..  
ba050 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ba060 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
ba070 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ba080 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
ba090 20 7b 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 67   {..  result = g
ba0a0 61 69 61 53 70 6c 69 74 52 69 67 68 74 20 28 63  aiaSplitRight (c
ba0b0 61 63 68 65 2c 20 69 6e 70 75 74 2c 20 62 6c 61  ache, input, bla
ba0c0 64 65 29 3b 0a 09 20 20 69 66 20 28 72 65 73 75  de);..  if (resu
ba0d0 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  lt == NULL)..   
ba0e0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ba0f0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
ba100 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
ba110 0a 09 09 2f 2a 20 62 75 69 6c 64 73 20 74 68 65  .../* builds the
ba120 20 42 4c 4f 42 20 67 65 6f 6d 65 74 72 79 20 74   BLOB geometry t
ba130 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f  o be returned */
ba140 0a 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 75 6e  ...int len;...un
ba150 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72  signed char *p_r
ba160 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09  esult = NULL;...
ba170 72 65 73 75 6c 74 2d 3e 53 72 69 64 20 3d 20 69  result->Srid = i
ba180 6e 70 75 74 2d 3e 53 72 69 64 3b 0a 09 09 67 61  nput->Srid;...ga
ba190 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c  iaToSpatiaLiteBl
ba1a0 6f 62 57 6b 62 45 78 32 20 28 72 65 73 75 6c 74  obWkbEx2 (result
ba1b0 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
ba1c0 6e 2c 0a 09 09 09 09 09 20 20 20 20 67 70 6b 67  n,......    gpkg
ba1d0 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f 70 6f 69 6e  _mode, tiny_poin
ba1e0 74 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65  t);...sqlite3_re
ba1f0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
ba200 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
ba210 6e 2c 20 66 72 65 65 29 3b 0a 09 09 67 61 69 61  n, free);...gaia
ba220 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65  FreeGeomColl (re
ba230 73 75 6c 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20  sult);..    }.  
ba240 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
ba250 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 69 6e 70 75  eeGeomColl (inpu
ba260 74 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65  t);.    gaiaFree
ba270 47 65 6f 6d 43 6f 6c 6c 20 28 62 6c 61 64 65 29  GeomColl (blade)
ba280 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  ;.}..static int.
ba290 67 65 74 58 59 53 69 6e 67 6c 65 50 6f 69 6e 74  getXYSinglePoint
ba2a0 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
ba2b0 72 20 67 65 6f 6d 2c 20 64 6f 75 62 6c 65 20 2a  r geom, double *
ba2c0 78 2c 20 64 6f 75 62 6c 65 20 2a 79 29 0a 7b 0a  x, double *y).{.
ba2d0 2f 2a 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  /* check if this
ba2e0 20 67 65 6f 6d 65 74 72 79 20 69 73 20 61 20 73   geometry is a s
ba2f0 69 6d 70 6c 65 20 50 6f 69 6e 74 20 28 72 65 74  imple Point (ret
ba300 75 72 6e 69 6e 67 20 32 44 20 63 6f 6f 72 64 73  urning 2D coords
ba310 29 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) */.    double 
ba320 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b  z;.    double m;
ba330 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65 74 58  .    return getX
ba340 59 5a 4d 53 69 6e 67 6c 65 50 6f 69 6e 74 20 28  YZMSinglePoint (
ba350 67 65 6f 6d 2c 20 78 2c 20 79 2c 20 26 7a 2c 20  geom, x, y, &z, 
ba360 26 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  &m);.}..static v
ba370 6f 69 64 0a 66 6e 63 74 5f 41 7a 69 6d 75 74 68  oid.fnct_Azimuth
ba380 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
ba390 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
ba3a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ba3b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
ba3c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
ba3d0 0a 2f 20 41 7a 69 6d 75 74 68 28 42 4c 4f 42 65  ./ Azimuth(BLOBe
ba3e0 6e 63 6f 64 65 64 20 70 6f 69 6e 74 41 2c 20 42  ncoded pointA, B
ba3f0 4c 4f 42 65 6e 63 6f 64 65 64 20 70 6f 69 6e 74  LOBencoded point
ba400 42 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74  B)././ Returns t
ba410 68 65 20 61 6e 67 6c 65 20 69 6e 20 72 61 64 69  he angle in radi
ba420 61 6e 73 20 66 72 6f 6d 20 74 68 65 20 68 6f 72  ans from the hor
ba430 69 7a 6f 6e 74 61 6c 20 6f 66 20 74 68 65 20 76  izontal of the v
ba440 65 63 74 6f 72 20 0a 2f 20 64 65 66 69 6e 65 64  ector ./ defined
ba450 20 62 79 20 70 6f 69 6e 74 41 20 61 6e 64 20 70   by pointA and p
ba460 6f 69 6e 74 42 2e 20 0a 2f 20 41 6e 67 6c 65 20  ointB. ./ Angle 
ba470 69 73 20 63 6f 6d 70 75 74 65 64 20 63 6c 6f 63  is computed cloc
ba480 6b 77 69 73 65 20 66 72 6f 6d 20 64 6f 77 6e 2d  kwise from down-
ba490 74 6f 2d 75 70 3a 20 6f 6e 20 74 68 65 20 63 6c  to-up: on the cl
ba4a0 6f 63 6b 3a 20 0a 2f 20 31 32 3d 30 3b 20 33 3d  ock: ./ 12=0; 3=
ba4b0 50 49 2f 32 3b 20 36 3d 50 49 3b 20 39 3d 33 50  PI/2; 6=PI; 9=3P
ba4c0 49 2f 32 2e 0a 2f 20 4e 55 4c 4c 20 69 73 20 72  I/2../ NULL is r
ba4d0 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76 61  eturned for inva
ba4e0 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
ba4f0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
ba500 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
ba510 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
ba520 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
ba530 20 67 65 6f 6d 3b 0a 20 20 20 20 64 6f 75 62 6c   geom;.    doubl
ba540 65 20 78 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  e x1;.    double
ba550 20 79 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20   y1;.    double 
ba560 78 32 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  x2;.    double y
ba570 32 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 61 3b  2;.    double a;
ba580 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 3b 0a 20  .    double b;. 
ba590 20 20 20 64 6f 75 62 6c 65 20 72 66 3b 0a 20 20     double rf;.  
ba5a0 20 20 64 6f 75 62 6c 65 20 61 7a 69 6d 75 74 68    double azimuth
ba5b0 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64 3b 0a  ;.    int srid;.
ba5c0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
ba5d0 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
ba5e0 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
ba5f0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69  (context);.    i
ba600 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  nt gpkg_amphibio
ba610 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  us = 0;.    int 
ba620 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20  gpkg_mode = 0;. 
ba630 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
ba640 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
ba650 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
ba660 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
ba670 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
ba680 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
ba690 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
ba6a0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21 3d      if (cache !=
ba6b0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
ba6c0 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
ba6d0 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  s = cache->gpkg_
ba6e0 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b  amphibious_mode;
ba6f0 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  ..  gpkg_mode = 
ba700 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65  cache->gpkg_mode
ba710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
ba720 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
ba730 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
ba740 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
ba750 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
ba760 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
ba770 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
ba780 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
ba790 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
ba7a0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
ba7b0 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
ba7c0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
ba7d0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
ba7e0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
ba7f0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f  turn;.      }../
ba800 2a 20 72 65 74 72 69 65 76 69 6e 67 20 61 6e 64  * retrieving and
ba810 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20   validating the 
ba820 66 69 72 73 74 20 70 6f 69 6e 74 20 2a 2f 0a 20  first point */. 
ba830 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
ba840 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
ba850 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
ba860 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
ba870 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
ba880 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
ba890 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
ba8a0 6d 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  m =..gaiaFromSpa
ba8b0 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
ba8c0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
ba8d0 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
ba8e0 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
ba8f0 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
ba900 28 67 65 6f 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 20  (geom == NULL). 
ba910 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
ba920 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
ba930 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
ba940 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
ba950 69 66 20 28 21 67 65 74 58 59 53 69 6e 67 6c 65  if (!getXYSingle
ba960 50 6f 69 6e 74 20 28 67 65 6f 6d 2c 20 26 78 31  Point (geom, &x1
ba970 2c 20 26 79 31 29 29 0a 20 20 20 20 20 20 7b 0a  , &y1)).      {.
ba980 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43  .  gaiaFreeGeomC
ba990 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20 73  oll (geom);..  s
ba9a0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ba9b0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
ba9c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ba9d0 0a 20 20 20 20 73 72 69 64 20 3d 20 67 65 6f 6d  .    srid = geom
ba9e0 2d 3e 53 72 69 64 3b 0a 20 20 20 20 67 61 69 61  ->Srid;.    gaia
ba9f0 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
baa00 6f 6d 29 3b 0a 0a 2f 2a 20 72 65 74 72 69 65 76  om);../* retriev
baa10 69 6e 67 20 61 6e 64 20 76 61 6c 69 64 61 74 69  ing and validati
baa20 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 70 6f  ng the second po
baa30 69 6e 74 20 2a 2f 0a 20 20 20 20 70 5f 62 6c 6f  int */.    p_blo
baa40 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
baa50 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
baa60 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31  lue_blob (argv[1
baa70 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
baa80 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
baa90 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b  bytes (argv[1]);
baaa0 0a 20 20 20 20 67 65 6f 6d 20 3d 0a 09 67 61 69  .    geom =..gai
baab0 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
baac0 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
baad0 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
baae0 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
baaf0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
bab00 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 20 3d 3d  .    if (geom ==
bab10 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
bab20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
bab30 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
bab40 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
bab50 20 20 7d 0a 20 20 20 20 69 66 20 28 21 67 65 74    }.    if (!get
bab60 58 59 53 69 6e 67 6c 65 50 6f 69 6e 74 20 28 67  XYSinglePoint (g
bab70 65 6f 6d 2c 20 26 78 32 2c 20 26 79 32 29 29 0a  eom, &x2, &y2)).
bab80 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 46        {..  gaiaF
bab90 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  reeGeomColl (geo
baba0 6d 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  m);..  sqlite3_r
babb0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
babc0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
babd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
babe0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
babf0 65 6f 6d 29 3b 0a 0a 20 20 20 20 69 66 20 28 67  eom);..    if (g
bac00 65 74 45 6c 6c 69 70 73 6f 69 64 50 61 72 61 6d  etEllipsoidParam
bac10 73 20 28 73 71 6c 69 74 65 2c 20 73 72 69 64 2c  s (sqlite, srid,
bac20 20 26 61 2c 20 26 62 2c 20 26 72 66 29 29 0a 20   &a, &b, &rf)). 
bac30 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 61       {..  if (ga
bac40 69 61 45 6c 6c 69 70 73 6f 69 64 41 7a 69 6d 75  iaEllipsoidAzimu
bac50 74 68 20 28 63 61 63 68 65 2c 20 78 31 2c 20 79  th (cache, x1, y
bac60 31 2c 20 78 32 2c 20 79 32 2c 20 61 2c 20 62 2c  1, x2, y2, a, b,
bac70 20 26 61 7a 69 6d 75 74 68 29 29 0a 09 20 20 20   &azimuth))..   
bac80 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
bac90 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
baca0 74 2c 20 61 7a 69 6d 75 74 68 29 3b 0a 09 20 20  t, azimuth);..  
bacb0 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69  else..      sqli
bacc0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
bacd0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
bace0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  turn;.      }.. 
bacf0 20 20 20 69 66 20 28 67 61 69 61 41 7a 69 6d 75     if (gaiaAzimu
bad00 74 68 20 28 63 61 63 68 65 2c 20 78 31 2c 20 79  th (cache, x1, y
bad10 31 2c 20 78 32 2c 20 79 32 2c 20 26 61 7a 69 6d  1, x2, y2, &azim
bad20 75 74 68 29 29 0a 09 73 71 6c 69 74 65 33 5f 72  uth))..sqlite3_r
bad30 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f  esult_double (co
bad40 6e 74 65 78 74 2c 20 61 7a 69 6d 75 74 68 29 3b  ntext, azimuth);
bad50 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
bad60 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
bad70 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61  context);.}..sta
bad80 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 50 72  tic void.fnct_Pr
bad90 6f 6a 65 63 74 20 28 73 71 6c 69 74 65 33 5f 63  oject (sqlite3_c
bada0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
badb0 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
badc0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
badd0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
bade0 74 69 6f 6e 3a 0a 2f 20 50 72 6f 6a 65 63 74 28  tion:./ Project(
badf0 42 4c 4f 42 65 6e 63 6f 64 65 64 20 70 6f 69 6e  BLOBencoded poin
bae00 74 2c 20 64 69 73 74 61 6e 63 65 20 44 6f 75 62  t, distance Doub
bae10 6c 65 2c 20 62 65 61 72 69 6e 67 20 44 6f 75 62  le, bearing Doub
bae20 6c 65 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20  le)././ Returns 
bae30 61 20 6e 65 77 20 50 6f 69 6e 74 20 70 72 6f 6a  a new Point proj
bae40 65 63 74 65 64 20 66 72 6f 6d 20 61 20 73 74 61  ected from a sta
bae50 72 74 20 70 6f 69 6e 74 20 67 69 76 65 6e 20 61  rt point given a
bae60 0a 2f 20 64 69 73 74 61 6e 63 65 20 61 6e 64 20  ./ distance and 
bae70 61 20 62 65 61 72 69 6e 67 2e 20 0a 2f 20 2d 20  a bearing. ./ - 
bae80 50 6f 69 6e 74 20 69 73 20 65 78 70 65 63 74 65  Point is expecte
bae90 64 20 74 6f 20 62 65 20 4c 6f 6e 67 2f 4c 61 74  d to be Long/Lat
baea0 0a 2f 20 2d 20 44 69 73 74 61 6e 63 65 20 69 73  ./ - Distance is
baeb0 20 69 6e 20 6d 65 74 65 72 73 0a 2f 20 2d 20 42   in meters./ - B
baec0 65 61 72 69 6e 67 20 69 73 20 69 6e 20 72 61 64  earing is in rad
baed0 69 61 6e 73 3b 20 6f 6e 20 74 68 65 20 63 6c 6f  ians; on the clo
baee0 63 6b 3a 20 0a 2f 20 20 20 31 32 3d 30 3b 20 33  ck: ./   12=0; 3
baef0 3d 50 49 2f 32 3b 20 36 3d 50 49 3b 20 39 3d 33  =PI/2; 6=PI; 9=3
baf00 50 49 2f 32 2e 0a 2f 20 4e 55 4c 4c 20 69 73 20  PI/2../ NULL is 
baf10 72 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76  returned for inv
baf20 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
baf30 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
baf40 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
baf50 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
baf60 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
baf70 72 20 67 65 6f 6d 3b 0a 20 20 20 20 64 6f 75 62  r geom;.    doub
baf80 6c 65 20 78 31 3b 0a 20 20 20 20 64 6f 75 62 6c  le x1;.    doubl
baf90 65 20 79 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  e y1;.    double
bafa0 20 78 32 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20   x2;.    double 
bafb0 79 32 3b 0a 20 20 20 20 69 6e 74 20 69 76 61 6c  y2;.    int ival
bafc0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 69 73  ;.    double dis
bafd0 74 61 6e 63 65 3b 0a 20 20 20 20 64 6f 75 62 6c  tance;.    doubl
bafe0 65 20 61 7a 69 6d 75 74 68 3b 0a 20 20 20 20 64  e azimuth;.    d
baff0 6f 75 62 6c 65 20 61 3b 0a 20 20 20 20 64 6f 75  ouble a;.    dou
bb000 62 6c 65 20 62 3b 0a 20 20 20 20 64 6f 75 62 6c  ble b;.    doubl
bb010 65 20 72 66 3b 0a 20 20 20 20 69 6e 74 20 73 72  e rf;.    int sr
bb020 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  id;.    sqlite3 
bb030 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
bb040 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
bb050 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
bb060 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
bb070 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
bb080 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
bb090 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f  0;.    int tiny_
bb0a0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  point = 0;.    s
bb0b0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
bb0c0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
bb0d0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
bb0e0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
bb0f0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
bb100 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
bb110 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
bb120 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
bb130 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
bb140 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
bb150 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
bb160 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
bb170 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
bb180 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20  e->gpkg_mode;.. 
bb190 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61   tiny_point = ca
bb1a0 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e  che->tinyPointEn
bb1b0 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  abled;.      }. 
bb1c0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
bb1d0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
bb1e0 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
bb1f0 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
bb200 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
bb210 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
bb220 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
bb230 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
bb240 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
bb250 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
bb260 46 4c 4f 41 54 29 0a 09 64 69 73 74 61 6e 63 65  FLOAT)..distance
bb270 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
bb280 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31 5d  _double (argv[1]
bb290 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
bb2a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
bb2b0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
bb2c0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
bb2d0 20 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20        {..  ival 
bb2e0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bb2f0 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  int (argv[1]);..
bb300 20 20 64 69 73 74 61 6e 63 65 20 3d 20 69 76 61    distance = iva
bb310 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  l;.      }.    e
bb320 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
bb330 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
bb340 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
bb350 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
bb360 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
bb370 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
bb380 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
bb390 46 4c 4f 41 54 29 0a 09 61 7a 69 6d 75 74 68 20  FLOAT)..azimuth 
bb3a0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bb3b0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29  double (argv[2])
bb3c0 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
bb3d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
bb3e0 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
bb3f0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
bb400 20 20 20 20 20 7b 0a 09 20 20 69 76 61 6c 20 3d       {..  ival =
bb410 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
bb420 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20  nt (argv[2]);.. 
bb430 20 61 7a 69 6d 75 74 68 20 3d 20 69 76 61 6c 3b   azimuth = ival;
bb440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
bb450 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
bb460 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
bb470 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
bb480 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  eturn;.      }..
bb490 2f 2a 20 72 65 74 72 69 65 76 69 6e 67 20 61 6e  /* retrieving an
bb4a0 64 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  d validating the
bb4b0 20 73 74 61 72 74 20 70 6f 69 6e 74 20 2a 2f 0a   start point */.
bb4c0 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e      p_blob = (un
bb4d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
bb4e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
bb4f0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
bb500 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
bb510 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
bb520 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65  argv[0]);.    ge
bb530 6f 6d 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  om =..gaiaFromSp
bb540 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
bb550 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
bb560 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
bb570 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
bb580 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66  hibious);.    if
bb590 20 28 67 65 6f 6d 20 3d 3d 20 4e 55 4c 4c 29 0a   (geom == NULL).
bb5a0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
bb5b0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
bb5c0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
bb5d0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
bb5e0 20 69 66 20 28 21 67 65 74 58 59 53 69 6e 67 6c   if (!getXYSingl
bb5f0 65 50 6f 69 6e 74 20 28 67 65 6f 6d 2c 20 26 78  ePoint (geom, &x
bb600 31 2c 20 26 79 31 29 29 0a 20 20 20 20 20 20 7b  1, &y1)).      {
bb610 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d  ..  gaiaFreeGeom
bb620 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20  Coll (geom);..  
bb630 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
bb640 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
bb650 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
bb660 7d 0a 20 20 20 20 73 72 69 64 20 3d 20 67 65 6f  }.    srid = geo
bb670 6d 2d 3e 53 72 69 64 3b 0a 20 20 20 20 67 61 69  m->Srid;.    gai
bb680 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
bb690 65 6f 6d 29 3b 0a 20 20 20 20 69 66 20 28 21 67  eom);.    if (!g
bb6a0 65 74 45 6c 6c 69 70 73 6f 69 64 50 61 72 61 6d  etEllipsoidParam
bb6b0 73 20 28 73 71 6c 69 74 65 2c 20 73 72 69 64 2c  s (sqlite, srid,
bb6c0 20 26 61 2c 20 26 62 2c 20 26 72 66 29 29 0a 20   &a, &b, &rf)). 
bb6d0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
bb6e0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
bb6f0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
bb700 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
bb710 69 66 20 28 64 69 73 74 61 6e 63 65 20 3d 3d 20  if (distance == 
bb720 30 2e 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  0.0).      {..  
bb730 2f 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65  /* returning the
bb740 20 53 74 61 72 74 20 50 6f 69 6e 74 20 2a 2f 0a   Start Point */.
bb750 09 20 20 67 61 69 61 4d 61 6b 65 50 6f 69 6e 74  .  gaiaMakePoint
bb760 45 78 20 28 74 69 6e 79 5f 70 6f 69 6e 74 2c 20  Ex (tiny_point, 
bb770 78 31 2c 20 79 31 2c 20 73 72 69 64 2c 20 26 70  x1, y1, srid, &p
bb780 5f 62 6c 6f 62 2c 20 26 6e 5f 62 79 74 65 73 29  _blob, &n_bytes)
bb790 3b 0a 09 20 20 69 66 20 28 21 70 5f 62 6c 6f 62  ;..  if (!p_blob
bb7a0 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
bb7b0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
bb7c0 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
bb7d0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
bb7e0 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
bb7f0 65 78 74 2c 20 70 5f 62 6c 6f 62 2c 20 6e 5f 62  ext, p_blob, n_b
bb800 79 74 65 73 2c 20 66 72 65 65 29 3b 0a 09 20 20  ytes, free);..  
bb810 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
bb820 0a 20 20 20 20 69 66 20 28 67 61 69 61 50 72 6f  .    if (gaiaPro
bb830 6a 65 63 74 65 64 50 6f 69 6e 74 20 28 63 61 63  jectedPoint (cac
bb840 68 65 2c 20 78 31 2c 20 79 31 2c 20 61 2c 20 62  he, x1, y1, a, b
bb850 2c 20 64 69 73 74 61 6e 63 65 2c 20 61 7a 69 6d  , distance, azim
bb860 75 74 68 2c 20 26 78 32 2c 20 26 79 32 29 29 0a  uth, &x2, &y2)).
bb870 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 4d        {..  gaiaM
bb880 61 6b 65 50 6f 69 6e 74 45 78 20 28 74 69 6e 79  akePointEx (tiny
bb890 5f 70 6f 69 6e 74 2c 20 78 32 2c 20 79 32 2c 20  _point, x2, y2, 
bb8a0 73 72 69 64 2c 20 26 70 5f 62 6c 6f 62 2c 20 26  srid, &p_blob, &
bb8b0 6e 5f 62 79 74 65 73 29 3b 0a 09 20 20 69 66 20  n_bytes);..  if 
bb8c0 28 21 70 5f 62 6c 6f 62 29 0a 09 20 20 20 20 20  (!p_blob)..     
bb8d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
bb8e0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
bb8f0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
bb900 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
bb910 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 62  ob (context, p_b
bb920 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 66 72  lob, n_bytes, fr
bb930 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
bb940 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
bb950 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
bb960 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ext);.}..static 
bb970 76 6f 69 64 0a 66 6e 63 74 5f 47 65 6f 48 61 73  void.fnct_GeoHas
bb980 68 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  h (sqlite3_conte
bb990 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
bb9a0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
bb9b0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
bb9c0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
bb9d0 3a 0a 2f 20 47 65 6f 48 61 73 68 28 42 4c 4f 42  :./ GeoHash(BLOB
bb9e0 65 6e 63 6f 64 65 64 20 67 65 6f 6d 29 0a 2f 20  encoded geom)./ 
bb9f0 47 65 6f 48 61 73 68 28 42 4c 4f 42 65 6e 63 6f  GeoHash(BLOBenco
bba00 64 65 64 20 67 65 6f 6d 2c 20 49 6e 74 65 67 65  ded geom, Intege
bba10 72 20 70 72 65 63 69 73 69 6f 6e 29 0a 2f 0a 2f  r precision)././
bba20 20 52 65 74 75 72 6e 73 20 61 20 47 65 6f 48 61   Returns a GeoHa
bba30 73 68 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  sh representatio
bba40 6e 20 66 6f 72 20 69 6e 70 75 74 20 67 65 6f 6d  n for input geom
bba50 65 74 72 79 0a 2f 20 28 65 78 70 65 63 74 65 64  etry./ (expected
bba60 20 74 6f 20 62 65 20 69 6e 20 6c 6f 6e 67 69 74   to be in longit
bba70 75 64 65 2f 6c 61 74 69 74 75 64 65 20 63 6f 6f  ude/latitude coo
bba80 72 64 73 29 0a 2f 20 4e 55 4c 4c 20 69 73 20 72  rds)./ NULL is r
bba90 65 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76 61  eturned for inva
bbaa0 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
bbab0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
bbac0 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
bbad0 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
bbae0 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
bbaf0 20 67 65 6f 6d 3b 0a 20 20 20 20 69 6e 74 20 70   geom;.    int p
bbb00 72 65 63 69 73 69 6f 6e 20 3d 20 30 3b 0a 20 20  recision = 0;.  
bbb10 20 20 63 68 61 72 20 2a 67 65 6f 5f 68 61 73 68    char *geo_hash
bbb20 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
bbb30 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
bbb40 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
bbb50 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
bbb60 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
bbb70 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
bbb80 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
bbb90 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
bbba0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
bbbb0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
bbbc0 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
bbbd0 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
bbbe0 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
bbbf0 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
bbc00 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
bbc10 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
bbc20 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
bbc30 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d  kg_mode;.      }
bbc40 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
bbc50 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
bbc60 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
bbc70 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
bbc80 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
bbc90 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
bbca0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
bbcb0 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
bbcc0 3d 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 2).      {.. 
bbcd0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
bbce0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
bbcf0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
bbd00 47 45 52 29 0a 09 20 20 20 20 20 20 70 72 65 63  GER)..      prec
bbd10 69 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ision = sqlite3_
bbd20 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
bbd30 31 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  1]);..  else..  
bbd40 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
bbd50 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
bbd60 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
bbd70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
bbd80 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
bbd90 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
bbda0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
bbdb0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
bbdc0 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
bbdd0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
bbde0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
bbdf0 6d 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61  m =..gaiaFromSpa
bbe00 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78  tiaLiteBlobWkbEx
bbe10 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
bbe20 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
bbe30 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68  ..     gpkg_amph
bbe40 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20  ibious);.    if 
bbe50 28 67 65 6f 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 20  (geom == NULL). 
bbe60 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
bbe70 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
bbe80 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
bbe90 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
bbea0 67 65 6f 5f 68 61 73 68 20 3d 20 67 61 69 61 47  geo_hash = gaiaG
bbeb0 65 6f 48 61 73 68 20 28 63 61 63 68 65 2c 20 67  eoHash (cache, g
bbec0 65 6f 6d 2c 20 70 72 65 63 69 73 69 6f 6e 29 3b  eom, precision);
bbed0 0a 20 20 20 20 69 66 20 28 67 65 6f 5f 68 61 73  .    if (geo_has
bbee0 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  h != NULL).     
bbef0 20 7b 0a 09 20 20 69 6e 74 20 6c 65 6e 20 3d 20   {..  int len = 
bbf00 73 74 72 6c 65 6e 20 28 67 65 6f 5f 68 61 73 68  strlen (geo_hash
bbf10 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
bbf20 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
bbf30 78 74 2c 20 67 65 6f 5f 68 61 73 68 2c 20 6c 65  xt, geo_hash, le
bbf40 6e 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20  n, free);.      
bbf50 7d 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  }.    else..sqli
bbf60 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
bbf70 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
bbf80 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
bbf90 28 67 65 6f 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69  (geom);.}..stati
bbfa0 63 20 63 68 61 72 20 2a 0a 67 65 74 5f 73 72 73  c char *.get_srs
bbfb0 5f 62 79 5f 73 72 69 64 20 28 73 71 6c 69 74 65  _by_srid (sqlite
bbfc0 33 20 2a 20 73 71 6c 69 74 65 2c 20 69 6e 74 20  3 * sqlite, int 
bbfd0 73 72 69 64 2c 20 69 6e 74 20 6c 6f 6e 67 73 72  srid, int longsr
bbfe0 73 29 0a 7b 0a 2f 2a 20 72 65 74 72 69 65 76 65  s).{./* retrieve
bbff0 73 20 74 68 65 20 73 68 6f 72 74 2d 20 6f 72 20  s the short- or 
bc000 6c 6f 6e 67 2d 20 73 72 73 20 72 65 66 65 72 65  long- srs refere
bc010 6e 63 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  nce for the give
bc020 6e 20 73 72 69 64 20 2a 2f 0a 20 20 20 20 63 68  n srid */.    ch
bc030 61 72 20 73 71 6c 5b 31 30 32 34 5d 3b 0a 20 20  ar sql[1024];.  
bc040 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
bc050 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b  onst char *name;
bc060 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bc070 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a  char **results;.
bc080 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20      int rows;.  
bc090 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20    int columns;. 
bc0a0 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
bc0b0 63 68 61 72 20 2a 73 72 73 20 3d 20 4e 55 4c 4c  char *srs = NULL
bc0c0 3b 0a 0a 20 20 20 20 69 66 20 28 6c 6f 6e 67 73  ;..    if (longs
bc0d0 72 73 29 0a 09 73 70 72 69 6e 74 66 20 28 73 71  rs)..sprintf (sq
bc0e0 6c 2c 0a 09 09 20 22 53 45 4c 45 43 54 20 27 75  l,... "SELECT 'u
bc0f0 72 6e 3a 6f 67 63 3a 64 65 66 3a 63 72 73 3a 27  rn:ogc:def:crs:'
bc100 20 7c 7c 20 61 75 74 68 5f 6e 61 6d 65 20 7c 7c   || auth_name ||
bc110 20 27 3a 3a 27 20 7c 7c 20 61 75 74 68 5f 73 72   '::' || auth_sr
bc120 69 64 20 22 0a 09 09 20 22 46 52 4f 4d 20 73 70  id "... "FROM sp
bc130 61 74 69 61 6c 5f 72 65 66 5f 73 79 73 20 57 48  atial_ref_sys WH
bc140 45 52 45 20 73 72 69 64 20 3d 20 25 64 22 2c 20  ERE srid = %d", 
bc150 73 72 69 64 29 3b 0a 20 20 20 20 65 6c 73 65 0a  srid);.    else.
bc160 09 73 70 72 69 6e 74 66 20 28 73 71 6c 2c 20 22  .sprintf (sql, "
bc170 53 45 4c 45 43 54 20 61 75 74 68 5f 6e 61 6d 65  SELECT auth_name
bc180 20 7c 7c 20 27 3a 27 20 7c 7c 20 61 75 74 68 5f   || ':' || auth_
bc190 73 72 69 64 20 22 0a 09 09 20 22 46 52 4f 4d 20  srid "... "FROM 
bc1a0 73 70 61 74 69 61 6c 5f 72 65 66 5f 73 79 73 20  spatial_ref_sys 
bc1b0 57 48 45 52 45 20 73 72 69 64 20 3d 20 25 64 22  WHERE srid = %d"
bc1c0 2c 20 73 72 69 64 29 3b 0a 20 20 20 20 72 65 74  , srid);.    ret
bc1d0 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74   = sqlite3_get_t
bc1e0 61 62 6c 65 20 28 73 71 6c 69 74 65 2c 20 73 71  able (sqlite, sq
bc1f0 6c 2c 20 26 72 65 73 75 6c 74 73 2c 20 26 72 6f  l, &results, &ro
bc200 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 2c 20 4e 55  ws, &columns, NU
bc210 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74  LL);.    if (ret
bc220 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09   != SQLITE_OK)..
bc230 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
bc240 20 69 66 20 28 72 6f 77 73 20 3c 20 31 29 0a 09   if (rows < 1)..
bc250 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
bc260 20 7b 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 31   {..  for (i = 1
bc270 3b 20 69 20 3c 3d 20 72 6f 77 73 3b 20 69 2b 2b  ; i <= rows; i++
bc280 29 0a 09 20 20 20 20 7b 0a 09 09 6e 61 6d 65 20  )..    {...name 
bc290 3d 20 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63  = results[(i * c
bc2a0 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 3b 0a 09 09  olumns) + 0];...
bc2b0 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 6e 61  len = strlen (na
bc2c0 6d 65 29 3b 0a 09 09 73 72 73 20 3d 20 6d 61 6c  me);...srs = mal
bc2d0 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 09  loc (len + 1);..
bc2e0 09 73 74 72 63 70 79 20 28 73 72 73 2c 20 6e 61  .strcpy (srs, na
bc2f0 6d 65 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  me);..    }.    
bc300 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
bc310 66 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73 75  free_table (resu
bc320 6c 74 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lts);.    return
bc330 20 73 72 73 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   srs;.}..static 
bc340 76 6f 69 64 0a 66 6e 63 74 5f 41 73 58 33 44 20  void.fnct_AsX3D 
bc350 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
bc360 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
bc370 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
bc380 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
bc390 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
bc3a0 2f 20 41 73 58 33 44 28 42 4c 4f 42 65 6e 63 6f  / AsX3D(BLOBenco
bc3b0 64 65 64 20 67 65 6f 6d 29 0a 2f 20 41 73 58 33  ded geom)./ AsX3
bc3c0 44 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  D(BLOBencoded ge
bc3d0 6f 6d 2c 20 49 6e 74 65 67 65 72 20 70 72 65 63  om, Integer prec
bc3e0 69 73 69 6f 6e 29 0a 2f 20 41 73 58 33 44 28 42  ision)./ AsX3D(B
bc3f0 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 2c  LOBencoded geom,
bc400 20 49 6e 74 65 67 65 72 20 70 72 65 63 69 73 69   Integer precisi
bc410 6f 6e 2c 20 49 6e 74 65 67 65 72 20 6f 70 74 69  on, Integer opti
bc420 6f 6e 73 29 0a 2f 20 41 73 58 33 44 28 42 4c 4f  ons)./ AsX3D(BLO
bc430 42 65 6e 63 6f 64 65 64 20 67 65 6f 6d 2c 20 49  Bencoded geom, I
bc440 6e 74 65 67 65 72 20 70 72 65 63 69 73 69 6f 6e  nteger precision
bc450 2c 20 49 6e 74 65 67 65 72 20 6f 70 74 69 6f 6e  , Integer option
bc460 73 2c 20 54 65 78 74 20 72 65 66 69 64 29 0a 2f  s, Text refid)./
bc470 0a 2f 20 52 65 74 75 72 6e 73 20 61 6e 20 58 33  ./ Returns an X3
bc480 44 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  D representation
bc490 20 66 6f 72 20 69 6e 70 75 74 20 67 65 6f 6d 65   for input geome
bc4a0 74 72 79 0a 2f 20 4e 55 4c 4c 20 69 73 20 72 65  try./ NULL is re
bc4b0 74 75 72 6e 65 64 20 66 6f 72 20 69 6e 76 61 6c  turned for inval
bc4c0 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
bc4d0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
bc4e0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
bc4f0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
bc500 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
bc510 67 65 6f 6d 3b 0a 20 20 20 20 69 6e 74 20 70 72  geom;.    int pr
bc520 65 63 69 73 69 6f 6e 20 3d 20 31 35 3b 0a 20 20  ecision = 15;.  
bc530 20 20 69 6e 74 20 6f 70 74 69 6f 6e 73 20 3d 20    int options = 
bc540 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
bc550 72 20 2a 72 65 66 69 64 20 3d 20 22 22 3b 0a 20  r *refid = "";. 
bc560 20 20 20 63 68 61 72 20 2a 73 72 73 20 3d 20 4e     char *srs = N
bc570 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 78  ULL;.    char *x
bc580 33 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  3d;.    sqlite3 
bc590 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
bc5a0 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
bc5b0 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
bc5c0 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68     int gpkg_amph
bc5d0 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20  ibious = 0;.    
bc5e0 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20  int gpkg_mode = 
bc5f0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  0;.    struct sp
bc600 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
bc610 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
bc620 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
bc630 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
bc640 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
bc650 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
bc660 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
bc670 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
bc680 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69   {..  gpkg_amphi
bc690 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67  bious = cache->g
bc6a0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d  pkg_amphibious_m
bc6b0 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64  ode;..  gpkg_mod
bc6c0 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f  e = cache->gpkg_
bc6d0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mode;.      }.  
bc6e0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
bc6f0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
bc700 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
bc710 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
bc720 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
bc730 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
bc740 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
bc750 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20      if (argc >= 
bc760 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  2).      {..  if
bc770 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
bc780 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
bc790 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
bc7a0 29 0a 09 20 20 20 20 20 20 70 72 65 63 69 73 69  )..      precisi
bc7b0 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  on = sqlite3_val
bc7c0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
bc7d0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  ;..  else..    {
bc7e0 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
bc7f0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
bc800 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
bc810 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69   }.      }.    i
bc820 66 20 28 61 72 67 63 20 3e 3d 20 33 29 0a 20 20  f (argc >= 3).  
bc830 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
bc840 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
bc850 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c  (argv[2]) == SQL
bc860 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
bc870 20 20 20 20 6f 70 74 69 6f 6e 73 20 3d 20 73 71      options = sq
bc880 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
bc890 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 65 6c  (argv[2]);..  el
bc8a0 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  se..    {...sqli
bc8b0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
bc8c0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
bc8d0 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  urn;..    }.    
bc8e0 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
bc8f0 20 3d 3d 20 34 29 0a 20 20 20 20 20 20 7b 0a 09   == 4).      {..
bc900 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
bc910 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33  lue_type (argv[3
bc920 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) == SQLITE_TEX
bc930 54 29 0a 09 20 20 20 20 20 20 72 65 66 69 64 20  T)..      refid 
bc940 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
bc950 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
bc960 65 78 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09  ext (argv[3]);..
bc970 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
bc980 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
bc990 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
bc9a0 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
bc9b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 70 5f 62        }..    p_b
bc9c0 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
bc9d0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
bc9e0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
bc9f0 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
bca00 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
bca10 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
bca20 29 3b 0a 20 20 20 20 67 65 6f 6d 20 3d 0a 09 67  );.    geom =..g
bca30 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
bca40 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
bca50 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
bca60 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
bca70 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
bca80 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 20  );.    if (geom 
bca90 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
bcaa0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
bcab0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
bcac0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
bcad0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 67 65      }.    if (ge
bcae0 6f 6d 2d 3e 53 72 69 64 20 3e 20 30 29 0a 20 20  om->Srid > 0).  
bcaf0 20 20 20 20 7b 0a 09 20 20 69 6e 74 20 6c 6f 6e      {..  int lon
bcb00 67 73 68 6f 72 74 20 3d 20 30 3b 0a 09 20 20 69  gshort = 0;..  i
bcb10 66 20 28 6f 70 74 69 6f 6e 73 20 26 20 31 29 0a  f (options & 1).
bcb20 09 20 20 20 20 20 20 6c 6f 6e 67 73 68 6f 72 74  .      longshort
bcb30 20 3d 20 31 3b 0a 09 20 20 73 72 73 20 3d 20 67   = 1;..  srs = g
bcb40 65 74 5f 73 72 73 5f 62 79 5f 73 72 69 64 20 28  et_srs_by_srid (
bcb50 73 71 6c 69 74 65 2c 20 67 65 6f 6d 2d 3e 53 72  sqlite, geom->Sr
bcb60 69 64 2c 20 6c 6f 6e 67 73 68 6f 72 74 29 3b 0a  id, longshort);.
bcb70 20 20 20 20 20 20 7d 0a 20 20 20 20 78 33 64 20        }.    x3d 
bcb80 3d 20 67 61 69 61 41 73 58 33 44 20 28 63 61 63  = gaiaAsX3D (cac
bcb90 68 65 2c 20 67 65 6f 6d 2c 20 73 72 73 2c 20 70  he, geom, srs, p
bcba0 72 65 63 69 73 69 6f 6e 2c 20 6f 70 74 69 6f 6e  recision, option
bcbb0 73 2c 20 72 65 66 69 64 29 3b 0a 20 20 20 20 69  s, refid);.    i
bcbc0 66 20 28 78 33 64 20 21 3d 20 4e 55 4c 4c 29 0a  f (x3d != NULL).
bcbd0 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20 6c        {..  int l
bcbe0 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 78 33 64  en = strlen (x3d
bcbf0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
bcc00 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
bcc10 78 74 2c 20 78 33 64 2c 20 6c 65 6e 2c 20 66 72  xt, x3d, len, fr
bcc20 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
bcc30 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
bcc40 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
bcc50 65 78 74 29 3b 0a 20 20 20 20 67 61 69 61 46 72  ext);.    gaiaFr
bcc60 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
bcc70 29 3b 0a 20 20 20 20 69 66 20 28 73 72 73 29 0a  );.    if (srs).
bcc80 09 66 72 65 65 20 28 73 72 73 29 3b 0a 7d 0a 0a  .free (srs);.}..
bcc90 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
bcca0 5f 33 44 44 69 73 74 61 6e 63 65 20 28 73 71 6c  _3DDistance (sql
bccb0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
bccc0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
bccd0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
bcce0 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
bccf0 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 33 44  L function:./ 3D
bcd00 44 69 73 74 61 6e 63 65 28 42 4c 4f 42 65 6e 63  Distance(BLOBenc
bcd10 6f 64 65 64 20 67 65 6f 6d 31 2c 20 42 4c 4f 42  oded geom1, BLOB
bcd20 65 6e 63 6f 64 65 64 20 67 65 6f 6d 32 29 0a 2f  encoded geom2)./
bcd30 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 33  ./ returns the 3
bcd40 44 20 64 69 73 74 61 6e 63 65 20 62 65 74 77 65  D distance betwe
bcd50 65 6e 20 47 45 4f 4d 2d 31 20 61 6e 64 20 47 45  en GEOM-1 and GE
bcd60 4f 4d 2d 32 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  OM-2.*/.    unsi
bcd70 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
bcd80 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
bcd90 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  es;.    gaiaGeom
bcda0 43 6f 6c 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e  CollPtr geo1 = N
bcdb0 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  ULL;.    gaiaGeo
bcdc0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20  mCollPtr geo2 = 
bcdd0 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65  NULL;.    double
bcde0 20 64 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 72   dist;.    int r
bcdf0 65 74 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  et;.    int gpkg
bce00 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
bce10 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
bce20 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  de = 0;.    stru
bce30 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
bce40 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
bce50 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
bce60 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
bce70 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
bce80 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
bce90 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
bcea0 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
bceb0 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
bcec0 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
bced0 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
bcee0 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
bcef0 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
bcf00 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20  gpkg_mode;.     
bcf10 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
bcf20 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
bcf30 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
bcf40 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
bcf50 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
bcf60 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
bcf70 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
bcf80 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
bcf90 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
bcfa0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
bcfb0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
bcfc0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
bcfd0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
bcfe0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
bcff0 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
bd000 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
bd010 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
bd020 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
bd030 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
bd040 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bd050 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
bd060 0a 20 20 20 20 67 65 6f 31 20 3d 0a 09 67 61 69  .    geo1 =..gai
bd070 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
bd080 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62  lobWkbEx (p_blob
bd090 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f  , n_bytes, gpkg_
bd0a0 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67  mode,.....     g
bd0b0 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b  pkg_amphibious);
bd0c0 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
bd0d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
bd0e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
bd0f0 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ob (argv[1]);.  
bd100 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
bd110 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
bd120 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67  (argv[1]);.    g
bd130 65 6f 32 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53  eo2 =..gaiaFromS
bd140 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62  patiaLiteBlobWkb
bd150 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79  Ex (p_blob, n_by
bd160 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a  tes, gpkg_mode,.
bd170 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d  ....     gpkg_am
bd180 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 69  phibious);.    i
bd190 66 20 28 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f  f (!geo1 || !geo
bd1a0 32 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  2)..sqlite3_resu
bd1b0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
bd1c0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
bd1d0 20 20 7b 0a 09 20 20 72 65 74 20 3d 20 67 61 69    {..  ret = gai
bd1e0 61 33 44 44 69 73 74 61 6e 63 65 20 28 63 61 63  a3DDistance (cac
bd1f0 68 65 2c 20 67 65 6f 31 2c 20 67 65 6f 32 2c 20  he, geo1, geo2, 
bd200 26 64 69 73 74 29 3b 0a 09 20 20 69 66 20 28 21  &dist);..  if (!
bd210 72 65 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ret)..      sqli
bd220 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
bd230 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
bd240 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
bd250 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
bd260 28 63 6f 6e 74 65 78 74 2c 20 64 69 73 74 29 3b  (context, dist);
bd270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
bd280 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
bd290 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46 72  eo1);.    gaiaFr
bd2a0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32  eeGeomColl (geo2
bd2b0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
bd2c0 64 0a 66 6e 63 74 5f 4d 61 78 44 69 73 74 61 6e  d.fnct_MaxDistan
bd2d0 63 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ce (sqlite3_cont
bd2e0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
bd2f0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
bd300 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
bd310 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
bd320 6e 3a 0a 2f 20 4d 61 78 44 69 73 74 61 6e 63 65  n:./ MaxDistance
bd330 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65 6f  (BLOBencoded geo
bd340 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64 20  m1, BLOBencoded 
bd350 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75 72  geom2)././ retur
bd360 6e 73 20 74 68 65 20 6d 61 78 20 32 44 20 64 69  ns the max 2D di
bd370 73 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20 47  stance between G
bd380 45 4f 4d 2d 31 20 61 6e 64 20 47 45 4f 4d 2d 32  EOM-1 and GEOM-2
bd390 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
bd3a0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
bd3b0 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
bd3c0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
bd3d0 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c 4c 3b  Ptr geo1 = NULL;
bd3e0 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
bd3f0 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55 4c 4c  lPtr geo2 = NULL
bd400 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 69 73  ;.    double dis
bd410 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  t;.    int ret;.
bd420 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
bd430 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
bd440 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
bd450 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
bd460 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
bd470 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
bd480 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
bd490 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
bd4a0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
bd4b0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
bd4c0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
bd4d0 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he != NULL).    
bd4e0 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68    {..  gpkg_amph
bd4f0 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e  ibious = cache->
bd500 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
bd510 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f  mode;..  gpkg_mo
bd520 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  de = cache->gpkg
bd530 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _mode;.      }. 
bd540 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
bd550 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
bd560 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
bd570 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
bd580 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
bd590 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
bd5a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
bd5b0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
bd5c0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
bd5d0 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
bd5e0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
bd5f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
bd600 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
bd610 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
bd620 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20   }.    p_blob = 
bd630 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
bd640 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
bd650 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
bd660 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
bd670 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
bd680 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
bd690 20 67 65 6f 31 20 3d 0a 09 67 61 69 61 46 72 6f   geo1 =..gaiaFro
bd6a0 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
bd6b0 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  kbEx (p_blob, n_
bd6c0 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65  bytes, gpkg_mode
bd6d0 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f  ,.....     gpkg_
bd6e0 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20  amphibious);.   
bd6f0 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
bd700 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
bd710 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
bd720 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f  argv[1]);.    n_
bd730 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
bd740 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
bd750 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f 32 20  v[1]);.    geo2 
bd760 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
bd770 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
bd780 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
bd790 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
bd7a0 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
bd7b0 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
bd7c0 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32 29 0a 09  geo1 || !geo2)..
bd7d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
bd7e0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
bd7f0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
bd800 09 20 20 72 65 74 20 3d 20 67 61 69 61 4d 61 78  .  ret = gaiaMax
bd810 44 69 73 74 61 6e 63 65 20 28 63 61 63 68 65 2c  Distance (cache,
bd820 20 67 65 6f 31 2c 20 67 65 6f 32 2c 20 26 64 69   geo1, geo2, &di
bd830 73 74 29 3b 0a 09 20 20 69 66 20 28 21 72 65 74  st);..  if (!ret
bd840 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
bd850 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
bd860 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a  ntext);..  else.
bd870 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
bd880 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f  esult_double (co
bd890 6e 74 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20  ntext, dist);.  
bd8a0 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61 46 72      }.    gaiaFr
bd8b0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 31  eeGeomColl (geo1
bd8c0 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  );.    gaiaFreeG
bd8d0 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32 29 3b 0a  eomColl (geo2);.
bd8e0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
bd8f0 6e 63 74 5f 33 44 4d 61 78 44 69 73 74 61 6e 63  nct_3DMaxDistanc
bd900 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
bd910 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
bd920 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
bd930 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
bd940 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
bd950 3a 0a 2f 20 33 44 4d 61 78 44 69 73 74 61 6e 63  :./ 3DMaxDistanc
bd960 65 28 42 4c 4f 42 65 6e 63 6f 64 65 64 20 67 65  e(BLOBencoded ge
bd970 6f 6d 31 2c 20 42 4c 4f 42 65 6e 63 6f 64 65 64  om1, BLOBencoded
bd980 20 67 65 6f 6d 32 29 0a 2f 0a 2f 20 72 65 74 75   geom2)././ retu
bd990 72 6e 73 20 74 68 65 20 6d 61 78 20 33 44 20 64  rns the max 3D d
bd9a0 69 73 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20  istance between 
bd9b0 47 45 4f 4d 2d 31 20 61 6e 64 20 47 45 4f 4d 2d  GEOM-1 and GEOM-
bd9c0 32 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  2.*/.    unsigne
bd9d0 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
bd9e0 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
bd9f0 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
bda00 6c 50 74 72 20 67 65 6f 31 20 3d 20 4e 55 4c 4c  lPtr geo1 = NULL
bda10 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f  ;.    gaiaGeomCo
bda20 6c 6c 50 74 72 20 67 65 6f 32 20 3d 20 4e 55 4c  llPtr geo2 = NUL
bda30 4c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 69  L;.    double di
bda40 73 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  st;.    int ret;
bda50 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d  .    int gpkg_am
bda60 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20  phibious = 0;.  
bda70 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20    int gpkg_mode 
bda80 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
bda90 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
bdaa0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
bdab0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
bdac0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
bdad0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
bdae0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
bdaf0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
bdb00 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
bdb10 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
bdb20 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
bdb30 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
bdb40 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
bdb50 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
bdb60 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  g_mode;.      }.
bdb70 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
bdb80 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
bdb90 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
bdba0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
bdbb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
bdbc0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
bdbd0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
bdbe0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
bdbf0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
bdc00 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
bdc10 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
bdc20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
bdc30 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
bdc40 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
bdc50 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
bdc60 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
bdc70 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
bdc80 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
bdc90 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
bdca0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
bdcb0 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
bdcc0 20 20 67 65 6f 31 20 3d 0a 09 67 61 69 61 46 72    geo1 =..gaiaFr
bdcd0 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
bdce0 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
bdcf0 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
bdd00 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
bdd10 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20  _amphibious);.  
bdd20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
bdd30 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
bdd40 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
bdd50 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e  (argv[1]);.    n
bdd60 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
bdd70 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
bdd80 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f 32  gv[1]);.    geo2
bdd90 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
bdda0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
bddb0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
bddc0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
bddd0 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
bdde0 62 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28  bious);.    if (
bddf0 21 67 65 6f 31 20 7c 7c 20 21 67 65 6f 32 29 0a  !geo1 || !geo2).
bde00 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
bde10 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
bde20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
bde30 0a 09 20 20 72 65 74 20 3d 20 67 61 69 61 33 44  ..  ret = gaia3D
bde40 4d 61 78 44 69 73 74 61 6e 63 65 20 28 63 61 63  MaxDistance (cac
bde50 68 65 2c 20 67 65 6f 31 2c 20 67 65 6f 32 2c 20  he, geo1, geo2, 
bde60 26 64 69 73 74 29 3b 0a 09 20 20 69 66 20 28 21  &dist);..  if (!
bde70 72 65 74 29 0a 09 20 20 20 20 20 20 73 71 6c 69  ret)..      sqli
bde80 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
bde90 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 65 6c  (context);..  el
bdea0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
bdeb0 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
bdec0 28 63 6f 6e 74 65 78 74 2c 20 64 69 73 74 29 3b  (context, dist);
bded0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69  .      }.    gai
bdee0 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
bdef0 65 6f 31 29 3b 0a 20 20 20 20 67 61 69 61 46 72  eo1);.    gaiaFr
bdf00 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 32  eeGeomColl (geo2
bdf10 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
bdf20 64 0a 66 6e 63 74 5f 4e 6f 64 65 20 28 73 71 6c  d.fnct_Node (sql
bdf30 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
bdf40 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
bdf50 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
bdf60 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
bdf70 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54  L function:./ ST
bdf80 5f 4e 6f 64 65 28 42 4c 4f 42 65 6e 63 6f 64 65  _Node(BLOBencode
bdf90 64 20 6c 69 6e 65 73 74 72 69 6e 67 28 73 29 29  d linestring(s))
bdfa0 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 61 20 6e  ././ Returns a n
bdfb0 65 77 20 6e 65 77 20 28 4d 75 6c 74 69 29 4c 69  ew new (Multi)Li
bdfc0 6e 65 73 74 72 69 6e 67 20 62 79 20 72 65 2d 6e  nestring by re-n
bdfd0 6f 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  oding the input 
bdfe0 6c 69 6e 65 73 74 72 69 6e 67 28 73 29 0a 2f 20  linestring(s)./ 
bdff0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
be000 20 66 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67   for invalid arg
be010 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 75 6e  uments.*/.    un
be020 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
be030 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
be040 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65  ytes;.    gaiaGe
be050 6f 6d 43 6f 6c 6c 50 74 72 20 69 6e 70 75 74 3b  omCollPtr input;
be060 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
be070 6c 50 74 72 20 72 65 73 75 6c 74 3b 0a 20 20 20  lPtr result;.   
be080 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
be090 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
be0a0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
be0b0 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f  .    int tiny_po
be0c0 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  int = 0;.    str
be0d0 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
be0e0 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
be0f0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
be100 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
be110 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
be120 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
be130 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
be140 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29   (cache != NULL)
be150 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67  .      {..  gpkg
be160 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61  _amphibious = ca
be170 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62  che->gpkg_amphib
be180 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70  ious_mode;..  gp
be190 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d  kg_mode = cache-
be1a0 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74  >gpkg_mode;..  t
be1b0 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68  iny_point = cach
be1c0 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62  e->tinyPointEnab
be1d0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
be1e0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
be1f0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
be200 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
be210 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
be220 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
be230 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
be240 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  eturn;.      }..
be250 2f 2a 20 72 65 74 72 69 65 76 69 6e 67 20 74 68  /* retrieving th
be260 65 20 69 6e 70 75 74 20 67 65 6f 6d 65 74 72 79  e input geometry
be270 20 2a 2f 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d   */.    p_blob =
be280 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
be290 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
be2a0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
be2b0 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
be2c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
be2d0 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
be2e0 20 20 69 6e 70 75 74 20 3d 0a 09 67 61 69 61 46    input =..gaiaF
be2f0 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  romSpatiaLiteBlo
be300 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20  bWkbEx (p_blob, 
be310 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
be320 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
be330 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
be340 20 20 20 69 66 20 28 69 6e 70 75 74 20 3d 3d 20     if (input == 
be350 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
be360 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
be370 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
be380 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
be390 20 7d 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d   }..    result =
be3a0 20 67 61 69 61 4e 6f 64 65 4c 69 6e 65 73 20 28   gaiaNodeLines (
be3b0 63 61 63 68 65 2c 20 69 6e 70 75 74 29 3b 0a 20  cache, input);. 
be3c0 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d     if (result !=
be3d0 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
be3e0 20 20 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69    gaiaToSpatiaLi
be3f0 74 65 42 6c 6f 62 57 6b 62 45 78 32 20 28 72 65  teBlobWkbEx2 (re
be400 73 75 6c 74 2c 20 26 70 5f 62 6c 6f 62 2c 20 26  sult, &p_blob, &
be410 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f  n_bytes, gpkg_mo
be420 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 74 69  de,.....      ti
be430 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 73 71  ny_point);..  sq
be440 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
be450 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 62 6c  b (context, p_bl
be460 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 66 72 65  ob, n_bytes, fre
be470 65 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47  e);..  gaiaFreeG
be480 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75 6c 74 29  eomColl (result)
be490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
be4a0 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  se..sqlite3_resu
be4b0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
be4c0 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  );.    gaiaFreeG
be4d0 65 6f 6d 43 6f 6c 6c 20 28 69 6e 70 75 74 29 3b  eomColl (input);
be4e0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 63  .}..static int.c
be4f0 68 65 63 6b 5f 61 6c 6c 5f 6c 69 6e 65 73 74 72  heck_all_linestr
be500 69 6e 67 73 20 28 67 61 69 61 47 65 6f 6d 43 6f  ings (gaiaGeomCo
be510 6c 6c 50 74 72 20 69 6e 29 0a 7b 0a 2f 2a 20 63  llPtr in).{./* c
be520 68 65 63 6b 20 69 64 20 74 68 69 73 20 69 73 20  heck id this is 
be530 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20  a collection of 
be540 4c 69 6e 65 73 74 72 69 6e 67 73 20 2a 2f 0a 20  Linestrings */. 
be550 20 20 20 69 6e 74 20 70 74 73 20 3d 20 30 3b 0a     int pts = 0;.
be560 20 20 20 20 69 6e 74 20 6c 6e 73 20 3d 20 30 3b      int lns = 0;
be570 0a 20 20 20 20 69 6e 74 20 70 67 73 20 3d 20 30  .    int pgs = 0
be580 3b 0a 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50  ;.    gaiaPointP
be590 74 72 20 70 74 3b 0a 20 20 20 20 67 61 69 61 4c  tr pt;.    gaiaL
be5a0 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 6e 3b  inestringPtr ln;
be5b0 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e  .    gaiaPolygon
be5c0 50 74 72 20 70 67 3b 0a 0a 20 20 20 20 69 66 20  Ptr pg;..    if 
be5d0 28 69 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65  (in == NULL)..re
be5e0 74 75 72 6e 20 30 3b 0a 2f 2a 20 63 68 65 63 6b  turn 0;./* check
be5f0 69 6e 67 20 69 66 20 77 65 20 68 61 76 65 20 61  ing if we have a
be600 6e 79 20 50 4f 49 4e 54 20 2a 2f 0a 20 20 20 20  ny POINT */.    
be610 70 74 20 3d 20 69 6e 2d 3e 46 69 72 73 74 50 6f  pt = in->FirstPo
be620 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  int;.    while (
be630 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70  pt).      {..  p
be640 74 73 2b 2b 3b 0a 09 20 20 70 74 20 3d 20 70 74  ts++;..  pt = pt
be650 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ->Next;.      }.
be660 20 20 20 20 69 66 20 28 70 74 73 20 3e 20 30 29      if (pts > 0)
be670 0a 09 72 65 74 75 72 6e 20 30 3b 0a 2f 2a 20 63  ..return 0;./* c
be680 68 65 63 6b 69 6e 67 20 69 66 20 77 65 20 68 61  hecking if we ha
be690 76 65 20 61 6e 79 20 50 4f 4c 59 47 4f 4e 20 2a  ve any POLYGON *
be6a0 2f 0a 20 20 20 20 70 67 20 3d 20 69 6e 2d 3e 46  /.    pg = in->F
be6b0 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20 20  irstPolygon;.   
be6c0 20 77 68 69 6c 65 20 28 70 67 29 0a 20 20 20 20   while (pg).    
be6d0 20 20 7b 0a 09 20 20 70 67 73 2b 2b 3b 0a 09 20    {..  pgs++;.. 
be6e0 20 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a   pg = pg->Next;.
be6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
be700 70 67 73 20 3e 20 30 29 0a 09 72 65 74 75 72 6e  pgs > 0)..return
be710 20 30 3b 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20   0;./* checking 
be720 69 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 4c  if we have any L
be730 49 4e 45 53 54 52 49 4e 47 20 2a 2f 0a 20 20 20  INESTRING */.   
be740 20 6c 6e 20 3d 20 69 6e 2d 3e 46 69 72 73 74 4c   ln = in->FirstL
be750 69 6e 65 73 74 72 69 6e 67 3b 0a 20 20 20 20 77  inestring;.    w
be760 68 69 6c 65 20 28 6c 6e 29 0a 20 20 20 20 20 20  hile (ln).      
be770 7b 0a 09 20 20 6c 6e 73 2b 2b 3b 0a 09 20 20 6c  {..  lns++;..  l
be780 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74 3b 0a 20 20  n = ln->Next;.  
be790 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6c 6e      }.    if (ln
be7a0 73 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 20  s == 0)..return 
be7b0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  0;.    return 1;
be7c0 0a 7d 0a 0a 73 74 61 74 69 63 20 67 61 69 61 47  .}..static gaiaG
be7d0 65 6f 6d 43 6f 6c 6c 50 74 72 0a 67 65 74 5f 6e  eomCollPtr.get_n
be7e0 6f 64 65 73 20 28 67 61 69 61 47 65 6f 6d 43 6f  odes (gaiaGeomCo
be7f0 6c 6c 50 74 72 20 69 6e 29 0a 7b 0a 2f 2a 20 65  llPtr in).{./* e
be800 78 74 72 61 63 74 73 20 61 6c 6c 20 4e 6f 64 65  xtracts all Node
be810 73 20 28 4c 69 6e 65 73 74 72 69 6e 67 20 65 78  s (Linestring ex
be820 74 65 72 6d 69 74 69 65 73 29 20 2a 2f 0a 20 20  termities) */.  
be830 20 20 69 6e 74 20 69 76 3b 0a 20 20 20 20 64 6f    int iv;.    do
be840 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62  uble x;.    doub
be850 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le y;.    double
be860 20 6d 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a   m;.    double z
be870 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74  ;.    gaiaLinest
be880 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20  ringPtr ln;.    
be890 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
be8a0 6f 75 74 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  out;..    if (in
be8b0 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72   == NULL)..retur
be8c0 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  n NULL;..    if 
be8d0 28 69 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  (in->DimensionMo
be8e0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
be8f0 29 0a 09 6f 75 74 20 3d 20 67 61 69 61 41 6c 6c  )..out = gaiaAll
be900 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 4d 20 28 29  ocGeomCollXYM ()
be910 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 69  ;.    else if (i
be920 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  n->DimensionMode
be930 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a  l == GAIA_XY_Z).
be940 09 6f 75 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63  .out = gaiaAlloc
be950 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29 3b 0a  GeomCollXYZ ();.
be960 20 20 20 20 65 6c 73 65 20 69 66 20 28 69 6e 2d      else if (in-
be970 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
be980 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
be990 09 6f 75 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63  .out = gaiaAlloc
be9a0 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20 28 29 3b  GeomCollXYZM ();
be9b0 0a 20 20 20 20 65 6c 73 65 0a 09 6f 75 74 20 3d  .    else..out =
be9c0 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f   gaiaAllocGeomCo
be9d0 6c 6c 20 28 29 3b 0a 20 20 20 20 6f 75 74 2d 3e  ll ();.    out->
be9e0 53 72 69 64 20 3d 20 69 6e 2d 3e 53 72 69 64 3b  Srid = in->Srid;
be9f0 0a 0a 20 20 20 20 6c 6e 20 3d 20 69 6e 2d 3e 46  ..    ln = in->F
bea00 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a  irstLinestring;.
bea10 20 20 20 20 77 68 69 6c 65 20 28 6c 6e 29 0a 20      while (ln). 
bea20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 61 76       {..  /* sav
bea30 69 6e 67 20 74 68 65 20 65 78 74 72 65 6d 65 20  ing the extreme 
bea40 70 6f 69 6e 74 73 20 2d 20 53 74 61 72 74 20 2a  points - Start *
bea50 2f 0a 09 20 20 69 66 20 28 6c 6e 2d 3e 44 69 6d  /..  if (ln->Dim
bea60 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
bea70 41 49 41 5f 58 59 5f 5a 29 0a 09 20 20 20 20 7b  AIA_XY_Z)..    {
bea80 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
bea90 59 5a 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  YZ (ln->Coords, 
beaa0 30 2c 20 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a  0, &x, &y, &z);.
beab0 09 09 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f  ..gaiaAddPointTo
beac0 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 6f 75 74  GeomCollXYZ (out
bead0 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 20 20 20  , x, y, z);..   
beae0 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 6c   }..  else if (l
beaf0 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  n->DimensionMode
beb00 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
beb10 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74  .    {...gaiaGet
beb20 50 6f 69 6e 74 58 59 4d 20 28 6c 6e 2d 3e 43 6f  PointXYM (ln->Co
beb30 6f 72 64 73 2c 20 30 2c 20 26 78 2c 20 26 79 2c  ords, 0, &x, &y,
beb40 20 26 6d 29 3b 0a 09 09 67 61 69 61 41 64 64 50   &m);...gaiaAddP
beb50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59  ointToGeomCollXY
beb60 4d 20 28 6f 75 74 2c 20 78 2c 20 79 2c 20 6d 29  M (out, x, y, m)
beb70 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
beb80 20 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69   if (ln->Dimensi
beb90 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
beba0 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b 0a 09  XY_Z_M)..    {..
bebb0 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a  .gaiaGetPointXYZ
bebc0 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 30  M (ln->Coords, 0
bebd0 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d  , &x, &y, &z, &m
bebe0 29 3b 0a 09 09 67 61 69 61 41 64 64 50 6f 69 6e  );...gaiaAddPoin
bebf0 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20  tToGeomCollXYZM 
bec00 28 6f 75 74 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d  (out, x, y, z, m
bec10 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
bec20 65 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47  e..    {...gaiaG
bec30 65 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f  etPoint (ln->Coo
bec40 72 64 73 2c 20 30 2c 20 26 78 2c 20 26 79 29 3b  rds, 0, &x, &y);
bec50 0a 09 09 67 61 69 61 41 64 64 50 6f 69 6e 74 54  ...gaiaAddPointT
bec60 6f 47 65 6f 6d 43 6f 6c 6c 20 28 6f 75 74 2c 20  oGeomColl (out, 
bec70 78 2c 20 79 29 3b 0a 09 20 20 20 20 7d 0a 09 20  x, y);..    }.. 
bec80 20 2f 2a 20 73 61 76 69 6e 67 20 74 68 65 20 65   /* saving the e
bec90 78 74 72 65 6d 65 20 70 6f 69 6e 74 73 20 2d 20  xtreme points - 
beca0 45 6e 64 20 2a 2f 0a 09 20 20 69 76 20 3d 20 6c  End */..  iv = l
becb0 6e 2d 3e 50 6f 69 6e 74 73 20 2d 20 31 3b 0a 09  n->Points - 1;..
becc0 20 20 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73    if (ln->Dimens
becd0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
bece0 5f 58 59 5f 5a 29 0a 09 20 20 20 20 7b 0a 09 09  _XY_Z)..    {...
becf0 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20  gaiaGetPointXYZ 
bed00 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  (ln->Coords, iv,
bed10 20 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09   &x, &y, &z);...
bed20 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65  gaiaAddPointToGe
bed30 6f 6d 43 6f 6c 6c 58 59 5a 20 28 6f 75 74 2c 20  omCollXYZ (out, 
bed40 78 2c 20 79 2c 20 7a 29 3b 0a 09 20 20 20 20 7d  x, y, z);..    }
bed50 0a 09 20 20 65 6c 73 65 20 69 66 20 28 6c 6e 2d  ..  else if (ln-
bed60 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
bed70 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20  == GAIA_XY_M).. 
bed80 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f     {...gaiaGetPo
bed90 69 6e 74 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72  intXYM (ln->Coor
beda0 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20  ds, iv, &x, &y, 
bedb0 26 6d 29 3b 0a 09 09 67 61 69 61 41 64 64 50 6f  &m);...gaiaAddPo
bedc0 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 4d  intToGeomCollXYM
bedd0 20 28 6f 75 74 2c 20 78 2c 20 79 2c 20 6d 29 3b   (out, x, y, m);
bede0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20  ..    }..  else 
bedf0 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f  if (ln->Dimensio
bee00 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
bee10 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b 0a 09 09  Y_Z_M)..    {...
bee20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d  gaiaGetPointXYZM
bee30 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76   (ln->Coords, iv
bee40 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d  , &x, &y, &z, &m
bee50 29 3b 0a 09 09 67 61 69 61 41 64 64 50 6f 69 6e  );...gaiaAddPoin
bee60 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20  tToGeomCollXYZM 
bee70 28 6f 75 74 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d  (out, x, y, z, m
bee80 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  );..    }..  els
bee90 65 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47  e..    {...gaiaG
beea0 65 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e 43 6f 6f  etPoint (ln->Coo
beeb0 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29  rds, iv, &x, &y)
beec0 3b 0a 09 09 67 61 69 61 41 64 64 50 6f 69 6e 74  ;...gaiaAddPoint
beed0 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 6f 75 74 2c  ToGeomColl (out,
beee0 20 78 2c 20 79 29 3b 0a 09 20 20 20 20 7d 0a 09   x, y);..    }..
beef0 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74 3b    ln = ln->Next;
bef00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  .      }..    re
bef10 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 73 74 61  turn out;.}..sta
bef20 74 69 63 20 69 6e 74 0a 70 6f 69 6e 74 5f 69 73  tic int.point_is
bef30 5f 64 65 66 69 6e 65 64 20 28 67 61 69 61 50 6f  _defined (gaiaPo
bef40 69 6e 74 50 74 72 20 69 6e 2c 20 67 61 69 61 47  intPtr in, gaiaG
bef50 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 29  eomCollPtr geom)
bef60 0a 7b 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69  .{./* checking i
bef70 66 20 61 20 50 6f 69 6e 74 20 69 73 20 61 6c 72  f a Point is alr
bef80 65 61 64 79 20 64 65 66 69 6e 65 64 20 2a 2f 0a  eady defined */.
bef90 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72      gaiaPointPtr
befa0 20 70 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73   pt = geom->Firs
befb0 74 50 6f 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c  tPoint;.    whil
befc0 65 20 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09  e (pt).      {..
befd0 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65    if (geom->Dime
befe0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
beff0 49 41 5f 58 59 5f 5a 29 0a 09 20 20 20 20 7b 0a  IA_XY_Z)..    {.
bf000 09 09 69 66 20 28 70 74 2d 3e 58 20 3d 3d 20 69  ..if (pt->X == i
bf010 6e 2d 3e 58 20 26 26 20 70 74 2d 3e 59 20 3d 3d  n->X && pt->Y ==
bf020 20 69 6e 2d 3e 59 20 26 26 20 70 74 2d 3e 5a 20   in->Y && pt->Z 
bf030 3d 3d 20 69 6e 2d 3e 5a 29 0a 09 09 20 20 20 20  == in->Z)...    
bf040 72 65 74 75 72 6e 20 31 3b 0a 09 20 20 20 20 7d  return 1;..    }
bf050 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f  ..  else if (geo
bf060 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
bf070 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
bf080 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 74 2d  .    {...if (pt-
bf090 3e 58 20 3d 3d 20 69 6e 2d 3e 58 20 26 26 20 70  >X == in->X && p
bf0a0 74 2d 3e 59 20 3d 3d 20 69 6e 2d 3e 59 20 26 26  t->Y == in->Y &&
bf0b0 20 70 74 2d 3e 4d 20 3d 3d 20 69 6e 2d 3e 4d 29   pt->M == in->M)
bf0c0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ...    return 1;
bf0d0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20  ..    }..  else 
bf0e0 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
bf0f0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
bf100 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b 0a  _XY_Z_M)..    {.
bf110 09 09 69 66 20 28 70 74 2d 3e 58 20 3d 3d 20 69  ..if (pt->X == i
bf120 6e 2d 3e 58 20 26 26 20 70 74 2d 3e 59 20 3d 3d  n->X && pt->Y ==
bf130 20 69 6e 2d 3e 59 20 26 26 20 70 74 2d 3e 5a 20   in->Y && pt->Z 
bf140 3d 3d 20 69 6e 2d 3e 5a 0a 09 09 20 20 20 20 26  == in->Z...    &
bf150 26 20 70 74 2d 3e 4d 20 3d 3d 20 69 6e 2d 3e 4d  & pt->M == in->M
bf160 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 31  )...    return 1
bf170 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
bf180 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 70 74  ..    {...if (pt
bf190 2d 3e 58 20 3d 3d 20 69 6e 2d 3e 58 20 26 26 20  ->X == in->X && 
bf1a0 70 74 2d 3e 59 20 3d 3d 20 69 6e 2d 3e 59 29 0a  pt->Y == in->Y).
bf1b0 09 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ..    return 1;.
bf1c0 09 20 20 20 20 7d 0a 09 20 20 70 74 20 3d 20 70  .    }..  pt = p
bf1d0 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  t->Next;.      }
bf1e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
bf1f0 0a 0a 73 74 61 74 69 63 20 67 61 69 61 47 65 6f  ..static gaiaGeo
bf200 6d 43 6f 6c 6c 50 74 72 0a 67 65 74 5f 73 65 6c  mCollPtr.get_sel
bf210 66 5f 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20  f_intersections 
bf220 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
bf230 20 69 6e 5f 6f 6c 64 2c 20 67 61 69 61 47 65 6f   in_old, gaiaGeo
bf240 6d 43 6f 6c 6c 50 74 72 20 69 6e 5f 6e 65 77 29  mCollPtr in_new)
bf250 0a 7b 0a 2f 2a 20 65 78 74 72 61 63 74 69 6e 67  .{./* extracting
bf260 20 74 68 65 20 73 65 6c 66 2d 69 6e 74 65 72 73   the self-inters
bf270 65 63 74 69 6f 6e 20 70 6f 69 6e 74 73 20 2a 2f  ection points */
bf280 0a 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74  .    gaiaPointPt
bf290 72 20 70 74 3b 0a 20 20 20 20 67 61 69 61 47 65  r pt;.    gaiaGe
bf2a0 6f 6d 43 6f 6c 6c 50 74 72 20 6f 75 74 3b 0a 0a  omCollPtr out;..
bf2b0 20 20 20 20 69 66 20 28 69 6e 5f 6f 6c 64 2d 3e      if (in_old->
bf2c0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
bf2d0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 6f 75  = GAIA_XY_M)..ou
bf2e0 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f  t = gaiaAllocGeo
bf2f0 6d 43 6f 6c 6c 58 59 4d 20 28 29 3b 0a 20 20 20  mCollXYM ();.   
bf300 20 65 6c 73 65 20 69 66 20 28 69 6e 5f 6f 6c 64   else if (in_old
bf310 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
bf320 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
bf330 6f 75 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47  out = gaiaAllocG
bf340 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29 3b 0a 20  eomCollXYZ ();. 
bf350 20 20 20 65 6c 73 65 20 69 66 20 28 69 6e 5f 6f     else if (in_o
bf360 6c 64 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ld->DimensionMod
bf370 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
bf380 4d 29 0a 09 6f 75 74 20 3d 20 67 61 69 61 41 6c  M)..out = gaiaAl
bf390 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20  locGeomCollXYZM 
bf3a0 28 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 6f 75  ();.    else..ou
bf3b0 74 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f  t = gaiaAllocGeo
bf3c0 6d 43 6f 6c 6c 20 28 29 3b 0a 20 20 20 20 6f 75  mColl ();.    ou
bf3d0 74 2d 3e 53 72 69 64 20 3d 20 69 6e 5f 6f 6c 64  t->Srid = in_old
bf3e0 2d 3e 53 72 69 64 3b 0a 0a 20 20 20 20 70 74 20  ->Srid;..    pt 
bf3f0 3d 20 69 6e 5f 6e 65 77 2d 3e 46 69 72 73 74 50  = in_new->FirstP
bf400 6f 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65 20  oint;.    while 
bf410 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  (pt).      {..  
bf420 69 6e 74 20 6f 6b 31 20 3d 20 70 6f 69 6e 74 5f  int ok1 = point_
bf430 69 73 5f 64 65 66 69 6e 65 64 20 28 70 74 2c 20  is_defined (pt, 
bf440 69 6e 5f 6f 6c 64 29 3b 0a 09 20 20 69 6e 74 20  in_old);..  int 
bf450 6f 6b 32 20 3d 20 70 6f 69 6e 74 5f 69 73 5f 64  ok2 = point_is_d
bf460 65 66 69 6e 65 64 20 28 70 74 2c 20 6f 75 74 29  efined (pt, out)
bf470 3b 0a 09 20 20 69 66 20 28 21 6f 6b 31 20 26 26  ;..  if (!ok1 &&
bf480 20 21 6f 6b 32 29 0a 09 20 20 20 20 7b 0a 09 09   !ok2)..    {...
bf490 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 61 20 50  /* inserting a P
bf4a0 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 72 65  oint into the re
bf4b0 73 75 6c 74 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  sult collection 
bf4c0 2a 2f 0a 09 09 69 66 20 28 6f 75 74 2d 3e 44 69  */...if (out->Di
bf4d0 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
bf4e0 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20  GAIA_XY_Z)...   
bf4f0 20 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47   gaiaAddPointToG
bf500 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 6f 75 74 2c  eomCollXYZ (out,
bf510 20 70 74 2d 3e 58 2c 20 70 74 2d 3e 59 2c 20 70   pt->X, pt->Y, p
bf520 74 2d 3e 5a 29 3b 0a 09 09 65 6c 73 65 20 69 66  t->Z);...else if
bf530 20 28 6f 75 74 2d 3e 44 69 6d 65 6e 73 69 6f 6e   (out->Dimension
bf540 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
bf550 5f 4d 29 0a 09 09 20 20 20 20 67 61 69 61 41 64  _M)...    gaiaAd
bf560 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
bf570 58 59 4d 20 28 6f 75 74 2c 20 70 74 2d 3e 58 2c  XYM (out, pt->X,
bf580 20 70 74 2d 3e 59 2c 20 70 74 2d 3e 4d 29 3b 0a   pt->Y, pt->M);.
bf590 09 09 65 6c 73 65 20 69 66 20 28 6f 75 74 2d 3e  ..else if (out->
bf5a0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
bf5b0 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
bf5c0 09 20 20 20 20 67 61 69 61 41 64 64 50 6f 69 6e  .    gaiaAddPoin
bf5d0 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20  tToGeomCollXYZM 
bf5e0 28 6f 75 74 2c 20 70 74 2d 3e 58 2c 20 70 74 2d  (out, pt->X, pt-
bf5f0 3e 59 2c 20 70 74 2d 3e 5a 2c 0a 09 09 09 09 09  >Y, pt->Z,......
bf600 09 70 74 2d 3e 4d 29 3b 0a 09 09 65 6c 73 65 0a  .pt->M);...else.
bf610 09 09 20 20 20 20 67 61 69 61 41 64 64 50 6f 69  ..    gaiaAddPoi
bf620 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 6f 75  ntToGeomColl (ou
bf630 74 2c 20 70 74 2d 3e 58 2c 20 70 74 2d 3e 59 29  t, pt->X, pt->Y)
bf640 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70 74 20 3d  ;..    }..  pt =
bf650 20 70 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20   pt->Next;.     
bf660 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 75 74 2d   }..    if (out-
bf670 3e 46 69 72 73 74 50 6f 69 6e 74 20 3d 3d 20 4e  >FirstPoint == N
bf680 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
bf690 2f 2a 20 6e 6f 20 73 65 6c 66 2d 69 6e 74 65 72  /* no self-inter
bf6a0 73 65 63 74 69 6f 6e 73 20 77 65 72 65 20 66 6f  sections were fo
bf6b0 75 6e 64 20 2a 2f 0a 09 20 20 67 61 69 61 46 72  und */..  gaiaFr
bf6c0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6f 75 74 29  eeGeomColl (out)
bf6d0 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ;..  return NULL
bf6e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 72  ;.      }..    r
bf6f0 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 73 74  eturn out;.}..st
bf700 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53  atic void.fnct_S
bf710 65 6c 66 49 6e 74 65 72 73 65 63 74 69 6f 6e 73  elfIntersections
bf720 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
bf730 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
bf740 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65   argc,....sqlite
bf750 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
bf760 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
bf770 6f 6e 3a 0a 2f 20 53 54 5f 53 65 6c 66 49 6e 74  on:./ ST_SelfInt
bf780 65 72 73 65 63 74 69 6f 6e 73 28 42 4c 4f 42 65  ersections(BLOBe
bf790 6e 63 6f 64 65 64 20 6c 69 6e 65 73 74 72 69 6e  ncoded linestrin
bf7a0 67 28 73 29 29 0a 2f 0a 2f 20 52 65 74 75 72 6e  g(s))././ Return
bf7b0 73 20 61 20 4d 75 6c 74 69 50 6f 69 6e 74 20 47  s a MultiPoint G
bf7c0 65 6f 6d 65 74 72 79 20 72 65 70 72 65 73 65 6e  eometry represen
bf7d0 74 69 6e 67 20 61 6e 79 20 73 65 6c 66 2d 69 6e  ting any self-in
bf7e0 74 65 72 73 65 63 74 69 6f 6e 0a 2f 20 66 6f 75  tersection./ fou
bf7f0 6e 64 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  nd within the in
bf800 70 75 74 20 67 65 6f 6d 65 74 72 79 20 5b 6c 69  put geometry [li
bf810 6e 65 73 74 72 69 6e 67 28 73 29 5d 0a 2f 20 4e  nestring(s)]./ N
bf820 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
bf830 66 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75  for invalid argu
bf840 6d 65 6e 74 73 2c 20 6f 72 20 77 68 65 6e 20 6e  ments, or when n
bf850 6f 20 73 65 6c 66 2d 69 6e 74 65 72 73 65 63 74  o self-intersect
bf860 69 6f 6e 73 0a 2f 20 77 65 72 65 20 66 6f 75 6e  ions./ were foun
bf870 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
bf880 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
bf890 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
bf8a0 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
bf8b0 6c 50 74 72 20 69 6e 70 75 74 3b 0a 20 20 20 20  lPtr input;.    
bf8c0 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
bf8d0 6e 6f 64 65 64 3b 0a 20 20 20 20 67 61 69 61 47  noded;.    gaiaG
bf8e0 65 6f 6d 43 6f 6c 6c 50 74 72 20 72 65 73 75 6c  eomCollPtr resul
bf8f0 74 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  t;.    gaiaGeomC
bf900 6f 6c 6c 50 74 72 20 6e 6f 64 65 73 5f 69 6e 3b  ollPtr nodes_in;
bf910 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
bf920 6c 50 74 72 20 6e 6f 64 65 73 5f 6f 75 74 3b 0a  lPtr nodes_out;.
bf930 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70      int gpkg_amp
bf940 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20  hibious = 0;.   
bf950 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d   int gpkg_mode =
bf960 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 69 6e 79   0;.    int tiny
bf970 5f 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  _point = 0;.    
bf980 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
bf990 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
bf9a0 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
bf9b0 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
bf9c0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
bf9d0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
bf9e0 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
bf9f0 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55   if (cache != NU
bfa00 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67  LL).      {..  g
bfa10 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
bfa20 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70   cache->gpkg_amp
bfa30 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20  hibious_mode;.. 
bfa40 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63   gpkg_mode = cac
bfa50 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09  he->gpkg_mode;..
bfa60 20 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63    tiny_point = c
bfa70 61 63 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45  ache->tinyPointE
bfa80 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nabled;.      }.
bfa90 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
bfaa0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
bfab0 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
bfac0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
bfad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
bfae0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
bfaf0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
bfb00 7d 0a 0a 2f 2a 20 72 65 74 72 69 65 76 69 6e 67  }../* retrieving
bfb10 20 74 68 65 20 69 6e 70 75 74 20 67 65 6f 6d 65   the input geome
bfb20 74 72 79 20 2a 2f 0a 20 20 20 20 70 5f 62 6c 6f  try */.    p_blo
bfb30 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
bfb40 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
bfb50 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
bfb60 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
bfb70 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bfb80 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
bfb90 0a 20 20 20 20 69 6e 70 75 74 20 3d 0a 09 67 61  .    input =..ga
bfba0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
bfbb0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
bfbc0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
bfbd0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
bfbe0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
bfbf0 3b 0a 20 20 20 20 69 66 20 28 69 6e 70 75 74 20  ;.    if (input 
bfc00 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
bfc10 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
bfc20 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
bfc30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
bfc40 20 20 20 20 7d 0a 0a 2f 2a 20 63 68 65 63 6b 69      }../* checki
bfc50 6e 67 20 74 68 65 20 69 6e 70 75 74 20 28 4c 69  ng the input (Li
bfc60 6e 65 73 74 72 69 6e 67 73 20 6f 6e 6c 79 29 20  nestrings only) 
bfc70 2a 2f 0a 20 20 20 20 69 66 20 28 21 63 68 65 63  */.    if (!chec
bfc80 6b 5f 61 6c 6c 5f 6c 69 6e 65 73 74 72 69 6e 67  k_all_linestring
bfc90 73 20 28 69 6e 70 75 74 29 29 0a 20 20 20 20 20  s (input)).     
bfca0 20 7b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65   {..  gaiaFreeGe
bfcb0 6f 6d 43 6f 6c 6c 20 28 69 6e 70 75 74 29 3b 0a  omColl (input);.
bfcc0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
bfcd0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
bfce0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
bfcf0 20 20 20 7d 0a 2f 2a 20 65 78 74 72 61 63 74 69     }./* extracti
bfd00 6e 67 20 61 6c 6c 20 69 6e 70 75 74 20 6e 6f 64  ng all input nod
bfd10 65 73 20 2a 2f 0a 20 20 20 20 6e 6f 64 65 73 5f  es */.    nodes_
bfd20 69 6e 20 3d 20 67 65 74 5f 6e 6f 64 65 73 20 28  in = get_nodes (
bfd30 69 6e 70 75 74 29 3b 0a 0a 20 20 20 20 6e 6f 64  input);..    nod
bfd40 65 64 20 3d 20 67 61 69 61 4e 6f 64 65 4c 69 6e  ed = gaiaNodeLin
bfd50 65 73 20 28 63 61 63 68 65 2c 20 69 6e 70 75 74  es (cache, input
bfd60 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47  );.    gaiaFreeG
bfd70 65 6f 6d 43 6f 6c 6c 20 28 69 6e 70 75 74 29 3b  eomColl (input);
bfd80 0a 2f 2a 20 65 78 74 72 61 63 74 69 6e 67 20 61  ./* extracting a
bfd90 6c 6c 20 6f 75 74 70 75 74 20 6e 6f 64 65 73 20  ll output nodes 
bfda0 2a 2f 0a 20 20 20 20 6e 6f 64 65 73 5f 6f 75 74  */.    nodes_out
bfdb0 20 3d 20 67 65 74 5f 6e 6f 64 65 73 20 28 6e 6f   = get_nodes (no
bfdc0 64 65 64 29 3b 0a 20 20 20 20 67 61 69 61 46 72  ded);.    gaiaFr
bfdd0 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 6e 6f 64 65  eeGeomColl (node
bfde0 64 29 3b 0a 0a 2f 2a 20 69 64 65 6e 74 69 66 79  d);../* identify
bfdf0 69 6e 67 20 74 68 65 20 69 6e 74 65 72 73 65 63  ing the intersec
bfe00 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 72 65 73  tions */.    res
bfe10 75 6c 74 20 3d 20 67 65 74 5f 73 65 6c 66 5f 69  ult = get_self_i
bfe20 6e 74 65 72 73 65 63 74 69 6f 6e 73 20 28 6e 6f  ntersections (no
bfe30 64 65 73 5f 69 6e 2c 20 6e 6f 64 65 73 5f 6f 75  des_in, nodes_ou
bfe40 74 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65  t);.    gaiaFree
bfe50 47 65 6f 6d 43 6f 6c 6c 20 28 6e 6f 64 65 73 5f  GeomColl (nodes_
bfe60 69 6e 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65  in);.    gaiaFre
bfe70 65 47 65 6f 6d 43 6f 6c 6c 20 28 6e 6f 64 65 73  eGeomColl (nodes
bfe80 5f 6f 75 74 29 3b 0a 20 20 20 20 69 66 20 28 72  _out);.    if (r
bfe90 65 73 75 6c 74 20 21 3d 20 4e 55 4c 4c 29 0a 20  esult != NULL). 
bfea0 20 20 20 20 20 7b 0a 09 20 20 72 65 73 75 6c 74       {..  result
bfeb0 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
bfec0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
bfed0 3b 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 69  ;..  gaiaToSpati
bfee0 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20  aLiteBlobWkbEx2 
bfef0 28 72 65 73 75 6c 74 2c 20 26 70 5f 62 6c 6f 62  (result, &p_blob
bff00 2c 20 26 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  , &n_bytes, gpkg
bff10 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
bff20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20   tiny_point);.. 
bff30 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
bff40 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70  blob (context, p
bff50 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
bff60 66 72 65 65 29 3b 0a 09 20 20 67 61 69 61 46 72  free);..  gaiaFr
bff70 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 72 65 73 75  eeGeomColl (resu
bff80 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lt);.      }.   
bff90 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
bffa0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
bffb0 65 78 74 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  ext);.}..#endif 
bffc0 2f 2a 20 65 6e 64 20 52 54 54 4f 50 4f 20 73 75  /* end RTTOPO su
bffd0 70 70 6f 72 74 20 2a 2f 0a 0a 0a 73 74 61 74 69  pport */...stati
bffe0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 75 74 74  c void.fnct_Cutt
bfff0 65 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  er (sqlite3_cont
c0000 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
c0010 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
c0020 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
c0030 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
c0040 6e 3a 0a 2f 20 53 54 5f 43 75 74 74 65 72 28 54  n:./ ST_Cutter(T
c0050 45 58 54 20 69 6e 5f 64 62 5f 70 72 65 66 69 78  EXT in_db_prefix
c0060 2c 20 54 45 58 54 20 69 6e 70 75 74 5f 74 61 62  , TEXT input_tab
c0070 6c 65 2c 20 54 45 58 54 20 69 6e 70 75 74 5f 67  le, TEXT input_g
c0080 65 6f 6d 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  eom,./          
c0090 20 20 20 20 54 45 58 54 20 62 6c 61 64 65 5f 64      TEXT blade_d
c00a0 62 5f 70 72 65 66 69 78 2c 20 54 45 58 54 20 62  b_prefix, TEXT b
c00b0 6c 61 64 65 5f 74 61 62 6c 65 2c 20 54 45 58 54  lade_table, TEXT
c00c0 20 62 6c 61 64 65 5f 67 65 6f 6d 2c 0a 2f 20 20   blade_geom,./  
c00d0 20 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54              TEXT
c00e0 20 6f 75 74 70 75 74 5f 74 61 62 6c 65 29 0a 2f   output_table)./
c00f0 20 53 54 5f 43 75 74 74 65 72 28 54 45 58 54 20   ST_Cutter(TEXT 
c0100 69 6e 5f 64 62 5f 70 72 65 66 69 78 2c 20 54 45  in_db_prefix, TE
c0110 58 54 20 69 6e 70 75 74 5f 74 61 62 6c 65 2c 20  XT input_table, 
c0120 54 45 58 54 20 69 6e 70 75 74 5f 67 65 6f 6d 2c  TEXT input_geom,
c0130 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ./              
c0140 54 45 58 54 20 62 6c 61 64 65 5f 64 62 5f 70 72  TEXT blade_db_pr
c0150 65 66 69 78 2c 20 54 45 58 54 20 62 6c 61 64 65  efix, TEXT blade
c0160 5f 74 61 62 6c 65 2c 20 54 45 58 54 20 62 6c 61  _table, TEXT bla
c0170 64 65 5f 67 65 6f 6d 2c 0a 2f 20 20 20 20 20 20  de_geom,./      
c0180 20 20 20 20 20 20 20 20 54 45 58 54 20 6f 75 74          TEXT out
c0190 70 75 74 5f 74 61 62 6c 65 2c 20 49 4e 54 20 74  put_table, INT t
c01a0 72 61 6e 73 61 63 74 69 6f 6e 29 0a 2f 20 53 54  ransaction)./ ST
c01b0 5f 43 75 74 74 65 72 28 54 45 58 54 20 69 6e 5f  _Cutter(TEXT in_
c01c0 64 62 5f 70 72 65 66 69 78 2c 20 54 45 58 54 20  db_prefix, TEXT 
c01d0 69 6e 70 75 74 5f 74 61 62 6c 65 2c 20 54 45 58  input_table, TEX
c01e0 54 20 69 6e 70 75 74 5f 67 65 6f 6d 2c 0a 2f 20  T input_geom,./ 
c01f0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 58               TEX
c0200 54 20 62 6c 61 64 65 5f 64 62 5f 70 72 65 66 69  T blade_db_prefi
c0210 78 2c 20 54 45 58 54 20 62 6c 61 64 65 5f 74 61  x, TEXT blade_ta
c0220 62 6c 65 2c 20 54 45 58 54 20 62 6c 61 64 65 5f  ble, TEXT blade_
c0230 67 65 6f 6d 2c 0a 2f 20 20 20 20 20 20 20 20 20  geom,./         
c0240 20 20 20 20 20 54 45 58 54 20 6f 75 74 70 75 74       TEXT output
c0250 5f 74 61 62 6c 65 2c 20 49 4e 54 20 74 72 61 6e  _table, INT tran
c0260 73 61 63 74 69 6f 6e 2c 20 49 4e 54 20 72 61 6d  saction, INT ram
c0270 5f 74 65 6d 70 5f 73 74 6f 72 65 29 0a 2f 0a 2f  _temp_store)././
c0280 20 74 68 65 20 22 69 6e 70 75 74 22 20 74 61 62   the "input" tab
c0290 6c 65 2d 67 65 6f 6d 65 74 72 79 20 69 73 20 65  le-geometry is e
c02a0 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 64 65  xpected to be de
c02b0 63 6c 61 72 65 64 20 61 73 20 50 4f 49 4e 54 2c  clared as POINT,
c02c0 0a 2f 20 4c 49 4e 45 53 54 52 49 4e 47 2c 20 50  ./ LINESTRING, P
c02d0 4f 4c 59 47 4f 4e 2c 20 4d 55 4c 54 49 50 4f 49  OLYGON, MULTIPOI
c02e0 4e 54 2c 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52  NT, MULTILINESTR
c02f0 49 4e 47 20 6f 72 20 4d 55 4c 54 49 50 4f 4c 59  ING or MULTIPOLY
c0300 47 4f 4e 0a 2f 20 61 6e 64 20 63 61 6e 20 62 65  GON./ and can be
c0310 20 6f 66 20 61 6e 79 20 32 44 20 6f 72 20 33 44   of any 2D or 3D
c0320 20 64 69 6d 65 6e 73 69 6f 6e 0a 2f 0a 2f 20 74   dimension././ t
c0330 68 65 20 22 62 6c 61 64 65 22 20 74 61 62 6c 65  he "blade" table
c0340 2d 67 65 6f 6d 65 74 72 79 20 69 73 20 65 78 70  -geometry is exp
c0350 65 63 74 65 64 20 74 6f 20 62 65 20 64 65 63 6c  ected to be decl
c0360 61 72 65 64 20 61 73 20 50 4f 4c 59 47 4f 4e 0a  ared as POLYGON.
c0370 2f 20 6f 72 20 4d 55 4c 54 49 50 4f 4c 59 47 4f  / or MULTIPOLYGO
c0380 4e 2c 20 61 6e 64 20 77 69 6c 6c 20 61 6c 77 61  N, and will alwa
c0390 79 73 20 62 65 20 63 61 73 74 65 64 20 74 6f 20  ys be casted to 
c03a0 61 20 70 75 72 65 28 58 2c 59 29 20 64 69 6d 65  a pure(X,Y) dime
c03b0 6e 73 69 6f 6e 0a 2f 0a 2f 20 74 68 65 20 22 6f  nsion././ the "o
c03c0 75 74 70 75 74 22 20 74 61 62 6c 65 20 2a 6d 75  utput" table *mu
c03d0 73 74 2a 20 6e 6f 74 20 65 78 69 73 74 73 2c 20  st* not exists, 
c03e0 61 6e 64 20 77 69 6c 6c 20 62 65 20 61 75 74 6f  and will be auto
c03f0 6d 61 74 69 63 61 6c 6c 79 0a 2f 20 63 72 65 61  matically./ crea
c0400 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 4d  ted within the M
c0410 41 49 4e 20 64 61 74 61 62 61 73 65 2e 0a 2f 20  AIN database../ 
c0420 0a 2f 20 69 6e 5f 64 62 5f 70 72 65 66 69 78 20  ./ in_db_prefix 
c0430 61 6e 64 2f 6f 72 20 62 6c 61 64 65 5f 64 62 5f  and/or blade_db_
c0440 70 72 65 66 69 78 20 63 61 6e 20 65 76 65 6e 74  prefix can event
c0450 75 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61  ually be NULL, a
c0460 6e 64 0a 2f 20 69 6e 20 74 68 69 73 20 63 61 73  nd./ in this cas
c0470 65 20 74 68 65 20 4d 41 49 4e 20 64 62 20 77 69  e the MAIN db wi
c0480 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 0a 2f 0a  ll be assumed./.
c0490 2f 20 69 6e 70 75 74 5f 67 65 6f 6d 20 61 6e 64  / input_geom and
c04a0 2f 6f 72 20 62 6c 61 64 65 5f 67 65 6f 6d 20 63  /or blade_geom c
c04b0 61 6e 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  an eventually be
c04c0 20 4e 55 4c 4c 2c 20 61 6e 64 20 69 6e 20 74 68   NULL, and in th
c04d0 69 73 0a 2f 20 63 61 73 65 20 74 68 65 20 67 65  is./ case the ge
c04e0 6f 6d 65 74 72 79 20 63 6f 6c 75 6d 6e 20 6e 61  ometry column na
c04f0 6d 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  me will be autom
c0500 61 74 69 63 61 6c 6c 79 20 64 65 74 65 72 6d 69  atically determi
c0510 6e 65 64 2e 0a 2f 20 61 6e 79 77 61 79 20 77 68  ned../ anyway wh
c0520 65 6e 20 61 20 74 61 62 6c 65 20 64 65 66 69 6e  en a table defin
c0530 65 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 47  es two or more G
c0540 65 6f 6d 65 74 72 69 65 73 20 64 65 63 6c 61 72  eometries declar
c0550 69 6e 67 20 61 0a 2f 20 4e 55 4c 4c 20 67 65 6f  ing a./ NULL geo
c0560 6d 65 74 72 79 20 6e 61 6d 65 20 77 69 6c 6c 20  metry name will 
c0570 63 61 75 73 65 20 61 20 66 61 69 6c 75 72 65 2e  cause a failure.
c0580 0a 2f 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ././////////////
c0590 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c05a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c05b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c05c0 2f 2f 2f 2f 2f 2f 0a 2f 0a 2f 20 77 69 6c 6c 20  //////././ will 
c05d0 70 72 65 63 69 73 65 6c 79 20 63 75 74 20 74 68  precisely cut th
c05e0 65 20 69 6e 70 75 74 20 64 61 74 61 73 65 74 20  e input dataset 
c05f0 61 67 61 69 6e 73 74 20 70 6f 6c 79 67 6f 6e 61  against polygona
c0600 6c 20 62 6c 61 64 65 28 73 29 0a 2f 20 61 6e 64  l blade(s)./ and
c0610 20 77 69 6c 6c 20 63 6f 6e 73 65 71 75 65 6e 74   will consequent
c0620 6c 79 20 63 72 65 61 74 65 20 61 6e 64 20 70 6f  ly create and po
c0630 70 75 6c 61 74 65 20 61 6e 20 6f 75 74 70 75 74  pulate an output
c0640 20 64 61 74 61 73 65 74 0a 2f 0a 2f 0a 2f 20 72   dataset./././ r
c0650 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63  eturns 1 on succ
c0660 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75  ess./ 0 on failu
c0670 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69  re, -1 on invali
c0680 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
c0690 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
c06a0 74 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20  te;.    int ret 
c06b0 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
c06c0 68 61 72 20 2a 69 6e 5f 64 62 5f 70 72 65 66 69  har *in_db_prefi
c06d0 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  x = NULL;.    co
c06e0 6e 73 74 20 63 68 61 72 20 2a 69 6e 70 75 74 5f  nst char *input_
c06f0 74 61 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  table = NULL;.  
c0700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e    const char *in
c0710 70 75 74 5f 67 65 6f 6d 20 3d 20 4e 55 4c 4c 3b  put_geom = NULL;
c0720 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c0730 2a 62 6c 61 64 65 5f 64 62 5f 70 72 65 66 69 78  *blade_db_prefix
c0740 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
c0750 73 74 20 63 68 61 72 20 2a 62 6c 61 64 65 5f 74  st char *blade_t
c0760 61 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  able = NULL;.   
c0770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 6c 61   const char *bla
c0780 64 65 5f 67 65 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a  de_geom = NULL;.
c0790 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c07a0 6f 75 74 70 75 74 5f 74 61 62 6c 65 20 3d 20 4e  output_table = N
c07b0 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 74 72 61  ULL;.    int tra
c07c0 6e 73 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20  nsaction = 0;.  
c07d0 20 20 69 6e 74 20 72 61 6d 5f 74 6d 70 5f 73 74    int ram_tmp_st
c07e0 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ore = 0;.    cha
c07f0 72 20 2a 2a 6d 65 73 73 61 67 65 20 3d 20 4e 55  r **message = NU
c0800 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  LL;.    struct s
c0810 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
c0820 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
c0830 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
c0840 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
c0850 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
c0860 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
c0870 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
c0880 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 6d 65 73  he != NULL)..mes
c0890 73 61 67 65 20 3d 20 26 28 63 61 63 68 65 2d 3e  sage = &(cache->
c08a0 63 75 74 74 65 72 4d 65 73 73 61 67 65 29 3b 0a  cutterMessage);.
c08b0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
c08c0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c08d0 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c08e0 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c 73  NULL)..;.    els
c08f0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
c0900 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c0910 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) == SQLITE_TEX
c0920 54 29 0a 09 69 6e 5f 64 62 5f 70 72 65 66 69 78  T)..in_db_prefix
c0930 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
c0940 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
c0950 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
c0960 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
c0970 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
c0980 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
c0990 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
c09a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
c09b0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
c09c0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
c09d0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 69   SQLITE_TEXT)..i
c09e0 6e 70 75 74 5f 74 61 62 6c 65 20 3d 20 28 63 6f  nput_table = (co
c09f0 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
c0a00 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
c0a10 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c  argv[1]);.    el
c0a20 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
c0a30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
c0a40 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
c0a50 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
c0a60 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
c0a70 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c0a80 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
c0a90 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65  E_NULL)..;.    e
c0aa0 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
c0ab0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
c0ac0 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [2]) == SQLITE_T
c0ad0 45 58 54 29 0a 09 69 6e 70 75 74 5f 67 65 6f 6d  EXT)..input_geom
c0ae0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
c0af0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
c0b00 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  text (argv[2]);.
c0b10 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
c0b20 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
c0b30 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
c0b40 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
c0b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
c0b60 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
c0b70 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d  ype (argv[3]) ==
c0b80 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 3b   SQLITE_NULL)..;
c0b90 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
c0ba0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c0bb0 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51   (argv[3]) == SQ
c0bc0 4c 49 54 45 5f 54 45 58 54 29 0a 09 62 6c 61 64  LITE_TEXT)..blad
c0bd0 65 5f 64 62 5f 70 72 65 66 69 78 20 3d 20 28 63  e_db_prefix = (c
c0be0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
c0bf0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
c0c00 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 65  (argv[3]);.    e
c0c10 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
c0c20 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
c0c30 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
c0c40 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
c0c50 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
c0c60 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
c0c70 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
c0c80 54 45 5f 54 45 58 54 29 0a 09 62 6c 61 64 65 5f  TE_TEXT)..blade_
c0c90 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  table = (const c
c0ca0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
c0cb0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
c0cc0 34 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  4]);.    else.  
c0cd0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
c0ce0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
c0cf0 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
c0d00 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c0d10 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
c0d20 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
c0d30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ]) == SQLITE_NUL
c0d40 4c 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 20 69  L)..;.    else i
c0d50 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
c0d60 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20  _type (argv[5]) 
c0d70 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
c0d80 09 62 6c 61 64 65 5f 67 65 6f 6d 20 3d 20 28 63  .blade_geom = (c
c0d90 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
c0da0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
c0db0 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20 65  (argv[5]);.    e
c0dc0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
c0dd0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
c0de0 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
c0df0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
c0e00 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
c0e10 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
c0e20 61 72 67 76 5b 36 5d 29 20 3d 3d 20 53 51 4c 49  argv[6]) == SQLI
c0e30 54 45 5f 54 45 58 54 29 0a 09 6f 75 74 70 75 74  TE_TEXT)..output
c0e40 5f 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20  _table = (const 
c0e50 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
c0e60 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
c0e70 5b 36 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  [6]);.    else. 
c0e80 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
c0e90 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
c0ea0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
c0eb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
c0ec0 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 38     if (argc >= 8
c0ed0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
c0ee0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
c0ef0 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d  ype (argv[7]) ==
c0f00 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
c0f10 0a 09 20 20 20 20 20 20 74 72 61 6e 73 61 63 74  ..      transact
c0f20 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ion = sqlite3_va
c0f30 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 37 5d  lue_int (argv[7]
c0f40 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
c0f50 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
c0f60 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
c0f70 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a   -1);...return;.
c0f80 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
c0f90 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 39     if (argc == 9
c0fa0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
c0fb0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
c0fc0 79 70 65 20 28 61 72 67 76 5b 38 5d 29 20 3d 3d  ype (argv[8]) ==
c0fd0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
c0fe0 0a 09 20 20 20 20 20 20 72 61 6d 5f 74 6d 70 5f  ..      ram_tmp_
c0ff0 73 74 6f 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  store = sqlite3_
c1000 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
c1010 38 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  8]);..  else..  
c1020 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
c1030 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
c1040 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e  t, -1);...return
c1050 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
c1060 0a 0a 20 20 20 20 73 71 6c 69 74 65 20 3d 20 73  ..    sqlite = s
c1070 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
c1080 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
c1090 74 29 3b 0a 20 20 20 20 72 65 74 20 3d 0a 09 67  t);.    ret =..g
c10a0 61 69 61 43 75 74 74 65 72 20 28 73 71 6c 69 74  aiaCutter (sqlit
c10b0 65 2c 20 63 61 63 68 65 2c 20 69 6e 5f 64 62 5f  e, cache, in_db_
c10c0 70 72 65 66 69 78 2c 20 69 6e 70 75 74 5f 74 61  prefix, input_ta
c10d0 62 6c 65 2c 20 69 6e 70 75 74 5f 67 65 6f 6d 2c  ble, input_geom,
c10e0 0a 09 09 20 20 20 20 62 6c 61 64 65 5f 64 62 5f  ...    blade_db_
c10f0 70 72 65 66 69 78 2c 20 62 6c 61 64 65 5f 74 61  prefix, blade_ta
c1100 62 6c 65 2c 20 62 6c 61 64 65 5f 67 65 6f 6d 2c  ble, blade_geom,
c1110 20 6f 75 74 70 75 74 5f 74 61 62 6c 65 2c 0a 09   output_table,..
c1120 09 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e  .    transaction
c1130 2c 20 72 61 6d 5f 74 6d 70 5f 73 74 6f 72 65 2c  , ram_tmp_store,
c1140 20 6d 65 73 73 61 67 65 29 3b 0a 0a 20 20 20 20   message);..    
c1150 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
c1160 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
c1170 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
c1180 64 0a 66 6e 63 74 5f 47 65 74 43 75 74 74 65 72  d.fnct_GetCutter
c1190 4d 65 73 73 61 67 65 20 28 73 71 6c 69 74 65 33  Message (sqlite3
c11a0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
c11b0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
c11c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
c11d0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
c11e0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
c11f0 0a 2f 20 47 65 74 43 75 74 74 65 72 4d 65 73 73  ./ GetCutterMess
c1200 61 67 65 28 20 76 6f 69 64 20 29 0a 2f 0a 2f 20  age( void )././ 
c1210 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20  will return the 
c1220 6c 61 73 74 20 64 69 61 67 6e 6f 73 74 69 63 20  last diagnostic 
c1230 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 43 75 74  message from Cut
c1240 74 65 72 0a 2f 20 4e 55 4c 4c 20 69 66 20 74 68  ter./ NULL if th
c1250 65 72 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e  ere is no pendin
c1260 67 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 20 20 20  g message.*/.   
c1270 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65 20 3d   char *message =
c1280 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63   NULL;.    struc
c1290 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
c12a0 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
c12b0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
c12c0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
c12d0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
c12e0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
c12f0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
c1300 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 09  cache != NULL)..
c1310 6d 65 73 73 61 67 65 20 3d 20 63 61 63 68 65 2d  message = cache-
c1320 3e 63 75 74 74 65 72 4d 65 73 73 61 67 65 3b 0a  >cutterMessage;.
c1330 0a 20 20 20 20 69 66 20 28 6d 65 73 73 61 67 65  .    if (message
c1340 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
c1350 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
c1360 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
c1370 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  se..sqlite3_resu
c1380 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74  lt_text (context
c1390 2c 20 6d 65 73 73 61 67 65 2c 20 73 74 72 6c 65  , message, strle
c13a0 6e 20 28 6d 65 73 73 61 67 65 29 2c 20 53 51 4c  n (message), SQL
c13b0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
c13c0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
c13d0 5f 44 72 61 70 65 4c 69 6e 65 20 28 73 71 6c 69  _DrapeLine (sqli
c13e0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
c13f0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
c1400 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c1410 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
c1420 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 54 5f   function:./ ST_
c1430 44 72 61 70 65 4c 69 6e 65 28 20 6c 69 6e 65 2d  DrapeLine( line-
c1440 31 20 4c 69 6e 65 73 74 72 69 6e 67 2c 20 6c 69  1 Linestring, li
c1450 6e 65 2d 32 20 4c 69 6e 65 73 74 72 69 6e 67 20  ne-2 Linestring 
c1460 29 0a 2f 20 20 20 20 6f 72 0a 2f 20 53 54 5f 44  )./    or./ ST_D
c1470 72 61 70 65 4c 69 6e 65 28 20 6c 69 6e 65 2d 31  rapeLine( line-1
c1480 20 4c 69 6e 65 73 74 72 69 6e 67 2c 20 6c 69 6e   Linestring, lin
c1490 65 2d 32 20 4c 69 6e 65 73 74 72 69 6e 67 2c 20  e-2 Linestring, 
c14a0 74 6f 6c 65 72 61 6e 63 65 20 44 6f 75 62 6c 65  tolerance Double
c14b0 20 29 0a 2f 0a 2f 20 77 69 6c 6c 20 64 72 61 70   )././ will drap
c14c0 65 20 6c 69 6e 65 2d 31 20 6f 76 65 72 20 6c 69  e line-1 over li
c14d0 6e 65 2d 32 20 72 65 74 75 72 6e 69 6e 67 20 61  ne-2 returning a
c14e0 20 6e 65 77 20 6c 69 6e 65 73 74 72 69 6e 67 0a   new linestring.
c14f0 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69  / NULL on invali
c1500 64 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 69  d arguments or i
c1510 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
c1520 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
c1530 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c1540 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62  *blob;.    int b
c1550 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47 65  ytes;.    gaiaGe
c1560 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 31 20  omCollPtr geom1 
c1570 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
c1580 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
c1590 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  2 = NULL;.    ga
c15a0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
c15b0 6f 6d 33 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  om3 = NULL;.    
c15c0 64 6f 75 62 6c 65 20 74 6f 6c 65 72 61 6e 63 65  double tolerance
c15d0 20 3d 20 30 2e 30 3b 0a 20 20 20 20 73 71 6c 69   = 0.0;.    sqli
c15e0 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d  te3 *db_handle =
c15f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
c1600 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
c1610 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67 70  ext);.    int gp
c1620 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
c1630 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
c1640 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74  mode = 0;.    st
c1650 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
c1660 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
c1670 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
c1680 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
c1690 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
c16a0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
c16b0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
c16c0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
c16d0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
c16e0 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
c16f0 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
c1700 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
c1710 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
c1720 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20  ->gpkg_mode;.   
c1730 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 71     }..    if (sq
c1740 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c1750 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
c1760 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
c1770 20 7b 0a 09 20 20 62 6c 6f 62 20 3d 20 28 75 6e   {..  blob = (un
c1780 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
c1790 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
c17a0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20  b (argv[0]);..  
c17b0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
c17c0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
c17d0 76 5b 30 5d 29 3b 0a 09 20 20 67 65 6f 6d 31 20  v[0]);..  geom1 
c17e0 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 6f  =..      gaiaFro
c17f0 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
c1800 6b 62 45 78 20 28 62 6c 6f 62 2c 20 62 79 74 65  kbEx (blob, byte
c1810 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
c1820 09 09 09 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  ...   gpkg_amphi
c1830 62 69 6f 75 73 29 3b 0a 20 20 20 20 20 20 7d 0a  bious);.      }.
c1840 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 65      else..goto e
c1850 72 72 6f 72 3b 0a 20 20 20 20 69 66 20 28 73 71  rror;.    if (sq
c1860 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c1870 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
c1880 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
c1890 20 7b 0a 09 20 20 62 6c 6f 62 20 3d 20 28 75 6e   {..  blob = (un
c18a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
c18b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
c18c0 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  b (argv[1]);..  
c18d0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
c18e0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
c18f0 76 5b 31 5d 29 3b 0a 09 20 20 67 65 6f 6d 32 20  v[1]);..  geom2 
c1900 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 6f  =..      gaiaFro
c1910 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
c1920 6b 62 45 78 20 28 62 6c 6f 62 2c 20 62 79 74 65  kbEx (blob, byte
c1930 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
c1940 09 09 09 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  ...   gpkg_amphi
c1950 62 69 6f 75 73 29 3b 0a 20 20 20 20 20 20 7d 0a  bious);.      }.
c1960 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 65      else..goto e
c1970 72 72 6f 72 3b 0a 20 20 20 20 69 66 20 28 61 72  rror;.    if (ar
c1980 67 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20 7b  gc >= 3).      {
c1990 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
c19a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
c19b0 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
c19c0 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
c19d0 09 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c 69 74  .int val = sqlit
c19e0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
c19f0 67 76 5b 32 5d 29 3b 0a 09 09 74 6f 6c 65 72 61  gv[2]);...tolera
c1a00 6e 63 65 20 3d 20 76 61 6c 3b 0a 09 20 20 20 20  nce = val;..    
c1a10 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71  }..  else if (sq
c1a20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c1a30 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
c1a40 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20  LITE_FLOAT)..   
c1a50 20 20 20 74 6f 6c 65 72 61 6e 63 65 20 3d 20 73     tolerance = s
c1a60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
c1a70 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09  ble (argv[2]);..
c1a80 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 6f    else..      go
c1a90 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to error;.      
c1aa0 7d 0a 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 74  }../* checking t
c1ab0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  he arguments for
c1ac0 20 76 61 6c 69 64 69 74 79 20 2a 2f 0a 20 20 20   validity */.   
c1ad0 20 69 66 20 28 67 65 6f 6d 31 20 3d 3d 20 4e 55   if (geom1 == NU
c1ae0 4c 4c 20 7c 7c 20 67 65 6f 6d 32 20 3d 3d 20 4e  LL || geom2 == N
c1af0 55 4c 4c 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72  ULL)..goto error
c1b00 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 31 2d  ;.    if (geom1-
c1b10 3e 53 72 69 64 20 21 3d 20 67 65 6f 6d 32 2d 3e  >Srid != geom2->
c1b20 53 72 69 64 29 0a 09 67 6f 74 6f 20 65 72 72 6f  Srid)..goto erro
c1b30 72 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 31  r;.    if (geom1
c1b40 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
c1b50 20 3d 3d 20 47 41 49 41 5f 58 59 20 7c 7c 20 67   == GAIA_XY || g
c1b60 65 6f 6d 31 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  eom1->DimensionM
c1b70 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
c1b80 4d 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 09  M)..;.    else..
c1b90 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
c1ba0 69 66 20 28 67 65 6f 6d 32 2d 3e 44 69 6d 65 6e  if (geom2->Dimen
c1bb0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
c1bc0 41 5f 58 59 5f 5a 0a 09 7c 7c 20 67 65 6f 6d 32  A_XY_Z..|| geom2
c1bd0 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
c1be0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
c1bf0 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 09 67 6f  ..;.    else..go
c1c00 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to error;.    if
c1c10 20 28 21 67 61 69 61 5f 64 6f 5f 63 68 65 63 6b   (!gaia_do_check
c1c20 5f 6c 69 6e 65 73 74 72 69 6e 67 20 28 67 65 6f  _linestring (geo
c1c30 6d 31 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72  m1))..goto error
c1c40 3b 0a 20 20 20 20 69 66 20 28 21 67 61 69 61 5f  ;.    if (!gaia_
c1c50 64 6f 5f 63 68 65 63 6b 5f 6c 69 6e 65 73 74 72  do_check_linestr
c1c60 69 6e 67 20 28 67 65 6f 6d 32 29 29 0a 09 67 6f  ing (geom2))..go
c1c70 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to error;.    if
c1c80 20 28 74 6f 6c 65 72 61 6e 63 65 20 3c 20 30 2e   (tolerance < 0.
c1c90 30 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  0)..goto error;.
c1ca0 0a 20 20 20 20 67 65 6f 6d 33 20 3d 20 67 61 69  .    geom3 = gai
c1cb0 61 44 72 61 70 65 4c 69 6e 65 20 28 64 62 5f 68  aDrapeLine (db_h
c1cc0 61 6e 64 6c 65 2c 20 67 65 6f 6d 31 2c 20 67 65  andle, geom1, ge
c1cd0 6f 6d 32 2c 20 74 6f 6c 65 72 61 6e 63 65 29 3b  om2, tolerance);
c1ce0 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 33 20 3d  .    if (geom3 =
c1cf0 3d 20 4e 55 4c 4c 29 0a 09 67 6f 74 6f 20 65 72  = NULL)..goto er
c1d00 72 6f 72 3b 0a 0a 20 20 20 20 67 61 69 61 54 6f  ror;..    gaiaTo
c1d10 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
c1d20 62 20 28 67 65 6f 6d 33 2c 20 26 62 6c 6f 62 2c  b (geom3, &blob,
c1d30 20 26 62 79 74 65 73 29 3b 0a 20 20 20 20 73 71   &bytes);.    sq
c1d40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
c1d50 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62  b (context, blob
c1d60 2c 20 62 79 74 65 73 2c 20 66 72 65 65 29 3b 0a  , bytes, free);.
c1d70 20 20 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d      gaiaFreeGeom
c1d80 43 6f 6c 6c 20 28 67 65 6f 6d 31 29 3b 0a 20 20  Coll (geom1);.  
c1d90 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
c1da0 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 20 20 20 20  ll (geom2);.    
c1db0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
c1dc0 20 28 67 65 6f 6d 33 29 3b 0a 20 20 20 20 72 65   (geom3);.    re
c1dd0 74 75 72 6e 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a  turn;..  error:.
c1de0 20 20 20 20 69 66 20 28 67 65 6f 6d 31 20 21 3d      if (geom1 !=
c1df0 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65   NULL)..gaiaFree
c1e00 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 31 29  GeomColl (geom1)
c1e10 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 32 20  ;.    if (geom2 
c1e20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72  != NULL)..gaiaFr
c1e30 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
c1e40 32 29 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d  2);.    if (geom
c1e50 33 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61  3 != NULL)..gaia
c1e60 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
c1e70 6f 6d 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  om3);.    sqlite
c1e80 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
c1e90 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74  ontext);.}..stat
c1ea0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 44 72 61  ic void.fnct_Dra
c1eb0 70 65 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e 73  peLineExceptions
c1ec0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
c1ed0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
c1ee0 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c 69   argc,....  sqli
c1ef0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
c1f00 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
c1f10 74 69 6f 6e 3a 0a 2f 20 53 54 5f 44 72 61 70 65  tion:./ ST_Drape
c1f20 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e 73 28 20  LineExceptions( 
c1f30 6c 69 6e 65 2d 31 20 4c 69 6e 65 73 74 72 69 6e  line-1 Linestrin
c1f40 67 2c 20 6c 69 6e 65 2d 32 20 4c 69 6e 65 73 74  g, line-2 Linest
c1f50 72 69 6e 67 20 29 0a 2f 20 20 20 20 6f 72 0a 2f  ring )./    or./
c1f60 20 53 54 5f 44 72 61 70 65 4c 69 6e 65 45 78 63   ST_DrapeLineExc
c1f70 65 70 74 69 6f 6e 73 28 20 6c 69 6e 65 2d 31 20  eptions( line-1 
c1f80 4c 69 6e 65 73 74 72 69 6e 67 2c 20 6c 69 6e 65  Linestring, line
c1f90 2d 32 20 4c 69 6e 65 73 74 72 69 6e 67 2c 20 0a  -2 Linestring, .
c1fa0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
c1fb0 20 20 20 20 20 20 20 20 20 20 74 6f 6c 65 72 61            tolera
c1fc0 6e 63 65 20 20 44 6f 75 62 6c 65 20 29 0a 2f 20  nce  Double )./ 
c1fd0 20 20 20 6f 72 0a 2f 20 53 54 5f 44 72 61 70 65     or./ ST_Drape
c1fe0 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e 73 28 20  LineExceptions( 
c1ff0 6c 69 6e 65 2d 31 20 4c 69 6e 65 73 74 72 69 6e  line-1 Linestrin
c2000 67 2c 20 6c 69 6e 65 2d 32 20 4c 69 6e 65 73 74  g, line-2 Linest
c2010 72 69 6e 67 2c 20 0a 2f 20 20 20 20 20 20 20 20  ring, ./        
c2020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2030 20 74 6f 6c 65 72 61 6e 63 65 20 20 44 6f 75 62   tolerance  Doub
c2040 6c 65 2c 20 69 6e 74 65 72 70 6f 6c 61 74 65 64  le, interpolated
c2050 20 49 6e 74 65 67 65 72 20 29 0a 2f 0a 2f 20 77   Integer )././ w
c2060 69 6c 6c 20 64 72 61 70 65 20 6c 69 6e 65 2d 31  ill drape line-1
c2070 20 6f 76 65 72 20 6c 69 6e 65 2d 32 20 72 65 74   over line-2 ret
c2080 75 72 6e 69 6e 67 20 61 20 4d 75 6c 74 69 50 6f  urning a MultiPo
c2090 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2f  int containing./
c20a0 20 61 6c 6c 20 50 6f 69 6e 74 73 20 66 72 6f 6d   all Points from
c20b0 20 6c 69 6e 65 2d 31 20 6e 6f 74 20 63 6f 72 72   line-1 not corr
c20c0 65 63 74 6c 79 20 64 72 61 70 65 64 2e 0a 2f 20  ectly draped../ 
c20d0 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64 20  NULL on invalid 
c20e0 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 69 66 20  arguments or if 
c20f0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
c2100 6f 75 6e 74 65 72 65 64 20 6f 72 0a 2f 20 69 66  ountered or./ if
c2110 20 61 6c 6c 20 50 6f 69 6e 74 20 61 72 65 20 63   all Point are c
c2120 6f 72 72 65 63 74 6c 79 20 64 72 61 70 65 64 2e  orrectly draped.
c2130 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
c2140 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20   char *blob;.   
c2150 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 20 20   int bytes;.    
c2160 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
c2170 67 65 6f 6d 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20  geom1 = NULL;.  
c2180 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
c2190 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
c21a0 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
c21b0 50 74 72 20 67 65 6f 6d 33 20 3d 20 4e 55 4c 4c  Ptr geom3 = NULL
c21c0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74 6f 6c  ;.    double tol
c21d0 65 72 61 6e 63 65 20 3d 20 30 2e 30 3b 0a 20 20  erance = 0.0;.  
c21e0 20 20 69 6e 74 20 69 6e 74 65 72 70 6f 6c 61 74    int interpolat
c21f0 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ed = 1;.    sqli
c2200 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d  te3 *db_handle =
c2210 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
c2220 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
c2230 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67 70  ext);.    int gp
c2240 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
c2250 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  0;.    int gpkg_
c2260 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74  mode = 0;.    st
c2270 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
c2280 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
c2290 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
c22a0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
c22b0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
c22c0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
c22d0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
c22e0 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c  f (cache != NULL
c22f0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b  ).      {..  gpk
c2300 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63  g_amphibious = c
c2310 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69  ache->gpkg_amphi
c2320 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67  bious_mode;..  g
c2330 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65  pkg_mode = cache
c2340 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20  ->gpkg_mode;.   
c2350 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 71     }..    if (sq
c2360 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c2370 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
c2380 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
c2390 20 7b 0a 09 20 20 62 6c 6f 62 20 3d 20 28 75 6e   {..  blob = (un
c23a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
c23b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
c23c0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20  b (argv[0]);..  
c23d0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
c23e0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
c23f0 76 5b 30 5d 29 3b 0a 09 20 20 67 65 6f 6d 31 20  v[0]);..  geom1 
c2400 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 6f  =..      gaiaFro
c2410 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
c2420 6b 62 45 78 20 28 62 6c 6f 62 2c 20 62 79 74 65  kbEx (blob, byte
c2430 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
c2440 09 09 09 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  ...   gpkg_amphi
c2450 62 69 6f 75 73 29 3b 0a 20 20 20 20 20 20 7d 0a  bious);.      }.
c2460 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 65      else..goto e
c2470 72 72 6f 72 3b 0a 20 20 20 20 69 66 20 28 73 71  rror;.    if (sq
c2480 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c2490 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
c24a0 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
c24b0 20 7b 0a 09 20 20 62 6c 6f 62 20 3d 20 28 75 6e   {..  blob = (un
c24c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
c24d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
c24e0 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  b (argv[1]);..  
c24f0 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
c2500 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
c2510 76 5b 31 5d 29 3b 0a 09 20 20 67 65 6f 6d 32 20  v[1]);..  geom2 
c2520 3d 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 6f  =..      gaiaFro
c2530 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
c2540 6b 62 45 78 20 28 62 6c 6f 62 2c 20 62 79 74 65  kbEx (blob, byte
c2550 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  s, gpkg_mode,...
c2560 09 09 09 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  ...   gpkg_amphi
c2570 62 69 6f 75 73 29 3b 0a 20 20 20 20 20 20 7d 0a  bious);.      }.
c2580 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 65      else..goto e
c2590 72 72 6f 72 3b 0a 20 20 20 20 69 66 20 28 61 72  rror;.    if (ar
c25a0 67 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20 7b  gc >= 3).      {
c25b0 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
c25c0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
c25d0 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
c25e0 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
c25f0 09 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c 69 74  .int val = sqlit
c2600 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
c2610 67 76 5b 32 5d 29 3b 0a 09 09 74 6f 6c 65 72 61  gv[2]);...tolera
c2620 6e 63 65 20 3d 20 76 61 6c 3b 0a 09 20 20 20 20  nce = val;..    
c2630 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71  }..  else if (sq
c2640 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c2650 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
c2660 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20  LITE_FLOAT)..   
c2670 20 20 20 74 6f 6c 65 72 61 6e 63 65 20 3d 20 73     tolerance = s
c2680 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
c2690 62 6c 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09  ble (argv[2]);..
c26a0 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 6f    else..      go
c26b0 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to error;.      
c26c0 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e  }.    if (argc >
c26d0 3d 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 4).      {..  
c26e0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
c26f0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29  e_type (argv[3])
c2700 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
c2710 45 52 29 0a 09 20 20 20 20 20 20 69 6e 74 65 72  ER)..      inter
c2720 70 6f 6c 61 74 65 64 20 3d 20 73 71 6c 69 74 65  polated = sqlite
c2730 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
c2740 76 5b 33 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09  v[3]);..  else..
c2750 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
c2760 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 68  ;.      }../* ch
c2770 65 63 6b 69 6e 67 20 74 68 65 20 61 72 67 75 6d  ecking the argum
c2780 65 6e 74 73 20 66 6f 72 20 76 61 6c 69 64 69 74  ents for validit
c2790 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 67 65 6f  y */.    if (geo
c27a0 6d 31 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 67 65  m1 == NULL || ge
c27b0 6f 6d 32 20 3d 3d 20 4e 55 4c 4c 29 0a 09 67 6f  om2 == NULL)..go
c27c0 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to error;.    if
c27d0 20 28 67 65 6f 6d 31 2d 3e 53 72 69 64 20 21 3d   (geom1->Srid !=
c27e0 20 67 65 6f 6d 32 2d 3e 53 72 69 64 29 0a 09 67   geom2->Srid)..g
c27f0 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69  oto error;.    i
c2800 66 20 28 67 65 6f 6d 31 2d 3e 44 69 6d 65 6e 73  f (geom1->Dimens
c2810 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
c2820 5f 58 59 20 7c 7c 20 67 65 6f 6d 31 2d 3e 44 69  _XY || geom1->Di
c2830 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
c2840 47 41 49 41 5f 58 59 5f 4d 29 0a 09 3b 0a 20 20  GAIA_XY_M)..;.  
c2850 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 65 72 72    else..goto err
c2860 6f 72 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d  or;.    if (geom
c2870 32 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  2->DimensionMode
c2880 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09  l == GAIA_XY_Z..
c2890 7c 7c 20 67 65 6f 6d 32 2d 3e 44 69 6d 65 6e 73  || geom2->Dimens
c28a0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
c28b0 5f 58 59 5f 5a 5f 4d 29 0a 09 3b 0a 20 20 20 20  _XY_Z_M)..;.    
c28c0 65 6c 73 65 0a 09 67 6f 74 6f 20 65 72 72 6f 72  else..goto error
c28d0 3b 0a 20 20 20 20 69 66 20 28 21 67 61 69 61 5f  ;.    if (!gaia_
c28e0 64 6f 5f 63 68 65 63 6b 5f 6c 69 6e 65 73 74 72  do_check_linestr
c28f0 69 6e 67 20 28 67 65 6f 6d 31 29 29 0a 09 67 6f  ing (geom1))..go
c2900 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to error;.    if
c2910 20 28 21 67 61 69 61 5f 64 6f 5f 63 68 65 63 6b   (!gaia_do_check
c2920 5f 6c 69 6e 65 73 74 72 69 6e 67 20 28 67 65 6f  _linestring (geo
c2930 6d 32 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72  m2))..goto error
c2940 3b 0a 20 20 20 20 69 66 20 28 74 6f 6c 65 72 61  ;.    if (tolera
c2950 6e 63 65 20 3c 20 30 2e 30 29 0a 09 67 6f 74 6f  nce < 0.0)..goto
c2960 20 65 72 72 6f 72 3b 0a 0a 20 20 20 20 67 65 6f   error;..    geo
c2970 6d 33 20 3d 0a 09 67 61 69 61 44 72 61 70 65 4c  m3 =..gaiaDrapeL
c2980 69 6e 65 45 78 63 65 70 74 69 6f 6e 73 20 28 64  ineExceptions (d
c2990 62 5f 68 61 6e 64 6c 65 2c 20 67 65 6f 6d 31 2c  b_handle, geom1,
c29a0 20 67 65 6f 6d 32 2c 20 74 6f 6c 65 72 61 6e 63   geom2, toleranc
c29b0 65 2c 0a 09 09 09 09 20 69 6e 74 65 72 70 6f 6c  e,..... interpol
c29c0 61 74 65 64 29 3b 0a 20 20 20 20 69 66 20 28 67  ated);.    if (g
c29d0 65 6f 6d 33 20 3d 3d 20 4e 55 4c 4c 29 0a 09 67  eom3 == NULL)..g
c29e0 6f 74 6f 20 65 72 72 6f 72 3b 0a 0a 20 20 20 20  oto error;..    
c29f0 67 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65  gaiaToSpatiaLite
c2a00 42 6c 6f 62 57 6b 62 20 28 67 65 6f 6d 33 2c 20  BlobWkb (geom3, 
c2a10 26 62 6c 6f 62 2c 20 26 62 79 74 65 73 29 3b 0a  &blob, &bytes);.
c2a20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
c2a30 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
c2a40 2c 20 62 6c 6f 62 2c 20 62 79 74 65 73 2c 20 66  , blob, bytes, f
c2a50 72 65 65 29 3b 0a 20 20 20 20 67 61 69 61 46 72  ree);.    gaiaFr
c2a60 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
c2a70 31 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65  1);.    gaiaFree
c2a80 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29  GeomColl (geom2)
c2a90 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
c2aa0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 33 29 3b 0a  omColl (geom3);.
c2ab0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 65      return;..  e
c2ac0 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 67 65  rror:.    if (ge
c2ad0 6f 6d 31 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61  om1 != NULL)..ga
c2ae0 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28  iaFreeGeomColl (
c2af0 67 65 6f 6d 31 29 3b 0a 20 20 20 20 69 66 20 28  geom1);.    if (
c2b00 67 65 6f 6d 32 20 21 3d 20 4e 55 4c 4c 29 0a 09  geom2 != NULL)..
c2b10 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
c2b20 20 28 67 65 6f 6d 32 29 3b 0a 20 20 20 20 69 66   (geom2);.    if
c2b30 20 28 67 65 6f 6d 33 20 21 3d 20 4e 55 4c 4c 29   (geom3 != NULL)
c2b40 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
c2b50 6c 6c 20 28 67 65 6f 6d 33 29 3b 0a 20 20 20 20  ll (geom3);.    
c2b60 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
c2b70 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d  ull (context);.}
c2b80 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ..#endif /* end 
c2b90 69 6e 63 6c 75 64 69 6e 67 20 47 45 4f 53 20 2a  including GEOS *
c2ba0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 74 65  /..static int.te
c2bb0 78 74 32 64 6f 75 62 6c 65 20 28 63 6f 6e 73 74  xt2double (const
c2bc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c2bd0 73 74 72 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c  str, double *val
c2be0 29 0a 7b 0a 2f 2a 20 63 68 65 63 6b 73 20 66 6f  ).{./* checks fo
c2bf0 72 20 61 20 76 61 6c 69 64 20 6e 75 6d 62 65 72  r a valid number
c2c00 2c 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 74  , eventually ret
c2c10 75 72 6e 69 6e 67 20 61 20 44 4f 55 42 4c 45 20  urning a DOUBLE 
c2c20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  */.    int err =
c2c30 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 69 67 6e   0;.    int sign
c2c40 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 65   = 0;.    int de
c2c50 63 69 6d 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69  cimal = 0;.    i
c2c60 6e 74 20 65 78 70 20 3d 20 30 3b 0a 20 20 20 20  nt exp = 0;.    
c2c70 69 6e 74 20 65 78 70 73 69 67 6e 20 3d 20 30 3b  int expsign = 0;
c2c80 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
c2c90 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 73 74  ned char *p = st
c2ca0 72 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 70  r;.    while (*p
c2cb0 20 21 3d 20 27 5c 30 27 29 0a 20 20 20 20 20 20   != '\0').      
c2cc0 7b 0a 09 20 20 73 77 69 74 63 68 20 28 2a 70 29  {..  switch (*p)
c2cd0 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73  ..    {..    cas
c2ce0 65 20 27 30 27 3a 0a 09 20 20 20 20 63 61 73 65  e '0':..    case
c2cf0 20 27 31 27 3a 0a 09 20 20 20 20 63 61 73 65 20   '1':..    case 
c2d00 27 32 27 3a 0a 09 20 20 20 20 63 61 73 65 20 27  '2':..    case '
c2d10 33 27 3a 0a 09 20 20 20 20 63 61 73 65 20 27 34  3':..    case '4
c2d20 27 3a 0a 09 20 20 20 20 63 61 73 65 20 27 35 27  ':..    case '5'
c2d30 3a 0a 09 20 20 20 20 63 61 73 65 20 27 36 27 3a  :..    case '6':
c2d40 0a 09 20 20 20 20 63 61 73 65 20 27 37 27 3a 0a  ..    case '7':.
c2d50 09 20 20 20 20 63 61 73 65 20 27 38 27 3a 0a 09  .    case '8':..
c2d60 20 20 20 20 63 61 73 65 20 27 39 27 3a 0a 09 09      case '9':...
c2d70 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
c2d80 20 27 2d 27 3a 0a 09 20 20 20 20 63 61 73 65 20   '-':..    case 
c2d90 27 2b 27 3a 0a 09 09 69 66 20 28 21 65 78 70 29  '+':...if (!exp)
c2da0 0a 09 09 20 20 20 20 73 69 67 6e 2b 2b 3b 0a 09  ...    sign++;..
c2db0 09 65 6c 73 65 0a 09 09 20 20 20 20 65 78 70 73  .else...    exps
c2dc0 69 67 6e 2b 2b 3b 0a 09 09 62 72 65 61 6b 3b 0a  ign++;...break;.
c2dd0 09 20 20 20 20 63 61 73 65 20 27 2e 27 3a 0a 09  .    case '.':..
c2de0 09 64 65 63 69 6d 61 6c 2b 2b 3b 0a 09 09 62 72  .decimal++;...br
c2df0 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 27  eak;..    case '
c2e00 65 27 3a 0a 09 20 20 20 20 63 61 73 65 20 27 45  e':..    case 'E
c2e10 27 3a 0a 09 09 65 78 70 2b 2b 3b 0a 09 09 62 72  ':...exp++;...br
c2e20 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
c2e30 74 3a 0a 09 09 65 72 72 20 3d 20 31 3b 0a 09 09  t:...err = 1;...
c2e40 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 09  break;..    };..
c2e50 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    p++;.      }. 
c2e60 20 20 20 69 66 20 28 73 69 67 6e 20 3e 20 31 20     if (sign > 1 
c2e70 7c 7c 20 65 78 70 73 69 67 6e 20 3e 20 31 20 7c  || expsign > 1 |
c2e80 7c 20 64 65 63 69 6d 61 6c 20 3e 20 31 20 7c 7c  | decimal > 1 ||
c2e90 20 28 65 78 70 20 3d 3d 20 30 20 26 26 20 65 78   (exp == 0 && ex
c2ea0 70 73 69 67 6e 20 3e 20 30 29 29 0a 09 65 72 72  psign > 0))..err
c2eb0 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 28 65 72   = 1;.    if (er
c2ec0 72 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  r)..return 0;.  
c2ed0 20 20 2a 76 61 6c 20 3d 20 61 74 6f 66 20 28 28    *val = atof ((
c2ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 74  const char *) st
c2ef0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  r);.    return 1
c2f00 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
c2f10 0a 66 6e 63 74 5f 43 61 73 74 54 6f 49 6e 74 65  .fnct_CastToInte
c2f20 67 65 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ger (sqlite3_con
c2f30 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
c2f40 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
c2f50 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
c2f60 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
c2f70 6f 6e 3a 0a 2f 20 43 61 73 74 54 6f 49 6e 74 65  on:./ CastToInte
c2f80 67 65 72 28 67 65 6e 65 72 69 63 20 76 61 6c 75  ger(generic valu
c2f90 65 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61  e)././ returns a
c2fa0 6e 20 49 4e 54 45 47 45 52 20 76 61 6c 75 65 20  n INTEGER value 
c2fb0 5b 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  [if conversion i
c2fc0 73 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f 20 6f  s possible] ./ o
c2fd0 72 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20 6f 74  r NULL in any ot
c2fe0 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20  her case.*/.    
c2ff0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
c3000 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
c3010 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
c3020 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c3030 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
c3040 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
c3050 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
c3060 5f 69 6e 74 36 34 20 76 61 6c 20 3d 20 73 71 6c  _int64 val = sql
c3070 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
c3080 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 73   (argv[0]);..  s
c3090 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
c30a0 74 36 34 20 28 63 6f 6e 74 65 78 74 2c 20 76 61  t64 (context, va
c30b0 6c 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  l);..  return;. 
c30c0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
c30d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
c30e0 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
c30f0 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 20 20 20  QLITE_FLOAT).   
c3100 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
c3110 69 6e 74 36 34 20 76 61 6c 3b 0a 09 20 20 64 6f  int64 val;..  do
c3120 75 62 6c 65 20 64 76 61 6c 20 3d 20 73 71 6c 69  uble dval = sqli
c3130 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
c3140 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 64   (argv[0]);..  d
c3150 6f 75 62 6c 65 20 64 69 66 66 20 3d 20 64 76 61  ouble diff = dva
c3160 6c 20 2d 20 66 6c 6f 6f 72 20 28 64 76 61 6c 29  l - floor (dval)
c3170 3b 0a 09 20 20 76 61 6c 20 3d 20 28 73 71 6c 69  ;..  val = (sqli
c3180 74 65 33 5f 69 6e 74 36 34 29 20 73 71 6c 69 74  te3_int64) sqlit
c3190 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
c31a0 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 69 66  (argv[0]);..  if
c31b0 20 28 64 69 66 66 20 3e 3d 20 30 2e 35 29 0a 09   (diff >= 0.5)..
c31c0 20 20 20 20 20 20 76 61 6c 2b 2b 3b 0a 09 20 20        val++;..  
c31d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
c31e0 6e 74 36 34 20 28 63 6f 6e 74 65 78 74 2c 20 76  nt64 (context, v
c31f0 61 6c 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  al);..  return;.
c3200 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
c3210 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
c3220 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
c3230 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
c3240 20 20 20 7b 0a 09 20 20 63 6f 6e 73 74 20 75 6e     {..  const un
c3250 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 78 74  signed char *txt
c3260 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c3270 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
c3280 0a 09 20 20 64 6f 75 62 6c 65 20 64 76 61 6c 3b  ..  double dval;
c3290 0a 09 20 20 69 66 20 28 74 65 78 74 32 64 6f 75  ..  if (text2dou
c32a0 62 6c 65 20 28 74 78 74 2c 20 26 64 76 61 6c 29  ble (txt, &dval)
c32b0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
c32c0 65 33 5f 69 6e 74 36 34 20 76 61 6c 3b 0a 09 09  e3_int64 val;...
c32d0 64 6f 75 62 6c 65 20 64 76 61 6c 20 3d 20 73 71  double dval = sq
c32e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
c32f0 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 09  le (argv[0]);...
c3300 64 6f 75 62 6c 65 20 64 69 66 66 20 3d 20 64 76  double diff = dv
c3310 61 6c 20 2d 20 66 6c 6f 6f 72 20 28 64 76 61 6c  al - floor (dval
c3320 29 3b 0a 09 09 76 61 6c 20 3d 20 28 73 71 6c 69  );...val = (sqli
c3330 74 65 33 5f 69 6e 74 36 34 29 20 73 71 6c 69 74  te3_int64) sqlit
c3340 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
c3350 28 61 72 67 76 5b 30 5d 29 3b 0a 09 09 69 66 20  (argv[0]);...if 
c3360 28 64 69 66 66 20 3e 3d 20 30 2e 35 29 0a 09 09  (diff >= 0.5)...
c3370 20 20 20 20 76 61 6c 2b 2b 3b 0a 09 09 73 71 6c      val++;...sql
c3380 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
c3390 34 20 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c 29  4 (context, val)
c33a0 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
c33b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73   }.      }.    s
c33c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
c33d0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a  ll (context);.}.
c33e0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
c33f0 74 5f 43 61 73 74 54 6f 44 6f 75 62 6c 65 20 28  t_CastToDouble (
c3400 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c3410 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
c3420 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
c3430 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
c3440 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
c3450 20 43 61 73 74 54 6f 44 6f 75 62 6c 65 28 67 65   CastToDouble(ge
c3460 6e 65 72 69 63 20 76 61 6c 75 65 29 0a 2f 0a 2f  neric value)././
c3470 20 72 65 74 75 72 6e 73 20 61 20 44 4f 55 42 4c   returns a DOUBL
c3480 45 20 76 61 6c 75 65 20 5b 69 66 20 63 6f 6e 76  E value [if conv
c3490 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  ersion is possib
c34a0 6c 65 5d 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  le] ./ or NULL i
c34b0 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65  n any other case
c34c0 0a 2a 2f 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  .*/.    GAIA_UNU
c34d0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
c34e0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
c34f0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
c3500 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c3510 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
c3520 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
c3530 20 64 6f 75 62 6c 65 20 76 61 6c 20 3d 20 28 64   double val = (d
c3540 6f 75 62 6c 65 29 20 73 71 6c 69 74 65 33 5f 76  ouble) sqlite3_v
c3550 61 6c 75 65 5f 69 6e 74 36 34 20 28 61 72 67 76  alue_int64 (argv
c3560 5b 30 5d 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  [0]);..  sqlite3
c3570 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28  _result_double (
c3580 63 6f 6e 74 65 78 74 2c 20 76 61 6c 29 3b 0a 09  context, val);..
c3590 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c35a0 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
c35b0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
c35c0 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
c35d0 5f 46 4c 4f 41 54 29 0a 20 20 20 20 20 20 7b 0a  _FLOAT).      {.
c35e0 09 20 20 64 6f 75 62 6c 65 20 76 61 6c 20 3d 20  .  double val = 
c35f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
c3600 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a  uble (argv[0]);.
c3610 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
c3620 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
c3630 74 2c 20 76 61 6c 29 3b 0a 09 20 20 72 65 74 75  t, val);..  retu
c3640 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
c3650 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
c3660 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
c3670 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
c3680 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 6f 6e 73  .      {..  cons
c3690 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
c36a0 2a 74 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  *txt = sqlite3_v
c36b0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
c36c0 30 5d 29 3b 0a 09 20 20 64 6f 75 62 6c 65 20 76  0]);..  double v
c36d0 61 6c 3b 0a 09 20 20 69 66 20 28 74 65 78 74 32  al;..  if (text2
c36e0 64 6f 75 62 6c 65 20 28 74 78 74 2c 20 26 76 61  double (txt, &va
c36f0 6c 29 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  l))..    {...sql
c3700 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
c3710 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c  le (context, val
c3720 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
c3730 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c3740 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
c3750 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d  ull (context);.}
c3760 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
c3770 63 74 5f 43 61 73 74 54 6f 54 65 78 74 20 28 73  ct_CastToText (s
c3780 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c3790 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
c37a0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
c37b0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
c37c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
c37d0 43 61 73 74 54 6f 54 65 78 74 28 67 65 6e 65 72  CastToText(gener
c37e0 69 63 20 76 61 6c 75 65 29 0a 2f 20 43 61 73 74  ic value)./ Cast
c37f0 54 6f 54 65 78 74 28 67 65 6e 65 72 69 63 20 76  ToText(generic v
c3800 61 6c 75 65 2c 20 49 6e 74 65 67 65 72 20 6c 65  alue, Integer le
c3810 66 74 2d 61 6c 69 67 6e 65 64 2d 6c 65 6e 67 74  ft-aligned-lengt
c3820 68 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61  h)././ returns a
c3830 20 54 45 58 54 20 76 61 6c 75 65 20 5b 69 66 20   TEXT value [if 
c3840 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  conversion is po
c3850 73 73 69 62 6c 65 5d 20 0a 2f 20 6f 72 20 4e 55  ssible] ./ or NU
c3860 4c 4c 20 69 6e 20 61 6e 79 20 6f 74 68 65 72 20  LL in any other 
c3870 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63 68 61 72  case.*/.    char
c3880 20 2a 74 78 74 3b 0a 20 20 20 20 47 41 49 41 5f   *txt;.    GAIA_
c3890 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
c38a0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
c38b0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
c38c0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c38d0 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c38e0 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
c38f0 0a 09 20 20 63 68 61 72 20 66 6f 72 6d 61 74 5b  ..  char format[
c3900 33 32 5d 3b 0a 09 20 20 63 6f 6e 73 74 20 63 68  32];..  const ch
c3910 61 72 20 2a 66 6d 74 20 3d 20 46 52 4d 54 36 34  ar *fmt = FRMT64
c3920 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ;..  sqlite3_int
c3930 36 34 20 76 61 6c 3b 0a 09 20 20 69 66 20 28 61  64 val;..  if (a
c3940 72 67 63 20 3d 3d 20 32 29 0a 09 20 20 20 20 7b  rgc == 2)..    {
c3950 0a 09 09 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 09  ...int length;..
c3960 09 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  .if (sqlite3_val
c3970 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
c3980 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) != SQLITE_INTE
c3990 47 45 52 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  GER)...  {...   
c39a0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c39b0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
c39c0 3b 0a 09 09 20 20 20 20 20 20 72 65 74 75 72 6e  ;...      return
c39d0 3b 0a 09 09 20 20 7d 0a 09 09 6c 65 6e 67 74 68  ;...  }...length
c39e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c39f0 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
c3a00 09 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30  ..if (length > 0
c3a10 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
c3a20 73 70 72 69 6e 74 66 20 28 66 6f 72 6d 61 74 2c  sprintf (format,
c3a30 20 22 25 25 30 25 64 22 20 46 52 4d 54 36 34 5f   "%%0%d" FRMT64_
c3a40 57 4f 5f 50 43 54 2c 20 6c 65 6e 67 74 68 29 3b  WO_PCT, length);
c3a50 0a 09 09 20 20 20 20 20 20 66 6d 74 20 3d 20 66  ...      fmt = f
c3a60 6f 72 6d 61 74 3b 0a 09 09 20 20 7d 0a 09 20 20  ormat;...  }..  
c3a70 20 20 7d 0a 09 20 20 76 61 6c 20 3d 20 73 71 6c    }..  val = sql
c3a80 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
c3a90 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 74   (argv[0]);..  t
c3aa0 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  xt = sqlite3_mpr
c3ab0 69 6e 74 66 20 28 66 6d 74 2c 20 76 61 6c 29 3b  intf (fmt, val);
c3ac0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
c3ad0 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74  lt_text (context
c3ae0 2c 20 74 78 74 2c 20 73 74 72 6c 65 6e 20 28 74  , txt, strlen (t
c3af0 78 74 29 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  xt), sqlite3_fre
c3b00 65 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  e);..  return;. 
c3b10 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
c3b20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
c3b30 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
c3b40 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 20 20 20  QLITE_FLOAT).   
c3b50 20 20 20 7b 0a 09 20 20 69 6e 74 20 69 3b 0a 09     {..  int i;..
c3b60 20 20 69 6e 74 20 6c 65 6e 3b 0a 09 20 20 64 6f    int len;..  do
c3b70 75 62 6c 65 20 76 61 6c 20 3d 20 73 71 6c 69 74  uble val = sqlit
c3b80 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
c3b90 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 63 68  (argv[0]);..  ch
c3ba0 61 72 20 66 6f 72 6d 61 74 5b 33 32 5d 3b 0a 09  ar format[32];..
c3bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d    const char *fm
c3bc0 74 20 3d 20 22 25 31 2e 31 38 66 22 3b 0a 09 20  t = "%1.18f";.. 
c3bd0 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29 0a   if (argc == 2).
c3be0 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 6c 65 6e  .    {...int len
c3bf0 67 74 68 3b 0a 09 09 69 66 20 28 73 71 6c 69 74  gth;...if (sqlit
c3c00 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c3c10 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
c3c20 45 5f 49 4e 54 45 47 45 52 29 0a 09 09 20 20 7b  E_INTEGER)...  {
c3c30 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
c3c40 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c3c50 6e 74 65 78 74 29 3b 0a 09 09 20 20 20 20 20 20  ntext);...      
c3c60 72 65 74 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 09  return;...  }...
c3c70 6c 65 6e 67 74 68 20 3d 20 73 71 6c 69 74 65 33  length = sqlite3
c3c80 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
c3c90 5b 31 5d 29 3b 0a 09 09 69 66 20 28 6c 65 6e 67  [1]);...if (leng
c3ca0 74 68 20 3e 20 30 29 0a 09 09 20 20 7b 0a 09 09  th > 0)...  {...
c3cb0 20 20 20 20 20 20 73 70 72 69 6e 74 66 20 28 66        sprintf (f
c3cc0 6f 72 6d 61 74 2c 20 22 25 25 30 25 64 2e 31 38  ormat, "%%0%d.18
c3cd0 66 22 2c 20 6c 65 6e 67 74 68 20 2b 20 31 39 29  f", length + 19)
c3ce0 3b 0a 09 09 20 20 20 20 20 20 66 6d 74 20 3d 20  ;...      fmt = 
c3cf0 66 6f 72 6d 61 74 3b 0a 09 09 20 20 7d 0a 09 20  format;...  }.. 
c3d00 20 20 20 7d 0a 09 20 20 74 78 74 20 3d 20 73 71     }..  txt = sq
c3d10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 66  lite3_mprintf (f
c3d20 6d 74 2c 20 76 61 6c 29 3b 0a 09 20 20 6c 65 6e  mt, val);..  len
c3d30 20 3d 20 73 74 72 6c 65 6e 20 28 74 78 74 29 3b   = strlen (txt);
c3d40 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 6c 65 6e  ..  for (i = len
c3d50 20 2d 20 31 3b 20 69 20 3e 20 30 3b 20 69 2d 2d   - 1; i > 0; i--
c3d60 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 73 75  )..    {.../* su
c3d70 70 70 72 65 73 73 69 6e 67 20 6d 65 61 6e 69 6e  ppressing meanin
c3d80 67 6c 65 73 73 20 74 72 61 69 6c 69 6e 67 20 7a  gless trailing z
c3d90 65 72 6f 65 73 20 2a 2f 0a 09 09 69 66 20 28 74  eroes */...if (t
c3da0 78 74 5b 69 5d 20 3e 3d 20 27 31 27 20 26 26 20  xt[i] >= '1' && 
c3db0 74 78 74 5b 69 5d 20 3c 3d 20 27 39 27 29 0a 09  txt[i] <= '9')..
c3dc0 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 69 66  .    break;...if
c3dd0 20 28 74 78 74 5b 69 5d 20 3d 3d 20 27 2e 27 29   (txt[i] == '.')
c3de0 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 74  ...  {...      t
c3df0 78 74 5b 69 20 2b 20 31 5d 20 3d 20 27 30 27 3b  xt[i + 1] = '0';
c3e00 0a 09 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ...      break;.
c3e10 09 09 20 20 7d 0a 09 09 69 66 20 28 74 78 74 5b  ..  }...if (txt[
c3e20 69 5d 20 3d 3d 20 27 30 27 29 0a 09 09 20 20 20  i] == '0')...   
c3e30 20 74 78 74 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a   txt[i] = '\0';.
c3e40 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65  .    }..  sqlite
c3e50 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63  3_result_text (c
c3e60 6f 6e 74 65 78 74 2c 20 74 78 74 2c 20 73 74 72  ontext, txt, str
c3e70 6c 65 6e 20 28 74 78 74 29 2c 20 73 71 6c 69 74  len (txt), sqlit
c3e80 65 33 5f 66 72 65 65 29 3b 0a 09 20 20 72 65 74  e3_free);..  ret
c3e90 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c3ea0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
c3eb0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
c3ec0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
c3ed0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
c3ee0 20 6e 5f 62 79 74 65 73 3b 0a 09 20 20 74 78 74   n_bytes;..  txt
c3ef0 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69   = (char *) sqli
c3f00 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
c3f10 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 6e 5f 62  argv[0]);..  n_b
c3f20 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
c3f30 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
c3f40 5b 30 5d 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  [0]);..  sqlite3
c3f50 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f  _result_text (co
c3f60 6e 74 65 78 74 2c 20 74 78 74 2c 20 6e 5f 62 79  ntext, txt, n_by
c3f70 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  tes, SQLITE_TRAN
c3f80 53 49 45 4e 54 29 3b 0a 09 20 20 72 65 74 75 72  SIENT);..  retur
c3f90 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  n;.      }.    s
c3fa0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
c3fb0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a  ll (context);.}.
c3fc0 0a 73 74 61 74 69 63 20 69 6e 74 0a 70 61 72 73  .static int.pars
c3fd0 65 48 65 78 42 79 74 65 20 28 75 6e 73 69 67 6e  eHexByte (unsign
c3fe0 65 64 20 63 68 61 72 20 68 69 2c 20 75 6e 73 69  ed char hi, unsi
c3ff0 67 6e 65 64 20 63 68 61 72 20 6c 6f 2c 20 75 6e  gned char lo, un
c4000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 76 61 6c  signed char *val
c4010 29 0a 7b 0a 2f 2a 20 63 6f 6e 76 65 72 74 69 6e  ).{./* convertin
c4020 67 20 61 20 62 79 74 65 20 66 6f 72 20 69 74 73  g a byte for its
c4030 20 48 65 78 20 72 65 70 72 65 73 65 6e 74 61 74   Hex representat
c4040 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  ion */.    unsig
c4050 6e 65 64 20 63 68 61 72 20 78 3b 0a 20 20 20 20  ned char x;.    
c4060 73 77 69 74 63 68 20 28 68 69 29 0a 20 20 20 20  switch (hi).    
c4070 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27    {.      case '
c4080 30 27 3a 0a 09 20 20 78 20 3d 20 30 3b 0a 09 20  0':..  x = 0;.. 
c4090 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c40a0 73 65 20 27 31 27 3a 0a 09 20 20 78 20 3d 20 31  se '1':..  x = 1
c40b0 36 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  6;..  break;.   
c40c0 20 20 20 63 61 73 65 20 27 32 27 3a 0a 09 20 20     case '2':..  
c40d0 78 20 3d 20 31 36 20 2a 20 32 3b 0a 09 20 20 62  x = 16 * 2;..  b
c40e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c40f0 20 27 33 27 3a 0a 09 20 20 78 20 3d 20 31 36 20   '3':..  x = 16 
c4100 2a 20 33 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  * 3;..  break;. 
c4110 20 20 20 20 20 63 61 73 65 20 27 34 27 3a 0a 09       case '4':..
c4120 20 20 78 20 3d 20 31 36 20 2a 20 34 3b 0a 09 20    x = 16 * 4;.. 
c4130 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c4140 73 65 20 27 35 27 3a 0a 09 20 20 78 20 3d 20 31  se '5':..  x = 1
c4150 36 20 2a 20 35 3b 0a 09 20 20 62 72 65 61 6b 3b  6 * 5;..  break;
c4160 0a 20 20 20 20 20 20 63 61 73 65 20 27 36 27 3a  .      case '6':
c4170 0a 09 20 20 78 20 3d 20 31 36 20 2a 20 36 3b 0a  ..  x = 16 * 6;.
c4180 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
c4190 63 61 73 65 20 27 37 27 3a 0a 09 20 20 78 20 3d  case '7':..  x =
c41a0 20 31 36 20 2a 20 37 3b 0a 09 20 20 62 72 65 61   16 * 7;..  brea
c41b0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 38  k;.      case '8
c41c0 27 3a 0a 09 20 20 78 20 3d 20 31 36 20 2a 20 38  ':..  x = 16 * 8
c41d0 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
c41e0 20 20 63 61 73 65 20 27 39 27 3a 0a 09 20 20 78    case '9':..  x
c41f0 20 3d 20 31 36 20 2a 20 39 3b 0a 09 20 20 62 72   = 16 * 9;..  br
c4200 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c4210 27 61 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'a':.      case 
c4220 27 41 27 3a 0a 09 20 20 78 20 3d 20 31 36 20 2a  'A':..  x = 16 *
c4230 20 31 30 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20   10;..  break;. 
c4240 20 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20       case 'b':. 
c4250 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 0a 09       case 'B':..
c4260 20 20 78 20 3d 20 31 36 20 2a 20 31 31 3b 0a 09    x = 16 * 11;..
c4270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c4280 61 73 65 20 27 63 27 3a 0a 20 20 20 20 20 20 63  ase 'c':.      c
c4290 61 73 65 20 27 43 27 3a 0a 09 20 20 78 20 3d 20  ase 'C':..  x = 
c42a0 31 36 20 2a 20 31 32 3b 0a 09 20 20 62 72 65 61  16 * 12;..  brea
c42b0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 64  k;.      case 'd
c42c0 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 44  ':.      case 'D
c42d0 27 3a 0a 09 20 20 78 20 3d 20 31 36 20 2a 20 31  ':..  x = 16 * 1
c42e0 33 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  3;..  break;.   
c42f0 20 20 20 63 61 73 65 20 27 65 27 3a 0a 20 20 20     case 'e':.   
c4300 20 20 20 63 61 73 65 20 27 45 27 3a 0a 09 20 20     case 'E':..  
c4310 78 20 3d 20 31 36 20 2a 20 31 34 3b 0a 09 20 20  x = 16 * 14;..  
c4320 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c4330 65 20 27 66 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'f':.      cas
c4340 65 20 27 46 27 3a 0a 09 20 20 78 20 3d 20 31 36  e 'F':..  x = 16
c4350 20 2a 20 31 35 3b 0a 09 20 20 62 72 65 61 6b 3b   * 15;..  break;
c4360 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
c4370 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  .  return 0;.   
c4380 20 20 20 7d 3b 0a 20 20 20 20 73 77 69 74 63 68     };.    switch
c4390 20 28 6c 6f 29 0a 20 20 20 20 20 20 7b 0a 20 20   (lo).      {.  
c43a0 20 20 20 20 63 61 73 65 20 27 30 27 3a 0a 09 20      case '0':.. 
c43b0 20 78 20 2b 3d 20 30 3b 0a 09 20 20 62 72 65 61   x += 0;..  brea
c43c0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 31  k;.      case '1
c43d0 27 3a 0a 09 20 20 78 20 2b 3d 20 31 3b 0a 09 20  ':..  x += 1;.. 
c43e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c43f0 73 65 20 27 32 27 3a 0a 09 20 20 78 20 2b 3d 20  se '2':..  x += 
c4400 32 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  2;..  break;.   
c4410 20 20 20 63 61 73 65 20 27 33 27 3a 0a 09 20 20     case '3':..  
c4420 78 20 2b 3d 20 33 3b 0a 09 20 20 62 72 65 61 6b  x += 3;..  break
c4430 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 34 27  ;.      case '4'
c4440 3a 0a 09 20 20 78 20 2b 3d 20 34 3b 0a 09 20 20  :..  x += 4;..  
c4450 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c4460 65 20 27 35 27 3a 0a 09 20 20 78 20 2b 3d 20 35  e '5':..  x += 5
c4470 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
c4480 20 20 63 61 73 65 20 27 36 27 3a 0a 09 20 20 78    case '6':..  x
c4490 20 2b 3d 20 36 3b 0a 09 20 20 62 72 65 61 6b 3b   += 6;..  break;
c44a0 0a 20 20 20 20 20 20 63 61 73 65 20 27 37 27 3a  .      case '7':
c44b0 0a 09 20 20 78 20 2b 3d 20 37 3b 0a 09 20 20 62  ..  x += 7;..  b
c44c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c44d0 20 27 38 27 3a 0a 09 20 20 78 20 2b 3d 20 38 3b   '8':..  x += 8;
c44e0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
c44f0 20 63 61 73 65 20 27 39 27 3a 0a 09 20 20 78 20   case '9':..  x 
c4500 2b 3d 20 39 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  += 9;..  break;.
c4510 20 20 20 20 20 20 63 61 73 65 20 27 61 27 3a 0a        case 'a':.
c4520 20 20 20 20 20 20 63 61 73 65 20 27 41 27 3a 0a        case 'A':.
c4530 09 20 20 78 20 2b 3d 20 31 30 3b 0a 09 20 20 62  .  x += 10;..  b
c4540 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c4550 20 27 62 27 3a 0a 20 20 20 20 20 20 63 61 73 65   'b':.      case
c4560 20 27 42 27 3a 0a 09 20 20 78 20 2b 3d 20 31 31   'B':..  x += 11
c4570 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
c4580 20 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20    case 'c':.    
c4590 20 20 63 61 73 65 20 27 43 27 3a 0a 09 20 20 78    case 'C':..  x
c45a0 20 2b 3d 20 31 32 3b 0a 09 20 20 62 72 65 61 6b   += 12;..  break
c45b0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 64 27  ;.      case 'd'
c45c0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 44 27  :.      case 'D'
c45d0 3a 0a 09 20 20 78 20 2b 3d 20 31 33 3b 0a 09 20  :..  x += 13;.. 
c45e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c45f0 73 65 20 27 65 27 3a 0a 20 20 20 20 20 20 63 61  se 'e':.      ca
c4600 73 65 20 27 45 27 3a 0a 09 20 20 78 20 2b 3d 20  se 'E':..  x += 
c4610 31 34 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  14;..  break;.  
c4620 20 20 20 20 63 61 73 65 20 27 66 27 3a 0a 20 20      case 'f':.  
c4630 20 20 20 20 63 61 73 65 20 27 46 27 3a 0a 09 20      case 'F':.. 
c4640 20 78 20 2b 3d 20 31 35 3b 0a 09 20 20 62 72 65   x += 15;..  bre
c4650 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
c4660 74 3a 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a  t:..  return 0;.
c4670 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 2a 76 61        };.    *va
c4680 6c 20 3d 20 78 3b 0a 20 20 20 20 72 65 74 75 72  l = x;.    retur
c4690 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 1;.}..static i
c46a0 6e 74 0a 70 61 72 73 65 48 65 78 53 74 72 69 6e  nt.parseHexStrin
c46b0 67 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  g (const unsigne
c46c0 64 20 63 68 61 72 20 2a 69 6e 2c 20 69 6e 74 20  d char *in, int 
c46d0 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  in_len, unsigned
c46e0 20 63 68 61 72 20 2a 2a 6f 75 74 2c 0a 09 09 69   char **out,...i
c46f0 6e 74 20 2a 6f 75 74 5f 6c 65 6e 29 0a 7b 0a 2f  nt *out_len).{./
c4700 2a 20 70 61 72 73 69 6e 67 20 61 6e 20 48 65 78  * parsing an Hex
c4710 61 64 65 63 69 6d 61 6c 20 73 74 72 69 6e 67 20  adecimal string 
c4720 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
c4730 63 68 61 72 20 2a 62 75 66 3b 0a 20 20 20 20 75  char *buf;.    u
c4740 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
c4750 6f 75 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  out;.    unsigne
c4760 64 20 63 68 61 72 20 62 79 74 65 76 61 6c 3b 0a  d char byteval;.
c4770 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
c4780 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 2a 6f 75 74  nt len;.    *out
c4790 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 2a 6f 75   = NULL;.    *ou
c47a0 74 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69  t_len = 0;.    i
c47b0 66 20 28 69 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 09  f (in == NULL)..
c47c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6c 65  return 0;.    le
c47d0 6e 20 3d 20 69 6e 5f 6c 65 6e 20 2f 20 32 3b 0a  n = in_len / 2;.
c47e0 20 20 20 20 69 66 20 28 6c 65 6e 20 2a 20 32 20      if (len * 2 
c47f0 21 3d 20 69 6e 5f 6c 65 6e 29 09 2f 2a 20 23 20  != in_len)./* # 
c4800 64 69 67 69 74 73 20 69 73 20 61 6e 20 6f 64 64  digits is an odd
c4810 20 6e 75 6d 62 65 72 20 2a 2f 0a 09 72 65 74 75   number */..retu
c4820 72 6e 20 30 3b 0a 20 20 20 20 62 75 66 20 3d 20  rn 0;.    buf = 
c4830 6d 61 6c 6c 6f 63 20 28 6c 65 6e 29 3b 0a 20 20  malloc (len);.  
c4840 20 20 70 5f 6f 75 74 20 3d 20 62 75 66 3b 0a 20    p_out = buf;. 
c4850 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69     for (i = 0; i
c4860 20 3c 20 69 6e 5f 6c 65 6e 3b 20 69 20 2b 3d 20   < in_len; i += 
c4870 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  2).      {..  if
c4880 20 28 21 70 61 72 73 65 48 65 78 42 79 74 65 20   (!parseHexByte 
c4890 28 69 6e 5b 69 5d 2c 20 69 6e 5b 69 20 2b 20 31  (in[i], in[i + 1
c48a0 5d 2c 20 26 62 79 74 65 76 61 6c 29 29 0a 09 20  ], &byteval)).. 
c48b0 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b       goto error;
c48c0 0a 09 20 20 2a 70 5f 6f 75 74 2b 2b 20 3d 20 62  ..  *p_out++ = b
c48d0 79 74 65 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  yteval;.      }.
c48e0 20 20 20 20 2a 6f 75 74 20 3d 20 62 75 66 3b 0a      *out = buf;.
c48f0 20 20 20 20 2a 6f 75 74 5f 6c 65 6e 20 3d 20 6c      *out_len = l
c4900 65 6e 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  en;.    return 1
c4910 3b 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 66  ;.  error:.    f
c4920 72 65 65 20 28 62 75 66 29 3b 0a 20 20 20 20 72  ree (buf);.    r
c4930 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
c4940 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 61 73  ic void.fnct_Cas
c4950 74 54 6f 42 6c 6f 62 20 28 73 71 6c 69 74 65 33  tToBlob (sqlite3
c4960 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
c4970 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
c4980 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
c4990 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
c49a0 6e 63 74 69 6f 6e 3a 0a 2f 20 43 61 73 74 54 6f  nction:./ CastTo
c49b0 42 6c 6f 62 28 67 65 6e 65 72 69 63 20 76 61 6c  Blob(generic val
c49c0 75 65 29 0a 2f 20 20 20 6f 72 0a 2f 20 43 61 73  ue)./   or./ Cas
c49d0 74 54 6f 42 6c 6f 62 28 67 65 6e 65 72 69 63 20  tToBlob(generic 
c49e0 76 61 6c 75 65 2c 20 62 6f 6f 6c 65 6e 20 68 65  value, boolen he
c49f0 78 5f 69 6e 70 75 74 29 0a 2f 0a 2f 20 72 65 74  x_input)././ ret
c4a00 75 72 6e 73 20 61 20 42 4c 4f 42 20 76 61 6c 75  urns a BLOB valu
c4a10 65 20 5b 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e  e [if conversion
c4a20 20 69 73 20 70 6f 73 73 69 62 6c 65 5d 20 0a 2f   is possible] ./
c4a30 20 6f 72 20 4e 55 4c 4c 20 69 6e 20 61 6e 79 20   or NULL in any 
c4a40 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
c4a50 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
c4a60 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
c4a70 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
c4a80 20 20 20 20 69 6e 74 20 69 73 5f 68 65 78 20 3d      int is_hex =
c4a90 20 30 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55   0;.    GAIA_UNU
c4aa0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
c4ab0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
c4ac0 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29    if (argc == 2)
c4ad0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
c4ae0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
c4af0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
c4b00 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
c4b10 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
c4b20 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c4b30 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
c4b40 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 73 5f 68  ;..    }..  is_h
c4b50 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ex = sqlite3_val
c4b60 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
c4b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
c4b80 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c4b90 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
c4ba0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
c4bb0 20 20 20 20 20 7b 0a 09 20 20 70 5f 62 6c 6f 62       {..  p_blob
c4bc0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c4bd0 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
c4be0 0a 09 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71  ..  n_bytes = sq
c4bf0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
c4c00 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20  s (argv[0]);..  
c4c10 69 66 20 28 69 73 5f 68 65 78 29 0a 09 20 20 20  if (is_hex)..   
c4c20 20 7b 0a 09 09 2f 2a 20 61 74 74 65 6d 70 74 69   {.../* attempti
c4c30 6e 67 20 74 6f 20 63 6f 6e 76 65 72 74 20 48 65  ng to convert He
c4c40 78 61 64 65 63 69 6d 61 6c 20 69 6e 70 75 74 20  xadecimal input 
c4c50 2a 2f 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68  */...unsigned ch
c4c60 61 72 20 2a 62 6c 6f 62 3b 0a 09 09 69 6e 74 20  ar *blob;...int 
c4c70 62 79 74 65 73 3b 0a 09 09 69 66 20 28 21 70 61  bytes;...if (!pa
c4c80 72 73 65 48 65 78 53 74 72 69 6e 67 20 28 70 5f  rseHexString (p_
c4c90 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26  blob, n_bytes, &
c4ca0 62 6c 6f 62 2c 20 26 62 79 74 65 73 29 29 0a 09  blob, &bytes))..
c4cb0 09 20 20 7b 0a 09 09 20 20 20 20 20 20 73 71 6c  .  {...      sql
c4cc0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
c4cd0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 20 20   (context);...  
c4ce0 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 09 20 20      return;...  
c4cf0 7d 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  }...sqlite3_resu
c4d00 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
c4d10 2c 20 62 6c 6f 62 2c 20 62 79 74 65 73 2c 20 66  , blob, bytes, f
c4d20 72 65 65 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ree);...return;.
c4d30 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65  .    }..  sqlite
c4d40 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
c4d50 6f 6e 74 65 78 74 2c 20 70 5f 62 6c 6f 62 2c 20  ontext, p_blob, 
c4d60 6e 5f 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  n_bytes, SQLITE_
c4d70 54 52 41 4e 53 49 45 4e 54 29 3b 0a 09 20 20 72  TRANSIENT);..  r
c4d80 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
c4d90 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
c4da0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
c4db0 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45  0]) == SQLITE_TE
c4dc0 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70  XT).      {..  p
c4dd0 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  _blob = sqlite3_
c4de0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
c4df0 5b 30 5d 29 3b 0a 09 20 20 6e 5f 62 79 74 65 73  [0]);..  n_bytes
c4e00 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c4e10 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
c4e20 3b 0a 09 20 20 69 66 20 28 69 73 5f 68 65 78 29  ;..  if (is_hex)
c4e30 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 61 74 74  ..    {.../* att
c4e40 65 6d 70 74 69 6e 67 20 74 6f 20 63 6f 6e 76 65  empting to conve
c4e50 72 74 20 48 65 78 61 64 65 63 69 6d 61 6c 20 69  rt Hexadecimal i
c4e60 6e 70 75 74 20 2a 2f 0a 09 09 75 6e 73 69 67 6e  nput */...unsign
c4e70 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 09  ed char *blob;..
c4e80 09 69 6e 74 20 62 79 74 65 73 3b 0a 09 09 69 66  .int bytes;...if
c4e90 20 28 21 70 61 72 73 65 48 65 78 53 74 72 69 6e   (!parseHexStrin
c4ea0 67 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  g (p_blob, n_byt
c4eb0 65 73 2c 20 26 62 6c 6f 62 2c 20 26 62 79 74 65  es, &blob, &byte
c4ec0 73 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  s))...  {...    
c4ed0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c4ee0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
c4ef0 0a 09 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ...      return;
c4f00 0a 09 09 20 20 7d 0a 09 09 73 71 6c 69 74 65 33  ...  }...sqlite3
c4f10 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
c4f20 6e 74 65 78 74 2c 20 62 6c 6f 62 2c 20 62 79 74  ntext, blob, byt
c4f30 65 73 2c 20 66 72 65 65 29 3b 0a 09 09 72 65 74  es, free);...ret
c4f40 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73  urn;..    }..  s
c4f50 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
c4f60 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 62  ob (context, p_b
c4f70 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 53 51  lob, n_bytes, SQ
c4f80 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
c4f90 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
c4fa0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
c4fb0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
c4fc0 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  text);.}..static
c4fd0 20 76 6f 69 64 0a 66 6e 63 74 5f 46 6f 72 63 65   void.fnct_Force
c4fe0 41 73 4e 75 6c 6c 20 28 73 71 6c 69 74 65 33 5f  AsNull (sqlite3_
c4ff0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
c5000 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
c5010 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
c5020 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
c5030 63 74 69 6f 6e 3a 0a 2f 20 46 6f 72 63 65 41 73  ction:./ ForceAs
c5040 4e 75 6c 6c 28 67 65 6e 65 72 69 63 20 76 61 6c  Null(generic val
c5050 31 2c 20 67 65 6e 65 72 69 63 20 76 61 6c 32 29  1, generic val2)
c5060 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 4e  ././ returns a N
c5070 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 76 61 6c  ULL value if val
c5080 31 20 61 6e 64 20 76 61 6c 32 20 61 72 65 20 65  1 and val2 are e
c5090 71 75 61 6c 20 0a 2f 20 28 61 6e 64 20 65 78 61  qual ./ (and exa
c50a0 63 74 6c 79 20 6f 66 20 74 68 65 20 73 61 6d 65  ctly of the same
c50b0 20 74 79 70 65 29 0a 2f 20 72 65 74 75 72 6e 20   type)./ return 
c50c0 76 61 6c 31 20 69 6e 20 61 6e 79 20 6f 74 68 65  val1 in any othe
c50d0 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 69 6e  r case.*/.    in
c50e0 74 20 74 79 70 65 31 3b 0a 20 20 20 20 69 6e 74  t type1;.    int
c50f0 20 74 79 70 65 32 3b 0a 20 20 20 20 63 6f 6e 73   type2;.    cons
c5100 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
c5110 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
c5120 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f   n_bytes;.    co
c5130 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c5140 72 20 2a 70 5f 62 6c 6f 62 32 3b 0a 20 20 20 20  r *p_blob2;.    
c5150 69 6e 74 20 6e 5f 62 79 74 65 73 32 3b 0a 20 20  int n_bytes2;.  
c5160 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
c5170 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
c5180 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 74 79 70 65  LINE */.    type
c5190 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
c51a0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
c51b0 3b 0a 20 20 20 20 74 79 70 65 32 20 3d 20 73 71  ;.    type2 = sq
c51c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c51d0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
c51e0 69 66 20 28 74 79 70 65 31 20 3d 3d 20 74 79 70  if (type1 == typ
c51f0 65 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  e2).      {..  s
c5200 77 69 74 63 68 20 28 74 79 70 65 31 29 0a 09 20  witch (type1).. 
c5210 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20 53     {..    case S
c5220 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 09  QLITE_INTEGER:..
c5230 09 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  .if (sqlite3_val
c5240 75 65 5f 69 6e 74 36 34 20 28 61 72 67 76 5b 30  ue_int64 (argv[0
c5250 5d 29 20 3d 3d 0a 09 09 20 20 20 20 73 71 6c 69  ]) ==...    sqli
c5260 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 20  te3_value_int64 
c5270 28 61 72 67 76 5b 31 5d 29 29 0a 09 09 20 20 7b  (argv[1]))...  {
c5280 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
c5290 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c52a0 6e 74 65 78 74 29 3b 0a 09 09 20 20 20 20 20 20  ntext);...      
c52b0 72 65 74 75 72 6e 3b 0a 09 09 20 20 7d 0a 09 09  return;...  }...
c52c0 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
c52d0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 09   SQLITE_FLOAT:..
c52e0 09 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  .if (sqlite3_val
c52f0 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
c5300 30 5d 29 20 3d 3d 0a 09 09 20 20 20 20 73 71 6c  0]) ==...    sql
c5310 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
c5320 65 20 28 61 72 67 76 5b 31 5d 29 29 0a 09 09 20  e (argv[1]))... 
c5330 20 7b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74   {...      sqlit
c5340 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
c5350 63 6f 6e 74 65 78 74 29 3b 0a 09 09 20 20 20 20  context);...    
c5360 20 20 72 65 74 75 72 6e 3b 0a 09 09 20 20 7d 0a    return;...  }.
c5370 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
c5380 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
c5390 09 09 70 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74  ..p_blob = sqlit
c53a0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
c53b0 72 67 76 5b 30 5d 29 3b 0a 09 09 6e 5f 62 79 74  rgv[0]);...n_byt
c53c0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
c53d0 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
c53e0 5d 29 3b 0a 09 09 70 5f 62 6c 6f 62 32 20 3d 20  ]);...p_blob2 = 
c53f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c5400 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09  xt (argv[1]);...
c5410 6e 5f 62 79 74 65 73 32 20 3d 20 73 71 6c 69 74  n_bytes2 = sqlit
c5420 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
c5430 61 72 67 76 5b 31 5d 29 3b 0a 09 09 69 66 20 28  argv[1]);...if (
c5440 6e 5f 62 79 74 65 73 20 3d 3d 20 6e 5f 62 79 74  n_bytes == n_byt
c5450 65 73 32 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  es2)...  {...   
c5460 20 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d     if (strcasecm
c5470 70 0a 09 09 09 20 20 28 28 63 6f 6e 73 74 20 63  p....  ((const c
c5480 68 61 72 20 2a 29 20 70 5f 62 6c 6f 62 2c 20 28  har *) p_blob, (
c5490 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 70 5f  const char *) p_
c54a0 62 6c 6f 62 32 29 20 3d 3d 20 30 29 0a 09 09 09  blob2) == 0)....
c54b0 7b 0a 09 09 09 20 20 20 20 73 71 6c 69 74 65 33  {....    sqlite3
c54c0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c54d0 6e 74 65 78 74 29 3b 0a 09 09 09 20 20 20 20 72  ntext);....    r
c54e0 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 09 09 20 20  eturn;....}...  
c54f0 7d 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  }...break;..    
c5500 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
c5510 3a 0a 09 09 70 5f 62 6c 6f 62 20 3d 20 73 71 6c  :...p_blob = sql
c5520 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
c5530 28 61 72 67 76 5b 30 5d 29 3b 0a 09 09 6e 5f 62  (argv[0]);...n_b
c5540 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
c5550 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
c5560 5b 30 5d 29 3b 0a 09 09 70 5f 62 6c 6f 62 32 20  [0]);...p_blob2 
c5570 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
c5580 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a  blob (argv[1]);.
c5590 09 09 6e 5f 62 79 74 65 73 32 20 3d 20 73 71 6c  ..n_bytes2 = sql
c55a0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
c55b0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 69 66   (argv[1]);...if
c55c0 20 28 6e 5f 62 79 74 65 73 20 3d 3d 20 6e 5f 62   (n_bytes == n_b
c55d0 79 74 65 73 32 29 0a 09 09 20 20 7b 0a 09 09 20  ytes2)...  {... 
c55e0 20 20 20 20 20 69 66 20 28 6d 65 6d 63 6d 70 20       if (memcmp 
c55f0 28 70 5f 62 6c 6f 62 2c 20 70 5f 62 6c 6f 62 32  (p_blob, p_blob2
c5600 2c 20 6e 5f 62 79 74 65 73 29 20 3d 3d 20 30 29  , n_bytes) == 0)
c5610 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 73 71 6c  ....{....    sql
c5620 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
c5630 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 09 20   (context);.... 
c5640 20 20 20 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a     return;....}.
c5650 09 09 20 20 7d 0a 09 09 62 72 65 61 6b 3b 0a 09  ..  }...break;..
c5660 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c5670 4e 55 4c 4c 3a 0a 09 09 73 71 6c 69 74 65 33 5f  NULL:...sqlite3_
c5680 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
c5690 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
c56a0 0a 09 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d  ..    };.      }
c56b0 0a 2f 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68  ./* returning th
c56c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c56d0 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 20 28   */.    switch (
c56e0 74 79 70 65 31 29 0a 20 20 20 20 20 20 7b 0a 20  type1).      {. 
c56f0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c5700 5f 49 4e 54 45 47 45 52 3a 0a 09 20 20 73 71 6c  _INTEGER:..  sql
c5710 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
c5720 34 20 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  4 (context, sqli
c5730 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 20  te3_value_int64 
c5740 28 61 72 67 76 5b 30 5d 29 29 3b 0a 09 20 20 62  (argv[0]));..  b
c5750 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c5760 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 09   SQLITE_FLOAT:..
c5770 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c5780 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74  _double (context
c5790 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
c57a0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29  double (argv[0])
c57b0 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  );..  break;.   
c57c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
c57d0 45 58 54 3a 0a 09 20 20 70 5f 62 6c 6f 62 20 3d  EXT:..  p_blob =
c57e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
c57f0 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  ext (argv[0]);..
c5800 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
c5810 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
c5820 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 73 71  (argv[0]);..  sq
c5830 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
c5840 74 20 28 63 6f 6e 74 65 78 74 2c 20 28 63 6f 6e  t (context, (con
c5850 73 74 20 63 68 61 72 20 2a 29 20 70 5f 62 6c 6f  st char *) p_blo
c5860 62 2c 20 6e 5f 62 79 74 65 73 2c 0a 09 09 09 20  b, n_bytes,.... 
c5870 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41        SQLITE_TRA
c5880 4e 53 49 45 4e 54 29 3b 0a 09 20 20 62 72 65 61  NSIENT);..  brea
c5890 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c58a0 4c 49 54 45 5f 42 4c 4f 42 3a 0a 09 20 20 70 5f  LITE_BLOB:..  p_
c58b0 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  blob = sqlite3_v
c58c0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
c58d0 30 5d 29 3b 0a 09 20 20 6e 5f 62 79 74 65 73 20  0]);..  n_bytes 
c58e0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
c58f0 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
c5900 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
c5910 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
c5920 2c 20 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65  , p_blob, n_byte
c5930 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
c5940 45 4e 54 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  ENT);..  break;.
c5950 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09        default:..
c5960 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c5970 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
c5980 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
c5990 20 7d 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   };.}..static vo
c59a0 69 64 0a 66 6e 63 74 5f 43 72 65 61 74 65 55 55  id.fnct_CreateUU
c59b0 49 44 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ID (sqlite3_cont
c59c0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
c59d0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
c59e0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
c59f0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
c5a00 6e 3a 0a 2f 20 43 72 65 61 74 65 55 55 49 44 28  n:./ CreateUUID(
c5a10 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20  )././ returns a 
c5a20 54 45 58 54 20 76 61 6c 75 65 20 63 6f 6e 74 61  TEXT value conta
c5a30 69 6e 69 6e 67 20 61 6e 20 55 55 49 44 0a 2f 20  ining an UUID./ 
c5a40 5b 78 78 78 78 78 78 78 78 2d 78 78 78 78 2d 78  [xxxxxxxx-xxxx-x
c5a50 78 78 78 2d 78 78 78 78 2d 78 78 78 78 78 78 78  xxx-xxxx-xxxxxxx
c5a60 78 78 78 78 78 78 78 78 78 5d 0a 2a 2f 0a 20 20  xxxxxxxxx].*/.  
c5a70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c5a80 72 6e 64 5b 31 36 5d 3b 0a 20 20 20 20 63 68 61  rnd[16];.    cha
c5a90 72 20 75 75 69 64 5b 36 34 5d 3b 0a 20 20 20 20  r uuid[64];.    
c5aa0 63 68 61 72 20 2a 70 20 3d 20 75 75 69 64 3b 0a  char *p = uuid;.
c5ab0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 47      int i;.    G
c5ac0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
c5ad0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
c5ae0 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  E */.    sqlite3
c5af0 5f 72 61 6e 64 6f 6d 6e 65 73 73 20 28 31 36 2c  _randomness (16,
c5b00 20 72 6e 64 29 3b 0a 20 20 20 20 66 6f 72 20 28   rnd);.    for (
c5b10 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69  i = 0; i < 16; i
c5b20 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ++).      {..  i
c5b30 66 20 28 69 20 3d 3d 20 34 20 7c 7c 20 69 20 3d  f (i == 4 || i =
c5b40 3d 20 36 20 7c 7c 20 69 20 3d 3d 20 38 20 7c 7c  = 6 || i == 8 ||
c5b50 20 69 20 3d 3d 20 31 30 29 0a 09 20 20 20 20 20   i == 10)..     
c5b60 20 2a 70 2b 2b 20 3d 20 27 2d 27 3b 0a 09 20 20   *p++ = '-';..  
c5b70 73 70 72 69 6e 74 66 20 28 70 2c 20 22 25 30 32  sprintf (p, "%02
c5b80 78 22 2c 20 72 6e 64 5b 69 5d 29 3b 0a 09 20 20  x", rnd[i]);..  
c5b90 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a  p += 2;.      }.
c5ba0 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20      *p = '\0';. 
c5bb0 20 20 20 75 75 69 64 5b 31 34 5d 20 3d 20 27 34     uuid[14] = '4
c5bc0 27 3b 0a 20 20 20 20 75 75 69 64 5b 31 39 5d 20  ';.    uuid[19] 
c5bd0 3d 20 27 38 27 3b 0a 20 20 20 20 73 71 6c 69 74  = '8';.    sqlit
c5be0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28  e3_result_text (
c5bf0 63 6f 6e 74 65 78 74 2c 20 75 75 69 64 2c 20 73  context, uuid, s
c5c00 74 72 6c 65 6e 20 28 75 75 69 64 29 2c 20 53 51  trlen (uuid), SQ
c5c10 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
c5c20 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
c5c30 66 6e 63 74 5f 4d 44 35 43 68 65 63 6b 73 75 6d  fnct_MD5Checksum
c5c40 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
c5c50 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
c5c60 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
c5c70 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
c5c80 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
c5c90 0a 2f 20 4d 44 35 43 68 65 63 6b 73 75 6d 28 62  ./ MD5Checksum(b
c5ca0 6c 6f 62 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  lob)././ returns
c5cb0 20 61 20 54 45 58 54 20 76 61 6c 75 65 20 63 6f   a TEXT value co
c5cc0 6e 74 61 69 6e 69 6e 67 20 61 6e 20 68 65 78 20  ntaining an hex 
c5cd0 4d 44 35 20 63 68 65 63 6b 73 75 6d 0a 2f 20 5b  MD5 checksum./ [
c5ce0 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78  xxxxxxxxxxxxxxxx
c5cf0 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78  xxxxxxxxxxxxxxxx
c5d00 78 78 78 78 5d 0a 2f 20 20 20 20 20 20 6f 72 0a  xxxx]./      or.
c5d10 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69  / NULL on invali
c5d20 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
c5d30 20 20 20 76 6f 69 64 20 2a 6d 64 35 3b 0a 20 20     void *md5;.  
c5d40 20 20 63 68 61 72 20 2a 63 68 65 63 6b 73 75 6d    char *checksum
c5d50 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
c5d60 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
c5d70 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 6c 65  .    int blob_le
c5d80 6e 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  n;.    GAIA_UNUS
c5d90 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
c5da0 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20  EXCL_LINE */..  
c5db0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
c5dc0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c5dd0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) == SQLITE_BLO
c5de0 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 62 6c  B).      {..  bl
c5df0 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
c5e00 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
c5e10 29 3b 0a 09 20 20 62 6c 6f 62 5f 6c 65 6e 20 3d  );..  blob_len =
c5e20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
c5e30 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
c5e40 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
c5e50 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
c5e60 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
c5e70 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
c5e80 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 62 6c 6f  ).      {..  blo
c5e90 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
c5ea0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
c5eb0 3b 0a 09 20 20 62 6c 6f 62 5f 6c 65 6e 20 3d 20  ;..  blob_len = 
c5ec0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
c5ed0 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
c5ee0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
c5ef0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
c5f00 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
c5f10 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
c5f20 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20  urn;.      }./* 
c5f30 63 72 65 61 74 69 6e 67 20 61 6e 20 4d 44 35 20  creating an MD5 
c5f40 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6d 64  object */.    md
c5f50 35 20 3d 20 67 61 69 61 43 72 65 61 74 65 4d 44  5 = gaiaCreateMD
c5f60 35 43 68 65 63 6b 73 75 6d 20 28 29 3b 0a 2f 2a  5Checksum ();./*
c5f70 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
c5f80 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 67 61 69 61  BLOB */.    gaia
c5f90 55 70 64 61 74 65 4d 44 35 43 68 65 63 6b 73 75  UpdateMD5Checksu
c5fa0 6d 20 28 6d 64 35 2c 20 62 6c 6f 62 2c 20 62 6c  m (md5, blob, bl
c5fb0 6f 62 5f 6c 65 6e 29 3b 0a 20 20 20 20 63 68 65  ob_len);.    che
c5fc0 63 6b 73 75 6d 20 3d 20 67 61 69 61 46 69 6e 61  cksum = gaiaFina
c5fd0 6c 69 7a 65 4d 44 35 43 68 65 63 6b 73 75 6d 20  lizeMD5Checksum 
c5fe0 28 6d 64 35 29 3b 0a 20 20 20 20 67 61 69 61 46  (md5);.    gaiaF
c5ff0 72 65 65 4d 44 35 43 68 65 63 6b 73 75 6d 20 28  reeMD5Checksum (
c6000 6d 64 35 29 3b 0a 20 20 20 20 69 66 20 28 63 68  md5);.    if (ch
c6010 65 63 6b 73 75 6d 20 3d 3d 20 4e 55 4c 4c 29 0a  ecksum == NULL).
c6020 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
c6030 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
c6040 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65      else..sqlite
c6050 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63  3_result_text (c
c6060 6f 6e 74 65 78 74 2c 20 63 68 65 63 6b 73 75 6d  ontext, checksum
c6070 2c 20 73 74 72 6c 65 6e 20 28 63 68 65 63 6b 73  , strlen (checks
c6080 75 6d 29 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73  um), free);.}..s
c6090 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
c60a0 4d 44 35 54 6f 74 61 6c 43 68 65 63 6b 73 75 6d  MD5TotalChecksum
c60b0 5f 73 74 65 70 20 28 73 71 6c 69 74 65 33 5f 63  _step (sqlite3_c
c60c0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
c60d0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
c60e0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
c60f0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
c6100 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d  QL function:./ M
c6110 44 35 54 6f 74 61 6c 43 68 65 63 6b 73 75 6d 28  D5TotalChecksum(
c6120 42 4c 4f 42 29 0a 2f 0a 2f 20 61 67 67 72 65 67  BLOB)././ aggreg
c6130 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20 53  ate function - S
c6140 54 45 50 0a 2f 0a 2a 2f 0a 20 20 20 20 76 6f 69  TEP./.*/.    voi
c6150 64 20 2a 2a 70 3b 0a 20 20 20 20 76 6f 69 64 20  d **p;.    void 
c6160 2a 6d 64 35 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *md5;.    const 
c6170 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c6180 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f  lob;.    int blo
c6190 62 5f 6c 65 6e 3b 0a 20 20 20 20 47 41 49 41 5f  b_len;.    GAIA_
c61a0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
c61b0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
c61c0 0a 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ..    if (sqlite
c61d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
c61e0 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
c61f0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
c6200 20 20 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33    blob = sqlite3
c6210 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
c6220 76 5b 30 5d 29 3b 0a 09 20 20 62 6c 6f 62 5f 6c  v[0]);..  blob_l
c6230 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  en = sqlite3_val
c6240 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
c6250 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
c6260 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
c6270 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c6280 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c6290 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
c62a0 20 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f   blob = sqlite3_
c62b0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
c62c0 5b 30 5d 29 3b 0a 09 20 20 62 6c 6f 62 5f 6c 65  [0]);..  blob_le
c62d0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
c62e0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
c62f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  );.      }.    e
c6300 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
c6310 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
c6320 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
c6330 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
c6340 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
c6350 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
c6360 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  xt (context, siz
c6370 65 6f 66 20 28 76 6f 69 64 20 2a 29 29 3b 0a 20  eof (void *));. 
c6380 20 20 20 69 66 20 28 21 28 2a 70 29 29 0a 20 20     if (!(*p)).  
c6390 20 20 20 20 7b 0a 09 20 20 2f 2a 20 74 68 69 73      {..  /* this
c63a0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 6f   is the first ro
c63b0 77 20 2d 20 63 72 65 61 74 69 6e 67 20 61 6e 20  w - creating an 
c63c0 4d 44 35 20 6f 62 6a 65 63 74 20 2a 2f 0a 09 20  MD5 object */.. 
c63d0 20 6d 64 35 20 3d 20 67 61 69 61 43 72 65 61 74   md5 = gaiaCreat
c63e0 65 4d 44 35 43 68 65 63 6b 73 75 6d 20 28 29 3b  eMD5Checksum ();
c63f0 0a 09 20 20 67 61 69 61 55 70 64 61 74 65 4d 44  ..  gaiaUpdateMD
c6400 35 43 68 65 63 6b 73 75 6d 20 28 6d 64 35 2c 20  5Checksum (md5, 
c6410 62 6c 6f 62 2c 20 62 6c 6f 62 5f 6c 65 6e 29 3b  blob, blob_len);
c6420 0a 09 20 20 2a 70 20 3d 20 6d 64 35 3b 0a 20 20  ..  *p = md5;.  
c6430 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
c6440 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 75 62       {..  /* sub
c6450 73 65 71 75 65 6e 74 20 72 6f 77 73 20 2a 2f 0a  sequent rows */.
c6460 09 20 20 6d 64 35 20 3d 20 2a 70 3b 0a 09 20 20  .  md5 = *p;..  
c6470 67 61 69 61 55 70 64 61 74 65 4d 44 35 43 68 65  gaiaUpdateMD5Che
c6480 63 6b 73 75 6d 20 28 6d 64 35 2c 20 62 6c 6f 62  cksum (md5, blob
c6490 2c 20 62 6c 6f 62 5f 6c 65 6e 29 3b 0a 20 20 20  , blob_len);.   
c64a0 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76     }.}..static v
c64b0 6f 69 64 0a 66 6e 63 74 5f 4d 44 35 54 6f 74 61  oid.fnct_MD5Tota
c64c0 6c 43 68 65 63 6b 73 75 6d 5f 66 69 6e 61 6c 20  lChecksum_final 
c64d0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c64e0 20 2a 20 63 6f 6e 74 65 78 74 29 0a 7b 0a 2f 2a   * context).{./*
c64f0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
c6500 20 4d 44 35 54 6f 74 61 6c 43 68 65 63 6b 73 75   MD5TotalChecksu
c6510 6d 28 42 4c 4f 42 29 0a 2f 0a 2f 20 61 67 67 72  m(BLOB)././ aggr
c6520 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d  egate function -
c6530 20 46 49 4e 41 4c 0a 2f 0a 2a 2f 0a 20 20 20 20   FINAL./.*/.    
c6540 76 6f 69 64 20 2a 2a 70 3b 0a 20 20 20 20 76 6f  void **p;.    vo
c6550 69 64 20 2a 6d 64 35 3b 0a 20 20 20 20 63 68 61  id *md5;.    cha
c6560 72 20 2a 63 68 65 63 6b 73 75 6d 3b 0a 20 20 20  r *checksum;.   
c6570 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
c6580 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28  regate_context (
c6590 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  context, 0);.   
c65a0 20 69 66 20 28 21 28 2a 70 29 29 0a 20 20 20 20   if (!(*p)).    
c65b0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
c65c0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
c65d0 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
c65e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6d 64 35  .      }.    md5
c65f0 20 3d 20 2a 70 3b 0a 20 20 20 20 63 68 65 63 6b   = *p;.    check
c6600 73 75 6d 20 3d 20 67 61 69 61 46 69 6e 61 6c 69  sum = gaiaFinali
c6610 7a 65 4d 44 35 43 68 65 63 6b 73 75 6d 20 28 6d  zeMD5Checksum (m
c6620 64 35 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65  d5);.    gaiaFre
c6630 65 4d 44 35 43 68 65 63 6b 73 75 6d 20 28 6d 64  eMD5Checksum (md
c6640 35 29 3b 0a 20 20 20 20 69 66 20 28 63 68 65 63  5);.    if (chec
c6650 6b 73 75 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73  ksum == NULL)..s
c6660 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
c6670 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
c6680 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
c6690 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e  result_text (con
c66a0 74 65 78 74 2c 20 63 68 65 63 6b 73 75 6d 2c 20  text, checksum, 
c66b0 73 74 72 6c 65 6e 20 28 63 68 65 63 6b 73 75 6d  strlen (checksum
c66c0 29 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 23 69 66  ), free);.}..#if
c66d0 20 4f 4d 49 54 5f 49 43 4f 4e 56 20 3d 3d 20 30   OMIT_ICONV == 0
c66e0 09 09 2f 2a 20 49 43 4f 4e 56 20 69 73 20 61 62  ../* ICONV is ab
c66f0 73 6f 6c 75 74 65 6c 79 20 72 65 71 75 69 72 65  solutely require
c6700 64 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  d */..static voi
c6710 64 0a 66 6e 63 74 5f 45 6e 63 6f 64 65 55 52 4c  d.fnct_EncodeURL
c6720 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
c6730 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
c6740 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
c6750 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
c6760 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
c6770 0a 2f 20 45 6e 63 6f 64 65 55 52 4c 28 74 65 78  ./ EncodeURL(tex
c6780 74 20 75 72 6c 29 0a 2f 20 20 20 6f 72 0a 2f 20  t url)./   or./ 
c6790 45 6e 63 6f 64 65 55 52 4c 28 74 65 78 74 20 75  EncodeURL(text u
c67a0 72 6c 2c 20 74 65 78 74 20 6f 75 74 5f 63 68 61  rl, text out_cha
c67b0 72 73 65 74 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  rset)././ return
c67c0 73 20 61 20 54 45 58 54 20 76 61 6c 75 65 20 63  s a TEXT value c
c67d0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 65  ontaining the pe
c67e0 72 63 65 6e 74 2d 65 6e 63 6f 64 65 64 20 55 52  rcent-encoded UR
c67f0 4c 0a 2f 20 20 20 20 20 20 6f 72 0a 2f 20 4e 55  L./      or./ NU
c6800 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  LL on invalid ar
c6810 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 63  guments.*/.    c
c6820 6f 6e 73 74 20 63 68 61 72 20 2a 75 72 6c 3b 0a  onst char *url;.
c6830 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c6840 6f 75 74 5f 63 68 61 72 73 65 74 20 3d 20 22 55  out_charset = "U
c6850 54 46 2d 38 22 3b 0a 20 20 20 20 63 68 61 72 20  TF-8";.    char 
c6860 2a 65 6e 63 6f 64 65 64 3b 0a 20 20 20 20 47 41  *encoded;.    GA
c6870 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
c6880 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
c6890 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 71 6c   */..    if (sql
c68a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
c68b0 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
c68c0 49 54 45 5f 54 45 58 54 29 0a 09 75 72 6c 20 3d  ITE_TEXT)..url =
c68d0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
c68e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c68f0 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
c6900 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
c6910 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c6920 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
c6930 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
c6940 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
c6950 20 3e 20 31 29 0a 20 20 20 20 20 20 7b 0a 09 20   > 1).      {.. 
c6960 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
c6970 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
c6980 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
c6990 29 0a 09 20 20 20 20 20 20 6f 75 74 5f 63 68 61  )..      out_cha
c69a0 72 73 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rset = (const ch
c69b0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
c69c0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
c69d0 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  ]);..  else..   
c69e0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
c69f0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
c6a00 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
c6a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 2f 2a 20     }.      }./* 
c6a20 65 6e 63 6f 64 69 6e 67 20 74 68 65 20 55 52 4c  encoding the URL
c6a30 20 2a 2f 0a 20 20 20 20 65 6e 63 6f 64 65 64 20   */.    encoded 
c6a40 3d 20 67 61 69 61 45 6e 63 6f 64 65 55 52 4c 20  = gaiaEncodeURL 
c6a50 28 75 72 6c 2c 20 6f 75 74 5f 63 68 61 72 73 65  (url, out_charse
c6a60 74 29 3b 0a 20 20 20 20 69 66 20 28 65 6e 63 6f  t);.    if (enco
c6a70 64 65 64 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71  ded == NULL)..sq
c6a80 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
c6a90 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
c6aa0 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
c6ab0 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74  esult_text (cont
c6ac0 65 78 74 2c 20 65 6e 63 6f 64 65 64 2c 20 73 74  ext, encoded, st
c6ad0 72 6c 65 6e 20 28 65 6e 63 6f 64 65 64 29 2c 20  rlen (encoded), 
c6ae0 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  free);.}..static
c6af0 20 76 6f 69 64 0a 66 6e 63 74 5f 44 65 63 6f 64   void.fnct_Decod
c6b00 65 55 52 4c 20 28 73 71 6c 69 74 65 33 5f 63 6f  eURL (sqlite3_co
c6b10 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
c6b20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
c6b30 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
c6b40 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
c6b50 69 6f 6e 3a 0a 2f 20 44 65 63 6f 64 65 55 52 4c  ion:./ DecodeURL
c6b60 28 74 65 78 74 29 0a 2f 20 20 20 6f 72 0a 2f 20  (text)./   or./ 
c6b70 44 65 63 6f 64 65 55 52 4c 28 74 65 78 74 20 75  DecodeURL(text u
c6b80 72 6c 2c 20 74 65 78 74 20 69 6e 5f 63 68 61 72  rl, text in_char
c6b90 73 65 74 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  set)././ returns
c6ba0 20 61 20 54 45 58 54 20 76 61 6c 75 65 20 63 6f   a TEXT value co
c6bb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 55 52 4c  ntaining the URL
c6bc0 20 63 6c 65 61 6e 65 64 20 66 72 6f 6d 20 70 65   cleaned from pe
c6bd0 72 63 65 6e 74 2d 65 6e 63 6f 64 69 6e 67 0a 2f  rcent-encoding./
c6be0 20 20 20 20 20 20 6f 72 0a 2f 20 4e 55 4c 4c 20        or./ NULL 
c6bf0 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
c6c00 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 63 68 61 72  ents.*/.    char
c6c10 20 2a 75 72 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *url;.    const
c6c20 20 63 68 61 72 20 2a 65 6e 63 6f 64 65 64 3b 0a   char *encoded;.
c6c30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c6c40 69 6e 5f 63 68 61 72 73 65 74 20 3d 20 22 55 54  in_charset = "UT
c6c50 46 2d 38 22 3b 0a 20 20 20 20 47 41 49 41 5f 55  F-8";.    GAIA_U
c6c60 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
c6c70 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
c6c80 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
c6c90 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c6ca0 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c6cb0 54 45 58 54 29 0a 09 65 6e 63 6f 64 65 64 20 3d  TEXT)..encoded =
c6cc0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
c6cd0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c6ce0 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
c6cf0 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
c6d00 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c6d10 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
c6d20 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
c6d30 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
c6d40 20 3e 20 31 29 0a 20 20 20 20 20 20 7b 0a 09 20   > 1).      {.. 
c6d50 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
c6d60 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
c6d70 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
c6d80 29 0a 09 20 20 20 20 20 20 69 6e 5f 63 68 61 72  )..      in_char
c6d90 73 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  set = (const cha
c6da0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
c6db0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
c6dc0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
c6dd0 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
c6de0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
c6df0 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
c6e00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 64    }.      }./* d
c6e10 65 63 6f 64 69 6e 67 20 74 68 65 20 55 52 4c 20  ecoding the URL 
c6e20 2a 2f 0a 20 20 20 20 75 72 6c 20 3d 20 67 61 69  */.    url = gai
c6e30 61 44 65 63 6f 64 65 55 52 4c 20 28 65 6e 63 6f  aDecodeURL (enco
c6e40 64 65 64 2c 20 69 6e 5f 63 68 61 72 73 65 74 29  ded, in_charset)
c6e50 3b 0a 20 20 20 20 69 66 20 28 75 72 6c 20 3d 3d  ;.    if (url ==
c6e60 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f   NULL)..sqlite3_
c6e70 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
c6e80 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
c6e90 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
c6ea0 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 75  text (context, u
c6eb0 72 6c 2c 20 73 74 72 6c 65 6e 20 28 75 72 6c 29  rl, strlen (url)
c6ec0 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 23 65 6e 64  , free);.}..#end
c6ed0 69 66 20 2f 2a 20 49 43 4f 4e 56 20 65 6e 61 62  if /* ICONV enab
c6ee0 6c 65 64 2f 64 69 73 61 62 6c 65 64 20 2a 2f 0a  led/disabled */.
c6ef0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
c6f00 74 5f 44 69 72 4e 61 6d 65 46 72 6f 6d 50 61 74  t_DirNameFromPat
c6f10 68 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  h (sqlite3_conte
c6f20 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
c6f30 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20  t argc,...      
c6f40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c6f50 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
c6f60 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 44 69 72 4e  function:./ DirN
c6f70 61 6d 65 46 72 6f 6d 50 61 74 68 28 74 65 78 74  ameFromPath(text
c6f80 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20  )././ returns a 
c6f90 54 45 58 54 20 76 61 6c 75 65 20 63 6f 6e 74 61  TEXT value conta
c6fa0 69 6e 69 6e 67 20 74 68 65 20 44 69 72 65 63 74  ining the Direct
c6fb0 6f 72 79 20 4e 61 6d 65 20 66 72 6f 6d 20 61 20  ory Name from a 
c6fc0 50 61 74 68 0a 2f 20 20 20 20 20 20 6f 72 0a 2f  Path./      or./
c6fd0 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64   NULL on invalid
c6fe0 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
c6ff0 20 20 63 68 61 72 20 2a 64 69 72 3b 0a 20 20 20    char *dir;.   
c7000 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
c7010 68 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  h;.    GAIA_UNUS
c7020 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
c7030 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20  EXCL_LINE */..  
c7040 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
c7050 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c7060 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) == SQLITE_TEX
c7070 54 29 0a 09 70 61 74 68 20 3d 20 28 63 6f 6e 73  T)..path = (cons
c7080 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
c7090 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
c70a0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[0]);.    else
c70b0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
c70c0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
c70d0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
c70e0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a  turn;.      }./*
c70f0 20 62 72 65 61 6b 69 6e 67 20 74 68 65 20 50 61   breaking the Pa
c7100 74 68 20 2a 2f 0a 20 20 20 20 64 69 72 20 3d 20  th */.    dir = 
c7110 67 61 69 61 44 69 72 4e 61 6d 65 46 72 6f 6d 50  gaiaDirNameFromP
c7120 61 74 68 20 28 70 61 74 68 29 3b 0a 20 20 20 20  ath (path);.    
c7130 69 66 20 28 64 69 72 20 3d 3d 20 4e 55 4c 4c 29  if (dir == NULL)
c7140 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
c7150 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
c7160 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
c7170 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28  e3_result_text (
c7180 63 6f 6e 74 65 78 74 2c 20 64 69 72 2c 20 73 74  context, dir, st
c7190 72 6c 65 6e 20 28 64 69 72 29 2c 20 66 72 65 65  rlen (dir), free
c71a0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
c71b0 64 0a 66 6e 63 74 5f 46 75 6c 6c 46 69 6c 65 4e  d.fnct_FullFileN
c71c0 61 6d 65 46 72 6f 6d 50 61 74 68 20 28 73 71 6c  ameFromPath (sql
c71d0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
c71e0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
c71f0 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f  ,....   sqlite3_
c7200 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
c7210 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
c7220 3a 0a 2f 20 46 75 6c 6c 46 69 6c 65 4e 61 6d 65  :./ FullFileName
c7230 46 72 6f 6d 50 61 74 68 28 74 65 78 74 29 0a 2f  FromPath(text)./
c7240 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 54 45 58  ./ returns a TEX
c7250 54 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 69  T value containi
c7260 6e 67 20 74 68 65 20 46 75 6c 6c 20 46 69 6c 65  ng the Full File
c7270 4e 61 6d 65 20 28 69 6e 63 6c 75 64 69 6e 67 20  Name (including 
c7280 65 78 74 65 6e 73 69 6f 6e 29 0a 2f 20 66 72 6f  extension)./ fro
c7290 6d 20 61 20 50 61 74 68 0a 2f 20 20 20 20 20 20  m a Path./      
c72a0 6f 72 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76  or./ NULL on inv
c72b0 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
c72c0 2f 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65  /.    char *name
c72d0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c72e0 20 2a 70 61 74 68 3b 0a 20 20 20 20 47 41 49 41   *path;.    GAIA
c72f0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
c7300 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
c7310 2f 0a 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  /..    if (sqlit
c7320 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c7330 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
c7340 45 5f 54 45 58 54 29 0a 09 70 61 74 68 20 3d 20  E_TEXT)..path = 
c7350 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
c7360 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
c7370 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
c7380 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
c7390 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c73a0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
c73b0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
c73c0 20 7d 0a 2f 2a 20 62 72 65 61 6b 69 6e 67 20 74   }./* breaking t
c73d0 68 65 20 50 61 74 68 20 2a 2f 0a 20 20 20 20 6e  he Path */.    n
c73e0 61 6d 65 20 3d 20 67 61 69 61 46 75 6c 6c 46 69  ame = gaiaFullFi
c73f0 6c 65 4e 61 6d 65 46 72 6f 6d 50 61 74 68 20 28  leNameFromPath (
c7400 70 61 74 68 29 3b 0a 20 20 20 20 69 66 20 28 6e  path);.    if (n
c7410 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71  ame == NULL)..sq
c7420 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
c7430 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
c7440 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
c7450 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74  esult_text (cont
c7460 65 78 74 2c 20 6e 61 6d 65 2c 20 73 74 72 6c 65  ext, name, strle
c7470 6e 20 28 6e 61 6d 65 29 2c 20 66 72 65 65 29 3b  n (name), free);
c7480 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
c7490 66 6e 63 74 5f 46 69 6c 65 4e 61 6d 65 46 72 6f  fnct_FileNameFro
c74a0 6d 50 61 74 68 20 28 73 71 6c 69 74 65 33 5f 63  mPath (sqlite3_c
c74b0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
c74c0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20  , int argc,...  
c74d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
c74e0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
c74f0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
c7500 20 46 69 6c 65 4e 61 6d 65 46 72 6f 6d 50 61 74   FileNameFromPat
c7510 68 28 74 65 78 74 29 0a 2f 0a 2f 20 72 65 74 75  h(text)././ retu
c7520 72 6e 73 20 61 20 54 45 58 54 20 76 61 6c 75 65  rns a TEXT value
c7530 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c7540 46 69 6c 65 4e 61 6d 65 20 28 65 78 63 6c 75 64  FileName (exclud
c7550 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 29 0a 2f  ing extension)./
c7560 20 66 72 6f 6d 20 61 20 50 61 74 68 0a 2f 20 20   from a Path./  
c7570 20 20 20 20 6f 72 0a 2f 20 4e 55 4c 4c 20 6f 6e      or./ NULL on
c7580 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
c7590 74 73 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ts.*/.    char *
c75a0 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  name;.    const 
c75b0 63 68 61 72 20 2a 70 61 74 68 3b 0a 20 20 20 20  char *path;.    
c75c0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
c75d0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
c75e0 4e 45 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73  NE */..    if (s
c75f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
c7600 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
c7610 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 70 61 74  QLITE_TEXT)..pat
c7620 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  h = (const char 
c7630 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
c7640 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
c7650 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
c7660 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
c7670 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
c7680 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
c7690 20 20 20 20 20 7d 0a 2f 2a 20 62 72 65 61 6b 69       }./* breaki
c76a0 6e 67 20 74 68 65 20 50 61 74 68 20 2a 2f 0a 20  ng the Path */. 
c76b0 20 20 20 6e 61 6d 65 20 3d 20 67 61 69 61 46 69     name = gaiaFi
c76c0 6c 65 4e 61 6d 65 46 72 6f 6d 50 61 74 68 20 28  leNameFromPath (
c76d0 70 61 74 68 29 3b 0a 20 20 20 20 69 66 20 28 6e  path);.    if (n
c76e0 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71  ame == NULL)..sq
c76f0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
c7700 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
c7710 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
c7720 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74  esult_text (cont
c7730 65 78 74 2c 20 6e 61 6d 65 2c 20 73 74 72 6c 65  ext, name, strle
c7740 6e 20 28 6e 61 6d 65 29 2c 20 66 72 65 65 29 3b  n (name), free);
c7750 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
c7760 66 6e 63 74 5f 46 69 6c 65 45 78 74 46 72 6f 6d  fnct_FileExtFrom
c7770 50 61 74 68 20 28 73 71 6c 69 74 65 33 5f 63 6f  Path (sqlite3_co
c7780 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
c7790 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
c77a0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
c77b0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
c77c0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 46  QL function:./ F
c77d0 69 6c 65 45 78 74 46 72 6f 6d 50 61 74 68 28 74  ileExtFromPath(t
c77e0 65 78 74 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  ext)././ returns
c77f0 20 61 20 54 45 58 54 20 76 61 6c 75 65 20 63 6f   a TEXT value co
c7800 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 45 78 74  ntaining the Ext
c7810 65 6e 73 69 6f 6e 20 28 69 66 20 61 6e 79 29 20  ension (if any) 
c7820 66 72 6f 6d 20 61 20 50 61 74 68 0a 2f 20 20 20  from a Path./   
c7830 20 20 20 6f 72 0a 2f 20 4e 55 4c 4c 20 6f 6e 20     or./ NULL on 
c7840 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
c7850 73 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 65  s.*/.    char *e
c7860 78 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  xt;.    const ch
c7870 61 72 20 2a 70 61 74 68 3b 0a 20 20 20 20 47 41  ar *path;.    GA
c7880 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
c7890 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
c78a0 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 71 6c   */..    if (sql
c78b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
c78c0 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
c78d0 49 54 45 5f 54 45 58 54 29 0a 09 70 61 74 68 20  ITE_TEXT)..path 
c78e0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
c78f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
c7900 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
c7910 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
c7920 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
c7930 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
c7940 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
c7950 20 20 20 7d 0a 2f 2a 20 62 72 65 61 6b 69 6e 67     }./* breaking
c7960 20 74 68 65 20 50 61 74 68 20 2a 2f 0a 20 20 20   the Path */.   
c7970 20 65 78 74 20 3d 20 67 61 69 61 46 69 6c 65 45   ext = gaiaFileE
c7980 78 74 46 72 6f 6d 50 61 74 68 20 28 70 61 74 68  xtFromPath (path
c7990 29 3b 0a 20 20 20 20 69 66 20 28 65 78 74 20 3d  );.    if (ext =
c79a0 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
c79b0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c79c0 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
c79d0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
c79e0 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
c79f0 65 78 74 2c 20 73 74 72 6c 65 6e 20 28 65 78 74  ext, strlen (ext
c7a00 29 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61  ), free);.}..sta
c7a10 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6d 61  tic void.fnct_ma
c7a20 6b 65 5f 73 74 72 69 6e 67 5f 6c 69 73 74 5f 73  ke_string_list_s
c7a30 74 65 70 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep (sqlite3_con
c7a40 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
c7a50 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  int argc,....   
c7a60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c7a70 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
c7a80 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 61 6b   function:./ Mak
c7a90 65 53 74 72 69 6e 67 4c 69 73 74 28 58 29 0a 2f  eStringList(X)./
c7aa0 20 4d 61 6b 65 53 74 72 69 6e 67 4c 69 73 74 28   MakeStringList(
c7ab0 58 2c 20 73 65 70 61 72 61 74 6f 72 29 0a 2f 0a  X, separator)./.
c7ac0 2f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  / aggregate func
c7ad0 74 69 6f 6e 20 2d 20 53 54 45 50 0a 2f 0a 2a 2f  tion - STEP./.*/
c7ae0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 72 69  .    struct stri
c7af0 6e 67 5f 6c 69 73 74 5f 73 74 72 20 2a 70 3b 0a  ng_list_str *p;.
c7b00 20 20 20 20 63 68 61 72 20 62 75 66 5b 31 30 32      char buf[102
c7b10 34 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  4];.    const ch
c7b20 61 72 20 2a 73 74 72 20 3d 20 62 75 66 3b 0a 20  ar *str = buf;. 
c7b30 20 20 20 63 68 61 72 20 73 65 70 61 72 61 74 6f     char separato
c7b40 72 20 3d 20 27 2c 27 3b 0a 20 20 20 20 47 41 49  r = ',';.    GAI
c7b50 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
c7b60 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
c7b70 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
c7b80 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c7b90 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
c7ba0 45 5f 54 45 58 54 29 0a 09 73 74 72 20 3d 20 28  E_TEXT)..str = (
c7bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
c7bc0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c7bd0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
c7be0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
c7bf0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c7c00 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c7c10 49 4e 54 45 47 45 52 29 0a 23 69 66 20 64 65 66  INTEGER).#if def
c7c20 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20  ined(_WIN32) && 
c7c30 21 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57  !defined(__MINGW
c7c40 33 32 5f 5f 29 0a 09 73 70 72 69 6e 74 66 20 28  32__)..sprintf (
c7c50 62 75 66 2c 20 22 25 49 36 34 64 22 2c 20 73 71  buf, "%I64d", sq
c7c60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
c7c70 34 20 28 61 72 67 76 5b 30 5d 29 29 3b 0a 23 65  4 (argv[0]));.#e
c7c80 6c 73 65 0a 09 73 70 72 69 6e 74 66 20 28 62 75  lse..sprintf (bu
c7c90 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74  f, "%lld", sqlit
c7ca0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 20 28  e3_value_int64 (
c7cb0 61 72 67 76 5b 30 5d 29 29 3b 0a 23 65 6e 64 69  argv[0]));.#endi
c7cc0 66 0a 20 20 20 20 65 6c 73 65 0a 09 73 74 72 63  f.    else..strc
c7cd0 70 79 20 28 62 75 66 2c 20 22 49 4c 4c 45 47 41  py (buf, "ILLEGA
c7ce0 4c 5f 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 69  L_VALUE");.    i
c7cf0 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20  f (argc >= 2).  
c7d00 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
c7d10 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
c7d20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
c7d30 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b  ITE_TEXT)..    {
c7d40 0a 09 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ...const char *s
c7d50 65 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ep = (const char
c7d60 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
c7d70 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
c7d80 0a 09 09 73 65 70 61 72 61 74 6f 72 20 3d 20 2a  ...separator = *
c7d90 73 65 70 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  sep;..    }..  e
c7da0 6c 73 65 0a 09 20 20 20 20 20 20 72 65 74 75 72  lse..      retur
c7db0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
c7dc0 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
c7dd0 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63 6f  gate_context (co
c7de0 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 20 28 73  ntext, sizeof (s
c7df0 74 72 75 63 74 20 73 74 72 69 6e 67 5f 6c 69 73  truct string_lis
c7e00 74 5f 73 74 72 29 29 3b 0a 20 20 20 20 69 66 20  t_str));.    if 
c7e10 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 20 3d 3d  (p->separator ==
c7e20 20 27 5c 30 27 20 26 26 20 70 2d 3e 73 74 72 69   '\0' && p->stri
c7e30 6e 67 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  ng == NULL).    
c7e40 20 20 7b 0a 09 20 20 2f 2a 20 66 69 72 73 74 20    {..  /* first 
c7e50 69 74 65 6d 20 2a 2f 0a 09 20 20 70 2d 3e 73 65  item */..  p->se
c7e60 70 61 72 61 74 6f 72 20 3d 20 73 65 70 61 72 61  parator = separa
c7e70 74 6f 72 3b 0a 09 20 20 69 66 20 28 73 65 70 61  tor;..  if (sepa
c7e80 72 61 74 6f 72 20 3d 3d 20 27 5c 30 27 29 0a 09  rator == '\0')..
c7e90 20 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20        separator 
c7ea0 3d 20 27 2c 27 3b 0a 09 20 20 70 2d 3e 73 74 72  = ',';..  p->str
c7eb0 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ing = sqlite3_mp
c7ec0 72 69 6e 74 66 20 28 22 25 73 22 2c 20 73 74 72  rintf ("%s", str
c7ed0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  );.      }.    e
c7ee0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63  lse.      {..  c
c7ef0 68 61 72 20 2a 6f 6c 64 73 74 72 20 3d 20 70 2d  har *oldstr = p-
c7f00 3e 73 74 72 69 6e 67 3b 0a 09 20 20 70 2d 3e 73  >string;..  p->s
c7f10 74 72 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  tring = sqlite3_
c7f20 6d 70 72 69 6e 74 66 20 28 22 25 73 25 63 25 73  mprintf ("%s%c%s
c7f30 22 2c 20 6f 6c 64 73 74 72 2c 20 70 2d 3e 73 65  ", oldstr, p->se
c7f40 70 61 72 61 74 6f 72 2c 20 73 74 72 29 3b 0a 09  parator, str);..
c7f50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28    sqlite3_free (
c7f60 6f 6c 64 73 74 72 29 3b 0a 20 20 20 20 20 20 7d  oldstr);.      }
c7f70 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
c7f80 66 6e 63 74 5f 6d 61 6b 65 5f 73 74 72 69 6e 67  fnct_make_string
c7f90 5f 6c 69 73 74 5f 66 69 6e 61 6c 20 28 73 71 6c  _list_final (sql
c7fa0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
c7fb0 6f 6e 74 65 78 74 29 0a 7b 0a 2f 2a 20 53 51 4c  ontext).{./* SQL
c7fc0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4d 61 6b   function:./ Mak
c7fd0 65 53 74 72 69 6e 67 4c 69 73 74 28 58 29 0a 2f  eStringList(X)./
c7fe0 20 4d 61 6b 65 53 74 72 69 6e 67 4c 69 73 74 28   MakeStringList(
c7ff0 58 2c 20 73 65 70 61 72 61 74 6f 72 29 0a 2f 20  X, separator)./ 
c8000 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
c8010 6f 6e 20 2d 20 20 46 49 4e 41 4c 0a 2f 0a 2a 2f  on -  FINAL./.*/
c8020 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 72 69  .    struct stri
c8030 6e 67 5f 6c 69 73 74 5f 73 74 72 20 2a 70 20 3d  ng_list_str *p =
c8040 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
c8050 74 65 5f 63 6f 6e 74 65 78 74 20 28 63 6f 6e 74  te_context (cont
c8060 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 20  ext, 0);.    if 
c8070 28 21 70 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  (!p).      {..  
c8080 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
c8090 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
c80a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c80b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
c80c0 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
c80d0 78 74 2c 20 70 2d 3e 73 74 72 69 6e 67 2c 20 2d  xt, p->string, -
c80e0 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
c80f0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 4f 4d  ;.}...#ifndef OM
c8100 49 54 5f 4d 41 54 48 53 51 4c 09 09 2f 2a 20 73  IT_MATHSQL../* s
c8110 75 70 70 6f 72 74 69 6e 67 20 53 51 4c 20 6d 61  upporting SQL ma
c8120 74 68 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  th functions */.
c8130 0a 73 74 61 74 69 63 20 69 6e 74 0a 74 65 73 74  .static int.test
c8140 49 6e 76 61 6c 69 64 46 50 20 28 64 6f 75 62 6c  InvalidFP (doubl
c8150 65 20 78 29 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e  e x).{./* testin
c8160 67 20 69 66 20 74 68 69 73 20 6f 6e 65 20 69 73  g if this one is
c8170 20 61 6e 20 69 6e 76 61 6c 69 64 20 46 6c 6f 61   an invalid Floa
c8180 74 69 6e 67 20 50 6f 69 6e 74 20 2a 2f 0a 23 69  ting Point */.#i
c8190 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 20 20  fdef _WIN32.    
c81a0 69 66 20 28 5f 66 70 63 6c 61 73 73 20 28 78 29  if (_fpclass (x)
c81b0 20 3d 3d 20 5f 46 50 43 4c 41 53 53 5f 4e 4e 20   == _FPCLASS_NN 
c81c0 7c 7c 20 5f 66 70 63 6c 61 73 73 20 28 78 29 20  || _fpclass (x) 
c81d0 3d 3d 20 5f 46 50 43 4c 41 53 53 5f 50 4e 20 7c  == _FPCLASS_PN |
c81e0 7c 0a 09 5f 66 70 63 6c 61 73 73 20 28 78 29 20  |.._fpclass (x) 
c81f0 3d 3d 20 5f 46 50 43 4c 41 53 53 5f 4e 5a 20 7c  == _FPCLASS_NZ |
c8200 7c 20 5f 66 70 63 6c 61 73 73 20 28 78 29 20 3d  | _fpclass (x) =
c8210 3d 20 5f 46 50 43 4c 41 53 53 5f 50 5a 29 0a 09  = _FPCLASS_PZ)..
c8220 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75  ;.    else..retu
c8230 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  rn 1;.#else.    
c8240 69 66 20 28 66 70 63 6c 61 73 73 69 66 79 20 28  if (fpclassify (
c8250 78 29 20 3d 3d 20 46 50 5f 4e 4f 52 4d 41 4c 20  x) == FP_NORMAL 
c8260 7c 7c 20 66 70 63 6c 61 73 73 69 66 79 20 28 78  || fpclassify (x
c8270 29 20 3d 3d 20 46 50 5f 5a 45 52 4f 29 0a 09 3b  ) == FP_ZERO)..;
c8280 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72  .    else..retur
c8290 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  n 1;.#endif.    
c82a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
c82b0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6d 61  tic void.fnct_ma
c82c0 74 68 5f 61 63 6f 73 20 28 73 71 6c 69 74 65 33  th_acos (sqlite3
c82d0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
c82e0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
c82f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
c8300 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
c8310 6e 63 74 69 6f 6e 3a 0a 2f 20 61 63 6f 73 28 64  nction:./ acos(d
c8320 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f 20 52 65 74  ouble X)././ Ret
c8330 75 72 6e 73 20 74 68 65 20 61 72 63 20 63 6f 73  urns the arc cos
c8340 69 6e 65 20 6f 66 20 58 2c 20 74 68 61 74 20 69  ine of X, that i
c8350 73 2c 20 74 68 65 20 76 61 6c 75 65 20 77 68 6f  s, the value who
c8360 73 65 20 63 6f 73 69 6e 65 20 69 73 20 58 0a 2f  se cosine is X./
c8370 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
c8380 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
c8390 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ered.*/.    int 
c83a0 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64  int_value;.    d
c83b0 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 47 41 49  ouble x;.    GAI
c83c0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
c83d0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
c83e0 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
c83f0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c8400 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
c8410 45 5f 46 4c 4f 41 54 29 0a 20 20 20 20 20 20 7b  E_FLOAT).      {
c8420 0a 09 20 20 78 20 3d 20 61 63 6f 73 20 28 73 71  ..  x = acos (sq
c8430 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
c8440 6c 65 20 28 61 72 67 76 5b 30 5d 29 29 3b 0a 09  le (argv[0]));..
c8450 20 20 69 66 20 28 74 65 73 74 49 6e 76 61 6c 69    if (testInvali
c8460 64 46 50 20 28 78 29 29 0a 09 20 20 20 20 20 20  dFP (x))..      
c8470 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
c8480 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
c8490 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71    else..      sq
c84a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
c84b0 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29  ble (context, x)
c84c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
c84d0 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
c84e0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
c84f0 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  0]) == SQLITE_IN
c8500 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
c8510 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71    int_value = sq
c8520 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
c8530 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20  (argv[0]);..  x 
c8540 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
c8550 78 20 3d 20 61 63 6f 73 20 28 78 29 3b 0a 09 20  x = acos (x);.. 
c8560 20 69 66 20 28 74 65 73 74 49 6e 76 61 6c 69 64   if (testInvalid
c8570 46 50 20 28 78 29 29 0a 09 20 20 20 20 20 20 73  FP (x))..      s
c8580 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
c8590 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
c85a0 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c   else..      sql
c85b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
c85c0 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b  le (context, x);
c85d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
c85e0 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
c85f0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
c8600 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
c8610 0a 66 6e 63 74 5f 6d 61 74 68 5f 61 73 69 6e 20  .fnct_math_asin 
c8620 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c8630 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
c8640 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
c8650 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
c8660 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
c8670 2f 20 61 73 69 6e 28 64 6f 75 62 6c 65 20 58 29  / asin(double X)
c8680 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74 68 65  ././ Returns the
c8690 20 61 72 63 20 73 69 6e 65 20 6f 66 20 58 2c 20   arc sine of X, 
c86a0 74 68 61 74 20 69 73 2c 20 74 68 65 20 76 61 6c  that is, the val
c86b0 75 65 20 77 68 6f 73 65 20 73 69 6e 65 20 69 73  ue whose sine is
c86c0 20 58 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20   X./ or NULL if 
c86d0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
c86e0 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
c86f0 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  int int_value;. 
c8700 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20     double x;.   
c8710 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
c8720 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
c8730 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
c8740 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
c8750 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
c8760 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 20 20 20  QLITE_FLOAT).   
c8770 20 20 20 7b 0a 09 20 20 78 20 3d 20 61 73 69 6e     {..  x = asin
c8780 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c8790 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29  double (argv[0])
c87a0 29 3b 0a 09 20 20 69 66 20 28 74 65 73 74 49 6e  );..  if (testIn
c87b0 76 61 6c 69 64 46 50 20 28 78 29 29 0a 09 20 20  validFP (x))..  
c87c0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
c87d0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
c87e0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
c87f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c8800 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74  _double (context
c8810 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
c8820 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
c8830 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c8840 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
c8850 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
c8860 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20   {..  int_value 
c8870 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
c8880 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  int (argv[0]);..
c8890 20 20 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b    x = int_value;
c88a0 0a 09 20 20 78 20 3d 20 61 73 69 6e 20 28 78 29  ..  x = asin (x)
c88b0 3b 0a 09 20 20 69 66 20 28 74 65 73 74 49 6e 76  ;..  if (testInv
c88c0 61 6c 69 64 46 50 20 28 78 29 29 0a 09 20 20 20  alidFP (x))..   
c88d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c88e0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
c88f0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
c8900 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c8910 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
c8920 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
c8930 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
c8940 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
c8950 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ext);.}..static 
c8960 76 6f 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 61  void.fnct_math_a
c8970 74 61 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tan (sqlite3_con
c8980 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
c8990 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
c89a0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
c89b0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
c89c0 6f 6e 3a 0a 2f 20 61 74 61 6e 28 64 6f 75 62 6c  on:./ atan(doubl
c89d0 65 20 58 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73  e X)././ Returns
c89e0 20 74 68 65 20 61 72 63 20 74 61 6e 67 65 6e 74   the arc tangent
c89f0 20 6f 66 20 58 2c 20 74 68 61 74 20 69 73 2c 20   of X, that is, 
c8a00 74 68 65 20 76 61 6c 75 65 20 77 68 6f 73 65 20  the value whose 
c8a10 74 61 6e 67 65 6e 74 20 69 73 20 58 0a 2f 20 6f  tangent is X./ o
c8a20 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
c8a30 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
c8a40 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e  ed.*/.    int in
c8a50 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75  t_value;.    dou
c8a60 62 6c 65 20 78 3b 0a 20 20 20 20 47 41 49 41 5f  ble x;.    GAIA_
c8a70 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
c8a80 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
c8a90 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
c8aa0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c8ab0 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c8ac0 46 4c 4f 41 54 29 0a 20 20 20 20 20 20 7b 0a 09  FLOAT).      {..
c8ad0 20 20 78 20 3d 20 61 74 61 6e 20 28 73 71 6c 69    x = atan (sqli
c8ae0 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
c8af0 20 28 61 72 67 76 5b 30 5d 29 29 3b 0a 09 20 20   (argv[0]));..  
c8b00 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
c8b10 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
c8b20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c8b30 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
c8b40 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
c8b50 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
c8b60 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
c8b70 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20  ..  int_value = 
c8b80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
c8b90 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20  t (argv[0]);..  
c8ba0 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09  x = int_value;..
c8bb0 20 20 78 20 3d 20 61 74 61 6e 20 28 78 29 3b 0a    x = atan (x);.
c8bc0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
c8bd0 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
c8be0 74 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, x);.      }. 
c8bf0 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
c8c00 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c8c10 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  ntext);.}..stati
c8c20 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6d 61 74 68  c void.fnct_math
c8c30 5f 61 74 61 6e 32 20 28 73 71 6c 69 74 65 33 5f  _atan2 (sqlite3_
c8c40 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
c8c50 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
c8c60 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
c8c70 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
c8c80 63 74 69 6f 6e 3a 0a 2f 20 61 74 61 6e 32 28 64  ction:./ atan2(d
c8c90 6f 75 62 6c 65 20 59 2c 20 64 6f 75 62 6c 65 20  ouble Y, double 
c8ca0 58 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 20  X)././ Returns  
c8cb0 74 68 65 20 70 72 69 6e 63 69 70 61 6c 20 76 61  the principal va
c8cc0 6c 75 65 20 6f 66 20 74 68 65 20 61 72 63 20 74  lue of the arc t
c8cd0 61 6e 67 65 6e 74 20 6f 66 20 59 2f 58 2c 20 75  angent of Y/X, u
c8ce0 73 69 6e 67 0a 2f 20 74 68 65 20 73 69 67 6e 73  sing./ the signs
c8cf0 20 6f 66 20 74 68 65 20 74 77 6f 20 61 72 67 75   of the two argu
c8d00 6d 65 6e 74 73 20 74 6f 20 64 65 74 65 72 6d 69  ments to determi
c8d10 6e 65 20 74 68 65 20 71 75 61 64 72 61 6e 74 20  ne the quadrant 
c8d20 6f 66 20 0a 2f 20 74 68 65 20 72 65 73 75 6c 74  of ./ the result
c8d30 2e 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61  ../ or NULL if a
c8d40 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
c8d50 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69  untered.*/.    i
c8d60 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20  nt int_value;.  
c8d70 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 30 2e 30    double x = 0.0
c8d80 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 20 3d  ;.    double y =
c8d90 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
c8da0 20 74 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55   t;.    GAIA_UNU
c8db0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
c8dc0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
c8dd0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
c8de0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c8df0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
c8e00 41 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33  AT)..x = sqlite3
c8e10 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
c8e20 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
c8e30 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
c8e40 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c8e50 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
c8e60 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
c8e70 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
c8e80 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
c8e90 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 79 20 3d  argv[0]);..  y =
c8ea0 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
c8eb0 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
c8ec0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
c8ed0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
c8ee0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
c8ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
c8f00 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c8f10 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
c8f20 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
c8f30 09 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .y = sqlite3_val
c8f40 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
c8f50 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  1]);.    else if
c8f60 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c8f70 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
c8f80 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
c8f90 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
c8fa0 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
c8fb0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
c8fc0 5b 31 5d 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74  [1]);..  x = int
c8fd0 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
c8fe0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
c8ff0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
c9000 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
c9010 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
c9020 20 20 20 20 7d 0a 20 20 20 20 74 20 3d 20 61 74      }.    t = at
c9030 61 6e 32 20 28 79 2c 20 78 29 3b 0a 20 20 20 20  an2 (y, x);.    
c9040 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
c9050 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
c9060 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
c9070 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 63 65 69  id.fnct_math_cei
c9080 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l (sqlite3_conte
c9090 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
c90a0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
c90b0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
c90c0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
c90d0 3a 0a 2f 20 63 65 69 6c 28 64 6f 75 62 6c 65 20  :./ ceil(double 
c90e0 58 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74  X)././ Returns t
c90f0 68 65 20 73 6d 61 6c 6c 65 73 74 20 69 6e 74 65  he smallest inte
c9100 67 65 72 20 76 61 6c 75 65 20 6e 6f 74 20 6c 65  ger value not le
c9110 73 73 20 74 68 61 6e 20 58 0a 2f 20 6f 72 20 4e  ss than X./ or N
c9120 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ULL if any error
c9130 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
c9140 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76  */.    int int_v
c9150 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65  alue;.    double
c9160 20 78 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55   x;.    GAIA_UNU
c9170 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
c9180 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
c9190 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
c91a0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c91b0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
c91c0 41 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 78  AT).      {..  x
c91d0 20 3d 20 63 65 69 6c 20 28 73 71 6c 69 74 65 33   = ceil (sqlite3
c91e0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
c91f0 72 67 76 5b 30 5d 29 29 3b 0a 09 20 20 73 71 6c  rgv[0]));..  sql
c9200 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
c9210 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b  le (context, x);
c9220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
c9230 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
c9240 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c9250 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
c9260 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
c9270 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
c9280 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
c9290 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d  argv[0]);..  x =
c92a0 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 78   int_value;..  x
c92b0 20 3d 20 63 65 69 6c 20 28 78 29 3b 0a 09 20 20   = ceil (x);..  
c92c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
c92d0 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
c92e0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c92f0 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
c9300 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
c9310 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  xt);.}..static v
c9320 6f 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 63 6f  oid.fnct_math_co
c9330 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  s (sqlite3_conte
c9340 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
c9350 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
c9360 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
c9370 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
c9380 3a 0a 2f 20 63 6f 73 28 64 6f 75 62 6c 65 20 58  :./ cos(double X
c9390 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74 68  )././ Returns th
c93a0 65 20 63 6f 73 69 6e 65 20 6f 66 20 58 2c 20 77  e cosine of X, w
c93b0 68 65 72 65 20 58 20 69 73 20 67 69 76 65 6e 20  here X is given 
c93c0 69 6e 20 72 61 64 69 61 6e 73 0a 2f 20 6f 72 20  in radians./ or 
c93d0 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
c93e0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
c93f0 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f  .*/.    int int_
c9400 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c  value;.    doubl
c9410 65 20 78 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  e x;.    GAIA_UN
c9420 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
c9430 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
c9440 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
c9450 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
c9460 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  0]) == SQLITE_FL
c9470 4f 41 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  OAT).      {..  
c9480 78 20 3d 20 63 6f 73 20 28 73 71 6c 69 74 65 33  x = cos (sqlite3
c9490 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
c94a0 72 67 76 5b 30 5d 29 29 3b 0a 09 20 20 73 71 6c  rgv[0]));..  sql
c94b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
c94c0 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b  le (context, x);
c94d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
c94e0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
c94f0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
c9500 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
c9510 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
c9520 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
c9530 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
c9540 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d  argv[0]);..  x =
c9550 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 78   int_value;..  x
c9560 20 3d 20 63 6f 73 20 28 78 29 3b 0a 09 20 20 73   = cos (x);..  s
c9570 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
c9580 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78  uble (context, x
c9590 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  );.      }.    e
c95a0 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  lse..sqlite3_res
c95b0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
c95c0 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
c95d0 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 63 6f 74  id.fnct_math_cot
c95e0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
c95f0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
c9600 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
c9610 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
c9620 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
c9630 0a 2f 20 63 6f 74 28 64 6f 75 62 6c 65 20 58 29  ./ cot(double X)
c9640 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74 68 65  ././ Returns the
c9650 20 63 6f 74 61 6e 67 65 6e 74 20 6f 66 20 58 0a   cotangent of X.
c9660 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
c9670 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
c9680 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74  tered.*/.    int
c9690 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
c96a0 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f  double x;.    do
c96b0 75 62 6c 65 20 74 61 6e 67 3b 0a 20 20 20 20 47  uble tang;.    G
c96c0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
c96d0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
c96e0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
c96f0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
c9700 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
c9710 49 54 45 5f 46 4c 4f 41 54 29 0a 09 78 20 3d 20  ITE_FLOAT)..x = 
c9720 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
c9730 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a  uble (argv[0]);.
c9740 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
c9750 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
c9760 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
c9770 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
c9780 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75     {..  int_valu
c9790 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
c97a0 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
c97b0 0a 09 20 20 78 20 3d 20 69 6e 74 5f 76 61 6c 75  ..  x = int_valu
c97c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  e;.      }.    e
c97d0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
c97e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
c97f0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
c9800 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
c9810 0a 20 20 20 20 74 61 6e 67 20 3d 20 74 61 6e 20  .    tang = tan 
c9820 28 78 29 3b 0a 20 20 20 20 69 66 20 28 74 61 6e  (x);.    if (tan
c9830 67 20 3d 3d 20 30 2e 30 29 0a 20 20 20 20 20 20  g == 0.0).      
c9840 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
c9850 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
c9860 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
c9870 20 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 31       }.    x = 1
c9880 2e 30 20 2f 20 74 61 6e 67 3b 0a 20 20 20 20 73  .0 / tang;.    s
c9890 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
c98a0 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78  uble (context, x
c98b0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
c98c0 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 64 65 67 72  d.fnct_math_degr
c98d0 65 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ees (sqlite3_con
c98e0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
c98f0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
c9900 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
c9910 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
c9920 6f 6e 3a 0a 2f 20 64 65 67 72 65 65 73 28 64 6f  on:./ degrees(do
c9930 75 62 6c 65 20 58 29 0a 2f 0a 2f 20 52 65 74 75  uble X)././ Retu
c9940 72 6e 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74  rns the argument
c9950 20 58 2c 20 63 6f 6e 76 65 72 74 65 64 20 66 72   X, converted fr
c9960 6f 6d 20 72 61 64 69 61 6e 73 20 74 6f 20 64 65  om radians to de
c9970 67 72 65 65 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20  grees./ or NULL 
c9980 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
c9990 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
c99a0 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65     int int_value
c99b0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  ;.    double x;.
c99c0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
c99d0 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
c99e0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
c99f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c9a00 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
c9a10 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
c9a20 09 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  .x = sqlite3_val
c9a30 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
c9a40 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  0]);.    else if
c9a50 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c9a60 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
c9a70 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
c9a80 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
c9a90 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
c9aa0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
c9ab0 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74  [0]);..  x = int
c9ac0 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
c9ad0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
c9ae0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
c9af0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
c9b00 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
c9b10 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 78 20      }.    x = x 
c9b20 2a 20 35 37 2e 32 39 35 37 37 39 35 31 33 30 38  * 57.29577951308
c9b30 32 33 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  232;.    sqlite3
c9b40 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28  _result_double (
c9b50 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 7d 0a 0a  context, x);.}..
c9b60 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
c9b70 5f 6d 61 74 68 5f 65 78 70 20 28 73 71 6c 69 74  _math_exp (sqlit
c9b80 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
c9b90 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
c9ba0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c9bb0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
c9bc0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 65 78 70 28  function:./ exp(
c9bd0 64 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f 20 52 65  double X)././ Re
c9be0 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
c9bf0 6f 66 20 65 20 28 74 68 65 20 62 61 73 65 20 6f  of e (the base o
c9c00 66 20 6e 61 74 75 72 61 6c 20 6c 6f 67 61 72 69  f natural logari
c9c10 74 68 6d 73 29 20 72 61 69 73 65 64 20 74 6f 20  thms) raised to 
c9c20 74 68 65 20 70 6f 77 65 72 20 6f 66 20 58 0a 2f  the power of X./
c9c30 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
c9c40 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
c9c50 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ered.*/.    int 
c9c60 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64  int_value;.    d
c9c70 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 47 41 49  ouble x;.    GAI
c9c80 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
c9c90 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
c9ca0 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
c9cb0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
c9cc0 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
c9cd0 45 5f 46 4c 4f 41 54 29 0a 20 20 20 20 20 20 7b  E_FLOAT).      {
c9ce0 0a 09 20 20 78 20 3d 20 65 78 70 20 28 73 71 6c  ..  x = exp (sql
c9cf0 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
c9d00 65 20 28 61 72 67 76 5b 30 5d 29 29 3b 0a 09 20  e (argv[0]));.. 
c9d10 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c9d20 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
c9d30 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
c9d40 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
c9d50 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
c9d60 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
c9d70 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
c9d80 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
c9d90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
c9da0 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  nt (argv[0]);.. 
c9db0 20 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   x = int_value;.
c9dc0 09 20 20 78 20 3d 20 65 78 70 20 28 78 29 3b 0a  .  x = exp (x);.
c9dd0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
c9de0 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
c9df0 74 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, x);.      }. 
c9e00 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
c9e10 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
c9e20 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  ntext);.}..stati
c9e30 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6d 61 74 68  c void.fnct_math
c9e40 5f 66 6c 6f 6f 72 20 28 73 71 6c 69 74 65 33 5f  _floor (sqlite3_
c9e50 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
c9e60 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
c9e70 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
c9e80 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
c9e90 63 74 69 6f 6e 3a 0a 2f 20 66 6c 6f 6f 72 28 64  ction:./ floor(d
c9ea0 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f 20 52 65 74  ouble X)././ Ret
c9eb0 75 72 6e 73 20 74 68 65 20 6c 61 72 67 65 73 74  urns the largest
c9ec0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6e   integer value n
c9ed0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
c9ee0 58 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61  X./ or NULL if a
c9ef0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
c9f00 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69  untered.*/.    i
c9f10 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20  nt int_value;.  
c9f20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20    double x;.    
c9f30 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
c9f40 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
c9f50 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
c9f60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
c9f70 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
c9f80 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 20 20 20 20  LITE_FLOAT).    
c9f90 20 20 7b 0a 09 20 20 78 20 3d 20 66 6c 6f 6f 72    {..  x = floor
c9fa0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
c9fb0 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29  double (argv[0])
c9fc0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
c9fd0 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e  sult_double (con
c9fe0 74 65 78 74 2c 20 78 29 3b 0a 20 20 20 20 20 20  text, x);.      
c9ff0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  }.    else if (s
ca000 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
ca010 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
ca020 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
ca030 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61       {..  int_va
ca040 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
ca050 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d  lue_int (argv[0]
ca060 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74 5f 76 61  );..  x = int_va
ca070 6c 75 65 3b 0a 09 20 20 78 20 3d 20 66 6c 6f 6f  lue;..  x = floo
ca080 72 20 28 78 29 3b 0a 09 20 20 73 71 6c 69 74 65  r (x);..  sqlite
ca090 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
ca0a0 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 20 20  (context, x);.  
ca0b0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09      }.    else..
ca0c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ca0d0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d  ull (context);.}
ca0e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
ca0f0 63 74 5f 6d 61 74 68 5f 6c 6f 67 6e 20 28 73 71  ct_math_logn (sq
ca100 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
ca110 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ca120 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
ca130 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
ca140 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 6c  QL function:./ l
ca150 6f 67 28 64 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f  og(double X)././
ca160 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e 61 74   Returns the nat
ca170 75 72 61 6c 20 6c 6f 67 61 72 69 74 68 6d 20 6f  ural logarithm o
ca180 66 20 58 3b 20 74 68 61 74 20 69 73 2c 20 74 68  f X; that is, th
ca190 65 20 62 61 73 65 2d 65 20 6c 6f 67 61 72 69 74  e base-e logarit
ca1a0 68 6d 20 6f 66 20 58 0a 2f 20 6f 72 20 4e 55 4c  hm of X./ or NUL
ca1b0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
ca1c0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
ca1d0 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c  .    int int_val
ca1e0 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  ue;.    double x
ca1f0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
ca200 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
ca210 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
ca220 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
ca230 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
ca240 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
ca250 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 78 20 3d  ).      {..  x =
ca260 20 6c 6f 67 20 28 73 71 6c 69 74 65 33 5f 76 61   log (sqlite3_va
ca270 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
ca280 5b 30 5d 29 29 3b 0a 09 20 20 69 66 20 28 74 65  [0]));..  if (te
ca290 73 74 49 6e 76 61 6c 69 64 46 50 20 28 78 29 29  stInvalidFP (x))
ca2a0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
ca2b0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
ca2c0 74 65 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09  text);..  else..
ca2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
ca2e0 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e  sult_double (con
ca2f0 74 65 78 74 2c 20 78 29 3b 0a 20 20 20 20 20 20  text, x);.      
ca300 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  }.    else if (s
ca310 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
ca320 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
ca330 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
ca340 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61       {..  int_va
ca350 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
ca360 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d  lue_int (argv[0]
ca370 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74 5f 76 61  );..  x = int_va
ca380 6c 75 65 3b 0a 09 20 20 78 20 3d 20 6c 6f 67 20  lue;..  x = log 
ca390 28 78 29 3b 0a 09 20 20 69 66 20 28 74 65 73 74  (x);..  if (test
ca3a0 49 6e 76 61 6c 69 64 46 50 20 28 78 29 29 0a 09  InvalidFP (x))..
ca3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
ca3c0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
ca3d0 78 74 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  xt);..  else..  
ca3e0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ca3f0 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65  lt_double (conte
ca400 78 74 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  xt, x);.      }.
ca410 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65      else..sqlite
ca420 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
ca430 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61 74  ontext);.}..stat
ca440 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6d 61 74  ic void.fnct_mat
ca450 68 5f 6c 6f 67 6e 32 20 28 73 71 6c 69 74 65 33  h_logn2 (sqlite3
ca460 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ca470 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
ca480 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ca490 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
ca4a0 6e 63 74 69 6f 6e 3a 0a 2f 20 6c 6f 67 28 64 6f  nction:./ log(do
ca4b0 75 62 6c 65 20 58 2c 20 64 6f 75 62 6c 65 20 42  uble X, double B
ca4c0 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74 68  )././ Returns th
ca4d0 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 58  e logarithm of X
ca4e0 20 74 6f 20 74 68 65 20 62 61 73 65 20 42 0a 2f   to the base B./
ca4f0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
ca500 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
ca510 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ered.*/.    int 
ca520 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64  int_value;.    d
ca530 6f 75 62 6c 65 20 78 20 3d 20 30 2e 30 3b 0a 20  ouble x = 0.0;. 
ca540 20 20 20 64 6f 75 62 6c 65 20 62 20 3d 20 31 2e     double b = 1.
ca550 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  0;.    double lo
ca560 67 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c  g1;.    double l
ca570 6f 67 32 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  og2;.    GAIA_UN
ca580 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
ca590 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
ca5a0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
ca5b0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
ca5c0 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  0]) == SQLITE_FL
ca5d0 4f 41 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65  OAT)..x = sqlite
ca5e0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
ca5f0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c  argv[0]);.    el
ca600 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
ca610 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
ca620 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  0]) == SQLITE_IN
ca630 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
ca640 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71    int_value = sq
ca650 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
ca660 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20  (argv[0]);..  x 
ca670 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  = int_value;.   
ca680 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
ca690 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
ca6a0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
ca6b0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
ca6c0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
ca6d0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
ca6e0 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
ca6f0 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
ca700 0a 09 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ..b = sqlite3_va
ca710 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
ca720 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  [1]);.    else i
ca730 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
ca740 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
ca750 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
ca760 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e  R).      {..  in
ca770 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  t_value = sqlite
ca780 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
ca790 76 5b 31 5d 29 3b 0a 09 20 20 62 20 3d 20 69 6e  v[1]);..  b = in
ca7a0 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  t_value;.      }
ca7b0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
ca7c0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
ca7d0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
ca7e0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
ca7f0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 78       }.    if (x
ca800 20 3c 3d 20 30 2e 30 20 7c 7c 20 62 20 3c 3d 20   <= 0.0 || b <= 
ca810 31 2e 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  1.0).      {..  
ca820 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ca830 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
ca840 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ca850 7d 0a 20 20 20 20 6c 6f 67 31 20 3d 20 6c 6f 67  }.    log1 = log
ca860 20 28 78 29 3b 0a 20 20 20 20 69 66 20 28 74 65   (x);.    if (te
ca870 73 74 49 6e 76 61 6c 69 64 46 50 20 28 6c 6f 67  stInvalidFP (log
ca880 31 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  1)).      {..  s
ca890 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ca8a0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
ca8b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ca8c0 0a 20 20 20 20 6c 6f 67 32 20 3d 20 6c 6f 67 20  .    log2 = log 
ca8d0 28 62 29 3b 0a 20 20 20 20 69 66 20 28 74 65 73  (b);.    if (tes
ca8e0 74 49 6e 76 61 6c 69 64 46 50 20 28 6c 6f 67 32  tInvalidFP (log2
ca8f0 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  )).      {..  sq
ca900 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
ca910 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
ca920 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
ca930 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ca940 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65  lt_double (conte
ca950 78 74 2c 20 6c 6f 67 31 20 2f 20 6c 6f 67 32 29  xt, log1 / log2)
ca960 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ca970 0a 66 6e 63 74 5f 6d 61 74 68 5f 6c 6f 67 5f 32  .fnct_math_log_2
ca980 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
ca990 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
ca9a0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ca9b0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
ca9c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
ca9d0 0a 2f 20 6c 6f 67 32 28 64 6f 75 62 6c 65 20 58  ./ log2(double X
ca9e0 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74 68  )././ Returns th
ca9f0 65 20 62 61 73 65 2d 32 20 6c 6f 67 61 72 69 74  e base-2 logarit
caa00 68 6d 20 6f 66 20 58 0a 2f 20 6f 72 20 4e 55 4c  hm of X./ or NUL
caa10 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
caa20 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
caa30 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c  .    int int_val
caa40 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  ue;.    double x
caa50 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67  ;.    double log
caa60 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  1;.    double lo
caa70 67 32 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  g2;.    GAIA_UNU
caa80 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
caa90 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
caaa0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
caab0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
caac0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
caad0 41 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33  AT)..x = sqlite3
caae0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
caaf0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73  rgv[0]);.    els
cab00 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
cab10 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
cab20 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
cab30 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20  EGER).      {.. 
cab40 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c   int_value = sql
cab50 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
cab60 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d  argv[0]);..  x =
cab70 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
cab80 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
cab90 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
caba0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
cabb0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
cabc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 6f  ;.      }.    lo
cabd0 67 31 20 3d 20 6c 6f 67 20 28 78 29 3b 0a 20 20  g1 = log (x);.  
cabe0 20 20 69 66 20 28 74 65 73 74 49 6e 76 61 6c 69    if (testInvali
cabf0 64 46 50 20 28 6c 6f 67 31 29 29 0a 20 20 20 20  dFP (log1)).    
cac00 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
cac10 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
cac20 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
cac30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 6f 67  .      }.    log
cac40 32 20 3d 20 6c 6f 67 20 28 32 2e 30 29 3b 0a 20  2 = log (2.0);. 
cac50 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cac60 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
cac70 74 2c 20 6c 6f 67 31 20 2f 20 6c 6f 67 32 29 3b  t, log1 / log2);
cac80 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
cac90 66 6e 63 74 5f 6d 61 74 68 5f 6c 6f 67 5f 31 30  fnct_math_log_10
caca0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
cacb0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
cacc0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
cacd0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
cace0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
cacf0 0a 2f 20 6c 6f 67 31 30 28 64 6f 75 62 6c 65 20  ./ log10(double 
cad00 58 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74  X)././ Returns t
cad10 68 65 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72  he base-10 logar
cad20 69 74 68 6d 20 6f 66 20 58 0a 2f 20 6f 72 20 4e  ithm of X./ or N
cad30 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ULL if any error
cad40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
cad50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76  */.    int int_v
cad60 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65  alue;.    double
cad70 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c   x;.    double l
cad80 6f 67 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  og1;.    double 
cad90 6c 6f 67 32 3b 0a 20 20 20 20 47 41 49 41 5f 55  log2;.    GAIA_U
cada0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
cadb0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
cadc0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
cadd0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
cade0 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [0]) == SQLITE_F
cadf0 4c 4f 41 54 29 0a 09 78 20 3d 20 73 71 6c 69 74  LOAT)..x = sqlit
cae00 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
cae10 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65  (argv[0]);.    e
cae20 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
cae30 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
cae40 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [0]) == SQLITE_I
cae50 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
cae60 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  .  int_value = s
cae70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
cae80 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78   (argv[0]);..  x
cae90 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20   = int_value;.  
caea0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
caeb0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
caec0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
caed0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
caee0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
caef0 6c 6f 67 31 20 3d 20 6c 6f 67 20 28 78 29 3b 0a  log1 = log (x);.
caf00 20 20 20 20 69 66 20 28 74 65 73 74 49 6e 76 61      if (testInva
caf10 6c 69 64 46 50 20 28 6c 6f 67 31 29 29 0a 20 20  lidFP (log1)).  
caf20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
caf30 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
caf40 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
caf50 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c  n;.      }.    l
caf60 6f 67 32 20 3d 20 6c 6f 67 20 28 31 30 2e 30 29  og2 = log (10.0)
caf70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
caf80 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e  sult_double (con
caf90 74 65 78 74 2c 20 6c 6f 67 31 20 2f 20 6c 6f 67  text, log1 / log
cafa0 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
cafb0 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 70 69 20  id.fnct_math_pi 
cafc0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cafd0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
cafe0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
caff0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
cb000 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
cb010 2f 20 70 69 28 76 6f 69 64 29 0a 2f 0a 2f 20 52  / pi(void)././ R
cb020 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
cb030 20 6f 66 20 28 70 69 29 0a 2a 2f 0a 20 20 20 20   of (pi).*/.    
cb040 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
cb050 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
cb060 4e 45 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  NE */.    sqlite
cb070 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
cb080 28 63 6f 6e 74 65 78 74 2c 20 33 2e 31 34 31 35  (context, 3.1415
cb090 39 32 36 35 33 35 38 39 37 39 33 32 33 38 34 36  9265358979323846
cb0a0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
cb0b0 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 70 6f 77 20  d.fnct_math_pow 
cb0c0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cb0d0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
cb0e0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
cb0f0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
cb100 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
cb110 2f 20 70 6f 77 28 64 6f 75 62 6c 65 20 58 2c 20  / pow(double X, 
cb120 64 6f 75 62 6c 65 20 59 29 0a 2f 0a 2f 20 52 65  double Y)././ Re
cb130 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
cb140 6f 66 20 58 20 72 61 69 73 65 64 20 74 6f 20 74  of X raised to t
cb150 68 65 20 70 6f 77 65 72 20 6f 66 20 59 2e 0a 2f  he power of Y../
cb160 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
cb170 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
cb180 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ered.*/.    int 
cb190 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64  int_value;.    d
cb1a0 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75  ouble x;.    dou
cb1b0 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  ble y;.    doubl
cb1c0 65 20 70 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  e p;.    GAIA_UN
cb1d0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
cb1e0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
cb1f0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
cb200 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
cb210 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  0]) == SQLITE_FL
cb220 4f 41 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65  OAT)..x = sqlite
cb230 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
cb240 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c  argv[0]);.    el
cb250 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
cb260 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
cb270 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  0]) == SQLITE_IN
cb280 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
cb290 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71    int_value = sq
cb2a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
cb2b0 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20  (argv[0]);..  x 
cb2c0 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20  = int_value;.   
cb2d0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
cb2e0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
cb2f0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
cb300 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
cb310 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
cb320 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
cb330 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
cb340 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
cb350 0a 09 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ..y = sqlite3_va
cb360 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
cb370 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  [1]);.    else i
cb380 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
cb390 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
cb3a0 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
cb3b0 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e  R).      {..  in
cb3c0 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  t_value = sqlite
cb3d0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
cb3e0 76 5b 31 5d 29 3b 0a 09 20 20 79 20 3d 20 69 6e  v[1]);..  y = in
cb3f0 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d  t_value;.      }
cb400 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
cb410 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
cb420 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
cb430 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
cb440 20 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70       }.    p = p
cb450 6f 77 20 28 78 2c 20 79 29 3b 0a 20 20 20 20 69  ow (x, y);.    i
cb460 66 20 28 74 65 73 74 49 6e 76 61 6c 69 64 46 50  f (testInvalidFP
cb470 20 28 70 29 29 0a 09 73 71 6c 69 74 65 33 5f 72   (p))..sqlite3_r
cb480 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
cb490 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  ext);.    else..
cb4a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
cb4b0 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
cb4c0 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  p);.}..static vo
cb4d0 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 73 74 64  id.fnct_math_std
cb4e0 64 65 76 5f 73 74 65 70 20 28 73 71 6c 69 74 65  dev_step (sqlite
cb4f0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
cb500 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
cb510 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
cb520 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
cb530 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
cb540 3a 0a 2f 20 73 74 64 64 65 76 5f 70 6f 70 28 64  :./ stddev_pop(d
cb550 6f 75 62 6c 65 20 58 29 0a 2f 20 73 74 64 64 65  ouble X)./ stdde
cb560 76 5f 73 61 6d 70 28 64 6f 75 62 6c 65 20 58 29  v_samp(double X)
cb570 0a 2f 20 76 61 72 5f 70 6f 70 28 64 6f 75 62 6c  ./ var_pop(doubl
cb580 65 20 58 29 0a 2f 20 76 61 72 5f 73 61 6d 70 28  e X)./ var_samp(
cb590 64 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f 20 61 67  double X)././ ag
cb5a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
cb5b0 20 2d 20 53 54 45 50 0a 2f 0a 2a 2f 0a 20 20 20   - STEP./.*/.   
cb5c0 20 73 74 72 75 63 74 20 73 74 64 64 65 76 5f 73   struct stddev_s
cb5d0 74 72 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20 69  tr *p;.    int i
cb5e0 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f  nt_value;.    do
cb5f0 75 62 6c 65 20 78 3b 0a 20 20 20 20 47 41 49 41  uble x;.    GAIA
cb600 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
cb610 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
cb620 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
cb630 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
cb640 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
cb650 5f 46 4c 4f 41 54 29 0a 09 78 20 3d 20 73 71 6c  _FLOAT)..x = sql
cb660 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
cb670 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  e (argv[0]);.   
cb680 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
cb690 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
cb6a0 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
cb6b0 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
cb6c0 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
cb6d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
cb6e0 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  nt (argv[0]);.. 
cb6f0 20 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   x = int_value;.
cb700 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
cb710 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 20  ..return;.    p 
cb720 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
cb730 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63 6f 6e  ate_context (con
cb740 74 65 78 74 2c 20 73 69 7a 65 6f 66 20 28 73 74  text, sizeof (st
cb750 72 75 63 74 20 73 74 64 64 65 76 5f 73 74 72 29  ruct stddev_str)
cb760 29 3b 0a 20 20 20 20 69 66 20 28 21 28 70 2d 3e  );.    if (!(p->
cb770 63 6c 65 61 6e 65 64 29 29 0a 20 20 20 20 20 20  cleaned)).      
cb780 7b 0a 09 20 20 70 2d 3e 63 6c 65 61 6e 65 64 20  {..  p->cleaned 
cb790 3d 20 31 3b 0a 09 20 20 70 2d 3e 6d 65 61 6e 20  = 1;..  p->mean 
cb7a0 3d 20 78 3b 0a 09 20 20 70 2d 3e 71 75 6f 74 20  = x;..  p->quot 
cb7b0 3d 20 30 2e 30 3b 0a 09 20 20 70 2d 3e 63 6f 75  = 0.0;..  p->cou
cb7c0 6e 74 20 3d 20 30 2e 30 3b 0a 20 20 20 20 20 20  nt = 0.0;.      
cb7d0 7d 0a 20 20 20 20 70 2d 3e 63 6f 75 6e 74 20 2b  }.    p->count +
cb7e0 3d 20 31 2e 30 3b 0a 20 20 20 20 70 2d 3e 71 75  = 1.0;.    p->qu
cb7f0 6f 74 20 3d 0a 09 70 2d 3e 71 75 6f 74 20 2b 0a  ot =..p->quot +.
cb800 09 28 28 28 70 2d 3e 63 6f 75 6e 74 20 2d 20 31  .(((p->count - 1
cb810 2e 30 29 20 2a 20 28 28 78 20 2d 20 70 2d 3e 6d  .0) * ((x - p->m
cb820 65 61 6e 29 20 2a 20 28 78 20 2d 20 70 2d 3e 6d  ean) * (x - p->m
cb830 65 61 6e 29 29 29 20 2f 20 70 2d 3e 63 6f 75 6e  ean))) / p->coun
cb840 74 29 3b 0a 20 20 20 20 70 2d 3e 6d 65 61 6e 20  t);.    p->mean 
cb850 3d 20 70 2d 3e 6d 65 61 6e 20 2b 20 28 28 78 20  = p->mean + ((x 
cb860 2d 20 70 2d 3e 6d 65 61 6e 29 20 2f 20 70 2d 3e  - p->mean) / p->
cb870 63 6f 75 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  count);.}..stati
cb880 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6d 61 74 68  c void.fnct_math
cb890 5f 73 74 64 64 65 76 5f 70 6f 70 5f 66 69 6e 61  _stddev_pop_fina
cb8a0 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l (sqlite3_conte
cb8b0 78 74 20 2a 20 63 6f 6e 74 65 78 74 29 0a 7b 0a  xt * context).{.
cb8c0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
cb8d0 0a 2f 20 73 74 64 64 65 76 5f 70 6f 70 28 64 6f  ./ stddev_pop(do
cb8e0 75 62 6c 65 20 58 29 0a 2f 20 61 67 67 72 65 67  uble X)./ aggreg
cb8f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20 20  ate function -  
cb900 46 49 4e 41 4c 0a 2f 0a 2a 2f 0a 20 20 20 20 64  FINAL./.*/.    d
cb910 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 73 74 72  ouble x;.    str
cb920 75 63 74 20 73 74 64 64 65 76 5f 73 74 72 20 2a  uct stddev_str *
cb930 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
cb940 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28 63  egate_context (c
cb950 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20  ontext, 0);.    
cb960 69 66 20 28 21 70 29 0a 20 20 20 20 20 20 7b 0a  if (!p).      {.
cb970 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
cb980 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
cb990 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
cb9a0 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 73 71 72     }.    x = sqr
cb9b0 74 20 28 70 2d 3e 71 75 6f 74 20 2f 20 70 2d 3e  t (p->quot / p->
cb9c0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  count);.    sqli
cb9d0 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
cb9e0 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a  e (context, x);.
cb9f0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
cba00 6e 63 74 5f 6d 61 74 68 5f 73 74 64 64 65 76 5f  nct_math_stddev_
cba10 73 61 6d 70 5f 66 69 6e 61 6c 20 28 73 71 6c 69  samp_final (sqli
cba20 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
cba30 6e 74 65 78 74 29 0a 7b 0a 2f 2a 20 53 51 4c 20  ntext).{./* SQL 
cba40 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 73 74 64 64  function:./ stdd
cba50 65 76 5f 73 61 6d 70 28 64 6f 75 62 6c 65 20 58  ev_samp(double X
cba60 29 0a 2f 20 61 67 67 72 65 67 61 74 65 20 66 75  )./ aggregate fu
cba70 6e 63 74 69 6f 6e 20 2d 20 20 46 49 4e 41 4c 0a  nction -  FINAL.
cba80 2f 0a 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  /.*/.    double 
cba90 78 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  x;.    struct st
cbaa0 64 64 65 76 5f 73 74 72 20 2a 70 20 3d 20 73 71  ddev_str *p = sq
cbab0 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
cbac0 63 6f 6e 74 65 78 74 20 28 63 6f 6e 74 65 78 74  context (context
cbad0 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 21 70  , 0);.    if (!p
cbae0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
cbaf0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
cbb00 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
cbb10 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
cbb20 20 20 20 78 20 3d 20 73 71 72 74 20 28 70 2d 3e     x = sqrt (p->
cbb30 71 75 6f 74 20 2f 20 28 70 2d 3e 63 6f 75 6e 74  quot / (p->count
cbb40 20 2d 20 31 2e 30 29 29 3b 0a 20 20 20 20 73 71   - 1.0));.    sq
cbb50 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
cbb60 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29  ble (context, x)
cbb70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
cbb80 0a 66 6e 63 74 5f 6d 61 74 68 5f 76 61 72 5f 70  .fnct_math_var_p
cbb90 6f 70 5f 66 69 6e 61 6c 20 28 73 71 6c 69 74 65  op_final (sqlite
cbba0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
cbbb0 65 78 74 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  ext).{./* SQL fu
cbbc0 6e 63 74 69 6f 6e 3a 0a 2f 20 76 61 72 5f 70 6f  nction:./ var_po
cbbd0 70 28 64 6f 75 62 6c 65 20 58 29 0a 2f 20 61 67  p(double X)./ ag
cbbe0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
cbbf0 20 2d 20 20 46 49 4e 41 4c 0a 2f 0a 2a 2f 0a 20   -  FINAL./.*/. 
cbc00 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20     double x;.   
cbc10 20 73 74 72 75 63 74 20 73 74 64 64 65 76 5f 73   struct stddev_s
cbc20 74 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  tr *p = sqlite3_
cbc30 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
cbc40 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
cbc50 20 20 20 20 69 66 20 28 21 70 29 0a 20 20 20 20      if (!p).    
cbc60 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
cbc70 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
cbc80 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
cbc90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 78 20 3d  .      }.    x =
cbca0 20 70 2d 3e 71 75 6f 74 20 2f 20 70 2d 3e 63 6f   p->quot / p->co
cbcb0 75 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  unt;.    sqlite3
cbcc0 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28  _result_double (
cbcd0 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 7d 0a 0a  context, x);.}..
cbce0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
cbcf0 5f 6d 61 74 68 5f 76 61 72 5f 73 61 6d 70 5f 66  _math_var_samp_f
cbd00 69 6e 61 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f  inal (sqlite3_co
cbd10 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 29  ntext * context)
cbd20 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
cbd30 6f 6e 3a 0a 2f 20 76 61 72 5f 73 61 6d 70 28 64  on:./ var_samp(d
cbd40 6f 75 62 6c 65 20 58 29 0a 2f 20 61 67 67 72 65  ouble X)./ aggre
cbd50 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20  gate function - 
cbd60 20 46 49 4e 41 4c 0a 2f 0a 2a 2f 0a 20 20 20 20   FINAL./.*/.    
cbd70 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 73 74  double x;.    st
cbd80 72 75 63 74 20 73 74 64 64 65 76 5f 73 74 72 20  ruct stddev_str 
cbd90 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  *p = sqlite3_agg
cbda0 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28  regate_context (
cbdb0 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  context, 0);.   
cbdc0 20 69 66 20 28 21 70 29 0a 20 20 20 20 20 20 7b   if (!p).      {
cbdd0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
cbde0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
cbdf0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
cbe00 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 70 2d      }.    x = p-
cbe10 3e 71 75 6f 74 20 2f 20 28 70 2d 3e 63 6f 75 6e  >quot / (p->coun
cbe20 74 20 2d 20 31 2e 30 29 3b 0a 20 20 20 20 73 71  t - 1.0);.    sq
cbe30 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
cbe40 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29  ble (context, x)
cbe50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
cbe60 0a 66 6e 63 74 5f 6d 61 74 68 5f 72 61 64 69 61  .fnct_math_radia
cbe70 6e 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ns (sqlite3_cont
cbe80 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
cbe90 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
cbea0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
cbeb0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
cbec0 6e 3a 0a 2f 20 72 61 64 69 61 6e 73 28 64 6f 75  n:./ radians(dou
cbed0 62 6c 65 20 58 29 0a 2f 0a 2f 20 52 65 74 75 72  ble X)././ Retur
cbee0 6e 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  ns the argument 
cbef0 58 2c 20 63 6f 6e 76 65 72 74 65 64 20 66 72 6f  X, converted fro
cbf00 6d 20 64 65 67 72 65 65 73 20 74 6f 20 72 61 64  m degrees to rad
cbf10 69 61 6e 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  ians./ or NULL i
cbf20 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
cbf30 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
cbf40 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b    int int_value;
cbf50 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20  .    double x;. 
cbf60 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
cbf70 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
cbf80 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
cbf90 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
cbfa0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d  ype (argv[0]) ==
cbfb0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09   SQLITE_FLOAT)..
cbfc0 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
cbfd0 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30  e_double (argv[0
cbfe0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
cbff0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
cc000 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d  ype (argv[0]) ==
cc010 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
cc020 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f  .      {..  int_
cc030 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
cc040 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
cc050 30 5d 29 3b 0a 09 20 20 78 20 3d 20 69 6e 74 5f  0]);..  x = int_
cc060 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  value;.      }. 
cc070 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
cc080 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
cc090 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
cc0a0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
cc0b0 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 78 20 2a     }.    x = x *
cc0c0 20 2e 30 31 37 34 35 33 32 39 32 35 31 39 39 34   .01745329251994
cc0d0 33 32 39 35 38 3b 0a 20 20 20 20 73 71 6c 69 74  32958;.    sqlit
cc0e0 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
cc0f0 20 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 7d   (context, x);.}
cc100 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
cc110 63 74 5f 6d 61 74 68 5f 73 69 67 6e 20 28 73 71  ct_math_sign (sq
cc120 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
cc130 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
cc140 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
cc150 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
cc160 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 73  QL function:./ s
cc170 69 67 6e 28 64 6f 75 62 6c 65 20 58 29 0a 2f 0a  ign(double X)./.
cc180 2f 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 69  / Returns the si
cc190 67 6e 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  gn of the argume
cc1a0 6e 74 20 61 73 20 2d 31 2c 20 30 2c 20 6f 72 20  nt as -1, 0, or 
cc1b0 31 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  1, depending on 
cc1c0 77 68 65 74 68 65 72 20 58 20 69 73 20 6e 65 67  whether X is neg
cc1d0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
cc1e0 70 6f 73 69 74 69 76 65 0a 2f 20 6f 72 20 4e 55  positive./ or NU
cc1f0 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
cc200 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
cc210 2f 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61  /.    int int_va
cc220 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  lue;.    double 
cc230 78 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  x;.    GAIA_UNUS
cc240 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
cc250 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
cc260 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
cc270 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
cc280 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
cc290 54 29 0a 09 78 20 3d 20 73 71 6c 69 74 65 33 5f  T)..x = sqlite3_
cc2a0 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
cc2b0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[0]);.    else
cc2c0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
cc2d0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
cc2e0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
cc2f0 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
cc300 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
cc310 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
cc320 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20 3d 20  rgv[0]);..  x = 
cc330 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20  int_value;.     
cc340 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
cc350 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
cc360 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
cc370 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
cc380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
cc390 28 78 20 3e 20 30 2e 30 29 0a 09 73 71 6c 69 74  (x > 0.0)..sqlit
cc3a0 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
cc3b0 20 28 63 6f 6e 74 65 78 74 2c 20 31 2e 30 29 3b   (context, 1.0);
cc3c0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 78 20  .    else if (x 
cc3d0 3c 20 30 2e 30 29 0a 09 73 71 6c 69 74 65 33 5f  < 0.0)..sqlite3_
cc3e0 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63  result_double (c
cc3f0 6f 6e 74 65 78 74 2c 20 2d 31 2e 30 29 3b 0a 20  ontext, -1.0);. 
cc400 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
cc410 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28  _result_double (
cc420 63 6f 6e 74 65 78 74 2c 20 30 2e 30 29 3b 0a 7d  context, 0.0);.}
cc430 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
cc440 63 74 5f 6d 61 74 68 5f 73 69 6e 20 28 73 71 6c  ct_math_sin (sql
cc450 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
cc460 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
cc470 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
cc480 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
cc490 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 73 69  L function:./ si
cc4a0 6e 28 64 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f 20  n(double X)././ 
cc4b0 52 65 74 75 72 6e 73 20 74 68 65 20 73 69 6e 65  Returns the sine
cc4c0 20 6f 66 20 58 2c 20 77 68 65 72 65 20 58 20 69   of X, where X i
cc4d0 73 20 67 69 76 65 6e 20 69 6e 20 72 61 64 69 61  s given in radia
cc4e0 6e 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ns./ or NULL if 
cc4f0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
cc500 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
cc510 69 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20  int int_value;. 
cc520 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20     double x;.   
cc530 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
cc540 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
cc550 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
cc560 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
cc570 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
cc580 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 20 20 20  QLITE_FLOAT).   
cc590 20 20 20 7b 0a 09 20 20 78 20 3d 20 73 69 6e 20     {..  x = sin 
cc5a0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64  (sqlite3_value_d
cc5b0 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 29  ouble (argv[0]))
cc5c0 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
cc5d0 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74  ult_double (cont
cc5e0 65 78 74 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  ext, x);.      }
cc5f0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
cc600 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
cc610 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
cc620 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
cc630 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
cc640 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
cc650 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
cc660 3b 0a 09 20 20 78 20 3d 20 69 6e 74 5f 76 61 6c  ;..  x = int_val
cc670 75 65 3b 0a 09 20 20 78 20 3d 20 73 69 6e 20 28  ue;..  x = sin (
cc680 78 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  x);..  sqlite3_r
cc690 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63 6f  esult_double (co
cc6a0 6e 74 65 78 74 2c 20 78 29 3b 0a 20 20 20 20 20  ntext, x);.     
cc6b0 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c   }.    else..sql
cc6c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
cc6d0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73   (context);.}..s
cc6e0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
cc6f0 6d 61 74 68 5f 73 71 72 74 20 28 73 71 6c 69 74  math_sqrt (sqlit
cc700 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
cc710 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
cc720 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
cc730 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
cc740 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 73 71 72 74  function:./ sqrt
cc750 28 64 6f 75 62 6c 65 20 58 29 0a 2f 0a 2f 20 52  (double X)././ R
cc760 65 74 75 72 6e 73 20 74 68 65 20 73 71 75 61 72  eturns the squar
cc770 65 20 72 6f 6f 74 20 6f 66 20 61 20 6e 6f 6e 2d  e root of a non-
cc780 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
cc790 58 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61  X./ or NULL if a
cc7a0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
cc7b0 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69  untered.*/.    i
cc7c0 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20  nt int_value;.  
cc7d0 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20    double x;.    
cc7e0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
cc7f0 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
cc800 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
cc810 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
cc820 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
cc830 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 20 20 20 20  LITE_FLOAT).    
cc840 20 20 7b 0a 09 20 20 78 20 3d 20 73 71 72 74 20    {..  x = sqrt 
cc850 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64  (sqlite3_value_d
cc860 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 29  ouble (argv[0]))
cc870 3b 0a 09 20 20 69 66 20 28 74 65 73 74 49 6e 76  ;..  if (testInv
cc880 61 6c 69 64 46 50 20 28 78 29 29 0a 09 20 20 20  alidFP (x))..   
cc890 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cc8a0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
cc8b0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
cc8c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cc8d0 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
cc8e0 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
cc8f0 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
cc900 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
cc910 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
cc920 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
cc930 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
cc940 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
cc950 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  nt (argv[0]);.. 
cc960 20 78 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a   x = int_value;.
cc970 09 20 20 78 20 3d 20 73 71 72 74 20 28 78 29 3b  .  x = sqrt (x);
cc980 0a 09 20 20 69 66 20 28 74 65 73 74 49 6e 76 61  ..  if (testInva
cc990 6c 69 64 46 50 20 28 78 29 29 0a 09 20 20 20 20  lidFP (x))..    
cc9a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cc9b0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
cc9c0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
cc9d0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
cc9e0 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
cc9f0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
cca00 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
cca10 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
cca20 78 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  xt);.}..static v
cca30 6f 69 64 0a 66 6e 63 74 5f 6d 61 74 68 5f 74 61  oid.fnct_math_ta
cca40 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  n (sqlite3_conte
cca50 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
cca60 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
cca70 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
cca80 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
cca90 3a 0a 2f 20 74 61 6e 28 64 6f 75 62 6c 65 20 58  :./ tan(double X
ccaa0 29 0a 2f 0a 2f 20 52 65 74 75 72 6e 73 20 74 68  )././ Returns th
ccab0 65 20 74 61 6e 67 65 6e 74 20 6f 66 20 58 2c 20  e tangent of X, 
ccac0 77 68 65 72 65 20 58 20 69 73 20 67 69 76 65 6e  where X is given
ccad0 20 69 6e 20 72 61 64 69 61 6e 73 0a 2f 20 6f 72   in radians./ or
ccae0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
ccaf0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
ccb00 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 69 6e 74  d.*/.    int int
ccb10 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62  _value;.    doub
ccb20 6c 65 20 78 3b 0a 20 20 20 20 47 41 49 41 5f 55  le x;.    GAIA_U
ccb30 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
ccb40 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
ccb50 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
ccb60 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
ccb70 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [0]) == SQLITE_F
ccb80 4c 4f 41 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  LOAT).      {.. 
ccb90 20 78 20 3d 20 74 61 6e 20 28 73 71 6c 69 74 65   x = tan (sqlite
ccba0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
ccbb0 61 72 67 76 5b 30 5d 29 29 3b 0a 09 20 20 73 71  argv[0]));..  sq
ccbc0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
ccbd0 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 78 29  ble (context, x)
ccbe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
ccbf0 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
ccc00 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
ccc10 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  0]) == SQLITE_IN
ccc20 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09  TEGER).      {..
ccc30 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71    int_value = sq
ccc40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
ccc50 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 78 20  (argv[0]);..  x 
ccc60 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
ccc70 78 20 3d 20 74 61 6e 20 28 78 29 3b 0a 09 20 20  x = tan (x);..  
ccc80 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
ccc90 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
ccca0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
cccb0 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
cccc0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
cccd0 78 74 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  xt);.}..#endif /
ccce0 2a 20 65 6e 64 20 73 75 70 70 6f 72 74 69 6e 67  * end supporting
cccf0 20 53 51 4c 20 6d 61 74 68 20 66 75 6e 63 74 69   SQL math functi
ccd00 6f 6e 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  ons */..static v
ccd10 6f 69 64 0a 66 6e 63 74 5f 47 65 6f 6d 46 72 6f  oid.fnct_GeomFro
ccd20 6d 45 78 69 66 47 70 73 42 6c 6f 62 20 28 73 71  mExifGpsBlob (sq
ccd30 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
ccd40 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ccd50 63 2c 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f  c,....  sqlite3_
ccd60 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
ccd70 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
ccd80 3a 0a 2f 20 47 65 6f 6d 46 72 6f 6d 45 78 69 66  :./ GeomFromExif
ccd90 47 70 73 42 6c 6f 62 28 42 4c 4f 42 20 65 6e 63  GpsBlob(BLOB enc
ccda0 6f 64 65 64 20 69 6d 61 67 65 29 0a 2f 0a 2f 20  oded image)././ 
ccdb0 72 65 74 75 72 6e 73 3a 0a 2f 20 61 20 50 4f 49  returns:./ a POI
ccdc0 4e 54 20 67 65 6f 6d 65 74 72 79 0a 2f 20 6f 72  NT geometry./ or
ccdd0 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
ccde0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
ccdf0 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
cce00 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
cce10 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
cce20 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c  .    gaiaGeomCol
cce30 6c 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20 75  lPtr geom;.    u
cce40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 67 65  nsigned char *ge
cce50 6f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 67  oblob;.    int g
cce60 65 6f 73 69 7a 65 3b 0a 20 20 20 20 64 6f 75 62  eosize;.    doub
cce70 6c 65 20 6c 6f 6e 67 69 74 75 64 65 3b 0a 20 20  le longitude;.  
cce80 20 20 64 6f 75 62 6c 65 20 6c 61 74 69 74 75 64    double latitud
cce90 65 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f  e;.    int gpkg_
ccea0 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mode = 0;.    in
cceb0 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30  t tiny_point = 0
ccec0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
cced0 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
ccee0 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
ccef0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
ccf00 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
ccf10 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
ccf20 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
ccf30 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
ccf40 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
ccf50 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  {..  gpkg_mode =
ccf60 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
ccf70 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e 74  e;..  tiny_point
ccf80 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50 6f   = cache->tinyPo
ccf90 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  intEnabled;.    
ccfa0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
ccfb0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
ccfc0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
ccfd0 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
ccfe0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
ccff0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
cd000 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
cd010 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
cd020 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
cd030 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
cd040 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
cd050 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
cd060 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
cd070 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
cd080 20 20 20 20 69 66 20 28 67 61 69 61 47 65 74 47      if (gaiaGetG
cd090 70 73 43 6f 6f 72 64 73 20 28 70 5f 62 6c 6f 62  psCoords (p_blob
cd0a0 2c 20 6e 5f 62 79 74 65 73 2c 20 26 6c 6f 6e 67  , n_bytes, &long
cd0b0 69 74 75 64 65 2c 20 26 6c 61 74 69 74 75 64 65  itude, &latitude
cd0c0 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 65  )).      {..  ge
cd0d0 6f 6d 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65  om = gaiaAllocGe
cd0e0 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 09 20 20 67 65  omColl ();..  ge
cd0f0 6f 6d 2d 3e 53 72 69 64 20 3d 20 34 33 32 36 3b  om->Srid = 4326;
cd100 0a 09 20 20 67 61 69 61 41 64 64 50 6f 69 6e 74  ..  gaiaAddPoint
cd110 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  ToGeomColl (geom
cd120 2c 20 6c 6f 6e 67 69 74 75 64 65 2c 20 6c 61 74  , longitude, lat
cd130 69 74 75 64 65 29 3b 0a 09 20 20 67 61 69 61 54  itude);..  gaiaT
cd140 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
cd150 6b 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 67 65  kbEx2 (geom, &ge
cd160 6f 62 6c 6f 62 2c 20 26 67 65 6f 73 69 7a 65 2c  oblob, &geosize,
cd170 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
cd180 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74        tiny_point
cd190 29 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65  );..  gaiaFreeGe
cd1a0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09  omColl (geom);..
cd1b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cd1c0 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
cd1d0 67 65 6f 62 6c 6f 62 2c 20 67 65 6f 73 69 7a 65  geoblob, geosize
cd1e0 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  , free);.      }
cd1f0 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
cd200 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
cd210 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61  context);.}..sta
cd220 74 69 63 20 63 68 61 72 20 2a 0a 67 75 65 73 73  tic char *.guess
cd230 5f 6d 69 6d 65 5f 74 79 70 65 20 28 63 6f 6e 73  _mime_type (cons
cd240 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
cd250 2a 70 5f 62 6c 6f 62 2c 20 69 6e 74 20 6e 5f 62  *p_blob, int n_b
cd260 79 74 65 73 29 0a 7b 0a 2f 2a 20 67 75 65 73 73  ytes).{./* guess
cd270 69 6e 67 20 74 68 65 20 6d 69 6d 65 2d 74 79 70  ing the mime-typ
cd280 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
cd290 74 6f 20 73 6f 6d 65 20 42 4c 4f 42 20 2a 2f 0a  to some BLOB */.
cd2a0 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 74 79 70      int blob_typ
cd2b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
cd2c0 72 20 2a 6d 69 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  r *mime = NULL;.
cd2d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
cd2e0 20 63 68 61 72 20 2a 73 74 72 69 6e 67 20 3d 20   char *string = 
cd2f0 4e 55 4c 4c 3b 0a 20 20 20 20 62 6c 6f 62 5f 74  NULL;.    blob_t
cd300 79 70 65 20 3d 20 67 61 69 61 47 75 65 73 73 42  ype = gaiaGuessB
cd310 6c 6f 62 54 79 70 65 20 28 70 5f 62 6c 6f 62 2c  lobType (p_blob,
cd320 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 73   n_bytes);.    s
cd330 77 69 74 63 68 20 28 62 6c 6f 62 5f 74 79 70 65  witch (blob_type
cd340 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
cd350 63 61 73 65 20 47 41 49 41 5f 5a 49 50 5f 42 4c  case GAIA_ZIP_BL
cd360 4f 42 3a 0a 09 20 20 6d 69 6d 65 20 3d 20 22 61  OB:..  mime = "a
cd370 70 70 6c 69 63 61 74 69 6f 6e 2f 7a 69 70 22 3b  pplication/zip";
cd380 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
cd390 20 63 61 73 65 20 47 41 49 41 5f 50 44 46 5f 42   case GAIA_PDF_B
cd3a0 4c 4f 42 3a 0a 09 20 20 6d 69 6d 65 20 3d 20 22  LOB:..  mime = "
cd3b0 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22  application/pdf"
cd3c0 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
cd3d0 20 20 63 61 73 65 20 47 41 49 41 5f 54 49 46 46    case GAIA_TIFF
cd3e0 5f 42 4c 4f 42 3a 0a 09 20 20 6d 69 6d 65 20 3d  _BLOB:..  mime =
cd3f0 20 22 69 6d 61 67 65 2f 74 69 66 66 22 3b 0a 09   "image/tiff";..
cd400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cd410 61 73 65 20 47 41 49 41 5f 47 49 46 5f 42 4c 4f  ase GAIA_GIF_BLO
cd420 42 3a 0a 09 20 20 6d 69 6d 65 20 3d 20 22 69 6d  B:..  mime = "im
cd430 61 67 65 2f 67 69 66 22 3b 0a 09 20 20 62 72 65  age/gif";..  bre
cd440 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
cd450 41 49 41 5f 50 4e 47 5f 42 4c 4f 42 3a 0a 09 20  AIA_PNG_BLOB:.. 
cd460 20 6d 69 6d 65 20 3d 20 22 69 6d 61 67 65 2f 70   mime = "image/p
cd470 6e 67 22 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  ng";..  break;. 
cd480 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4a       case GAIA_J
cd490 50 32 5f 42 4c 4f 42 3a 0a 09 20 20 6d 69 6d 65  P2_BLOB:..  mime
cd4a0 20 3d 20 22 69 6d 61 67 65 2f 6a 70 32 22 3b 0a   = "image/jp2";.
cd4b0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
cd4c0 63 61 73 65 20 47 41 49 41 5f 4a 50 45 47 5f 42  case GAIA_JPEG_B
cd4d0 4c 4f 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LOB:.      case 
cd4e0 47 41 49 41 5f 45 58 49 46 5f 42 4c 4f 42 3a 0a  GAIA_EXIF_BLOB:.
cd4f0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
cd500 45 58 49 46 5f 47 50 53 5f 42 4c 4f 42 3a 0a 09  EXIF_GPS_BLOB:..
cd510 20 20 6d 69 6d 65 20 3d 20 22 69 6d 61 67 65 2f    mime = "image/
cd520 6a 70 65 67 22 3b 0a 09 20 20 62 72 65 61 6b 3b  jpeg";..  break;
cd530 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 4c  .#ifdef ENABLE_L
cd540 49 42 58 4d 4c 32 09 09 2f 2a 20 69 6e 63 6c 75  IBXML2../* inclu
cd550 64 69 6e 67 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a  ding LIBXML2 */.
cd560 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
cd570 58 4d 4c 5f 42 4c 4f 42 3a 0a 09 20 20 6d 69 6d  XML_BLOB:..  mim
cd580 65 20 3d 20 22 61 70 70 6c 69 63 61 74 69 6f 6e  e = "application
cd590 2f 78 6d 6c 22 3b 0a 09 20 20 69 66 20 28 67 61  /xml";..  if (ga
cd5a0 69 61 49 73 53 76 67 58 6d 6c 42 6c 6f 62 20 28  iaIsSvgXmlBlob (
cd5b0 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29  p_blob, n_bytes)
cd5c0 29 0a 09 20 20 20 20 20 20 6d 69 6d 65 20 3d 20  )..      mime = 
cd5d0 22 69 6d 61 67 65 2f 73 76 67 2b 78 6d 6c 22 3b  "image/svg+xml";
cd5e0 0a 09 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  ..  break;.#endi
cd5f0 66 20 2f 2a 20 65 6e 64 20 69 6e 63 6c 75 64 69  f /* end includi
cd600 6e 67 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a 20 20  ng LIBXML2 */.  
cd610 20 20 20 20 7d 3b 0a 20 20 20 20 69 66 20 28 6d      };.    if (m
cd620 69 6d 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  ime != NULL).   
cd630 20 20 20 7b 0a 09 20 20 6c 65 6e 20 3d 20 73 74     {..  len = st
cd640 72 6c 65 6e 20 28 6d 69 6d 65 29 3b 0a 09 20 20  rlen (mime);..  
cd650 73 74 72 69 6e 67 20 3d 20 6d 61 6c 6c 6f 63 20  string = malloc 
cd660 28 6c 65 6e 20 2b 20 31 29 3b 0a 09 20 20 73 74  (len + 1);..  st
cd670 72 63 70 79 20 28 73 74 72 69 6e 67 2c 20 6d 69  rcpy (string, mi
cd680 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
cd690 20 72 65 74 75 72 6e 20 73 74 72 69 6e 67 3b 0a   return string;.
cd6a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
cd6b0 6e 63 74 5f 47 65 74 4d 69 6d 65 54 79 70 65 20  nct_GetMimeType 
cd6c0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cd6d0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
cd6e0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
cd6f0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
cd700 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
cd710 2f 20 47 65 74 4d 69 6d 65 54 79 70 65 28 42 4c  / GetMimeType(BL
cd720 4f 42 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a  OB)././ returns:
cd730 0a 2f 20 74 68 65 20 4d 69 6d 65 2d 54 79 70 65  ./ the Mime-Type
cd740 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
cd750 6f 20 74 68 65 20 42 4c 4f 42 0a 2f 20 6f 72 20  o the BLOB./ or 
cd760 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f  NULL if any erro
cd770 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
cd780 20 6f 72 20 6e 6f 20 76 61 6c 69 64 20 6d 69 6d   or no valid mim
cd790 65 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2f 0a  e is defined.*/.
cd7a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
cd7b0 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
cd7c0 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
cd7d0 63 68 61 72 20 2a 6d 69 6d 65 20 3d 20 4e 55 4c  char *mime = NUL
cd7e0 4c 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  L;.    GAIA_UNUS
cd7f0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
cd800 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
cd810 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
cd820 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
cd830 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
cd840 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
cd850 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
cd860 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
cd870 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
cd880 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
cd890 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
cd8a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
cd8b0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
cd8c0 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
cd8d0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
cd8e0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6d 69 6d  rgv[0]);.    mim
cd8f0 65 20 3d 20 67 75 65 73 73 5f 6d 69 6d 65 5f 74  e = guess_mime_t
cd900 79 70 65 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  ype (p_blob, n_b
cd910 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20 28 6d  ytes);.    if (m
cd920 69 6d 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71  ime == NULL)..sq
cd930 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
cd940 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
cd950 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
cd960 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74  esult_text (cont
cd970 65 78 74 2c 20 6d 69 6d 65 2c 20 73 74 72 6c 65  ext, mime, strle
cd980 6e 20 28 6d 69 6d 65 29 2c 20 66 72 65 65 29 3b  n (mime), free);
cd990 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
cd9a0 62 6c 6f 62 5f 67 75 65 73 73 20 28 73 71 6c 69  blob_guess (sqli
cd9b0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
cd9c0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
cd9d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
cd9e0 2a 20 61 72 67 76 2c 0a 09 20 20 20 20 69 6e 74  * argv,..    int
cd9f0 20 72 65 71 75 65 73 74 29 0a 7b 0a 2f 2a 20 53   request).{./* S
cda00 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49  QL function:./ I
cda10 73 47 69 66 42 6c 6f 62 28 42 4c 4f 42 20 65 6e  sGifBlob(BLOB en
cda20 63 6f 64 65 64 20 69 6d 61 67 65 29 0a 2f 20 49  coded image)./ I
cda30 73 50 6e 67 42 6c 6f 62 2c 20 49 73 4a 70 65 67  sPngBlob, IsJpeg
cda40 42 6c 6f 62 2c 20 49 73 45 78 69 66 42 6c 6f 62  Blob, IsExifBlob
cda50 2c 20 49 73 45 78 69 66 47 70 73 42 6c 6f 62 2c  , IsExifGpsBlob,
cda60 20 49 73 54 69 66 66 42 6c 6f 62 2c 0a 2f 20 49   IsTiffBlob,./ I
cda70 73 5a 69 70 42 6c 6f 62 2c 20 49 73 50 64 66 42  sZipBlob, IsPdfB
cda80 6c 6f 62 2c 20 49 73 4a 50 32 42 6c 6f 62 2c 20  lob, IsJP2Blob, 
cda90 49 73 47 65 6f 6d 65 74 72 79 42 6c 6f 62 2c 20  IsGeometryBlob, 
cdaa0 49 73 54 69 6e 79 50 6f 69 6e 74 42 6c 6f 62 0a  IsTinyPointBlob.
cdab0 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 31  /./ returns:./ 1
cdac0 20 69 66 20 74 68 65 20 72 65 71 75 69 72 65 64   if the required
cdad0 20 42 4c 4f 42 5f 54 59 50 45 20 69 73 20 54 52   BLOB_TYPE is TR
cdae0 55 45 0a 2f 20 30 20 6f 74 68 65 72 77 69 73 65  UE./ 0 otherwise
cdaf0 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79 20  ./ or -1 if any 
cdb00 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
cdb10 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  ered.*/.    unsi
cdb20 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f  gned char *p_blo
cdb30 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  b;.    int n_byt
cdb40 65 73 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62  es;.    int blob
cdb50 5f 74 79 70 65 3b 0a 20 20 20 20 47 41 49 41 5f  _type;.    GAIA_
cdb60 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
cdb70 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
cdb80 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
cdb90 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
cdba0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
cdbb0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
cdbc0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cdbd0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
cdbe0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
cdbf0 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
cdc00 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
cdc10 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
cdc20 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
cdc30 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
cdc40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
cdc50 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
cdc60 20 20 20 20 62 6c 6f 62 5f 74 79 70 65 20 3d 20      blob_type = 
cdc70 67 61 69 61 47 75 65 73 73 42 6c 6f 62 54 79 70  gaiaGuessBlobTyp
cdc80 65 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  e (p_blob, n_byt
cdc90 65 73 29 3b 0a 20 20 20 20 69 66 20 28 72 65 71  es);.    if (req
cdca0 75 65 73 74 20 3d 3d 20 47 41 49 41 5f 47 45 4f  uest == GAIA_GEO
cdcb0 4d 45 54 52 59 5f 42 4c 4f 42 29 0a 20 20 20 20  METRY_BLOB).    
cdcc0 20 20 7b 0a 09 20 20 69 66 20 28 62 6c 6f 62 5f    {..  if (blob_
cdcd0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
cdce0 4d 45 54 52 59 5f 42 4c 4f 42 29 0a 09 20 20 20  METRY_BLOB)..   
cdcf0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cdd00 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
cdd10 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  1);..  else..   
cdd20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cdd30 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
cdd40 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  0);..  return;. 
cdd50 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72       }.    if (r
cdd60 65 71 75 65 73 74 20 3d 3d 20 47 41 49 41 5f 54  equest == GAIA_T
cdd70 49 4e 59 50 4f 49 4e 54 5f 42 4c 4f 42 29 0a 20  INYPOINT_BLOB). 
cdd80 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 62 6c       {..  if (bl
cdd90 6f 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  ob_type == GAIA_
cdda0 54 49 4e 59 50 4f 49 4e 54 5f 42 4c 4f 42 29 0a  TINYPOINT_BLOB).
cddb0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cddc0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
cddd0 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 1);..  else.
cdde0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cddf0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
cde00 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
cde10 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
cde20 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20 47 41  f (request == GA
cde30 49 41 5f 5a 49 50 5f 42 4c 4f 42 29 0a 20 20 20  IA_ZIP_BLOB).   
cde40 20 20 20 7b 0a 09 20 20 69 66 20 28 62 6c 6f 62     {..  if (blob
cde50 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 5a 49  _type == GAIA_ZI
cde60 50 5f 42 4c 4f 42 29 0a 09 20 20 20 20 20 20 73  P_BLOB)..      s
cde70 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
cde80 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
cde90 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
cdea0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
cdeb0 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
cdec0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
cded0 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
cdee0 73 74 20 3d 3d 20 47 41 49 41 5f 50 44 46 5f 42  st == GAIA_PDF_B
cdef0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
cdf00 69 66 20 28 62 6c 6f 62 5f 74 79 70 65 20 3d 3d  if (blob_type ==
cdf10 20 47 41 49 41 5f 50 44 46 5f 42 4c 4f 42 29 0a   GAIA_PDF_BLOB).
cdf20 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cdf30 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
cdf40 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 1);..  else.
cdf50 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cdf60 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
cdf70 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
cdf80 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
cdf90 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20 47 41  f (request == GA
cdfa0 49 41 5f 54 49 46 46 5f 42 4c 4f 42 29 0a 20 20  IA_TIFF_BLOB).  
cdfb0 20 20 20 20 7b 0a 09 20 20 69 66 20 28 62 6c 6f      {..  if (blo
cdfc0 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 54  b_type == GAIA_T
cdfd0 49 46 46 5f 42 4c 4f 42 29 0a 09 20 20 20 20 20  IFF_BLOB)..     
cdfe0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cdff0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29  int (context, 1)
ce000 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
ce010 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ce020 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
ce030 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
ce040 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71     }.    if (req
ce050 75 65 73 74 20 3d 3d 20 47 41 49 41 5f 47 49 46  uest == GAIA_GIF
ce060 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
ce070 20 20 69 66 20 28 62 6c 6f 62 5f 74 79 70 65 20    if (blob_type 
ce080 3d 3d 20 47 41 49 41 5f 47 49 46 5f 42 4c 4f 42  == GAIA_GIF_BLOB
ce090 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  )..      sqlite3
ce0a0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
ce0b0 74 65 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73  text, 1);..  els
ce0c0 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  e..      sqlite3
ce0d0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
ce0e0 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74  text, 0);..  ret
ce0f0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
ce100 20 69 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20   if (request == 
ce110 47 41 49 41 5f 50 4e 47 5f 42 4c 4f 42 29 0a 20  GAIA_PNG_BLOB). 
ce120 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 62 6c       {..  if (bl
ce130 6f 62 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  ob_type == GAIA_
ce140 50 4e 47 5f 42 4c 4f 42 29 0a 09 20 20 20 20 20  PNG_BLOB)..     
ce150 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ce160 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29  int (context, 1)
ce170 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
ce180 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ce190 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
ce1a0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
ce1b0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71     }.    if (req
ce1c0 75 65 73 74 20 3d 3d 20 47 41 49 41 5f 4a 50 45  uest == GAIA_JPE
ce1d0 47 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  G_BLOB).      {.
ce1e0 09 20 20 69 66 20 28 62 6c 6f 62 5f 74 79 70 65  .  if (blob_type
ce1f0 20 3d 3d 20 47 41 49 41 5f 4a 50 45 47 5f 42 4c   == GAIA_JPEG_BL
ce200 4f 42 20 7c 7c 20 62 6c 6f 62 5f 74 79 70 65 20  OB || blob_type 
ce210 3d 3d 20 47 41 49 41 5f 45 58 49 46 5f 42 4c 4f  == GAIA_EXIF_BLO
ce220 42 0a 09 20 20 20 20 20 20 7c 7c 20 62 6c 6f 62  B..      || blob
ce230 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 45 58  _type == GAIA_EX
ce240 49 46 5f 47 50 53 5f 42 4c 4f 42 29 0a 09 20 20  IF_GPS_BLOB)..  
ce250 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ce260 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
ce270 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20   1);..  else..  
ce280 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ce290 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
ce2a0 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
ce2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
ce2c0 72 65 71 75 65 73 74 20 3d 3d 20 47 41 49 41 5f  request == GAIA_
ce2d0 45 58 49 46 5f 42 4c 4f 42 29 0a 20 20 20 20 20  EXIF_BLOB).     
ce2e0 20 7b 0a 09 20 20 69 66 20 28 62 6c 6f 62 5f 74   {..  if (blob_t
ce2f0 79 70 65 20 3d 3d 20 47 41 49 41 5f 45 58 49 46  ype == GAIA_EXIF
ce300 5f 42 4c 4f 42 20 7c 7c 20 62 6c 6f 62 5f 74 79  _BLOB || blob_ty
ce310 70 65 20 3d 3d 20 47 41 49 41 5f 45 58 49 46 5f  pe == GAIA_EXIF_
ce320 47 50 53 5f 42 4c 4f 42 29 0a 09 20 20 20 20 7b  GPS_BLOB)..    {
ce330 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
ce340 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
ce350 31 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  1);..    }..  el
ce360 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  se..      sqlite
ce370 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
ce380 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65  ntext, 0);..  re
ce390 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
ce3a0 20 20 69 66 20 28 72 65 71 75 65 73 74 20 3d 3d    if (request ==
ce3b0 20 47 41 49 41 5f 45 58 49 46 5f 47 50 53 5f 42   GAIA_EXIF_GPS_B
ce3c0 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
ce3d0 69 66 20 28 62 6c 6f 62 5f 74 79 70 65 20 3d 3d  if (blob_type ==
ce3e0 20 47 41 49 41 5f 45 58 49 46 5f 47 50 53 5f 42   GAIA_EXIF_GPS_B
ce3f0 4c 4f 42 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  LOB)..    {...sq
ce400 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
ce410 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 09   (context, 1);..
ce420 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
ce430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
ce440 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
ce450 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  , 0);..  return;
ce460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
ce470 28 72 65 71 75 65 73 74 20 3d 3d 20 47 41 49 41  (request == GAIA
ce480 5f 57 45 42 50 5f 42 4c 4f 42 29 0a 20 20 20 20  _WEBP_BLOB).    
ce490 20 20 7b 0a 09 20 20 69 66 20 28 62 6c 6f 62 5f    {..  if (blob_
ce4a0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 57 45 42  type == GAIA_WEB
ce4b0 50 5f 42 4c 4f 42 29 0a 09 20 20 20 20 20 20 73  P_BLOB)..      s
ce4c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
ce4d0 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
ce4e0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73  .  else..      s
ce4f0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
ce500 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
ce510 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
ce520 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
ce530 73 74 20 3d 3d 20 47 41 49 41 5f 4a 50 32 5f 42  st == GAIA_JP2_B
ce540 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
ce550 69 66 20 28 62 6c 6f 62 5f 74 79 70 65 20 3d 3d  if (blob_type ==
ce560 20 47 41 49 41 5f 4a 50 32 5f 42 4c 4f 42 29 0a   GAIA_JP2_BLOB).
ce570 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ce580 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
ce590 78 74 2c 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a  xt, 1);..  else.
ce5a0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ce5b0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
ce5c0 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
ce5d0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  n;.      }.    s
ce5e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
ce5f0 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
ce600 0a 7d 0a 0a 2f 2a 0a 2f 20 74 68 65 20 66 6f 6c  .}../*./ the fol
ce610 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
ce620 20 73 69 6d 70 6c 79 20 72 65 61 64 64 72 65 73   simply readdres
ce630 73 20 74 68 65 20 62 6c 6f 62 5f 67 75 65 73 73  s the blob_guess
ce640 28 29 0a 2f 20 73 65 74 74 69 6e 67 20 74 68 65  ()./ setting the
ce650 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 71   appropriate req
ce660 75 65 73 74 20 6d 6f 64 65 0a 2a 2f 0a 0a 73 74  uest mode.*/..st
ce670 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49  atic void.fnct_I
ce680 73 47 65 6f 6d 65 74 72 79 42 6c 6f 62 20 28 73  sGeometryBlob (s
ce690 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ce6a0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
ce6b0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ce6c0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
ce6d0 20 62 6c 6f 62 5f 67 75 65 73 73 20 28 63 6f 6e   blob_guess (con
ce6e0 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
ce6f0 2c 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 5f  , GAIA_GEOMETRY_
ce700 42 4c 4f 42 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  BLOB);.}..static
ce710 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 54 69 6e   void.fnct_IsTin
ce720 79 50 6f 69 6e 74 42 6c 6f 62 20 28 73 71 6c 69  yPointBlob (sqli
ce730 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
ce740 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
ce750 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
ce760 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
ce770 7b 0a 20 20 20 20 62 6c 6f 62 5f 67 75 65 73 73  {.    blob_guess
ce780 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
ce790 20 61 72 67 76 2c 20 47 41 49 41 5f 54 49 4e 59   argv, GAIA_TINY
ce7a0 50 4f 49 4e 54 5f 42 4c 4f 42 29 3b 0a 7d 0a 0a  POINT_BLOB);.}..
ce7b0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
ce7c0 5f 49 73 5a 69 70 42 6c 6f 62 20 28 73 71 6c 69  _IsZipBlob (sqli
ce7d0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
ce7e0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
ce7f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
ce800 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 62 6c  * argv).{.    bl
ce810 6f 62 5f 67 75 65 73 73 20 28 63 6f 6e 74 65 78  ob_guess (contex
ce820 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47  t, argc, argv, G
ce830 41 49 41 5f 5a 49 50 5f 42 4c 4f 42 29 3b 0a 7d  AIA_ZIP_BLOB);.}
ce840 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
ce850 63 74 5f 49 73 50 64 66 42 6c 6f 62 20 28 73 71  ct_IsPdfBlob (sq
ce860 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
ce870 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ce880 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
ce890 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
ce8a0 62 6c 6f 62 5f 67 75 65 73 73 20 28 63 6f 6e 74  blob_guess (cont
ce8b0 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ext, argc, argv,
ce8c0 20 47 41 49 41 5f 50 44 46 5f 42 4c 4f 42 29 3b   GAIA_PDF_BLOB);
ce8d0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
ce8e0 66 6e 63 74 5f 49 73 54 69 66 66 42 6c 6f 62 20  fnct_IsTiffBlob 
ce8f0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ce900 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
ce910 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ce920 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
ce930 20 20 20 62 6c 6f 62 5f 67 75 65 73 73 20 28 63     blob_guess (c
ce940 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
ce950 67 76 2c 20 47 41 49 41 5f 54 49 46 46 5f 42 4c  gv, GAIA_TIFF_BL
ce960 4f 42 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  OB);.}..static v
ce970 6f 69 64 0a 66 6e 63 74 5f 49 73 47 69 66 42 6c  oid.fnct_IsGifBl
ce980 6f 62 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ob (sqlite3_cont
ce990 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
ce9a0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
ce9b0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
ce9c0 7b 0a 20 20 20 20 62 6c 6f 62 5f 67 75 65 73 73  {.    blob_guess
ce9d0 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
ce9e0 20 61 72 67 76 2c 20 47 41 49 41 5f 47 49 46 5f   argv, GAIA_GIF_
ce9f0 42 4c 4f 42 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  BLOB);.}..static
cea00 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 50 6e 67   void.fnct_IsPng
cea10 42 6c 6f 62 20 28 73 71 6c 69 74 65 33 5f 63 6f  Blob (sqlite3_co
cea20 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
cea30 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
cea40 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
cea50 29 0a 7b 0a 20 20 20 20 62 6c 6f 62 5f 67 75 65  ).{.    blob_gue
cea60 73 73 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ss (context, arg
cea70 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 50 4e  c, argv, GAIA_PN
cea80 47 5f 42 4c 4f 42 29 3b 0a 7d 0a 0a 73 74 61 74  G_BLOB);.}..stat
cea90 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 73 4a  ic void.fnct_IsJ
ceaa0 70 65 67 42 6c 6f 62 20 28 73 71 6c 69 74 65 33  pegBlob (sqlite3
ceab0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ceac0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
cead0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ceae0 72 67 76 29 0a 7b 0a 20 20 20 20 62 6c 6f 62 5f  rgv).{.    blob_
ceaf0 67 75 65 73 73 20 28 63 6f 6e 74 65 78 74 2c 20  guess (context, 
ceb00 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41  argc, argv, GAIA
ceb10 5f 4a 50 45 47 5f 42 4c 4f 42 29 3b 0a 7d 0a 0a  _JPEG_BLOB);.}..
ceb20 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
ceb30 5f 49 73 45 78 69 66 42 6c 6f 62 20 28 73 71 6c  _IsExifBlob (sql
ceb40 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
ceb50 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
ceb60 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
ceb70 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 62  ** argv).{.    b
ceb80 6c 6f 62 5f 67 75 65 73 73 20 28 63 6f 6e 74 65  lob_guess (conte
ceb90 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
ceba0 47 41 49 41 5f 45 58 49 46 5f 42 4c 4f 42 29 3b  GAIA_EXIF_BLOB);
cebb0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
cebc0 66 6e 63 74 5f 49 73 45 78 69 66 47 70 73 42 6c  fnct_IsExifGpsBl
cebd0 6f 62 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ob (sqlite3_cont
cebe0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
cebf0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
cec00 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
cec10 7b 0a 20 20 20 20 62 6c 6f 62 5f 67 75 65 73 73  {.    blob_guess
cec20 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
cec30 20 61 72 67 76 2c 20 47 41 49 41 5f 45 58 49 46   argv, GAIA_EXIF
cec40 5f 47 50 53 5f 42 4c 4f 42 29 3b 0a 7d 0a 0a 73  _GPS_BLOB);.}..s
cec50 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
cec60 49 73 57 65 62 50 42 6c 6f 62 20 28 73 71 6c 69  IsWebPBlob (sqli
cec70 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
cec80 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
cec90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
ceca0 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 62 6c  * argv).{.    bl
cecb0 6f 62 5f 67 75 65 73 73 20 28 63 6f 6e 74 65 78  ob_guess (contex
cecc0 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47  t, argc, argv, G
cecd0 41 49 41 5f 57 45 42 50 5f 42 4c 4f 42 29 3b 0a  AIA_WEBP_BLOB);.
cece0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
cecf0 6e 63 74 5f 49 73 4a 50 32 42 6c 6f 62 20 28 73  nct_IsJP2Blob (s
ced00 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ced10 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
ced20 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ced30 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
ced40 20 62 6c 6f 62 5f 67 75 65 73 73 20 28 63 6f 6e   blob_guess (con
ced50 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
ced60 2c 20 47 41 49 41 5f 4a 50 32 5f 42 4c 4f 42 29  , GAIA_JP2_BLOB)
ced70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ced80 0a 66 6e 63 74 5f 42 6c 6f 62 46 72 6f 6d 46 69  .fnct_BlobFromFi
ced90 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  le (sqlite3_cont
ceda0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
cedb0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
cedc0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
cedd0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
cede0 6e 3a 0a 2f 20 42 6c 6f 62 46 72 6f 6d 46 69 6c  n:./ BlobFromFil
cedf0 65 28 54 45 58 54 20 66 69 6c 65 70 61 74 68 29  e(TEXT filepath)
cee00 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20  ././ returns:./ 
cee10 73 6f 6d 65 20 42 4c 4f 42 20 6f 6e 20 73 75 63  some BLOB on suc
cee20 63 65 73 73 0a 2f 20 6f 72 20 4e 55 4c 4c 20 6f  cess./ or NULL o
cee30 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20  n failure.*/.   
cee40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cee50 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
cee60 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74  n_bytes;.    int
cee70 20 6d 61 78 5f 62 6c 6f 62 3b 0a 20 20 20 20 69   max_blob;.    i
cee80 6e 74 20 72 64 3b 0a 20 20 20 20 73 71 6c 69 74  nt rd;.    sqlit
cee90 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
ceea0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
ceeb0 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
ceec0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ceed0 20 2a 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20   *path = NULL;. 
ceee0 20 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e 55     FILE *in = NU
ceef0 4c 4c 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  LL;.    GAIA_UNU
cef00 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
cef10 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
cef20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
cef30 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
cef40 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) == SQLITE_TEX
cef50 54 29 0a 09 70 61 74 68 20 3d 20 28 63 6f 6e 73  T)..path = (cons
cef60 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
cef70 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
cef80 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
cef90 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  path == NULL).  
cefa0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
cefb0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
cefc0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
cefd0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
cefe0 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65  _blob = (unsigne
ceff0 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  d char *) sqlite
cf000 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
cf010 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[0]);.    n_by
cf020 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
cf030 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
cf040 30 5d 29 3b 0a 20 20 20 20 69 6e 20 3d 20 66 6f  0]);.    in = fo
cf050 70 65 6e 20 28 70 61 74 68 2c 20 22 72 62 22 29  pen (path, "rb")
cf060 3b 0a 20 20 20 20 69 66 20 28 69 6e 20 3d 3d 20  ;.    if (in == 
cf070 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
cf080 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cf090 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
cf0a0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
cf0b0 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
cf0c0 20 20 7b 0a 09 20 20 2f 2a 20 71 75 65 72 79 69    {..  /* queryi
cf0d0 6e 67 20 74 68 65 20 66 69 6c 65 20 6c 65 6e 67  ng the file leng
cf0e0 74 68 20 2a 2f 0a 09 20 20 69 66 20 28 66 73 65  th */..  if (fse
cf0f0 65 6b 20 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f  ek (in, 0, SEEK_
cf100 45 4e 44 29 20 3c 20 30 29 0a 09 20 20 20 20 7b  END) < 0)..    {
cf110 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
cf120 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
cf130 3b 0a 09 09 66 63 6c 6f 73 65 20 28 69 6e 29 3b  ;...fclose (in);
cf140 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
cf150 7d 0a 09 20 20 6e 5f 62 79 74 65 73 20 3d 20 66  }..  n_bytes = f
cf160 74 65 6c 6c 20 28 69 6e 29 3b 0a 09 20 20 6d 61  tell (in);..  ma
cf170 78 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  x_blob = sqlite3
cf180 5f 6c 69 6d 69 74 20 28 73 71 6c 69 74 65 2c 20  _limit (sqlite, 
cf190 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
cf1a0 47 54 48 2c 20 2d 31 29 3b 0a 09 20 20 69 66 20  GTH, -1);..  if 
cf1b0 28 6e 5f 62 79 74 65 73 20 3e 20 6d 61 78 5f 62  (n_bytes > max_b
cf1c0 6c 6f 62 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a  lob)..    {.../*
cf1d0 20 74 6f 6f 20 62 69 67 3b 20 63 61 6e 6e 6f 74   too big; cannot
cf1e0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 74 6f 20   be stored into 
cf1f0 61 20 42 4c 4f 42 20 2a 2f 0a 09 09 73 71 6c 69  a BLOB */...sqli
cf200 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
cf210 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 66 63 6c  (context);...fcl
cf220 6f 73 65 20 28 69 6e 29 3b 0a 09 09 72 65 74 75  ose (in);...retu
cf230 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 72 65  rn;..    }..  re
cf240 77 69 6e 64 20 28 69 6e 29 3b 0a 09 20 20 70 5f  wind (in);..  p_
cf250 62 6c 6f 62 20 3d 20 6d 61 6c 6c 6f 63 20 28 6e  blob = malloc (n
cf260 5f 62 79 74 65 73 29 3b 0a 09 20 20 2f 2a 20 61  _bytes);..  /* a
cf270 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6c 6f 61  ttempting to loa
cf280 64 20 74 68 65 20 42 4c 4f 42 20 66 72 6f 6d 20  d the BLOB from 
cf290 74 68 65 20 66 69 6c 65 20 2a 2f 0a 09 20 20 72  the file */..  r
cf2a0 64 20 3d 20 66 72 65 61 64 20 28 70 5f 62 6c 6f  d = fread (p_blo
cf2b0 62 2c 20 31 2c 20 6e 5f 62 79 74 65 73 2c 20 69  b, 1, n_bytes, i
cf2c0 6e 29 3b 0a 09 20 20 66 63 6c 6f 73 65 20 28 69  n);..  fclose (i
cf2d0 6e 29 3b 0a 09 20 20 69 66 20 28 72 64 20 21 3d  n);..  if (rd !=
cf2e0 20 6e 5f 62 79 74 65 73 29 0a 09 20 20 20 20 7b   n_bytes)..    {
cf2f0 0a 09 09 2f 2a 20 72 65 61 64 20 65 72 72 6f 72  .../* read error
cf300 20 2a 2f 0a 09 09 66 72 65 65 20 28 70 5f 62 6c   */...free (p_bl
cf310 6f 62 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 72  ob);...sqlite3_r
cf320 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
cf330 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
cf340 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 65  .    }..  sqlite
cf350 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63  3_result_blob (c
cf360 6f 6e 74 65 78 74 2c 20 70 5f 62 6c 6f 62 2c 20  ontext, p_blob, 
cf370 6e 5f 62 79 74 65 73 2c 20 66 72 65 65 29 3b 0a  n_bytes, free);.
cf380 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69        }.}..stati
cf390 63 20 76 6f 69 64 0a 66 6e 63 74 5f 42 6c 6f 62  c void.fnct_Blob
cf3a0 54 6f 46 69 6c 65 20 28 73 71 6c 69 74 65 33 5f  ToFile (sqlite3_
cf3b0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
cf3c0 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
cf3d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
cf3e0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
cf3f0 63 74 69 6f 6e 3a 0a 2f 20 42 6c 6f 62 54 6f 46  ction:./ BlobToF
cf400 69 6c 65 28 42 4c 4f 42 20 70 61 79 6c 6f 61 64  ile(BLOB payload
cf410 2c 20 54 45 58 54 20 66 69 6c 65 70 61 74 68 29  , TEXT filepath)
cf420 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20  ././ returns:./ 
cf430 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 6f  1 on success./ o
cf440 72 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a  r 0 on failure.*
cf450 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
cf460 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
cf470 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
cf480 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
cf490 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 46  th = NULL;.    F
cf4a0 49 4c 45 20 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b  ILE *out = NULL;
cf4b0 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31  .    int ret = 1
cf4c0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
cf4d0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
cf4e0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
cf4f0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
cf500 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
cf510 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
cf520 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
cf530 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
cf540 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20  context, 0);..  
cf550 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
cf560 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
cf570 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
cf580 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [1]) == SQLITE_T
cf590 45 58 54 29 0a 09 70 61 74 68 20 3d 20 28 63 6f  EXT)..path = (co
cf5a0 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
cf5b0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
cf5c0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
cf5d0 20 28 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 0a   (path == NULL).
cf5e0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
cf5f0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
cf600 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72  ontext, 0);..  r
cf610 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
cf620 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
cf630 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
cf640 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
cf650 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
cf660 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
cf670 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
cf680 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6f 75 74  rgv[0]);.    out
cf690 20 3d 20 66 6f 70 65 6e 20 28 70 61 74 68 2c 20   = fopen (path, 
cf6a0 22 77 62 22 29 3b 0a 20 20 20 20 69 66 20 28 6f  "wb");.    if (o
cf6b0 75 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74  ut == NULL)..ret
cf6c0 20 3d 20 30 3b 0a 20 20 20 20 65 6c 73 65 0a 20   = 0;.    else. 
cf6d0 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 65 78 70       {..  /* exp
cf6e0 6f 72 74 69 6e 67 20 74 68 65 20 42 4c 4f 42 20  orting the BLOB 
cf6f0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  into the file */
cf700 0a 09 20 20 69 6e 74 20 77 72 20 3d 20 66 77 72  ..  int wr = fwr
cf710 69 74 65 20 28 70 5f 62 6c 6f 62 2c 20 31 2c 20  ite (p_blob, 1, 
cf720 6e 5f 62 79 74 65 73 2c 20 6f 75 74 29 3b 0a 09  n_bytes, out);..
cf730 20 20 69 66 20 28 77 72 20 21 3d 20 6e 5f 62 79    if (wr != n_by
cf740 74 65 73 29 0a 09 20 20 20 20 20 20 72 65 74 20  tes)..      ret 
cf750 3d 20 30 3b 0a 09 20 20 66 63 6c 6f 73 65 20 28  = 0;..  fclose (
cf760 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
cf770 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cf780 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
cf790 65 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  et);.}..#ifndef 
cf7a0 4f 4d 49 54 5f 47 45 4f 53 09 09 2f 2a 20 6f 6e  OMIT_GEOS../* on
cf7b0 6c 79 20 69 66 20 47 45 4f 53 20 69 73 20 65 6e  ly if GEOS is en
cf7c0 61 62 6c 65 64 20 2a 2f 0a 0a 73 74 61 74 69 63  abled */..static
cf7d0 20 69 6e 74 0a 6c 6f 61 64 5f 64 78 66 20 28 73   int.load_dxf (s
cf7e0 71 6c 69 74 65 33 20 2a 20 64 62 5f 68 61 6e 64  qlite3 * db_hand
cf7f0 6c 65 2c 20 73 74 72 75 63 74 20 73 70 6c 69 74  le, struct split
cf800 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
cf810 20 2a 63 61 63 68 65 2c 0a 09 20 20 63 68 61 72   *cache,..  char
cf820 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20   *filename, int 
cf830 73 72 69 64 2c 20 69 6e 74 20 61 70 70 65 6e 64  srid, int append
cf840 2c 20 69 6e 74 20 66 6f 72 63 65 5f 64 69 6d 73  , int force_dims
cf850 2c 20 69 6e 74 20 6d 6f 64 65 2c 0a 09 20 20 69  , int mode,..  i
cf860 6e 74 20 73 70 65 63 69 61 6c 5f 72 69 6e 67 73  nt special_rings
cf870 2c 20 63 68 61 72 20 2a 70 72 65 66 69 78 2c 20  , char *prefix, 
cf880 63 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61 6d 65  char *layer_name
cf890 29 0a 7b 0a 2f 2a 20 73 63 61 6e 6e 69 6e 67 20  ).{./* scanning 
cf8a0 61 20 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a Directory and 
cf8b0 70 72 6f 63 65 73 73 69 6e 67 20 61 6c 6c 20 44  processing all D
cf8c0 58 46 20 66 69 6c 65 73 20 2a 2f 0a 20 20 20 20  XF files */.    
cf8d0 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 67 61 69  int ret;.    gai
cf8e0 61 44 78 66 50 61 72 73 65 72 50 74 72 20 64 78  aDxfParserPtr dx
cf8f0 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 63 72  f = NULL;../* cr
cf900 65 61 74 69 6e 67 20 61 20 44 58 46 20 70 61 72  eating a DXF par
cf910 73 65 72 20 2a 2f 0a 20 20 20 20 64 78 66 20 3d  ser */.    dxf =
cf920 20 67 61 69 61 43 72 65 61 74 65 44 78 66 50 61   gaiaCreateDxfPa
cf930 72 73 65 72 20 28 73 72 69 64 2c 20 66 6f 72 63  rser (srid, forc
cf940 65 5f 64 69 6d 73 2c 20 70 72 65 66 69 78 2c 20  e_dims, prefix, 
cf950 6c 61 79 65 72 5f 6e 61 6d 65 2c 0a 09 09 09 20  layer_name,.... 
cf960 20 20 20 20 20 20 73 70 65 63 69 61 6c 5f 72 69        special_ri
cf970 6e 67 73 29 3b 0a 20 20 20 20 69 66 20 28 64 78  ngs);.    if (dx
cf980 66 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  f == NULL).     
cf990 20 7b 0a 09 20 20 72 65 74 20 3d 20 30 3b 0a 09   {..  ret = 0;..
cf9a0 20 20 67 6f 74 6f 20 73 74 6f 70 5f 64 78 66 3b    goto stop_dxf;
cf9b0 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 61 74 74 65  .      }./* atte
cf9c0 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20  mpting to parse 
cf9d0 74 68 65 20 44 58 46 20 69 6e 70 75 74 20 66 69  the DXF input fi
cf9e0 6c 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 67 61  le */.    if (ga
cf9f0 69 61 50 61 72 73 65 44 78 66 46 69 6c 65 5f 72  iaParseDxfFile_r
cfa00 20 28 63 61 63 68 65 2c 20 64 78 66 2c 20 66 69   (cache, dxf, fi
cfa10 6c 65 6e 61 6d 65 29 29 0a 20 20 20 20 20 20 7b  lename)).      {
cfa20 0a 09 20 20 2f 2a 20 6c 6f 61 64 69 6e 67 20 69  ..  /* loading i
cfa30 6e 74 6f 20 74 68 65 20 44 42 20 2a 2f 0a 09 20  nto the DB */.. 
cfa40 20 69 66 20 28 21 67 61 69 61 4c 6f 61 64 46 72   if (!gaiaLoadFr
cfa50 6f 6d 44 78 66 50 61 72 73 65 72 20 28 64 62 5f  omDxfParser (db_
cfa60 68 61 6e 64 6c 65 2c 20 64 78 66 2c 20 6d 6f 64  handle, dxf, mod
cfa70 65 2c 20 61 70 70 65 6e 64 29 29 0a 09 20 20 20  e, append))..   
cfa80 20 7b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09   {...ret = 0;...
cfa90 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28 22 44  spatialite_e ("D
cfaa0 42 20 65 72 72 6f 72 20 77 68 69 6c 65 20 6c 6f  B error while lo
cfab0 61 64 69 6e 67 3a 20 25 73 5c 6e 22 2c 20 66 69  ading: %s\n", fi
cfac0 6c 65 6e 61 6d 65 29 3b 0a 09 20 20 20 20 7d 0a  lename);..    }.
cfad0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
cfae0 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65 74 20  .      {..  ret 
cfaf0 3d 20 30 3b 0a 09 20 20 73 70 61 74 69 61 6c 69  = 0;..  spatiali
cfb00 74 65 5f 65 20 28 22 55 6e 61 62 6c 65 20 74 6f  te_e ("Unable to
cfb10 20 70 61 72 73 65 3a 20 25 73 5c 6e 22 2c 20 66   parse: %s\n", f
cfb20 69 6c 65 6e 61 6d 65 29 3b 0a 09 20 20 67 6f 74  ilename);..  got
cfb30 6f 20 73 74 6f 70 5f 64 78 66 3b 0a 20 20 20 20  o stop_dxf;.    
cfb40 20 20 7d 0a 20 20 20 20 73 70 61 74 69 61 6c 69    }.    spatiali
cfb50 74 65 5f 65 20 28 22 5c 6e 2a 2a 2a 20 44 58 46  te_e ("\n*** DXF
cfb60 20 66 69 6c 65 20 73 75 63 63 65 73 73 66 75 6c   file successful
cfb70 6c 79 20 6c 6f 61 64 65 64 5c 6e 22 29 3b 0a 20  ly loaded\n");. 
cfb80 20 20 20 72 65 74 20 3d 20 31 3b 0a 0a 20 20 73     ret = 1;..  s
cfb90 74 6f 70 5f 64 78 66 3a 0a 20 20 20 20 2f 2a 20  top_dxf:.    /* 
cfba0 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 44  destroying the D
cfbb0 58 46 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20  XF parser */.   
cfbc0 20 67 61 69 61 44 65 73 74 72 6f 79 44 78 66 50   gaiaDestroyDxfP
cfbd0 61 72 73 65 72 20 28 64 78 66 29 3b 0a 20 20 20  arser (dxf);.   
cfbe0 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
cfbf0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
cfc00 5f 49 6d 70 6f 72 74 44 58 46 20 28 73 71 6c 69  _ImportDXF (sqli
cfc10 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
cfc20 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
cfc30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
cfc40 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
cfc50 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 6d 70   function:./ Imp
cfc60 6f 72 74 44 58 46 28 54 45 58 54 20 66 69 6c 65  ortDXF(TEXT file
cfc70 6e 61 6d 65 29 0a 2f 20 20 20 20 20 6f 72 0a 2f  name)./     or./
cfc80 20 49 6e 70 6f 72 74 44 58 46 28 54 45 58 54 20   InportDXF(TEXT 
cfc90 66 69 6c 65 6e 61 6d 65 2c 20 49 4e 54 20 73 72  filename, INT sr
cfca0 69 64 2c 20 49 4e 54 20 61 70 70 65 6e 64 2c 20  id, INT append, 
cfcb0 54 45 58 54 20 64 69 6d 73 2c 0a 2f 20 20 20 20  TEXT dims,./    
cfcc0 20 20 20 20 20 20 20 54 45 58 54 20 6d 6f 64 65         TEXT mode
cfcd0 2c 20 54 45 58 54 20 73 70 65 63 69 61 6c 5f 72  , TEXT special_r
cfce0 69 6e 67 73 2c 20 54 45 58 54 20 74 61 62 6c 65  ings, TEXT table
cfcf0 5f 70 72 65 66 69 78 2c 0a 2f 20 20 20 20 20 20  _prefix,./      
cfd00 20 20 20 20 20 54 45 58 54 20 6c 61 79 65 72 5f       TEXT layer_
cfd10 6e 61 6d 65 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  name)././ return
cfd20 73 3a 0a 2f 20 31 20 6f 6e 20 73 75 63 63 65 73  s:./ 1 on succes
cfd30 73 0a 2f 20 6f 72 20 30 20 6f 6e 20 66 61 69 6c  s./ or 0 on fail
cfd40 75 72 65 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e  ure./ NULL on in
cfd50 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
cfd60 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
cfd70 20 20 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61      char *filena
cfd80 6d 65 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64  me;.    int srid
cfd90 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 61   = -1;.    int a
cfda0 70 70 65 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69  ppend = 0;.    i
cfdb0 6e 74 20 73 70 65 63 69 61 6c 5f 72 69 6e 67 73  nt special_rings
cfdc0 20 3d 20 47 41 49 41 5f 44 58 46 5f 52 49 4e 47   = GAIA_DXF_RING
cfdd0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 6e 74 20 6d  _NONE;.    int m
cfde0 6f 64 65 20 3d 20 47 41 49 41 5f 44 58 46 5f 49  ode = GAIA_DXF_I
cfdf0 4d 50 4f 52 54 5f 42 59 5f 4c 41 59 45 52 3b 0a  MPORT_BY_LAYER;.
cfe00 20 20 20 20 69 6e 74 20 66 6f 72 63 65 5f 64 69      int force_di
cfe10 6d 73 20 3d 20 47 41 49 41 5f 44 58 46 5f 41 55  ms = GAIA_DXF_AU
cfe20 54 4f 5f 32 44 5f 33 44 3b 0a 20 20 20 20 63 68  TO_2D_3D;.    ch
cfe30 61 72 20 2a 70 72 65 66 69 78 20 3d 20 4e 55 4c  ar *prefix = NUL
cfe40 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6c 61 79  L;.    char *lay
cfe50 65 72 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  er_name = NULL;.
cfe60 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 5f      sqlite3 *db_
cfe70 68 61 6e 64 6c 65 20 3d 20 73 71 6c 69 74 65 33  handle = sqlite3
cfe80 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
cfe90 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
cfea0 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
cfeb0 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
cfec0 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
cfed0 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
cfee0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
cfef0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
cff00 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
cff10 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
cff20 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
cff30 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  0]) != SQLITE_TE
cff40 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
cff50 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
cff60 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
cff70 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
cff80 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 20 3d 20  .    filename = 
cff90 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33  (char *) sqlite3
cffa0 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
cffb0 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 61  v[0]);.    if (a
cffc0 72 67 63 20 3e 20 37 29 0a 20 20 20 20 20 20 7b  rgc > 7).      {
cffd0 0a 09 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
cffe0 76 61 6c 75 65 3b 0a 09 20 20 69 66 20 28 73 71  value;..  if (sq
cfff0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
d0000 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
d0010 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
d0020 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
d0030 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
d0040 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
d0050 09 20 20 20 20 7d 0a 09 20 20 73 72 69 64 20 3d  .    }..  srid =
d0060 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
d0070 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
d0080 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
d0090 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
d00a0 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) != SQLITE_INTE
d00b0 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  GER)..    {...sq
d00c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
d00d0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
d00e0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
d00f0 20 61 70 70 65 6e 64 20 3d 20 73 71 6c 69 74 65   append = sqlite
d0100 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
d0110 76 5b 32 5d 29 3b 0a 09 20 20 69 66 20 28 73 71  v[2]);..  if (sq
d0120 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
d0130 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51   (argv[3]) != SQ
d0140 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20  LITE_TEXT)..    
d0150 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
d0160 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
d0170 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
d0180 20 20 7d 0a 09 20 20 76 61 6c 75 65 20 3d 20 28    }..  value = (
d0190 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d01a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d01b0 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 69   (argv[3]);..  i
d01c0 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 76  f (strcasecmp (v
d01d0 61 6c 75 65 2c 20 22 32 44 22 29 20 3d 3d 20 30  alue, "2D") == 0
d01e0 29 0a 09 20 20 20 20 20 20 66 6f 72 63 65 5f 64  )..      force_d
d01f0 69 6d 73 20 3d 20 47 41 49 41 5f 44 58 46 5f 46  ims = GAIA_DXF_F
d0200 4f 52 43 45 5f 32 44 3b 0a 09 20 20 65 6c 73 65  ORCE_2D;..  else
d0210 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20   if (strcasecmp 
d0220 28 76 61 6c 75 65 2c 20 22 33 44 22 29 20 3d 3d  (value, "3D") ==
d0230 20 30 29 0a 09 20 20 20 20 20 20 66 6f 72 63 65   0)..      force
d0240 5f 64 69 6d 73 20 3d 20 47 41 49 41 5f 44 58 46  _dims = GAIA_DXF
d0250 5f 46 4f 52 43 45 5f 33 44 3b 0a 09 20 20 65 6c  _FORCE_3D;..  el
d0260 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63 6d  se if (strcasecm
d0270 70 20 28 76 61 6c 75 65 2c 20 22 41 55 54 4f 22  p (value, "AUTO"
d0280 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 66  ) == 0)..      f
d0290 6f 72 63 65 5f 64 69 6d 73 20 3d 20 47 41 49 41  orce_dims = GAIA
d02a0 5f 44 58 46 5f 41 55 54 4f 5f 32 44 5f 33 44 3b  _DXF_AUTO_2D_3D;
d02b0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
d02c0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
d02d0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
d02e0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
d02f0 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  }..  if (sqlite3
d0300 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d0310 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[4]) != SQLITE_
d0320 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
d0330 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d0340 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
d0350 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
d0360 20 20 76 61 6c 75 65 20 3d 20 28 63 6f 6e 73 74    value = (const
d0370 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
d0380 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
d0390 76 5b 34 5d 29 3b 0a 09 20 20 69 66 20 28 73 74  v[4]);..  if (st
d03a0 72 63 61 73 65 63 6d 70 20 28 76 61 6c 75 65 2c  rcasecmp (value,
d03b0 20 22 4d 49 58 45 44 22 29 20 3d 3d 20 30 29 0a   "MIXED") == 0).
d03c0 09 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 47 41  .      mode = GA
d03d0 49 41 5f 44 58 46 5f 49 4d 50 4f 52 54 5f 4d 49  IA_DXF_IMPORT_MI
d03e0 58 45 44 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  XED;..  else if 
d03f0 28 73 74 72 63 61 73 65 63 6d 70 20 28 76 61 6c  (strcasecmp (val
d0400 75 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 20  ue, "DISTINCT") 
d0410 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 6d 6f 64  == 0)..      mod
d0420 65 20 3d 20 47 41 49 41 5f 44 58 46 5f 49 4d 50  e = GAIA_DXF_IMP
d0430 4f 52 54 5f 42 59 5f 4c 41 59 45 52 3b 0a 09 20  ORT_BY_LAYER;.. 
d0440 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
d0450 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d0460 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
d0470 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
d0480 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
d0490 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
d04a0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
d04b0 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  T)..    {...sqli
d04c0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
d04d0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
d04e0 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 76  urn;..    }..  v
d04f0 61 6c 75 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  alue = (const ch
d0500 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
d0510 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 35  lue_text (argv[5
d0520 5d 29 3b 0a 09 20 20 69 66 20 28 73 74 72 63 61  ]);..  if (strca
d0530 73 65 63 6d 70 20 28 76 61 6c 75 65 2c 20 22 4c  secmp (value, "L
d0540 49 4e 4b 45 44 22 29 20 3d 3d 20 30 29 0a 09 20  INKED") == 0).. 
d0550 20 20 20 20 20 73 70 65 63 69 61 6c 5f 72 69 6e       special_rin
d0560 67 73 20 3d 20 47 41 49 41 5f 44 58 46 5f 52 49  gs = GAIA_DXF_RI
d0570 4e 47 5f 4c 49 4e 4b 45 44 3b 0a 09 20 20 65 6c  NG_LINKED;..  el
d0580 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63 6d  se if (strcasecm
d0590 70 20 28 76 61 6c 75 65 2c 20 22 55 4e 4c 49 4e  p (value, "UNLIN
d05a0 4b 45 44 22 29 20 3d 3d 20 30 29 0a 09 20 20 20  KED") == 0)..   
d05b0 20 20 20 73 70 65 63 69 61 6c 5f 72 69 6e 67 73     special_rings
d05c0 20 3d 20 47 41 49 41 5f 44 58 46 5f 52 49 4e 47   = GAIA_DXF_RING
d05d0 5f 55 4e 4c 49 4e 4b 45 44 3b 0a 09 20 20 65 6c  _UNLINKED;..  el
d05e0 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63 6d  se if (strcasecm
d05f0 70 20 28 76 61 6c 75 65 2c 20 22 4e 4f 4e 45 22  p (value, "NONE"
d0600 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 73  ) == 0)..      s
d0610 70 65 63 69 61 6c 5f 72 69 6e 67 73 20 3d 20 47  pecial_rings = G
d0620 41 49 41 5f 44 58 46 5f 52 49 4e 47 5f 4e 4f 4e  AIA_DXF_RING_NON
d0630 45 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  E;..  else..    
d0640 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
d0650 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
d0660 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
d0670 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74    }..  if (sqlit
d0680 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
d0690 72 67 76 5b 36 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[6]) == SQLIT
d06a0 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20 70  E_TEXT)..      p
d06b0 72 65 66 69 78 20 3d 20 28 63 68 61 72 20 2a 29  refix = (char *)
d06c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
d06d0 65 78 74 20 28 61 72 67 76 5b 36 5d 29 3b 0a 09  ext (argv[6]);..
d06e0 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
d06f0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
d0700 72 67 76 5b 36 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[6]) != SQLIT
d0710 45 5f 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09  E_NULL)..    {..
d0720 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
d0730 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
d0740 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
d0750 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
d0760 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
d0770 5b 37 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [7]) == SQLITE_T
d0780 45 58 54 29 0a 09 20 20 20 20 20 20 6c 61 79 65  EXT)..      laye
d0790 72 5f 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  r_name = (char *
d07a0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
d07b0 74 65 78 74 20 28 61 72 67 76 5b 37 5d 29 3b 0a  text (argv[7]);.
d07c0 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69  .  else if (sqli
d07d0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
d07e0 61 72 67 76 5b 37 5d 29 20 21 3d 20 53 51 4c 49  argv[7]) != SQLI
d07f0 54 45 5f 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a  TE_NULL)..    {.
d0800 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
d0810 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
d0820 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
d0830 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 72  }.      }..    r
d0840 65 74 20 3d 0a 09 6c 6f 61 64 5f 64 78 66 20 28  et =..load_dxf (
d0850 64 62 5f 68 61 6e 64 6c 65 2c 20 63 61 63 68 65  db_handle, cache
d0860 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 73 72 69 64  , filename, srid
d0870 2c 20 61 70 70 65 6e 64 2c 20 66 6f 72 63 65 5f  , append, force_
d0880 64 69 6d 73 2c 20 6d 6f 64 65 2c 0a 09 09 20 20  dims, mode,...  
d0890 73 70 65 63 69 61 6c 5f 72 69 6e 67 73 2c 20 70  special_rings, p
d08a0 72 65 66 69 78 2c 20 6c 61 79 65 72 5f 6e 61 6d  refix, layer_nam
d08b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
d08c0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
d08d0 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74  ext, ret);.}..st
d08e0 61 74 69 63 20 69 6e 74 0a 69 73 5f 64 78 66 5f  atic int.is_dxf_
d08f0 66 69 6c 65 20 28 63 6f 6e 73 74 20 63 68 61 72  file (const char
d0900 20 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 2f 2a   *filename).{./*
d0910 20 74 65 73 74 69 6e 67 20 69 66 20 61 20 46 69   testing if a Fi
d0920 6c 65 4e 61 6d 65 20 65 6e 64 73 20 77 69 74 68  leName ends with
d0930 20 74 68 65 20 65 78 70 65 63 74 65 64 20 73 75   the expected su
d0940 66 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ffix */.    int 
d0950 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 66 69  len = strlen (fi
d0960 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 6e 74  lename);.    int
d0970 20 6f 66 66 20 3d 20 6c 65 6e 20 2d 20 34 3b 0a   off = len - 4;.
d0980 20 20 20 20 69 66 20 28 6f 66 66 20 3e 3d 20 31      if (off >= 1
d0990 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
d09a0 28 73 74 72 63 61 73 65 63 6d 70 20 28 66 69 6c  (strcasecmp (fil
d09b0 65 6e 61 6d 65 20 2b 20 6f 66 66 2c 20 22 2e 64  ename + off, ".d
d09c0 78 66 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  xf") == 0)..    
d09d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d09e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
d09f0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  ;.}..static int.
d0a00 73 63 61 6e 5f 64 78 66 5f 64 69 72 20 28 73 71  scan_dxf_dir (sq
d0a10 6c 69 74 65 33 20 2a 20 64 62 5f 68 61 6e 64 6c  lite3 * db_handl
d0a20 65 2c 20 73 74 72 75 63 74 20 73 70 6c 69 74 65  e, struct splite
d0a30 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
d0a40 2a 63 61 63 68 65 2c 0a 09 20 20 20 20 20 20 63  *cache,..      c
d0a50 68 61 72 20 2a 64 69 72 5f 70 61 74 68 2c 20 69  har *dir_path, i
d0a60 6e 74 20 73 72 69 64 2c 20 69 6e 74 20 61 70 70  nt srid, int app
d0a70 65 6e 64 2c 20 69 6e 74 20 66 6f 72 63 65 5f 64  end, int force_d
d0a80 69 6d 73 2c 20 69 6e 74 20 6d 6f 64 65 2c 0a 09  ims, int mode,..
d0a90 20 20 20 20 20 20 69 6e 74 20 73 70 65 63 69 61        int specia
d0aa0 6c 5f 72 69 6e 67 73 2c 20 63 68 61 72 20 2a 70  l_rings, char *p
d0ab0 72 65 66 69 78 2c 20 63 68 61 72 20 2a 6c 61 79  refix, char *lay
d0ac0 65 72 5f 6e 61 6d 65 29 0a 7b 0a 2f 2a 20 73 63  er_name).{./* sc
d0ad0 61 6e 6e 69 6e 67 20 61 20 44 69 72 65 63 74 6f  anning a Directo
d0ae0 72 79 20 61 6e 64 20 70 72 6f 63 65 73 73 69 6e  ry and processin
d0af0 67 20 61 6c 6c 20 44 58 46 20 66 69 6c 65 73 20  g all DXF files 
d0b00 2a 2f 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  */.    int cnt =
d0b10 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 66 69   0;.    char *fi
d0b20 6c 65 70 61 74 68 3b 0a 23 69 66 20 64 65 66 69  lepath;.#if defi
d0b30 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
d0b40 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33  defined(__MINGW3
d0b50 32 5f 5f 29 0a 2f 2a 20 56 69 73 75 61 6c 20 53  2__)./* Visual S
d0b60 74 75 64 69 6f 20 2e 4e 45 54 20 2a 2f 0a 20 20  tudio .NET */.  
d0b70 20 20 73 74 72 75 63 74 20 5f 66 69 6e 64 64 61    struct _findda
d0b80 74 61 5f 74 20 63 5f 66 69 6c 65 3b 0a 20 20 20  ta_t c_file;.   
d0b90 20 69 6e 74 70 74 72 5f 74 20 68 46 69 6c 65 3b   intptr_t hFile;
d0ba0 0a 20 20 20 20 69 66 20 28 5f 63 68 64 69 72 20  .    if (_chdir 
d0bb0 28 64 69 72 5f 70 61 74 68 29 20 3c 20 30 29 0a  (dir_path) < 0).
d0bc0 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69  .return 0;.    i
d0bd0 66 20 28 28 68 46 69 6c 65 20 3d 20 5f 66 69 6e  f ((hFile = _fin
d0be0 64 66 69 72 73 74 20 28 22 2a 2e 2a 22 2c 20 26  dfirst ("*.*", &
d0bf0 63 5f 66 69 6c 65 29 29 20 3d 3d 20 2d 31 4c 29  c_file)) == -1L)
d0c00 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  ..;.    else.   
d0c10 20 20 20 7b 0a 09 20 20 77 68 69 6c 65 20 28 31     {..  while (1
d0c20 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 28  )..    {...if ((
d0c30 63 5f 66 69 6c 65 2e 61 74 74 72 69 62 20 26 20  c_file.attrib & 
d0c40 5f 41 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 5f 41  _A_RDONLY) == _A
d0c50 5f 52 44 4f 4e 4c 59 0a 09 09 20 20 20 20 7c 7c  _RDONLY...    ||
d0c60 20 28 63 5f 66 69 6c 65 2e 61 74 74 72 69 62 20   (c_file.attrib 
d0c70 26 20 5f 41 5f 4e 4f 52 4d 41 4c 29 20 3d 3d 20  & _A_NORMAL) == 
d0c80 5f 41 5f 4e 4f 52 4d 41 4c 29 0a 09 09 20 20 7b  _A_NORMAL)...  {
d0c90 0a 09 09 20 20 20 20 20 20 69 66 20 28 69 73 5f  ...      if (is_
d0ca0 64 78 66 5f 66 69 6c 65 20 28 63 5f 66 69 6c 65  dxf_file (c_file
d0cb0 2e 6e 61 6d 65 29 29 0a 09 09 09 7b 0a 09 09 09  .name))....{....
d0cc0 20 20 20 20 66 69 6c 65 70 61 74 68 20 3d 0a 09      filepath =..
d0cd0 09 09 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  ...sqlite3_mprin
d0ce0 74 66 20 28 22 25 73 2f 25 73 22 2c 20 64 69 72  tf ("%s/%s", dir
d0cf0 5f 70 61 74 68 2c 0a 09 09 09 09 09 09 20 63 5f  _path,....... c_
d0d00 66 69 6c 65 2e 6e 61 6d 65 29 3b 0a 09 09 09 20  file.name);.... 
d0d10 20 20 20 63 6e 74 20 2b 3d 0a 09 09 09 09 6c 6f     cnt +=.....lo
d0d20 61 64 5f 64 78 66 20 28 64 62 5f 68 61 6e 64 6c  ad_dxf (db_handl
d0d30 65 2c 20 63 61 63 68 65 2c 20 66 69 6c 65 70 61  e, cache, filepa
d0d40 74 68 2c 20 73 72 69 64 2c 0a 09 09 09 09 09 20  th, srid,...... 
d0d50 20 61 70 70 65 6e 64 2c 20 66 6f 72 63 65 5f 64   append, force_d
d0d60 69 6d 73 2c 20 6d 6f 64 65 2c 0a 09 09 09 09 09  ims, mode,......
d0d70 20 20 73 70 65 63 69 61 6c 5f 72 69 6e 67 73 2c    special_rings,
d0d80 20 70 72 65 66 69 78 2c 20 6c 61 79 65 72 5f 6e   prefix, layer_n
d0d90 61 6d 65 29 3b 0a 09 09 09 20 20 20 20 73 71 6c  ame);....    sql
d0da0 69 74 65 33 5f 66 72 65 65 20 28 66 69 6c 65 70  ite3_free (filep
d0db0 61 74 68 29 3b 0a 09 09 09 7d 0a 09 09 20 20 7d  ath);....}...  }
d0dc0 0a 09 09 69 66 20 28 5f 66 69 6e 64 6e 65 78 74  ...if (_findnext
d0dd0 20 28 68 46 69 6c 65 2c 20 26 63 5f 66 69 6c 65   (hFile, &c_file
d0de0 29 20 21 3d 20 30 29 0a 09 09 20 20 20 20 62 72  ) != 0)...    br
d0df0 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 09 20 20  eak;..    };..  
d0e00 5f 66 69 6e 64 63 6c 6f 73 65 20 28 68 46 69 6c  _findclose (hFil
d0e10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  e);.      }.#els
d0e20 65 0a 2f 2a 20 6e 6f 74 20 56 69 73 75 61 6c 20  e./* not Visual 
d0e30 53 74 75 64 69 6f 20 2e 4e 45 54 20 2a 2f 0a 20  Studio .NET */. 
d0e40 20 20 20 73 74 72 75 63 74 20 64 69 72 65 6e 74     struct dirent
d0e50 20 2a 65 6e 74 72 79 3b 0a 20 20 20 20 44 49 52   *entry;.    DIR
d0e60 20 2a 64 69 72 20 3d 20 6f 70 65 6e 64 69 72 20   *dir = opendir 
d0e70 28 64 69 72 5f 70 61 74 68 29 3b 0a 20 20 20 20  (dir_path);.    
d0e80 69 66 20 28 21 64 69 72 29 0a 09 72 65 74 75 72  if (!dir)..retur
d0e90 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  n 0;.    while (
d0ea0 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  1).      {..  /*
d0eb0 20 73 63 61 6e 6e 69 6e 67 20 64 69 72 2d 65 6e   scanning dir-en
d0ec0 74 72 69 65 73 20 2a 2f 0a 09 20 20 65 6e 74 72  tries */..  entr
d0ed0 79 20 3d 20 72 65 61 64 64 69 72 20 28 64 69 72  y = readdir (dir
d0ee0 29 3b 0a 09 20 20 69 66 20 28 21 65 6e 74 72 79  );..  if (!entry
d0ef0 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  )..      break;.
d0f00 09 20 20 69 66 20 28 69 73 5f 64 78 66 5f 66 69  .  if (is_dxf_fi
d0f10 6c 65 20 28 65 6e 74 72 79 2d 3e 64 5f 6e 61 6d  le (entry->d_nam
d0f20 65 29 29 0a 09 20 20 20 20 7b 0a 09 09 66 69 6c  e))..    {...fil
d0f30 65 70 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f  epath = sqlite3_
d0f40 6d 70 72 69 6e 74 66 20 28 22 25 73 2f 25 73 22  mprintf ("%s/%s"
d0f50 2c 20 64 69 72 5f 70 61 74 68 2c 20 65 6e 74 72  , dir_path, entr
d0f60 79 2d 3e 64 5f 6e 61 6d 65 29 3b 0a 09 09 63 6e  y->d_name);...cn
d0f70 74 20 2b 3d 0a 09 09 20 20 20 20 6c 6f 61 64 5f  t +=...    load_
d0f80 64 78 66 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20  dxf (db_handle, 
d0f90 63 61 63 68 65 2c 20 66 69 6c 65 70 61 74 68 2c  cache, filepath,
d0fa0 20 73 72 69 64 2c 20 61 70 70 65 6e 64 2c 0a 09   srid, append,..
d0fb0 09 09 20 20 20 20 20 20 66 6f 72 63 65 5f 64 69  ..      force_di
d0fc0 6d 73 2c 20 6d 6f 64 65 2c 20 73 70 65 63 69 61  ms, mode, specia
d0fd0 6c 5f 72 69 6e 67 73 2c 20 70 72 65 66 69 78 2c  l_rings, prefix,
d0fe0 0a 09 09 09 20 20 20 20 20 20 6c 61 79 65 72 5f  ....      layer_
d0ff0 6e 61 6d 65 29 3b 0a 09 09 73 71 6c 69 74 65 33  name);...sqlite3
d1000 5f 66 72 65 65 20 28 66 69 6c 65 70 61 74 68 29  _free (filepath)
d1010 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
d1020 0a 20 20 20 20 63 6c 6f 73 65 64 69 72 20 28 64  .    closedir (d
d1030 69 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ir);.#endif.    
d1040 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 73  return cnt;.}..s
d1050 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
d1060 49 6d 70 6f 72 74 44 58 46 66 72 6f 6d 44 69 72  ImportDXFfromDir
d1070 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
d1080 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
d1090 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20   argc,...       
d10a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d10b0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
d10c0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 6d 70 6f  function:./ Impo
d10d0 72 74 44 58 46 66 72 6f 6d 44 69 72 28 54 45 58  rtDXFfromDir(TEX
d10e0 54 20 64 69 72 5f 70 61 74 68 29 0a 2f 20 20 20  T dir_path)./   
d10f0 20 20 6f 72 0a 2f 20 49 6e 70 6f 72 74 44 58 46    or./ InportDXF
d1100 66 72 6f 6d 44 69 72 28 54 45 58 54 20 64 69 72  fromDir(TEXT dir
d1110 5f 70 61 74 68 2c 20 49 4e 54 20 73 72 69 64 2c  _path, INT srid,
d1120 20 49 4e 54 20 61 70 70 65 6e 64 2c 20 54 45 58   INT append, TEX
d1130 54 20 64 69 6d 73 2c 0a 2f 20 20 20 20 20 20 20  T dims,./       
d1140 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54 20             TEXT 
d1150 6d 6f 64 65 2c 20 54 45 58 54 20 73 70 65 63 69  mode, TEXT speci
d1160 61 6c 5f 72 69 6e 67 73 2c 20 54 45 58 54 20 74  al_rings, TEXT t
d1170 61 62 6c 65 5f 70 72 65 66 69 78 2c 0a 2f 20 20  able_prefix,./  
d1180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1190 54 45 58 54 20 6c 61 79 65 72 5f 6e 61 6d 65 29  TEXT layer_name)
d11a0 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20  ././ returns:./ 
d11b0 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 6f  1 on success./ o
d11c0 72 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2f  r 0 on failure./
d11d0 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c 69 64   NULL on invalid
d11e0 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
d11f0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
d1200 68 61 72 20 2a 64 69 72 5f 70 61 74 68 3b 0a 20  har *dir_path;. 
d1210 20 20 20 69 6e 74 20 73 72 69 64 20 3d 20 2d 31     int srid = -1
d1220 3b 0a 20 20 20 20 69 6e 74 20 61 70 70 65 6e 64  ;.    int append
d1230 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 70   = 0;.    int sp
d1240 65 63 69 61 6c 5f 72 69 6e 67 73 20 3d 20 47 41  ecial_rings = GA
d1250 49 41 5f 44 58 46 5f 52 49 4e 47 5f 4e 4f 4e 45  IA_DXF_RING_NONE
d1260 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d  ;.    int mode =
d1270 20 47 41 49 41 5f 44 58 46 5f 49 4d 50 4f 52 54   GAIA_DXF_IMPORT
d1280 5f 42 59 5f 4c 41 59 45 52 3b 0a 20 20 20 20 69  _BY_LAYER;.    i
d1290 6e 74 20 66 6f 72 63 65 5f 64 69 6d 73 20 3d 20  nt force_dims = 
d12a0 47 41 49 41 5f 44 58 46 5f 41 55 54 4f 5f 32 44  GAIA_DXF_AUTO_2D
d12b0 5f 33 44 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  _3D;.    char *p
d12c0 72 65 66 69 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  refix = NULL;.  
d12d0 20 20 63 68 61 72 20 2a 6c 61 79 65 72 5f 6e 61    char *layer_na
d12e0 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73  me = NULL;.    s
d12f0 71 6c 69 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c  qlite3 *db_handl
d1300 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
d1310 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
d1320 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74 72  ontext);.    str
d1330 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
d1340 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
d1350 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
d1360 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
d1370 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
d1380 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
d1390 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
d13a0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
d13b0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
d13c0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
d13d0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
d13e0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
d13f0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
d1400 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
d1410 64 69 72 5f 70 61 74 68 20 3d 20 28 63 68 61 72  dir_path = (char
d1420 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
d1430 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
d1440 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e  ;.    if (argc >
d1450 20 37 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 63   7).      {..  c
d1460 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 6c 75 65  onst char *value
d1470 3b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  ;..  if (sqlite3
d1480 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d1490 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
d14a0 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
d14b0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
d14c0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
d14d0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
d14e0 7d 0a 09 20 20 73 72 69 64 20 3d 20 73 71 6c 69  }..  srid = sqli
d14f0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
d1500 72 67 76 5b 31 5d 29 3b 0a 09 20 20 69 66 20 28  rgv[1]);..  if (
d1510 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d1520 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20  pe (argv[2]) != 
d1530 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
d1540 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
d1550 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
d1560 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
d1570 3b 0a 09 20 20 20 20 7d 0a 09 20 20 61 70 70 65  ;..    }..  appe
d1580 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  nd = sqlite3_val
d1590 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
d15a0 3b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  ;..  if (sqlite3
d15b0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d15c0 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[3]) != SQLITE_
d15d0 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
d15e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d15f0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
d1600 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
d1610 20 20 76 61 6c 75 65 20 3d 20 28 63 6f 6e 73 74    value = (const
d1620 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
d1630 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
d1640 76 5b 33 5d 29 3b 0a 09 20 20 69 66 20 28 73 74  v[3]);..  if (st
d1650 72 63 61 73 65 63 6d 70 20 28 76 61 6c 75 65 2c  rcasecmp (value,
d1660 20 22 32 44 22 29 20 3d 3d 20 30 29 0a 09 20 20   "2D") == 0)..  
d1670 20 20 20 20 66 6f 72 63 65 5f 64 69 6d 73 20 3d      force_dims =
d1680 20 47 41 49 41 5f 44 58 46 5f 46 4f 52 43 45 5f   GAIA_DXF_FORCE_
d1690 32 44 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  2D;..  else if (
d16a0 73 74 72 63 61 73 65 63 6d 70 20 28 76 61 6c 75  strcasecmp (valu
d16b0 65 2c 20 22 33 44 22 29 20 3d 3d 20 30 29 0a 09  e, "3D") == 0)..
d16c0 20 20 20 20 20 20 66 6f 72 63 65 5f 64 69 6d 73        force_dims
d16d0 20 3d 20 47 41 49 41 5f 44 58 46 5f 46 4f 52 43   = GAIA_DXF_FORC
d16e0 45 5f 33 44 3b 0a 09 20 20 65 6c 73 65 20 69 66  E_3D;..  else if
d16f0 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 76 61   (strcasecmp (va
d1700 6c 75 65 2c 20 22 41 55 54 4f 22 29 20 3d 3d 20  lue, "AUTO") == 
d1710 30 29 0a 09 20 20 20 20 20 20 66 6f 72 63 65 5f  0)..      force_
d1720 64 69 6d 73 20 3d 20 47 41 49 41 5f 44 58 46 5f  dims = GAIA_DXF_
d1730 41 55 54 4f 5f 32 44 5f 33 44 3b 0a 09 20 20 65  AUTO_2D_3D;..  e
d1740 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
d1750 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
d1760 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
d1770 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
d1780 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
d1790 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29  e_type (argv[4])
d17a0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
d17b0 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
d17c0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
d17d0 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
d17e0 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 76 61 6c  n;..    }..  val
d17f0 75 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ue = (const char
d1800 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
d1810 65 5f 74 65 78 74 20 28 61 72 67 76 5b 34 5d 29  e_text (argv[4])
d1820 3b 0a 09 20 20 69 66 20 28 73 74 72 63 61 73 65  ;..  if (strcase
d1830 63 6d 70 20 28 76 61 6c 75 65 2c 20 22 4d 49 58  cmp (value, "MIX
d1840 45 44 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  ED") == 0)..    
d1850 20 20 6d 6f 64 65 20 3d 20 47 41 49 41 5f 44 58    mode = GAIA_DX
d1860 46 5f 49 4d 50 4f 52 54 5f 4d 49 58 45 44 3b 0a  F_IMPORT_MIXED;.
d1870 09 20 20 65 6c 73 65 20 69 66 20 28 73 74 72 63  .  else if (strc
d1880 61 73 65 63 6d 70 20 28 76 61 6c 75 65 2c 20 22  asecmp (value, "
d1890 44 49 53 54 49 4e 43 54 22 29 20 3d 3d 20 30 29  DISTINCT") == 0)
d18a0 0a 09 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 47  ..      mode = G
d18b0 41 49 41 5f 44 58 46 5f 49 4d 50 4f 52 54 5f 42  AIA_DXF_IMPORT_B
d18c0 59 5f 4c 41 59 45 52 3b 0a 09 20 20 65 6c 73 65  Y_LAYER;..  else
d18d0 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
d18e0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
d18f0 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
d1900 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  n;..    }..  if 
d1910 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
d1920 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20 21 3d  ype (argv[5]) !=
d1930 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20   SQLITE_TEXT).. 
d1940 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
d1950 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
d1960 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
d1970 09 20 20 20 20 7d 0a 09 20 20 76 61 6c 75 65 20  .    }..  value 
d1980 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
d1990 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
d19a0 65 78 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 09  ext (argv[5]);..
d19b0 20 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70    if (strcasecmp
d19c0 20 28 76 61 6c 75 65 2c 20 22 4c 49 4e 4b 45 44   (value, "LINKED
d19d0 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20  ") == 0)..      
d19e0 73 70 65 63 69 61 6c 5f 72 69 6e 67 73 20 3d 20  special_rings = 
d19f0 47 41 49 41 5f 44 58 46 5f 52 49 4e 47 5f 4c 49  GAIA_DXF_RING_LI
d1a00 4e 4b 45 44 3b 0a 09 20 20 65 6c 73 65 20 69 66  NKED;..  else if
d1a10 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 76 61   (strcasecmp (va
d1a20 6c 75 65 2c 20 22 55 4e 4c 49 4e 4b 45 44 22 29  lue, "UNLINKED")
d1a30 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 73 70   == 0)..      sp
d1a40 65 63 69 61 6c 5f 72 69 6e 67 73 20 3d 20 47 41  ecial_rings = GA
d1a50 49 41 5f 44 58 46 5f 52 49 4e 47 5f 55 4e 4c 49  IA_DXF_RING_UNLI
d1a60 4e 4b 45 44 3b 0a 09 20 20 65 6c 73 65 20 69 66  NKED;..  else if
d1a70 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 76 61   (strcasecmp (va
d1a80 6c 75 65 2c 20 22 4e 4f 4e 45 22 29 20 3d 3d 20  lue, "NONE") == 
d1a90 30 29 0a 09 20 20 20 20 20 20 73 70 65 63 69 61  0)..      specia
d1aa0 6c 5f 72 69 6e 67 73 20 3d 20 47 41 49 41 5f 44  l_rings = GAIA_D
d1ab0 58 46 5f 52 49 4e 47 5f 4e 4f 4e 45 3b 0a 09 20  XF_RING_NONE;.. 
d1ac0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
d1ad0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d1ae0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
d1af0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
d1b00 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
d1b10 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36  lue_type (argv[6
d1b20 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) == SQLITE_TEX
d1b30 54 29 0a 09 20 20 20 20 20 20 70 72 65 66 69 78  T)..      prefix
d1b40 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69   = (char *) sqli
d1b50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
d1b60 61 72 67 76 5b 36 5d 29 3b 0a 09 20 20 65 6c 73  argv[6]);..  els
d1b70 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
d1b80 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36  lue_type (argv[6
d1b90 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ]) != SQLITE_NUL
d1ba0 4c 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  L)..    {...sqli
d1bb0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
d1bc0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
d1bd0 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  urn;..    }..  i
d1be0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
d1bf0 5f 74 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20  _type (argv[7]) 
d1c00 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
d1c10 09 20 20 20 20 20 20 6c 61 79 65 72 5f 6e 61 6d  .      layer_nam
d1c20 65 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c  e = (char *) sql
d1c30 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
d1c40 28 61 72 67 76 5b 37 5d 29 3b 0a 09 20 20 65 6c  (argv[7]);..  el
d1c50 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
d1c60 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
d1c70 37 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 4e 55  7]) != SQLITE_NU
d1c80 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  LL)..    {...sql
d1c90 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
d1ca0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
d1cb0 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
d1cc0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 20 3d 0a     }..    ret =.
d1cd0 09 73 63 61 6e 5f 64 78 66 5f 64 69 72 20 28 64  .scan_dxf_dir (d
d1ce0 62 5f 68 61 6e 64 6c 65 2c 20 63 61 63 68 65 2c  b_handle, cache,
d1cf0 20 64 69 72 5f 70 61 74 68 2c 20 73 72 69 64 2c   dir_path, srid,
d1d00 20 61 70 70 65 6e 64 2c 20 66 6f 72 63 65 5f 64   append, force_d
d1d10 69 6d 73 2c 0a 09 09 20 20 20 20 20 20 6d 6f 64  ims,...      mod
d1d20 65 2c 20 73 70 65 63 69 61 6c 5f 72 69 6e 67 73  e, special_rings
d1d30 2c 20 70 72 65 66 69 78 2c 20 6c 61 79 65 72 5f  , prefix, layer_
d1d40 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
d1d50 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
d1d60 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a  ontext, ret);.}.
d1d70 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 47  .#endif /* end G
d1d80 45 4f 53 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  EOS conditional 
d1d90 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  */..static void.
d1da0 66 6e 63 74 5f 45 78 70 6f 72 74 44 58 46 20 28  fnct_ExportDXF (
d1db0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d1dc0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
d1dd0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
d1de0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
d1df0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
d1e00 20 45 78 70 6f 72 74 44 58 46 28 54 45 58 54 20   ExportDXF(TEXT 
d1e10 6f 75 74 5f 64 69 72 2c 20 54 45 58 54 20 66 69  out_dir, TEXT fi
d1e20 6c 65 6e 61 6d 65 2c 20 54 45 58 54 20 73 71 6c  lename, TEXT sql
d1e30 5f 71 75 65 72 79 2c 20 54 45 58 54 20 6c 61 79  _query, TEXT lay
d1e40 65 72 5f 63 6f 6c 5f 6e 61 6d 65 2c 0a 2f 20 20  er_col_name,./  
d1e50 20 20 20 20 20 20 20 20 20 54 45 58 54 20 67 65           TEXT ge
d1e60 6f 6d 5f 63 6f 6c 5f 6e 61 6d 65 2c 20 54 45 58  om_col_name, TEX
d1e70 54 20 6c 61 62 65 6c 5f 63 6f 6c 5f 6e 61 6d 65  T label_col_name
d1e80 2c 20 54 45 58 54 20 74 65 78 74 5f 68 65 69 67  , TEXT text_heig
d1e90 68 74 5f 63 6f 6c 5f 6e 61 6d 65 2c 0a 2f 20 20  ht_col_name,./  
d1ea0 20 20 20 20 20 20 20 20 20 54 45 58 54 20 74 65           TEXT te
d1eb0 78 74 5f 72 6f 74 61 74 69 6f 6e 5f 63 6f 6c 5f  xt_rotation_col_
d1ec0 6e 61 6d 65 2c 20 42 4c 4f 42 20 67 65 6f 6d 5f  name, BLOB geom_
d1ed0 66 69 6c 74 65 72 29 0a 2f 20 20 20 20 20 6f 72  filter)./     or
d1ee0 0a 2f 20 45 78 70 6f 72 74 44 58 46 28 54 45 58  ./ ExportDXF(TEX
d1ef0 54 20 6f 75 74 5f 64 69 72 2c 20 54 45 58 54 20  T out_dir, TEXT 
d1f00 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58 54 20 73  filename, TEXT s
d1f10 71 6c 5f 71 75 65 72 79 2c 20 54 45 58 54 20 6c  ql_query, TEXT l
d1f20 61 79 65 72 5f 63 6f 6c 5f 6e 61 6d 65 2c 0a 2f  ayer_col_name,./
d1f30 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54 20             TEXT 
d1f40 67 65 6f 6d 5f 63 6f 6c 5f 6e 61 6d 65 2c 20 54  geom_col_name, T
d1f50 45 58 54 20 6c 61 62 65 6c 5f 63 6f 6c 5f 6e 61  EXT label_col_na
d1f60 6d 65 2c 20 54 45 58 54 20 74 65 78 74 5f 68 65  me, TEXT text_he
d1f70 69 67 68 74 5f 63 6f 6c 5f 6e 61 6d 65 2c 0a 2f  ight_col_name,./
d1f80 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54 20             TEXT 
d1f90 74 65 78 74 5f 72 6f 74 61 74 69 6f 6e 5f 63 6f  text_rotation_co
d1fa0 6c 5f 6e 61 6d 65 2c 20 42 4c 4f 42 20 67 65 6f  l_name, BLOB geo
d1fb0 6d 5f 66 69 6c 74 65 72 2c 20 49 4e 54 20 70 72  m_filter, INT pr
d1fc0 65 63 69 73 69 6f 6e 29 0a 2f 0a 2f 20 72 65 74  ecision)././ ret
d1fd0 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75 63  urns:./ 1 on suc
d1fe0 63 65 73 73 0a 2f 20 6f 72 20 30 20 6f 6e 20 66  cess./ or 0 on f
d1ff0 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 75 6e  ailure.*/.    un
d2000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
d2010 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
d2020 79 74 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  ytes;.    char *
d2030 70 61 74 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  path;.    const 
d2040 63 68 61 72 20 2a 64 69 72 5f 70 61 74 68 20 3d  char *dir_path =
d2050 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
d2060 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 20   char *filename 
d2070 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 46 49 4c 45  = NULL;.    FILE
d2080 20 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *out = NULL;.  
d2090 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71    const char *sq
d20a0 6c 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  l_query = NULL;.
d20b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d20c0 6c 61 79 65 72 5f 63 6f 6c 5f 6e 61 6d 65 20 3d  layer_col_name =
d20d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
d20e0 20 63 68 61 72 20 2a 67 65 6f 6d 5f 63 6f 6c 5f   char *geom_col_
d20f0 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  name = NULL;.   
d2100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62   const char *lab
d2110 65 6c 5f 63 6f 6c 5f 6e 61 6d 65 20 3d 20 4e 55  el_col_name = NU
d2120 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  LL;.    const ch
d2130 61 72 20 2a 74 65 78 74 5f 68 65 69 67 68 74 5f  ar *text_height_
d2140 63 6f 6c 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  col_name = NULL;
d2150 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d2160 2a 74 65 78 74 5f 72 6f 74 61 74 69 6f 6e 5f 63  *text_rotation_c
d2170 6f 6c 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  ol_name = NULL;.
d2180 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c      gaiaGeomColl
d2190 50 74 72 20 67 65 6f 6d 20 3d 20 4e 55 4c 4c 3b  Ptr geom = NULL;
d21a0 0a 20 20 20 20 69 6e 74 20 70 72 65 63 69 73 69  .    int precisi
d21b0 6f 6e 20 3d 20 33 3b 0a 20 20 20 20 69 6e 74 20  on = 3;.    int 
d21c0 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  ret = 1;.    sql
d21d0 69 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20  ite3 *db_handle 
d21e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
d21f0 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
d2200 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67  text);.    int g
d2210 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
d2220 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
d2230 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
d2240 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
d2250 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
d2260 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
d2270 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
d2280 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
d2290 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
d22a0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
d22b0 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
d22c0 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
d22d0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
d22e0 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
d22f0 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
d2300 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
d2310 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
d2320 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
d2330 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
d2340 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
d2350 4c 49 54 45 5f 54 45 58 54 29 0a 09 64 69 72 5f  LITE_TEXT)..dir_
d2360 70 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  path = (const ch
d2370 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
d2380 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
d2390 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ]);.    if (sqli
d23a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
d23b0 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
d23c0 54 45 5f 54 45 58 54 29 0a 09 66 69 6c 65 6e 61  TE_TEXT)..filena
d23d0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
d23e0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
d23f0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29  e_text (argv[1])
d2400 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
d2410 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
d2420 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[2]) == SQLITE
d2430 5f 54 45 58 54 29 0a 09 73 71 6c 5f 71 75 65 72  _TEXT)..sql_quer
d2440 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y = (const char 
d2450 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
d2460 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b  _text (argv[2]);
d2470 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
d2480 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d2490 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[3]) == SQLITE_
d24a0 54 45 58 54 29 0a 09 6c 61 79 65 72 5f 63 6f 6c  TEXT)..layer_col
d24b0 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  _name = (const c
d24c0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
d24d0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
d24e0 33 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  3]);.    if (sql
d24f0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
d2500 28 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c  (argv[4]) == SQL
d2510 49 54 45 5f 54 45 58 54 29 0a 09 67 65 6f 6d 5f  ITE_TEXT)..geom_
d2520 63 6f 6c 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  col_name = (cons
d2530 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
d2540 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
d2550 67 76 5b 34 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[4]);.    if (
d2560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d2570 70 65 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20  pe (argv[5]) == 
d2580 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 6c 61  SQLITE_TEXT)..la
d2590 62 65 6c 5f 63 6f 6c 5f 6e 61 6d 65 20 3d 20 28  bel_col_name = (
d25a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d25b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d25c0 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20   (argv[5]);.    
d25d0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
d25e0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29  e_type (argv[6])
d25f0 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
d2600 0a 09 74 65 78 74 5f 68 65 69 67 68 74 5f 63 6f  ..text_height_co
d2610 6c 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  l_name = (const 
d2620 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
d2630 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
d2640 5b 36 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71  [6]);.    if (sq
d2650 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
d2660 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51   (argv[7]) == SQ
d2670 4c 49 54 45 5f 54 45 58 54 29 0a 09 74 65 78 74  LITE_TEXT)..text
d2680 5f 72 6f 74 61 74 69 6f 6e 5f 63 6f 6c 5f 6e 61  _rotation_col_na
d2690 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
d26a0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
d26b0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 37 5d 29  e_text (argv[7])
d26c0 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
d26d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
d26e0 67 76 5b 38 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[8]) == SQLITE
d26f0 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
d2700 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
d2710 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
d2720 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
d2730 28 61 72 67 76 5b 38 5d 29 3b 0a 09 20 20 6e 5f  (argv[8]);..  n_
d2740 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
d2750 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
d2760 76 5b 38 5d 29 3b 0a 09 20 20 67 65 6f 6d 20 3d  v[8]);..  geom =
d2770 0a 09 20 20 20 20 20 20 67 61 69 61 46 72 6f 6d  ..      gaiaFrom
d2780 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
d2790 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
d27a0 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
d27b0 0a 09 09 09 09 09 20 20 20 67 70 6b 67 5f 61 6d  ......   gpkg_am
d27c0 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 20  phibious);.     
d27d0 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
d27e0 3d 3d 20 31 30 29 0a 20 20 20 20 20 20 7b 0a 09  == 10).      {..
d27f0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
d2800 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 39  lue_type (argv[9
d2810 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
d2820 45 47 45 52 29 0a 09 20 20 20 20 20 20 70 72 65  EGER)..      pre
d2830 63 69 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  cision = sqlite3
d2840 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
d2850 5b 39 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [9]);.      }.  
d2860 20 20 69 66 20 28 64 69 72 5f 70 61 74 68 20 3d    if (dir_path =
d2870 3d 20 4e 55 4c 4c 20 7c 7c 20 66 69 6c 65 6e 61  = NULL || filena
d2880 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 71  me == NULL || sq
d2890 6c 5f 71 75 65 72 79 20 3d 3d 20 4e 55 4c 4c 0a  l_query == NULL.
d28a0 09 7c 7c 20 6c 61 79 65 72 5f 63 6f 6c 5f 6e 61  .|| layer_col_na
d28b0 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 67 65  me == NULL || ge
d28c0 6f 6d 5f 63 6f 6c 5f 6e 61 6d 65 20 3d 3d 20 4e  om_col_name == N
d28d0 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
d28e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
d28f0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
d2900 0a 09 20 20 69 66 20 28 67 65 6f 6d 20 21 3d 20  ..  if (geom != 
d2910 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 67 61 69  NULL)..      gai
d2920 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67  aFreeGeomColl (g
d2930 65 6f 6d 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  eom);..  return;
d2940 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 70 61  .      }..    pa
d2950 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  th = sqlite3_mpr
d2960 69 6e 74 66 20 28 22 25 73 2f 25 73 2e 64 78 66  intf ("%s/%s.dxf
d2970 22 2c 20 64 69 72 5f 70 61 74 68 2c 20 66 69 6c  ", dir_path, fil
d2980 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6f 75 74 20  ename);.    out 
d2990 3d 20 66 6f 70 65 6e 20 28 70 61 74 68 2c 20 22  = fopen (path, "
d29a0 77 62 22 29 3b 0a 20 20 20 20 69 66 20 28 6f 75  wb");.    if (ou
d29b0 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  t == NULL).     
d29c0 20 7b 0a 09 20 20 72 65 74 20 3d 20 30 3b 0a 09   {..  ret = 0;..
d29d0 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 20 28    spatialite_e (
d29e0 22 45 78 70 6f 72 74 44 58 46 20 65 72 72 6f 72  "ExportDXF error
d29f0 20 2d 20 75 6e 61 62 6c 65 20 74 6f 20 63 72 65   - unable to cre
d2a00 61 74 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70  ate \"%s\"\n", p
d2a10 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
d2a20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
d2a30 20 20 2f 2a 20 65 78 70 6f 72 74 69 6e 67 20 74    /* exporting t
d2a40 68 65 20 44 58 46 20 2a 2f 0a 09 20 20 67 61 69  he DXF */..  gai
d2a50 61 44 78 66 57 72 69 74 65 72 20 64 78 66 3b 0a  aDxfWriter dxf;.
d2a60 09 20 20 67 61 69 61 44 78 66 57 72 69 74 65 72  .  gaiaDxfWriter
d2a70 49 6e 69 74 20 28 26 64 78 66 2c 20 6f 75 74 2c  Init (&dxf, out,
d2a80 20 70 72 65 63 69 73 69 6f 6e 2c 20 47 41 49 41   precision, GAIA
d2a90 5f 44 58 46 5f 56 31 32 29 3b 0a 09 20 20 72 65  _DXF_V12);..  re
d2aa0 74 20 3d 20 67 61 69 61 45 78 70 6f 72 74 44 78  t = gaiaExportDx
d2ab0 66 20 28 26 64 78 66 2c 20 64 62 5f 68 61 6e 64  f (&dxf, db_hand
d2ac0 6c 65 2c 20 73 71 6c 5f 71 75 65 72 79 2c 20 6c  le, sql_query, l
d2ad0 61 79 65 72 5f 63 6f 6c 5f 6e 61 6d 65 2c 0a 09  ayer_col_name,..
d2ae0 09 09 20 20 20 20 20 20 20 67 65 6f 6d 5f 63 6f  ..       geom_co
d2af0 6c 5f 6e 61 6d 65 2c 20 6c 61 62 65 6c 5f 63 6f  l_name, label_co
d2b00 6c 5f 6e 61 6d 65 2c 0a 09 09 09 20 20 20 20 20  l_name,....     
d2b10 20 20 74 65 78 74 5f 68 65 69 67 68 74 5f 63 6f    text_height_co
d2b20 6c 5f 6e 61 6d 65 2c 20 74 65 78 74 5f 72 6f 74  l_name, text_rot
d2b30 61 74 69 6f 6e 5f 63 6f 6c 5f 6e 61 6d 65 2c 0a  ation_col_name,.
d2b40 09 09 09 20 20 20 20 20 20 20 67 65 6f 6d 29 3b  ...       geom);
d2b50 0a 09 20 20 69 66 20 28 72 65 74 20 3e 20 30 29  ..  if (ret > 0)
d2b60 0a 09 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b  ..      ret = 1;
d2b70 0a 09 20 20 66 63 6c 6f 73 65 20 28 6f 75 74 29  ..  fclose (out)
d2b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71  ;.      }.    sq
d2b90 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
d2ba0 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b   (context, ret);
d2bb0 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 20 21 3d  .    if (geom !=
d2bc0 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65   NULL)..gaiaFree
d2bd0 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b  GeomColl (geom);
d2be0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d2bf0 65 20 28 70 61 74 68 29 3b 0a 7d 0a 0a 73 74 61  e (path);.}..sta
d2c00 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 68  tic void.fnct_Ch
d2c10 65 63 6b 44 75 70 6c 69 63 61 74 65 52 6f 77 73  eckDuplicateRows
d2c20 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
d2c30 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
d2c40 20 61 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74   argc,.... sqlit
d2c50 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
d2c60 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
d2c70 69 6f 6e 3a 0a 2f 20 43 68 65 63 6b 44 75 70 6c  ion:./ CheckDupl
d2c80 69 63 61 74 65 52 6f 77 73 28 54 45 58 54 20 74  icateRows(TEXT t
d2c90 61 62 6c 65 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  able)././ return
d2ca0 73 3a 0a 2f 20 74 68 65 20 6e 75 6d 62 65 72 20  s:./ the number 
d2cb0 6f 66 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  of duplicate row
d2cc0 73 20 66 6f 75 6e 64 0a 2f 20 4e 55 4c 4c 20 6f  s found./ NULL o
d2cd0 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
d2ce0 6e 74 73 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20  nts.*/.    char 
d2cf0 2a 74 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20  *table;.    int 
d2d00 72 6f 77 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  rows;.    sqlite
d2d10 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d 20 73  3 *db_handle = s
d2d20 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
d2d30 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
d2d40 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
d2d50 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
d2d60 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
d2d70 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
d2d80 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
d2d90 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
d2da0 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
d2db0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
d2dc0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
d2dd0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
d2de0 20 20 20 20 74 61 62 6c 65 20 3d 20 28 63 68 61      table = (cha
d2df0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
d2e00 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
d2e10 29 3b 0a 0a 20 20 20 20 63 68 65 63 6b 5f 64 75  );..    check_du
d2e20 70 6c 69 63 61 74 65 64 5f 72 6f 77 73 20 28 64  plicated_rows (d
d2e30 62 5f 68 61 6e 64 6c 65 2c 20 74 61 62 6c 65 2c  b_handle, table,
d2e40 20 26 72 6f 77 73 29 3b 0a 0a 20 20 20 20 69 66   &rows);..    if
d2e50 20 28 72 6f 77 73 20 3c 20 30 29 0a 09 73 71 6c   (rows < 0)..sql
d2e60 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
d2e70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
d2e80 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
d2e90 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
d2ea0 74 2c 20 72 6f 77 73 29 3b 0a 7d 0a 0a 73 74 61  t, rows);.}..sta
d2eb0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65  tic void.fnct_Re
d2ec0 6d 6f 76 65 44 75 70 6c 69 63 61 74 65 52 6f 77  moveDuplicateRow
d2ed0 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  s (sqlite3_conte
d2ee0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
d2ef0 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c  t argc,....  sql
d2f00 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
d2f10 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
d2f20 63 74 69 6f 6e 3a 0a 2f 20 52 65 6d 6f 76 65 44  ction:./ RemoveD
d2f30 75 70 6c 69 63 61 74 65 52 6f 77 73 28 54 45 58  uplicateRows(TEX
d2f40 54 20 74 61 62 6c 65 29 0a 2f 20 52 65 6d 6f 76  T table)./ Remov
d2f50 65 44 75 70 6c 69 63 61 74 65 52 6f 77 73 28 54  eDuplicateRows(T
d2f60 45 58 54 20 74 61 62 6c 65 2c 20 42 4f 4f 4c 20  EXT table, BOOL 
d2f70 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 2f 0a 2f  transaction)././
d2f80 20 72 65 74 75 72 6e 73 3a 0a 2f 20 74 68 65 20   returns:./ the 
d2f90 6e 75 6d 62 65 72 20 6f 66 20 64 75 70 6c 69 63  number of duplic
d2fa0 61 74 65 20 72 6f 77 73 20 72 65 6d 6f 76 65 64  ate rows removed
d2fb0 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c  ./ NULL on inval
d2fc0 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
d2fd0 20 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65 3b      char *table;
d2fe0 0a 20 20 20 20 69 6e 74 20 74 72 61 6e 73 61 63  .    int transac
d2ff0 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 69 6e  tion = 1;.    in
d3000 74 20 72 6f 77 73 3b 0a 20 20 20 20 73 71 6c 69  t rows;.    sqli
d3010 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d  te3 *db_handle =
d3020 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
d3030 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
d3040 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
d3050 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
d3060 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
d3070 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
d3080 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
d3090 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [0]) != SQLITE_T
d30a0 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
d30b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
d30c0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
d30d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
d30e0 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d 20 28 63  }.    table = (c
d30f0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
d3100 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
d3110 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67  0]);.    if (arg
d3120 63 20 3d 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a  c == 2).      {.
d3130 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
d3140 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
d3150 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  1]) != SQLITE_IN
d3160 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
d3170 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
d3180 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
d3190 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
d31a0 09 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d  .  transaction =
d31b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
d31c0 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  nt (argv[1]);.  
d31d0 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 6d 6f 76      }..    remov
d31e0 65 5f 64 75 70 6c 69 63 61 74 65 64 5f 72 6f 77  e_duplicated_row
d31f0 73 5f 65 78 32 20 28 64 62 5f 68 61 6e 64 6c 65  s_ex2 (db_handle
d3200 2c 20 74 61 62 6c 65 2c 20 26 72 6f 77 73 2c 20  , table, &rows, 
d3210 74 72 61 6e 73 61 63 74 69 6f 6e 29 3b 0a 0a 20  transaction);.. 
d3220 20 20 20 69 66 20 28 72 6f 77 73 20 3c 20 30 29     if (rows < 0)
d3230 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
d3240 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
d3250 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
d3260 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
d3270 6f 6e 74 65 78 74 2c 20 72 6f 77 73 29 3b 0a 7d  ontext, rows);.}
d3280 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
d3290 63 74 5f 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f  ct_ElementaryGeo
d32a0 6d 65 74 72 69 65 73 20 28 73 71 6c 69 74 65 33  metries (sqlite3
d32b0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
d32c0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
d32d0 09 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .   sqlite3_valu
d32e0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
d32f0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
d3300 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74  ElementaryGeomet
d3310 72 69 65 73 28 54 45 58 54 20 69 6e 70 75 74 5f  ries(TEXT input_
d3320 74 61 62 6c 65 2c 20 54 45 58 54 20 67 65 6f 5f  table, TEXT geo_
d3330 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 6f 75 74  column, TEXT out
d3340 5f 74 61 62 6c 65 2c 0a 2f 20 20 20 20 20 20 20  _table,./       
d3350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
d3360 45 58 54 20 6f 75 74 5f 70 6b 2c 20 54 45 58 54  EXT out_pk, TEXT
d3370 20 6f 75 74 5f 6d 75 6c 74 69 5f 69 64 29 0a 2f   out_multi_id)./
d3380 20 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65   ElementaryGeome
d3390 74 72 69 65 73 28 54 45 58 54 20 69 6e 70 75 74  tries(TEXT input
d33a0 5f 74 61 62 6c 65 2c 20 54 45 58 54 20 67 65 6f  _table, TEXT geo
d33b0 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 6f 75  _column, TEXT ou
d33c0 74 5f 74 61 62 6c 65 2c 0a 2f 20 20 20 20 20 20  t_table,./      
d33d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d33e0 54 45 58 54 20 6f 75 74 5f 70 6b 2c 20 54 45 58  TEXT out_pk, TEX
d33f0 54 20 6f 75 74 5f 6d 75 6c 74 69 5f 69 64 2c 20  T out_multi_id, 
d3400 42 4f 4f 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e  BOOL transaction
d3410 29 0a 2f 20 45 6c 65 6d 65 6e 74 61 72 79 47 65  )./ ElementaryGe
d3420 6f 6d 65 74 72 69 65 73 28 54 45 58 54 20 69 6e  ometries(TEXT in
d3430 70 75 74 5f 74 61 62 6c 65 2c 20 54 45 58 54 20  put_table, TEXT 
d3440 67 65 6f 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54  geo_column, TEXT
d3450 20 6f 75 74 5f 74 61 62 6c 65 2c 0a 2f 20 20 20   out_table,./   
d3460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3470 20 20 20 54 45 58 54 20 6f 75 74 5f 70 6b 2c 20     TEXT out_pk, 
d3480 54 45 58 54 20 6f 75 74 5f 6d 75 6c 74 69 5f 69  TEXT out_multi_i
d3490 64 2c 20 42 4f 4f 4c 20 74 72 61 6e 73 61 63 74  d, BOOL transact
d34a0 69 6f 6e 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  ion,./          
d34b0 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 74             ... t
d34c0 65 78 74 20 6f 70 74 69 6f 6e 31 20 2e 2e 2e 2c  ext option1 ...,
d34d0 20 2e 2e 2e 20 74 65 78 74 20 6f 70 74 69 6f 6e   ... text option
d34e0 32 20 2e 2e 2e 2c 20 74 65 78 74 20 6f 70 74 69  2 ..., text opti
d34f0 6f 6e 31 30 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  on10)././ return
d3500 73 3a 0a 2f 20 74 68 65 20 6e 75 6d 62 65 72 20  s:./ the number 
d3510 6f 66 20 69 6e 73 65 72 74 65 64 20 72 6f 77 73  of inserted rows
d3520 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c  ./ NULL on inval
d3530 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
d3540 20 20 20 20 63 68 61 72 20 2a 69 6e 5f 74 61 62      char *in_tab
d3550 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 67 65  le;.    char *ge
d3560 6f 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 68  o_column;.    ch
d3570 61 72 20 2a 6f 75 74 5f 74 61 62 6c 65 3b 0a 20  ar *out_table;. 
d3580 20 20 20 63 68 61 72 20 2a 6f 75 74 5f 70 6b 3b     char *out_pk;
d3590 0a 20 20 20 20 63 68 61 72 20 2a 6f 75 74 5f 6d  .    char *out_m
d35a0 75 6c 74 69 5f 69 64 3b 0a 20 20 20 20 63 6f 6e  ulti_id;.    con
d35b0 73 74 20 76 6f 69 64 20 2a 6f 70 74 69 6f 6e 73  st void *options
d35c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
d35d0 20 72 6f 77 73 3b 0a 20 20 20 20 69 6e 74 20 74   rows;.    int t
d35e0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 31 3b 0a  ransaction = 1;.
d35f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 5f      sqlite3 *db_
d3600 68 61 6e 64 6c 65 20 3d 20 73 71 6c 69 74 65 33  handle = sqlite3
d3610 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
d3620 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
d3630 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
d3640 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
d3650 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
d3660 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d3670 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
d3680 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
d3690 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
d36a0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
d36b0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
d36c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 6e  ;.      }.    in
d36d0 5f 74 61 62 6c 65 20 3d 20 28 63 68 61 72 20 2a  _table = (char *
d36e0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
d36f0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
d3700 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
d3710 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
d3720 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [1]) != SQLITE_T
d3730 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
d3740 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
d3750 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
d3760 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
d3770 7d 0a 20 20 20 20 67 65 6f 5f 63 6f 6c 75 6d 6e  }.    geo_column
d3780 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69   = (char *) sqli
d3790 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
d37a0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
d37b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
d37c0 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21  type (argv[2]) !
d37d0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
d37e0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
d37f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
d3800 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
d3810 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
d3820 6f 75 74 5f 74 61 62 6c 65 20 3d 20 28 63 68 61  out_table = (cha
d3830 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
d3840 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d  ue_text (argv[2]
d3850 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
d3860 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
d3870 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[3]) != SQLIT
d3880 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
d3890 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
d38a0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
d38b0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
d38c0 20 20 20 7d 0a 20 20 20 20 6f 75 74 5f 70 6b 20     }.    out_pk 
d38d0 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74  = (char *) sqlit
d38e0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
d38f0 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[3]);.    if 
d3900 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
d3910 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21 3d  ype (argv[4]) !=
d3920 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
d3930 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
d3940 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
d3950 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
d3960 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6f  n;.      }.    o
d3970 75 74 5f 6d 75 6c 74 69 5f 69 64 20 3d 20 28 63  ut_multi_id = (c
d3980 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
d3990 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
d39a0 34 5d 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67  4]);.    if (arg
d39b0 63 20 3e 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a  c >= 6).      {.
d39c0 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
d39d0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
d39e0 35 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  5]) != SQLITE_IN
d39f0 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
d3a00 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
d3a10 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
d3a20 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
d3a30 09 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d  .  transaction =
d3a40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
d3a50 6e 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20  nt (argv[5]);.  
d3a60 20 20 20 20 7d 0a 0a 2f 2a 20 61 64 64 69 74 69      }../* additi
d3a70 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  onal options */.
d3a80 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 36      if (argc > 6
d3a90 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
d3aa0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29  e_type (argv[6])
d3ab0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
d3ac0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74  .      {..  spat
d3ad0 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20  ialite_e..      
d3ae0 28 22 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d  ("ElementaryGeom
d3af0 65 74 72 69 65 73 28 29 20 65 72 72 6f 72 3a 20  etries() error: 
d3b00 61 72 67 75 6d 65 6e 74 20 37 20 69 73 20 6e 6f  argument 7 is no
d3b10 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20  t of the String 
d3b20 6f 72 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29  or TEXT type\n")
d3b30 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
d3b40 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
d3b50 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
d3b60 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
d3b70 72 67 63 20 3e 20 37 20 26 26 20 73 71 6c 69 74  rgc > 7 && sqlit
d3b80 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
d3b90 72 67 76 5b 37 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[7]) != SQLIT
d3ba0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
d3bb0 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
d3bc0 09 20 20 20 20 20 20 28 22 45 6c 65 6d 65 6e 74  .      ("Element
d3bd0 61 72 79 47 65 6f 6d 65 74 72 69 65 73 28 29 20  aryGeometries() 
d3be0 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20  error: argument 
d3bf0 38 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20  8 is not of the 
d3c00 53 74 72 69 6e 67 20 6f 72 20 54 45 58 54 20 74  String or TEXT t
d3c10 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69  ype\n");..  sqli
d3c20 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
d3c30 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
d3c40 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
d3c50 20 20 69 66 20 28 61 72 67 63 20 3e 20 38 20 26    if (argc > 8 &
d3c60 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
d3c70 74 79 70 65 20 28 61 72 67 76 5b 38 5d 29 20 21  type (argv[8]) !
d3c80 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
d3c90 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61       {..  spatia
d3ca0 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22  lite_e..      ("
d3cb0 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74  ElementaryGeomet
d3cc0 72 69 65 73 28 29 20 65 72 72 6f 72 3a 20 61 72  ries() error: ar
d3cd0 67 75 6d 65 6e 74 20 39 20 69 73 20 6e 6f 74 20  gument 9 is not 
d3ce0 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
d3cf0 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
d3d00 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
d3d10 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
d3d20 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
d3d30 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
d3d40 63 20 3e 20 39 20 26 26 20 73 71 6c 69 74 65 33  c > 9 && sqlite3
d3d50 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d3d60 76 5b 39 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[9]) != SQLITE_
d3d70 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
d3d80 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20   spatialite_e.. 
d3d90 20 20 20 20 20 28 22 45 6c 65 6d 65 6e 74 61 72       ("Elementar
d3da0 79 47 65 6f 6d 65 74 72 69 65 73 28 29 20 65 72  yGeometries() er
d3db0 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20 31 30  ror: argument 10
d3dc0 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53   is not of the S
d3dd0 74 72 69 6e 67 20 6f 72 20 54 45 58 54 20 74 79  tring or TEXT ty
d3de0 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74  pe\n");..  sqlit
d3df0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
d3e00 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
d3e10 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
d3e20 20 69 66 20 28 61 72 67 63 20 3e 20 31 30 20 26   if (argc > 10 &
d3e30 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
d3e40 74 79 70 65 20 28 61 72 67 76 5b 31 30 5d 29 20  type (argv[10]) 
d3e50 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
d3e60 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69        {..  spati
d3e70 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28  alite_e..      (
d3e80 22 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65  "ElementaryGeome
d3e90 74 72 69 65 73 28 29 20 65 72 72 6f 72 3a 20 61  tries() error: a
d3ea0 72 67 75 6d 65 6e 74 20 31 31 20 69 73 20 6e 6f  rgument 11 is no
d3eb0 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20  t of the String 
d3ec0 6f 72 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29  or TEXT type\n")
d3ed0 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
d3ee0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
d3ef0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
d3f00 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
d3f10 72 67 63 20 3e 20 31 31 20 26 26 20 73 71 6c 69  rgc > 11 && sqli
d3f20 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
d3f30 61 72 67 76 5b 31 31 5d 29 20 21 3d 20 53 51 4c  argv[11]) != SQL
d3f40 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
d3f50 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
d3f60 65 0a 09 20 20 20 20 20 20 28 22 45 6c 65 6d 65  e..      ("Eleme
d3f70 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73 28  ntaryGeometries(
d3f80 29 20 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e  ) error: argumen
d3f90 74 20 31 32 20 69 73 20 6e 6f 74 20 6f 66 20 74  t 12 is not of t
d3fa0 68 65 20 53 74 72 69 6e 67 20 6f 72 20 54 45 58  he String or TEX
d3fb0 54 20 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73  T type\n");..  s
d3fc0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d3fd0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
d3fe0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
d3ff0 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 20  .    if (argc > 
d4000 31 32 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  12 && sqlite3_va
d4010 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
d4020 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  2]) != SQLITE_TE
d4030 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
d4040 70 61 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20  patialite_e..   
d4050 20 20 20 28 22 45 6c 65 6d 65 6e 74 61 72 79 47     ("ElementaryG
d4060 65 6f 6d 65 74 72 69 65 73 28 29 20 65 72 72 6f  eometries() erro
d4070 72 3a 20 61 72 67 75 6d 65 6e 74 20 31 33 20 69  r: argument 13 i
d4080 73 20 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72  s not of the Str
d4090 69 6e 67 20 6f 72 20 54 45 58 54 20 74 79 70 65  ing or TEXT type
d40a0 5c 6e 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  \n");..  sqlite3
d40b0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
d40c0 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
d40d0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
d40e0 66 20 28 61 72 67 63 20 3e 20 31 33 20 26 26 20  f (argc > 13 && 
d40f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d4100 70 65 20 28 61 72 67 76 5b 31 33 5d 29 20 21 3d  pe (argv[13]) !=
d4110 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
d4120 20 20 20 20 7b 0a 09 20 20 73 70 61 74 69 61 6c      {..  spatial
d4130 69 74 65 5f 65 0a 09 20 20 20 20 20 20 28 22 45  ite_e..      ("E
d4140 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72  lementaryGeometr
d4150 69 65 73 28 29 20 65 72 72 6f 72 3a 20 61 72 67  ies() error: arg
d4160 75 6d 65 6e 74 20 31 34 20 69 73 20 6e 6f 74 20  ument 14 is not 
d4170 6f 66 20 74 68 65 20 53 74 72 69 6e 67 20 6f 72  of the String or
d4180 20 54 45 58 54 20 74 79 70 65 5c 6e 22 29 3b 0a   TEXT type\n");.
d4190 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
d41a0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
d41b0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
d41c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
d41d0 63 20 3e 20 31 34 20 26 26 20 73 71 6c 69 74 65  c > 14 && sqlite
d41e0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
d41f0 67 76 5b 31 34 5d 29 20 21 3d 20 53 51 4c 49 54  gv[14]) != SQLIT
d4200 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
d4210 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a  .  spatialite_e.
d4220 09 20 20 20 20 20 20 28 22 45 6c 65 6d 65 6e 74  .      ("Element
d4230 61 72 79 47 65 6f 6d 65 74 72 69 65 73 28 29 20  aryGeometries() 
d4240 65 72 72 6f 72 3a 20 61 72 67 75 6d 65 6e 74 20  error: argument 
d4250 31 35 20 69 73 20 6e 6f 74 20 6f 66 20 74 68 65  15 is not of the
d4260 20 53 74 72 69 6e 67 20 6f 72 20 54 45 58 54 20   String or TEXT 
d4270 74 79 70 65 5c 6e 22 29 3b 0a 09 20 20 73 71 6c  type\n");..  sql
d4280 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
d4290 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
d42a0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
d42b0 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 35     if (argc > 15
d42c0 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
d42d0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 35 5d  e_type (argv[15]
d42e0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
d42f0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 70 61  ).      {..  spa
d4300 74 69 61 6c 69 74 65 5f 65 0a 09 20 20 20 20 20  tialite_e..     
d4310 20 28 22 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f   ("ElementaryGeo
d4320 6d 65 74 72 69 65 73 28 29 20 65 72 72 6f 72 3a  metries() error:
d4330 20 61 72 67 75 6d 65 6e 74 20 31 36 20 69 73 20   argument 16 is 
d4340 6e 6f 74 20 6f 66 20 74 68 65 20 53 74 72 69 6e  not of the Strin
d4350 67 20 6f 72 20 54 45 58 54 20 74 79 70 65 5c 6e  g or TEXT type\n
d4360 22 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72  ");..  sqlite3_r
d4370 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
d4380 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
d4390 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 6f 70  .      }..    op
d43a0 74 69 6f 6e 73 20 3d 20 67 61 69 61 45 6c 65 6d  tions = gaiaElem
d43b0 47 65 6f 6d 4f 70 74 69 6f 6e 73 43 72 65 61 74  GeomOptionsCreat
d43c0 65 20 28 29 3b 0a 20 20 20 20 69 66 20 28 6f 70  e ();.    if (op
d43d0 74 69 6f 6e 73 20 3d 3d 20 4e 55 4c 4c 29 0a 20  tions == NULL). 
d43e0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
d43f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
d4400 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
d4410 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  rn;.      }../* 
d4420 61 64 64 69 74 69 6f 6e 61 6c 20 6f 70 74 69 6f  additional optio
d4430 6e 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 72  ns */.    if (ar
d4440 67 63 20 3e 20 36 29 0a 09 67 61 69 61 45 6c 65  gc > 6)..gaiaEle
d4450 6d 47 65 6f 6d 4f 70 74 69 6f 6e 73 41 64 64 20  mGeomOptionsAdd 
d4460 28 6f 70 74 69 6f 6e 73 2c 0a 09 09 09 09 28 63  (options,.....(c
d4470 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
d4480 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
d4490 28 61 72 67 76 5b 36 5d 29 29 3b 0a 20 20 20 20  (argv[6]));.    
d44a0 69 66 20 28 61 72 67 63 20 3e 20 37 29 0a 09 67  if (argc > 7)..g
d44b0 61 69 61 45 6c 65 6d 47 65 6f 6d 4f 70 74 69 6f  aiaElemGeomOptio
d44c0 6e 73 41 64 64 20 28 6f 70 74 69 6f 6e 73 2c 0a  nsAdd (options,.
d44d0 09 09 09 09 28 63 6f 6e 73 74 20 63 68 61 72 20  ....(const char 
d44e0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
d44f0 5f 74 65 78 74 20 28 61 72 67 76 5b 37 5d 29 29  _text (argv[7]))
d4500 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e  ;.    if (argc >
d4510 20 38 29 0a 09 67 61 69 61 45 6c 65 6d 47 65 6f   8)..gaiaElemGeo
d4520 6d 4f 70 74 69 6f 6e 73 41 64 64 20 28 6f 70 74  mOptionsAdd (opt
d4530 69 6f 6e 73 2c 0a 09 09 09 09 28 63 6f 6e 73 74  ions,.....(const
d4540 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
d4550 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
d4560 76 5b 38 5d 29 29 3b 0a 20 20 20 20 69 66 20 28  v[8]));.    if (
d4570 61 72 67 63 20 3e 20 39 29 0a 09 67 61 69 61 45  argc > 9)..gaiaE
d4580 6c 65 6d 47 65 6f 6d 4f 70 74 69 6f 6e 73 41 64  lemGeomOptionsAd
d4590 64 20 28 6f 70 74 69 6f 6e 73 2c 0a 09 09 09 09  d (options,.....
d45a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
d45b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
d45c0 74 20 28 61 72 67 76 5b 39 5d 29 29 3b 0a 20 20  t (argv[9]));.  
d45d0 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 30 29    if (argc > 10)
d45e0 0a 09 67 61 69 61 45 6c 65 6d 47 65 6f 6d 4f 70  ..gaiaElemGeomOp
d45f0 74 69 6f 6e 73 41 64 64 20 28 6f 70 74 69 6f 6e  tionsAdd (option
d4600 73 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68  s,.....(const ch
d4610 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
d4620 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
d4630 30 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72  0]));.    if (ar
d4640 67 63 20 3e 20 31 31 29 0a 09 67 61 69 61 45 6c  gc > 11)..gaiaEl
d4650 65 6d 47 65 6f 6d 4f 70 74 69 6f 6e 73 41 64 64  emGeomOptionsAdd
d4660 20 28 6f 70 74 69 6f 6e 73 2c 0a 09 09 09 09 28   (options,.....(
d4670 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d4680 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d4690 20 28 61 72 67 76 5b 31 31 5d 29 29 3b 0a 20 20   (argv[11]));.  
d46a0 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 32 29    if (argc > 12)
d46b0 0a 09 67 61 69 61 45 6c 65 6d 47 65 6f 6d 4f 70  ..gaiaElemGeomOp
d46c0 74 69 6f 6e 73 41 64 64 20 28 6f 70 74 69 6f 6e  tionsAdd (option
d46d0 73 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68  s,.....(const ch
d46e0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
d46f0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
d4700 32 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72  2]));.    if (ar
d4710 67 63 20 3e 20 31 33 29 0a 09 67 61 69 61 45 6c  gc > 13)..gaiaEl
d4720 65 6d 47 65 6f 6d 4f 70 74 69 6f 6e 73 41 64 64  emGeomOptionsAdd
d4730 20 28 6f 70 74 69 6f 6e 73 2c 0a 09 09 09 09 28   (options,.....(
d4740 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d4750 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d4760 20 28 61 72 67 76 5b 31 33 5d 29 29 3b 0a 20 20   (argv[13]));.  
d4770 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 34 29    if (argc > 14)
d4780 0a 09 67 61 69 61 45 6c 65 6d 47 65 6f 6d 4f 70  ..gaiaElemGeomOp
d4790 74 69 6f 6e 73 41 64 64 20 28 6f 70 74 69 6f 6e  tionsAdd (option
d47a0 73 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 63 68  s,.....(const ch
d47b0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
d47c0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
d47d0 34 5d 29 29 3b 0a 20 20 20 20 69 66 20 28 61 72  4]));.    if (ar
d47e0 67 63 20 3e 20 31 35 29 0a 09 67 61 69 61 45 6c  gc > 15)..gaiaEl
d47f0 65 6d 47 65 6f 6d 4f 70 74 69 6f 6e 73 41 64 64  emGeomOptionsAdd
d4800 20 28 6f 70 74 69 6f 6e 73 2c 0a 09 09 09 09 28   (options,.....(
d4810 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d4820 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d4830 20 28 61 72 67 76 5b 31 35 5d 29 29 3b 0a 0a 20   (argv[15]));.. 
d4840 20 20 20 65 6c 65 6d 65 6e 74 61 72 79 5f 67 65     elementary_ge
d4850 6f 6d 65 74 72 69 65 73 5f 65 78 33 20 28 64 62  ometries_ex3 (db
d4860 5f 68 61 6e 64 6c 65 2c 20 69 6e 5f 74 61 62 6c  _handle, in_tabl
d4870 65 2c 20 67 65 6f 5f 63 6f 6c 75 6d 6e 2c 20 6f  e, geo_column, o
d4880 75 74 5f 74 61 62 6c 65 2c 0a 09 09 09 20 20 20  ut_table,....   
d4890 20 20 20 20 6f 75 74 5f 70 6b 2c 20 6f 75 74 5f      out_pk, out_
d48a0 6d 75 6c 74 69 5f 69 64 2c 20 6f 70 74 69 6f 6e  multi_id, option
d48b0 73 2c 20 26 72 6f 77 73 2c 0a 09 09 09 20 20 20  s, &rows,....   
d48c0 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 29      transaction)
d48d0 3b 0a 0a 20 20 20 20 67 61 69 61 45 6c 65 6d 47  ;..    gaiaElemG
d48e0 65 6f 6d 4f 70 74 69 6f 6e 73 44 65 73 74 72 6f  eomOptionsDestro
d48f0 79 20 28 6f 70 74 69 6f 6e 73 29 3b 0a 20 20 20  y (options);.   
d4900 20 69 66 20 28 72 6f 77 73 20 3c 3d 20 30 29 0a   if (rows <= 0).
d4910 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
d4920 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
d4930 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65      else..sqlite
d4940 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
d4950 6e 74 65 78 74 2c 20 72 6f 77 73 29 3b 0a 7d 0a  ntext, rows);.}.
d4960 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
d4970 74 5f 44 72 6f 70 47 65 6f 54 61 62 6c 65 20 28  t_DropGeoTable (
d4980 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d4990 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
d49a0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
d49b0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
d49c0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
d49d0 20 44 72 6f 70 47 65 6f 54 61 62 6c 65 28 54 45   DropGeoTable(TE
d49e0 58 54 20 74 61 62 6c 65 29 0a 2f 20 44 72 6f 70  XT table)./ Drop
d49f0 47 65 6f 54 61 62 6c 65 28 54 45 58 54 20 74 61  GeoTable(TEXT ta
d4a00 62 6c 65 2c 20 42 4f 4f 4c 20 74 72 61 6e 73 61  ble, BOOL transa
d4a10 63 74 69 6f 6e 29 0a 2f 20 44 72 6f 70 47 65 6f  ction)./ DropGeo
d4a20 54 61 62 6c 65 28 54 45 58 54 20 64 62 5f 70 72  Table(TEXT db_pr
d4a30 65 66 69 78 2c 20 54 45 58 54 20 74 61 62 6c 65  efix, TEXT table
d4a40 29 0a 2f 20 44 72 6f 70 47 65 6f 54 61 62 6c 65  )./ DropGeoTable
d4a50 28 54 45 58 54 20 64 62 5f 70 72 65 66 69 78 2c  (TEXT db_prefix,
d4a60 20 54 45 58 54 20 74 61 62 6c 65 2c 20 42 4f 4f   TEXT table, BOO
d4a70 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 2f  L transaction)./
d4a80 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 31 20  ./ returns:./ 1 
d4a90 6f 6e 20 73 75 63 63 65 73 73 2c 20 30 20 6f 6e  on success, 0 on
d4aa0 20 66 61 69 6c 75 72 65 0a 2f 20 4e 55 4c 4c 20   failure./ NULL 
d4ab0 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
d4ac0 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 63 68 61 72  ents.*/.    char
d4ad0 20 2a 64 62 5f 70 72 65 66 69 78 20 3d 20 22 6d   *db_prefix = "m
d4ae0 61 69 6e 22 3b 0a 20 20 20 20 63 68 61 72 20 2a  ain";.    char *
d4af0 74 61 62 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  table = NULL;.  
d4b00 20 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f    int transactio
d4b10 6e 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 72  n = 1;.    int r
d4b20 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  et;.    int cnt;
d4b30 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
d4b40 5f 68 61 6e 64 6c 65 20 3d 20 73 71 6c 69 74 65  _handle = sqlite
d4b50 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
d4b60 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
d4b70 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
d4b80 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
d4b90 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
d4ba0 28 61 72 67 63 20 3d 3d 20 31 29 0a 20 20 20 20  (argc == 1).    
d4bb0 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
d4bc0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
d4bd0 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
d4be0 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09  E_TEXT)..    {..
d4bf0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
d4c00 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
d4c10 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
d4c20 0a 09 20 20 74 61 62 6c 65 20 3d 20 28 63 68 61  ..  table = (cha
d4c30 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
d4c40 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
d4c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  );.      }.    e
d4c60 6c 73 65 20 69 66 20 28 61 72 67 63 20 3e 3d 20  lse if (argc >= 
d4c70 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  2).      {..  if
d4c80 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
d4c90 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
d4ca0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 20  = SQLITE_TEXT.. 
d4cb0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
d4cc0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
d4cd0 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [1]) == SQLITE_I
d4ce0 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
d4cf0 09 74 61 62 6c 65 20 3d 20 28 63 68 61 72 20 2a  .table = (char *
d4d00 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
d4d10 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
d4d20 09 09 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  ..transaction = 
d4d30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
d4d40 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
d4d50 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28    }..  else if (
d4d60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d4d70 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
d4d80 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 09 20 20  SQLITE_TEXT...  
d4d90 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
d4da0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
d4db0 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
d4dc0 0a 09 20 20 20 20 7b 0a 09 09 64 62 5f 70 72 65  ..    {...db_pre
d4dd0 66 69 78 20 3d 20 28 63 68 61 72 20 2a 29 20 73  fix = (char *) s
d4de0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
d4df0 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 09 74  t (argv[0]);...t
d4e00 61 62 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 20  able = (char *) 
d4e10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
d4e20 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  xt (argv[1]);.. 
d4e30 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
d4e40 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
d4e50 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
d4e60 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
d4e70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d4e80 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29    if (argc == 3)
d4e90 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
d4ea0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d4eb0 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20  pe (argv[2]) != 
d4ec0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
d4ed0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
d4ee0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
d4ef0 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
d4f00 3b 0a 09 20 20 20 20 7d 0a 09 20 20 74 72 61 6e  ;..    }..  tran
d4f10 73 61 63 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  saction = sqlite
d4f20 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
d4f30 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  v[2]);.      }..
d4f40 20 20 20 20 63 6e 74 20 3d 20 73 71 6c 69 74 65      cnt = sqlite
d4f50 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20  3_total_changes 
d4f60 28 64 62 5f 68 61 6e 64 6c 65 29 3b 0a 20 20 20  (db_handle);.   
d4f70 20 72 65 74 20 3d 20 67 61 69 61 44 72 6f 70 54   ret = gaiaDropT
d4f80 61 62 6c 65 45 78 33 20 28 64 62 5f 68 61 6e 64  ableEx3 (db_hand
d4f90 6c 65 2c 20 64 62 5f 70 72 65 66 69 78 2c 20 74  le, db_prefix, t
d4fa0 61 62 6c 65 2c 20 74 72 61 6e 73 61 63 74 69 6f  able, transactio
d4fb0 6e 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  n, NULL);.    if
d4fc0 20 28 72 65 74 29 0a 20 20 20 20 20 20 7b 0a 09   (ret).      {..
d4fd0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 74 6f    if (sqlite3_to
d4fe0 74 61 6c 5f 63 68 61 6e 67 65 73 20 28 64 62 5f  tal_changes (db_
d4ff0 68 61 6e 64 6c 65 29 20 3c 3d 20 63 6e 74 29 0a  handle) <= cnt).
d5000 09 20 20 20 20 20 20 72 65 74 20 3d 20 30 3b 0a  .      ret = 0;.
d5010 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c        }..    sql
d5020 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
d5030 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a  (context, ret);.
d5040 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
d5050 6e 63 74 5f 73 70 5f 67 65 74 5f 6c 61 73 74 5f  nct_sp_get_last_
d5060 65 72 72 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  error (sqlite3_c
d5070 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
d5080 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 73  , int argc,....s
d5090 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
d50a0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
d50b0 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 71 6c 50 72  unction:./ SqlPr
d50c0 6f 63 5f 47 65 74 4c 61 73 74 45 72 72 6f 72 28  oc_GetLastError(
d50d0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 74 68 65  )././ return the
d50e0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 53 51 4c   most recent SQL
d50f0 20 50 72 6f 63 65 64 75 72 65 73 20 65 72 72 6f   Procedures erro
d5100 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 61 6e  r message (if an
d5110 79 29 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c  y)./ return NULL
d5120 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61   on any other ca
d5130 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  se.*/.    const 
d5140 63 68 61 72 20 2a 6d 73 67 20 3d 20 4e 55 4c 4c  char *msg = NULL
d5150 3b 0a 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61  ;.    void *data
d5160 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
d5170 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
d5180 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
d5190 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
d51a0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
d51b0 20 28 64 61 74 61 20 21 3d 20 4e 55 4c 4c 29 0a   (data != NULL).
d51c0 09 6d 73 67 20 3d 20 67 61 69 61 5f 73 71 6c 5f  .msg = gaia_sql_
d51d0 70 72 6f 63 5f 67 65 74 5f 6c 61 73 74 5f 65 72  proc_get_last_er
d51e0 72 6f 72 20 28 64 61 74 61 29 3b 0a 20 20 20 20  ror (data);.    
d51f0 69 66 20 28 6d 73 67 20 3d 3d 20 4e 55 4c 4c 29  if (msg == NULL)
d5200 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
d5210 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
d5220 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
d5230 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28  e3_result_text (
d5240 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 73 74  context, msg, st
d5250 72 6c 65 6e 20 28 6d 73 67 29 2c 20 53 51 4c 49  rlen (msg), SQLI
d5260 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 73  TE_STATIC);.}..s
d5270 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
d5280 73 70 5f 73 65 74 5f 6c 6f 67 66 69 6c 65 20 28  sp_set_logfile (
d5290 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d52a0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
d52b0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
d52c0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
d52d0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
d52e0 20 53 71 6c 50 72 6f 63 5f 53 65 74 4c 6f 67 66   SqlProc_SetLogf
d52f0 69 6c 65 28 54 45 58 54 20 6c 6f 67 66 69 6c 65  ile(TEXT logfile
d5300 5f 70 61 74 68 29 0a 2f 20 53 71 6c 50 72 6f 63  _path)./ SqlProc
d5310 5f 53 65 74 4c 6f 67 66 69 6c 65 28 54 45 58 54  _SetLogfile(TEXT
d5320 20 6c 6f 67 66 69 6c 65 5f 70 61 74 68 2c 20 49   logfile_path, I
d5330 4e 54 20 61 70 70 65 6e 64 29 0a 2f 0a 2f 20 72  NT append)././ r
d5340 65 74 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73  eturns:./ 1 on s
d5350 75 63 63 65 73 73 0a 2f 20 72 61 69 73 65 73 20  uccess./ raises 
d5360 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20  an exception on 
d5370 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
d5380 20 6f 72 20 75 6e 61 63 63 65 73 73 69 62 6c 65   or unaccessible
d5390 20 66 69 6c 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e   file.*/.    con
d53a0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 70 61 74  st char *filepat
d53b0 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  h = NULL;.    in
d53c0 74 20 61 70 70 65 6e 64 20 3d 20 30 3b 0a 20 20  t append = 0;.  
d53d0 20 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20    char *msg;.   
d53e0 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
d53f0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
d5400 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
d5410 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
d5420 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
d5430 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
d5440 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
d5450 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
d5460 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
d5470 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) == SQLITE_TEX
d5480 54 29 0a 09 66 69 6c 65 70 61 74 68 20 3d 20 28  T)..filepath = (
d5490 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d54a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d54b0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
d54c0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
d54d0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d54e0 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
d54f0 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c 73  NULL)..;.    els
d5500 65 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f  e..goto invalid_
d5510 66 69 6c 65 70 61 74 68 3b 0a 20 20 20 20 69 66  filepath;.    if
d5520 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20   (argc >= 2).   
d5530 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
d5540 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
d5550 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
d5560 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
d5570 20 20 20 61 70 70 65 6e 64 20 3d 20 73 71 6c 69     append = sqli
d5580 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
d5590 72 67 76 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65  rgv[1]);..  else
d55a0 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 76  ..      goto inv
d55b0 61 6c 69 64 5f 61 70 70 65 6e 64 3b 0a 20 20 20  alid_append;.   
d55c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 67 61 69     }.    if (gai
d55d0 61 5f 73 71 6c 5f 70 72 6f 63 5f 6c 6f 67 66 69  a_sql_proc_logfi
d55e0 6c 65 20 28 63 61 63 68 65 2c 20 66 69 6c 65 70  le (cache, filep
d55f0 61 74 68 2c 20 61 70 70 65 6e 64 29 29 0a 09 73  ath, append))..s
d5600 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
d5610 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
d5620 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 66      else..goto f
d5630 69 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 72  ile_error;.    r
d5640 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69  eturn;..  invali
d5650 64 5f 66 69 6c 65 70 61 74 68 3a 0a 20 20 20 20  d_filepath:.    
d5660 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63 20 65  msg = "SqlProc e
d5670 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67  xception - illeg
d5680 61 6c 20 46 69 6c 65 20 50 61 74 68 20 61 72 67  al File Path arg
d5690 75 6d 65 6e 74 2e 22 3b 0a 20 20 20 20 73 71 6c  ument.";.    sql
d56a0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
d56b0 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c  r (context, msg,
d56c0 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
d56d0 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 70 70  ;..  invalid_app
d56e0 65 6e 64 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22  end:.    msg = "
d56f0 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69 6f  SqlProc exceptio
d5700 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 41 70 70 65  n - illegal Appe
d5710 6e 64 20 4d 6f 64 65 20 61 72 67 75 6d 65 6e 74  nd Mode argument
d5720 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  .";.    sqlite3_
d5730 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f  result_error (co
d5740 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b  ntext, msg, -1);
d5750 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
d5760 66 69 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 20 20  file_error:.    
d5770 6d 73 67 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d  msg =..sqlite3_m
d5780 70 72 69 6e 74 66 0a 09 28 22 53 71 6c 50 72 6f  printf..("SqlPro
d5790 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 75 6e  c exception - un
d57a0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 5c 22 25  able to open \"%
d57b0 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  s\" for writing.
d57c0 22 2c 20 66 69 6c 65 70 61 74 68 29 3b 0a 20 20  ", filepath);.  
d57d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d57e0 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
d57f0 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73   msg, -1);.    s
d5800 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67  qlite3_free (msg
d5810 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d  );.    return;.}
d5820 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
d5830 63 74 5f 73 70 5f 67 65 74 5f 6c 6f 67 66 69 6c  ct_sp_get_logfil
d5840 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
d5850 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
d5860 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
d5870 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
d5880 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
d5890 3a 0a 2f 20 53 71 6c 50 72 6f 63 5f 47 65 74 4c  :./ SqlProc_GetL
d58a0 6f 67 66 69 6c 65 28 76 6f 69 64 29 0a 2f 0a 2f  ogfile(void)././
d58b0 20 72 65 74 75 72 6e 73 3a 0a 2f 20 74 68 65 20   returns:./ the 
d58c0 70 61 74 68 20 6f 66 20 74 68 65 20 63 75 72 72  path of the curr
d58d0 65 6e 74 6c 79 20 73 65 74 20 4c 6f 67 66 69 6c  ently set Logfil
d58e0 65 0a 2f 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 63  e./ NULL if no c
d58f0 75 72 72 65 6e 74 20 4c 6f 67 66 69 6c 65 20 69  urrent Logfile i
d5900 73 20 64 65 66 69 6e 65 64 0a 2a 2f 0a 20 20 20  s defined.*/.   
d5910 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
d5920 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
d5930 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
d5940 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
d5950 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
d5960 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
d5970 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
d5980 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e    if (cache == N
d5990 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  ULL)..sqlite3_re
d59a0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
d59b0 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
d59c0 20 20 20 20 7b 0a 09 20 20 63 6f 6e 73 74 20 63      {..  const c
d59d0 68 61 72 20 2a 70 61 74 68 20 3d 20 63 61 63 68  har *path = cach
d59e0 65 2d 3e 53 71 6c 50 72 6f 63 4c 6f 67 66 69 6c  e->SqlProcLogfil
d59f0 65 3b 0a 09 20 20 69 66 20 28 70 61 74 68 20 3d  e;..  if (path =
d5a00 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 73  = NULL)..      s
d5a10 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
d5a20 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
d5a30 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c   else..      sql
d5a40 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
d5a50 20 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 68 2c   (context, path,
d5a60 20 73 74 72 6c 65 6e 20 28 70 61 74 68 29 2c 20   strlen (path), 
d5a70 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
d5a80 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69        }.}..stati
d5a90 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 66  c void.fnct_sp_f
d5aa0 72 6f 6d 5f 74 65 78 74 20 28 73 71 6c 69 74 65  rom_text (sqlite
d5ab0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
d5ac0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
d5ad0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
d5ae0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
d5af0 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 71 6c 50 72  unction:./ SqlPr
d5b00 6f 63 5f 46 72 6f 6d 54 65 78 74 28 54 45 58 54  oc_FromText(TEXT
d5b10 20 73 71 6c 2d 73 63 72 69 70 74 29 0a 2f 20 53   sql-script)./ S
d5b20 71 6c 50 72 6f 63 5f 46 72 6f 6d 54 65 78 74 28  qlProc_FromText(
d5b30 54 45 58 54 20 73 71 6c 2d 73 63 72 69 70 74 2c  TEXT sql-script,
d5b40 20 54 45 58 54 20 63 68 61 72 73 65 74 29 0a 2f   TEXT charset)./
d5b50 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 61 20  ./ returns:./ a 
d5b60 53 51 4c 20 50 72 6f 63 65 64 75 72 65 20 42 4c  SQL Procedure BL
d5b70 4f 42 20 6f 62 6a 65 63 74 0a 2f 20 72 61 69 73  OB object./ rais
d5b80 65 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  es an exception 
d5b90 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
d5ba0 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73  ents.*/.    cons
d5bb0 74 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20  t char *sql;.   
d5bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61   const char *cha
d5bd0 72 73 65 74 20 3d 20 22 55 54 46 2d 38 22 3b 0a  rset = "UTF-8";.
d5be0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
d5bf0 72 20 2a 62 6c 6f 62 20 3d 20 4e 55 4c 4c 3b 0a  r *blob = NULL;.
d5c00 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 20      int blob_sz 
d5c10 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
d5c20 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20 20 73 74  har *msg;.    st
d5c30 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
d5c40 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
d5c50 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
d5c60 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
d5c70 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
d5c80 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
d5c90 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
d5ca0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
d5cb0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
d5cc0 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
d5cd0 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 73 71  .goto invalid_sq
d5ce0 6c 5f 62 6f 64 79 3b 0a 20 20 20 20 73 71 6c 20  l_body;.    sql 
d5cf0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
d5d00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
d5d10 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
d5d20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32     if (argc >= 2
d5d30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
d5d40 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
d5d50 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
d5d60 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20   SQLITE_TEXT).. 
d5d70 20 20 20 20 20 67 6f 74 6f 20 69 6e 76 61 6c 69       goto invali
d5d80 64 5f 63 68 61 72 73 65 74 3b 0a 09 20 20 63 68  d_charset;..  ch
d5d90 61 72 73 65 74 20 3d 20 28 63 6f 6e 73 74 20 63  arset = (const c
d5da0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
d5db0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
d5dc0 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
d5dd0 20 69 66 20 28 67 61 69 61 5f 73 71 6c 5f 70 72   if (gaia_sql_pr
d5de0 6f 63 5f 70 61 72 73 65 20 28 63 61 63 68 65 2c  oc_parse (cache,
d5df0 20 73 71 6c 2c 20 63 68 61 72 73 65 74 2c 20 26   sql, charset, &
d5e00 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73 7a 29 29  blob, &blob_sz))
d5e10 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
d5e20 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
d5e30 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66  blob, blob_sz, f
d5e40 72 65 65 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  ree);.    else. 
d5e50 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 62 6c       {..  if (bl
d5e60 6f 62 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  ob != NULL)..   
d5e70 20 20 20 66 72 65 65 20 28 62 6c 6f 62 29 3b 0a     free (blob);.
d5e80 09 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72  .  goto parse_er
d5e90 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
d5ea0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61   return;..  inva
d5eb0 6c 69 64 5f 73 71 6c 5f 62 6f 64 79 3a 0a 20 20  lid_sql_body:.  
d5ec0 20 20 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63    msg = "SqlProc
d5ed0 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c   exception - ill
d5ee0 65 67 61 6c 20 53 51 4c 20 42 6f 64 79 20 61 72  egal SQL Body ar
d5ef0 67 75 6d 65 6e 74 2e 22 3b 0a 20 20 20 20 73 71  gument.";.    sq
d5f00 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
d5f10 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67  or (context, msg
d5f20 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
d5f30 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 63 68  n;..  invalid_ch
d5f40 61 72 73 65 74 3a 0a 20 20 20 20 6d 73 67 20 3d  arset:.    msg =
d5f50 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74   "SqlProc except
d5f60 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 43 68  ion - illegal Ch
d5f70 61 72 73 65 74 20 45 6e 63 6f 64 69 6e 64 20 61  arset Encodind a
d5f80 72 67 75 6d 65 6e 74 2e 22 3b 0a 20 20 20 20 73  rgument.";.    s
d5f90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
d5fa0 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
d5fb0 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  g, -1);.    retu
d5fc0 72 6e 3b 0a 0a 20 20 70 61 72 73 65 5f 65 72 72  rn;..  parse_err
d5fd0 6f 72 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22 53  or:.    msg = "S
d5fe0 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e  qlProc exception
d5ff0 20 2d 20 69 6e 76 61 6c 69 64 20 53 51 4c 20 42   - invalid SQL B
d6000 6f 64 79 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74  ody.";.    sqlit
d6010 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20  e3_result_error 
d6020 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d  (context, msg, -
d6030 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
d6040 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
d6050 6e 63 74 5f 73 70 5f 66 72 6f 6d 5f 66 69 6c 65  nct_sp_from_file
d6060 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
d6070 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
d6080 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
d6090 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
d60a0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
d60b0 0a 2f 20 53 71 6c 50 72 6f 63 5f 46 72 6f 6d 46  ./ SqlProc_FromF
d60c0 69 6c 65 28 54 45 58 54 20 66 69 6c 65 70 61 74  ile(TEXT filepat
d60d0 68 29 0a 2f 20 53 71 6c 50 72 6f 63 5f 46 72 6f  h)./ SqlProc_Fro
d60e0 6d 46 69 6c 65 28 54 45 58 54 20 66 69 6c 65 70  mFile(TEXT filep
d60f0 61 74 68 2c 20 54 45 58 54 20 63 68 61 72 73 65  ath, TEXT charse
d6100 74 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a  t)././ returns:.
d6110 2f 20 61 20 53 51 4c 20 50 72 6f 63 65 64 75 72  / a SQL Procedur
d6120 65 20 42 4c 4f 42 20 6f 62 6a 65 63 74 0a 2f 20  e BLOB object./ 
d6130 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74  raises an except
d6140 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ion on invalid a
d6150 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
d6160 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
d6170 70 61 74 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  path;.    const 
d6180 63 68 61 72 20 2a 63 68 61 72 73 65 74 20 3d 20  char *charset = 
d6190 22 55 54 46 2d 38 22 3b 0a 20 20 20 20 75 6e 73  "UTF-8";.    uns
d61a0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
d61b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
d61c0 20 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b 0a 20 20   blob_sz = 0;.  
d61d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73    const char *ms
d61e0 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  g;.    struct sp
d61f0 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
d6200 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
d6210 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
d6220 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
d6230 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
d6240 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
d6250 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
d6260 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
d6270 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
d6280 54 45 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69  TE_TEXT)..goto i
d6290 6e 76 61 6c 69 64 5f 66 69 6c 65 70 61 74 68 3b  nvalid_filepath;
d62a0 0a 20 20 20 20 66 69 6c 65 70 61 74 68 20 3d 20  .    filepath = 
d62b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
d62c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
d62d0 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
d62e0 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a   if (argc >= 2).
d62f0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
d6300 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
d6310 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
d6320 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
d6330 20 20 20 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f     goto invalid_
d6340 63 68 61 72 73 65 74 3b 0a 09 20 20 63 68 61 72  charset;..  char
d6350 73 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  set = (const cha
d6360 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
d6370 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
d6380 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  );.      }.    i
d6390 66 20 28 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63  f (gaia_sql_proc
d63a0 5f 69 6d 70 6f 72 74 20 28 63 61 63 68 65 2c 20  _import (cache, 
d63b0 66 69 6c 65 70 61 74 68 2c 20 63 68 61 72 73 65  filepath, charse
d63c0 74 2c 20 26 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f  t, &blob, &blob_
d63d0 73 7a 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  sz))..sqlite3_re
d63e0 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
d63f0 78 74 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73  xt, blob, blob_s
d6400 7a 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 65 6c  z, free);.    el
d6410 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  se.      {..  if
d6420 20 28 62 6c 6f 62 20 21 3d 20 4e 55 4c 4c 29 0a   (blob != NULL).
d6430 09 20 20 20 20 20 20 66 72 65 65 20 28 62 6c 6f  .      free (blo
d6440 62 29 3b 0a 09 20 20 67 6f 74 6f 20 72 65 61 64  b);..  goto read
d6450 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
d6460 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69      return;..  i
d6470 6e 76 61 6c 69 64 5f 66 69 6c 65 70 61 74 68 3a  nvalid_filepath:
d6480 0a 20 20 20 20 6d 73 67 20 3d 20 22 53 71 6c 50  .    msg = "SqlP
d6490 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20  roc exception - 
d64a0 69 6c 6c 65 67 61 6c 20 46 69 6c 65 20 50 61 74  illegal File Pat
d64b0 68 20 61 72 67 75 6d 65 6e 74 2e 22 3b 0a 20 20  h argument.";.  
d64c0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d64d0 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
d64e0 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
d64f0 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69  eturn;..  invali
d6500 64 5f 63 68 61 72 73 65 74 3a 0a 20 20 20 20 6d  d_charset:.    m
d6510 73 67 20 3d 20 22 53 71 6c 50 72 6f 63 20 65 78  sg = "SqlProc ex
d6520 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61  ception - illega
d6530 6c 20 43 68 61 72 73 65 74 20 45 6e 63 6f 64 69  l Charset Encodi
d6540 6e 64 20 61 72 67 75 6d 65 6e 74 2e 22 3b 0a 20  nd argument.";. 
d6550 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
d6560 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74  t_error (context
d6570 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20  , msg, -1);.    
d6580 72 65 74 75 72 6e 3b 0a 0a 20 20 72 65 61 64 5f  return;..  read_
d6590 65 72 72 6f 72 3a 0a 20 20 20 20 6d 73 67 20 3d  error:.    msg =
d65a0 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74   "SqlProc except
d65b0 69 6f 6e 20 2d 20 75 6e 61 62 6c 65 20 74 6f 20  ion - unable to 
d65c0 70 61 72 73 65 20 74 68 65 20 65 78 74 65 72 6e  parse the extern
d65d0 61 6c 20 46 69 6c 65 2e 22 3b 0a 20 20 20 20 73  al File.";.    s
d65e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
d65f0 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
d6600 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  g, -1);.    retu
d6610 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rn;.}..static vo
d6620 69 64 0a 66 6e 63 74 5f 73 70 5f 69 73 5f 76 61  id.fnct_sp_is_va
d6630 6c 69 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lid (sqlite3_con
d6640 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
d6650 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
d6660 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
d6670 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
d6680 6f 6e 3a 0a 2f 20 53 71 6c 50 72 6f 63 5f 49 73  on:./ SqlProc_Is
d6690 56 61 6c 69 64 28 42 4c 4f 42 29 0a 2f 0a 2f 20  Valid(BLOB)././ 
d66a0 72 65 74 75 72 6e 73 3a 0a 2f 20 31 20 69 66 20  returns:./ 1 if 
d66b0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 72 65 61  the argument rea
d66c0 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20 53  lly is a valid S
d66d0 51 4c 20 50 72 6f 63 65 64 75 72 65 20 4f 62 6a  QL Procedure Obj
d66e0 65 63 74 0a 2f 20 30 20 69 66 20 6e 6f 74 0a 2a  ect./ 0 if not.*
d66f0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
d6700 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
d6710 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a  .    int blob_sz
d6720 20 3d 20 30 3b 0a 20 20 20 20 47 41 49 41 5f 55   = 0;.    GAIA_U
d6730 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
d6740 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
d6750 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
d6760 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
d6770 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
d6780 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
d6790 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
d67a0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
d67b0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
d67c0 20 20 7d 0a 20 20 20 20 62 6c 6f 62 20 3d 20 73    }.    blob = s
d67d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
d67e0 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
d67f0 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69 74   blob_sz = sqlit
d6800 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
d6810 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
d6820 20 28 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63 5f   (gaia_sql_proc_
d6830 69 73 5f 76 61 6c 69 64 20 28 62 6c 6f 62 2c 20  is_valid (blob, 
d6840 62 6c 6f 62 5f 73 7a 29 29 0a 09 73 71 6c 69 74  blob_sz))..sqlit
d6850 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
d6860 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  ontext, 1);.    
d6870 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
d6880 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
d6890 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  t, 0);.    retur
d68a0 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
d68b0 64 0a 66 6e 63 74 5f 73 70 5f 76 61 72 5f 63 6f  d.fnct_sp_var_co
d68c0 75 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unt (sqlite3_con
d68d0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
d68e0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
d68f0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
d6900 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
d6910 6f 6e 3a 0a 2f 20 53 71 6c 50 72 6f 63 5f 4e 75  on:./ SqlProc_Nu
d6920 6d 56 61 72 69 61 62 6c 65 73 28 42 4c 4f 42 29  mVariables(BLOB)
d6930 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20  ././ returns:./ 
d6940 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
d6950 6f 66 20 56 61 72 69 61 62 6c 65 73 20 66 72 6f  of Variables fro
d6960 6d 20 61 20 53 51 4c 20 50 72 6f 63 65 64 75 72  m a SQL Procedur
d6970 65 20 4f 62 6a 65 63 74 0a 2f 20 72 61 69 73 65  e Object./ raise
d6980 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f  s an exception o
d6990 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
d69a0 6e 74 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  nt.*/.    const 
d69b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d69c0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f  lob;.    int blo
d69d0 62 5f 73 7a 20 3d 20 30 3b 0a 20 20 20 20 69 6e  b_sz = 0;.    in
d69e0 74 20 63 6f 75 6e 74 3b 0a 20 20 20 20 63 6f 6e  t count;.    con
d69f0 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20  st char *msg;.  
d6a00 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
d6a10 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
d6a20 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
d6a30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
d6a40 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
d6a50 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 09 67 6f  SQLITE_BLOB)..go
d6a60 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d  to invalid_argum
d6a70 65 6e 74 3b 0a 20 20 20 20 62 6c 6f 62 20 3d 20  ent;.    blob = 
d6a80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
d6a90 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
d6aa0 20 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69    blob_sz = sqli
d6ab0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
d6ac0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
d6ad0 66 20 28 21 67 61 69 61 5f 73 71 6c 5f 70 72 6f  f (!gaia_sql_pro
d6ae0 63 5f 69 73 5f 76 61 6c 69 64 20 28 62 6c 6f 62  c_is_valid (blob
d6af0 2c 20 62 6c 6f 62 5f 73 7a 29 29 0a 09 67 6f 74  , blob_sz))..got
d6b00 6f 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f  o not_an_sql_pro
d6b10 63 3b 0a 20 20 20 20 63 6f 75 6e 74 20 3d 20 67  c;.    count = g
d6b20 61 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 76 61 72  aia_sql_proc_var
d6b30 5f 63 6f 75 6e 74 20 28 62 6c 6f 62 2c 20 62 6c  _count (blob, bl
d6b40 6f 62 5f 73 7a 29 3b 0a 20 20 20 20 73 71 6c 69  ob_sz);.    sqli
d6b50 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
d6b60 63 6f 6e 74 65 78 74 2c 20 63 6f 75 6e 74 29 3b  context, count);
d6b70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
d6b80 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74  invalid_argument
d6b90 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22 53 71 6c  :.    msg = "Sql
d6ba0 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d  Proc exception -
d6bb0 20 69 6c 6c 65 67 61 6c 20 53 51 4c 20 50 72 6f   illegal SQL Pro
d6bc0 63 65 64 75 72 65 20 61 72 67 20 5b 6e 6f 74 20  cedure arg [not 
d6bd0 61 20 42 4c 4f 42 5d 2e 22 3b 0a 20 20 20 20 73  a BLOB].";.    s
d6be0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
d6bf0 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
d6c00 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  g, -1);.    retu
d6c10 72 6e 3b 0a 0a 20 20 6e 6f 74 5f 61 6e 5f 73 71  rn;..  not_an_sq
d6c20 6c 5f 70 72 6f 63 3a 0a 20 20 20 20 6d 73 67 20  l_proc:.    msg 
d6c30 3d 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70  = "SqlProc excep
d6c40 74 69 6f 6e 20 2d 20 69 6e 76 61 6c 69 64 20 53  tion - invalid S
d6c50 51 4c 20 50 72 6f 63 65 64 75 72 65 20 42 4c 4f  QL Procedure BLO
d6c60 42 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  B.";.    sqlite3
d6c70 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63  _result_error (c
d6c80 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29  ontext, msg, -1)
d6c90 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ;.    return;.}.
d6ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
d6cb0 74 5f 73 70 5f 76 61 72 69 61 62 6c 65 20 28 73  t_sp_variable (s
d6cc0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
d6cd0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
d6ce0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
d6cf0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
d6d00 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
d6d10 53 71 6c 50 72 6f 63 5f 56 61 72 69 61 62 6c 65  SqlProc_Variable
d6d20 4e 28 42 4c 4f 42 2c 20 49 4e 54 45 47 45 52 20  N(BLOB, INTEGER 
d6d30 69 6e 64 65 78 29 0a 2f 0a 2f 20 72 65 74 75 72  index)././ retur
d6d40 6e 73 3a 0a 2f 20 74 68 65 20 4e 61 6d 65 20 6f  ns:./ the Name o
d6d50 66 20 74 68 65 20 4e 74 68 20 56 61 72 69 61 62  f the Nth Variab
d6d60 6c 65 20 66 72 6f 6d 20 61 20 53 51 4c 20 50 72  le from a SQL Pr
d6d70 6f 63 65 64 75 72 65 20 4f 62 6a 65 63 74 0a 2f  ocedure Object./
d6d80 20 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70   raises an excep
d6d90 74 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20  tion on invalid 
d6da0 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20  arguments.*/.   
d6db0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
d6dc0 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20  char *blob;.    
d6dd0 69 6e 74 20 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b  int blob_sz = 0;
d6de0 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 0a  .    int count;.
d6df0 20 20 20 20 69 6e 74 20 69 6e 64 65 78 3b 0a 20      int index;. 
d6e00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76     const char *v
d6e10 61 72 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  arname;.    char
d6e20 20 2a 6d 73 67 3b 0a 20 20 20 20 47 41 49 41 5f   *msg;.    GAIA_
d6e30 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
d6e40 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
d6e50 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
d6e60 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d6e70 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
d6e80 42 4c 4f 42 29 0a 09 67 6f 74 6f 20 69 6e 76 61  BLOB)..goto inva
d6e90 6c 69 64 5f 62 6c 6f 62 5f 61 72 67 75 6d 65 6e  lid_blob_argumen
d6ea0 74 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  t;.    if (sqlit
d6eb0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
d6ec0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
d6ed0 45 5f 49 4e 54 45 47 45 52 29 0a 09 67 6f 74 6f  E_INTEGER)..goto
d6ee0 20 69 6e 76 61 6c 69 64 5f 69 6e 74 5f 61 72 67   invalid_int_arg
d6ef0 75 6d 65 6e 74 3b 0a 20 20 20 20 62 6c 6f 62 20  ument;.    blob 
d6f00 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
d6f10 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
d6f20 20 20 20 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71      blob_sz = sq
d6f30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
d6f40 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
d6f50 20 69 66 20 28 21 67 61 69 61 5f 73 71 6c 5f 70   if (!gaia_sql_p
d6f60 72 6f 63 5f 69 73 5f 76 61 6c 69 64 20 28 62 6c  roc_is_valid (bl
d6f70 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29 29 0a 09 67  ob, blob_sz))..g
d6f80 6f 74 6f 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70  oto not_an_sql_p
d6f90 72 6f 63 3b 0a 20 20 20 20 69 6e 64 65 78 20 3d  roc;.    index =
d6fa0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
d6fb0 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  nt (argv[1]);.  
d6fc0 20 20 63 6f 75 6e 74 20 3d 20 67 61 69 61 5f 73    count = gaia_s
d6fd0 71 6c 5f 70 72 6f 63 5f 76 61 72 5f 63 6f 75 6e  ql_proc_var_coun
d6fe0 74 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a  t (blob, blob_sz
d6ff0 29 3b 0a 20 20 20 20 69 66 20 28 69 6e 64 65 78  );.    if (index
d7000 20 3c 20 30 20 7c 7c 20 69 6e 64 65 78 20 3e 3d   < 0 || index >=
d7010 20 63 6f 75 6e 74 29 0a 09 67 6f 74 6f 20 69 6c   count)..goto il
d7020 6c 65 67 61 6c 5f 69 6e 64 65 78 3b 0a 20 20 20  legal_index;.   
d7030 20 76 61 72 6e 61 6d 65 20 3d 20 67 61 69 61 5f   varname = gaia_
d7040 73 71 6c 5f 70 72 6f 63 5f 76 61 72 69 61 62 6c  sql_proc_variabl
d7050 65 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a  e (blob, blob_sz
d7060 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 69 66  , index);.    if
d7070 20 28 76 61 72 6e 61 6d 65 20 3d 3d 20 4e 55 4c   (varname == NUL
d7080 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  L)..sqlite3_resu
d7090 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
d70a0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
d70b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
d70c0 20 28 63 6f 6e 74 65 78 74 2c 20 76 61 72 6e 61   (context, varna
d70d0 6d 65 2c 20 73 74 72 6c 65 6e 20 28 76 61 72 6e  me, strlen (varn
d70e0 61 6d 65 29 2c 20 66 72 65 65 29 3b 0a 20 20 20  ame), free);.   
d70f0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61   return;..  inva
d7100 6c 69 64 5f 62 6c 6f 62 5f 61 72 67 75 6d 65 6e  lid_blob_argumen
d7110 74 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22 53 71  t:.    msg = "Sq
d7120 6c 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20  lProc exception 
d7130 2d 20 69 6c 6c 65 67 61 6c 20 53 51 4c 20 50 72  - illegal SQL Pr
d7140 6f 63 65 64 75 72 65 20 61 72 67 20 5b 6e 6f 74  ocedure arg [not
d7150 20 61 20 42 4c 4f 42 5d 2e 22 3b 0a 20 20 20 20   a BLOB].";.    
d7160 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
d7170 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d  rror (context, m
d7180 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  sg, -1);.    ret
d7190 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f  urn;..  invalid_
d71a0 69 6e 74 5f 61 72 67 75 6d 65 6e 74 3a 0a 20 20  int_argument:.  
d71b0 20 20 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63    msg = "SqlProc
d71c0 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c   exception - ill
d71d0 65 67 61 6c 20 49 6e 64 65 78 20 61 72 67 20 5b  egal Index arg [
d71e0 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 5d 2e  not an INTEGER].
d71f0 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ";.    sqlite3_r
d7200 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e  esult_error (con
d7210 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  text, msg, -1);.
d7220 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 6e      return;..  n
d7230 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f 63 3a 0a  ot_an_sql_proc:.
d7240 20 20 20 20 6d 73 67 20 3d 20 22 53 71 6c 50 72      msg = "SqlPr
d7250 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69  oc exception - i
d7260 6e 76 61 6c 69 64 20 53 51 4c 20 50 72 6f 63 65  nvalid SQL Proce
d7270 64 75 72 65 20 42 4c 4f 42 2e 22 3b 0a 20 20 20  dure BLOB.";.   
d7280 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
d7290 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20  error (context, 
d72a0 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  msg, -1);.    re
d72b0 74 75 72 6e 3b 0a 0a 20 20 69 6c 6c 65 67 61 6c  turn;..  illegal
d72c0 5f 69 6e 64 65 78 3a 0a 20 20 20 20 6d 73 67 20  _index:.    msg 
d72d0 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  =..sqlite3_mprin
d72e0 74 66 0a 09 28 22 53 71 6c 50 72 6f 63 20 65 78  tf..("SqlProc ex
d72f0 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61  ception - illega
d7300 6c 20 49 6e 64 65 78 20 28 65 78 70 65 63 74 65  l Index (expecte
d7310 64 20 74 6f 20 62 65 20 62 65 74 77 65 65 6e 20  d to be between 
d7320 30 20 61 6e 64 20 25 64 29 2e 22 2c 0a 09 20 63  0 and %d).",.. c
d7330 6f 75 6e 74 20 2d 20 31 29 3b 0a 20 20 20 20 73  ount - 1);.    s
d7340 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
d7350 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
d7360 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  g, -1);.    sqli
d7370 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a  te3_free (msg);.
d7380 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73      return;.}..s
d7390 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
d73a0 73 70 5f 61 6c 6c 5f 76 61 72 69 61 62 6c 65 73  sp_all_variables
d73b0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
d73c0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
d73d0 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20   argc,...       
d73e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d73f0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
d7400 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 71 6c 50  function:./ SqlP
d7410 72 6f 63 5f 41 6c 6c 56 61 72 69 61 62 6c 65 73  roc_AllVariables
d7420 28 42 4c 4f 42 29 0a 2f 0a 2f 20 72 65 74 75 72  (BLOB)././ retur
d7430 6e 73 3a 0a 2f 20 61 20 73 70 61 63 65 20 73 65  ns:./ a space se
d7440 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20  parated list of 
d7450 56 61 72 69 61 62 6c 65 20 4e 61 6d 65 73 20 66  Variable Names f
d7460 72 6f 6d 20 61 20 53 51 4c 20 50 72 6f 63 65 64  rom a SQL Proced
d7470 75 72 65 20 4f 62 6a 65 63 74 0a 2f 20 72 61 69  ure Object./ rai
d7480 73 65 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ses an exception
d7490 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
d74a0 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 63 6f 6e  ments.*/.    con
d74b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
d74c0 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20   *blob;.    int 
d74d0 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b 0a 20 20 20  blob_sz = 0;.   
d74e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 72   const char *var
d74f0 6c 69 73 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  list;.    const 
d7500 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20 20 47  char *msg;.    G
d7510 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
d7520 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
d7530 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
d7540 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
d7550 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
d7560 49 54 45 5f 42 4c 4f 42 29 0a 09 67 6f 74 6f 20  ITE_BLOB)..goto 
d7570 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74  invalid_argument
d7580 3b 0a 20 20 20 20 62 6c 6f 62 20 3d 20 73 71 6c  ;.    blob = sql
d7590 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
d75a0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 62  (argv[0]);.    b
d75b0 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69 74 65 33  lob_sz = sqlite3
d75c0 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
d75d0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
d75e0 21 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 69  !gaia_sql_proc_i
d75f0 73 5f 76 61 6c 69 64 20 28 62 6c 6f 62 2c 20 62  s_valid (blob, b
d7600 6c 6f 62 5f 73 7a 29 29 0a 09 67 6f 74 6f 20 6e  lob_sz))..goto n
d7610 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f 63 3b 0a  ot_an_sql_proc;.
d7620 20 20 20 20 76 61 72 6c 69 73 74 20 3d 20 67 61      varlist = ga
d7630 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 61 6c 6c 5f  ia_sql_proc_all_
d7640 76 61 72 69 61 62 6c 65 73 20 28 62 6c 6f 62 2c  variables (blob,
d7650 20 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20 69   blob_sz);.    i
d7660 66 20 28 76 61 72 6c 69 73 74 20 3d 3d 20 4e 55  f (varlist == NU
d7670 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
d7680 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
d7690 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
d76a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
d76b0 74 20 28 63 6f 6e 74 65 78 74 2c 20 76 61 72 6c  t (context, varl
d76c0 69 73 74 2c 20 73 74 72 6c 65 6e 20 28 76 61 72  ist, strlen (var
d76d0 6c 69 73 74 29 2c 20 73 71 6c 69 74 65 33 5f 66  list), sqlite3_f
d76e0 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ree);.    return
d76f0 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72 67  ;..  invalid_arg
d7700 75 6d 65 6e 74 3a 0a 20 20 20 20 6d 73 67 20 3d  ument:.    msg =
d7710 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74   "SqlProc except
d7720 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 53 51  ion - illegal SQ
d7730 4c 20 50 72 6f 63 65 64 75 72 65 20 61 72 67 20  L Procedure arg 
d7740 5b 6e 6f 74 20 61 20 42 4c 4f 42 5d 2e 22 3b 0a  [not a BLOB].";.
d7750 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d7760 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78  lt_error (contex
d7770 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  t, msg, -1);.   
d7780 20 72 65 74 75 72 6e 3b 0a 0a 20 20 6e 6f 74 5f   return;..  not_
d7790 61 6e 5f 73 71 6c 5f 70 72 6f 63 3a 0a 20 20 20  an_sql_proc:.   
d77a0 20 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63 20   msg = "SqlProc 
d77b0 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6e 76 61  exception - inva
d77c0 6c 69 64 20 53 51 4c 20 50 72 6f 63 65 64 75 72  lid SQL Procedur
d77d0 65 20 42 4c 4f 42 2e 22 3b 0a 20 20 20 20 73 71  e BLOB.";.    sq
d77e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
d77f0 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67  or (context, msg
d7800 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
d7810 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  n;.}..static int
d7820 0a 69 73 5f 64 65 63 6f 72 61 74 65 64 5f 76 61  .is_decorated_va
d7830 72 69 61 62 6c 65 5f 6e 61 6d 65 20 28 63 6f 6e  riable_name (con
d7840 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 29 0a 7b  st char *name).{
d7850 0a 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20  ./* testing for 
d7860 61 6e 20 61 6c 72 65 61 64 79 20 64 65 63 6f 72  an already decor
d7870 61 74 65 64 20 56 61 72 69 61 62 6c 65 20 4e 61  ated Variable Na
d7880 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 6d  me */.    char m
d7890 61 72 6b 5f 73 74 61 72 74 20 3d 20 2a 6e 61 6d  ark_start = *nam
d78a0 65 3b 0a 20 20 20 20 63 68 61 72 20 6d 61 72 6b  e;.    char mark
d78b0 5f 73 74 6f 70 20 3d 20 2a 28 6e 61 6d 65 20 2b  _stop = *(name +
d78c0 20 73 74 72 6c 65 6e 20 28 6e 61 6d 65 29 20 2d   strlen (name) -
d78d0 20 31 29 3b 0a 20 20 20 20 69 66 20 28 6d 61 72   1);.    if (mar
d78e0 6b 5f 73 74 61 72 74 20 3d 3d 20 6d 61 72 6b 5f  k_start == mark_
d78f0 73 74 6f 70 20 26 26 20 28 6d 61 72 6b 5f 73 74  stop && (mark_st
d7900 61 72 74 20 3d 3d 20 27 40 27 20 7c 7c 20 6d 61  art == '@' || ma
d7910 72 6b 5f 73 74 61 72 74 20 3d 3d 20 27 24 27 29  rk_start == '$')
d7920 29 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20  )..return 1;.   
d7930 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
d7940 61 74 69 63 20 63 68 61 72 20 2a 0a 64 6f 5f 65  atic char *.do_e
d7950 6e 63 6f 64 65 5f 62 6c 6f 62 5f 76 61 6c 75 65  ncode_blob_value
d7960 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
d7970 20 63 68 61 72 20 2a 62 6c 6f 62 2c 20 69 6e 74   char *blob, int
d7980 20 62 6c 6f 62 5f 73 7a 29 0a 7b 0a 2f 2a 20 65   blob_sz).{./* e
d7990 6e 63 6f 64 69 6e 67 20 61 20 42 4c 4f 42 20 76  ncoding a BLOB v
d79a0 61 6c 75 65 20 61 73 20 61 6e 20 48 65 78 20 53  alue as an Hex S
d79b0 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61  tring */.    cha
d79c0 72 20 2a 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  r *value = sqlit
d79d0 65 33 5f 6d 61 6c 6c 6f 63 20 28 28 62 6c 6f 62  e3_malloc ((blob
d79e0 5f 73 7a 20 2a 20 32 29 20 2b 20 34 29 3b 0a 20  _sz * 2) + 4);. 
d79f0 20 20 20 63 68 61 72 20 2a 70 5f 6f 75 74 20 3d     char *p_out =
d7a00 20 76 61 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20   value;.    int 
d7a10 69 3b 0a 0a 20 20 20 20 2a 70 5f 6f 75 74 2b 2b  i;..    *p_out++
d7a20 20 3d 20 27 78 27 3b 0a 20 20 20 20 2a 70 5f 6f   = 'x';.    *p_o
d7a30 75 74 2b 2b 20 3d 20 27 5c 27 27 3b 0a 20 20 20  ut++ = '\'';.   
d7a40 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
d7a50 20 62 6c 6f 62 5f 73 7a 3b 20 69 2b 2b 29 0a 20   blob_sz; i++). 
d7a60 20 20 20 20 20 7b 0a 09 20 20 75 6e 73 69 67 6e       {..  unsign
d7a70 65 64 20 63 68 61 72 20 62 79 74 65 20 3d 20 2a  ed char byte = *
d7a80 28 62 6c 6f 62 20 2b 20 69 29 3b 0a 09 20 20 75  (blob + i);..  u
d7a90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 69 20  nsigned char hi 
d7aa0 3d 20 62 79 74 65 20 2f 20 31 36 3b 0a 09 20 20  = byte / 16;..  
d7ab0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f  unsigned char lo
d7ac0 20 3d 20 62 79 74 65 20 2d 20 28 68 69 20 2a 20   = byte - (hi * 
d7ad0 31 36 29 3b 0a 09 20 20 73 77 69 74 63 68 20 28  16);..  switch (
d7ae0 68 69 29 0a 09 20 20 20 20 7b 0a 09 20 20 20 20  hi)..    {..    
d7af0 63 61 73 65 20 30 3a 0a 09 09 2a 70 5f 6f 75 74  case 0:...*p_out
d7b00 2b 2b 20 3d 20 27 30 27 3b 0a 09 09 62 72 65 61  ++ = '0';...brea
d7b10 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31 3a 0a  k;..    case 1:.
d7b20 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 31 27  ..*p_out++ = '1'
d7b30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
d7b40 63 61 73 65 20 32 3a 0a 09 09 2a 70 5f 6f 75 74  case 2:...*p_out
d7b50 2b 2b 20 3d 20 27 32 27 3b 0a 09 09 62 72 65 61  ++ = '2';...brea
d7b60 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 33 3a 0a  k;..    case 3:.
d7b70 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 33 27  ..*p_out++ = '3'
d7b80 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
d7b90 63 61 73 65 20 34 3a 0a 09 09 2a 70 5f 6f 75 74  case 4:...*p_out
d7ba0 2b 2b 20 3d 20 27 34 27 3b 0a 09 09 62 72 65 61  ++ = '4';...brea
d7bb0 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 35 3a 0a  k;..    case 5:.
d7bc0 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 35 27  ..*p_out++ = '5'
d7bd0 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
d7be0 63 61 73 65 20 36 3a 0a 09 09 2a 70 5f 6f 75 74  case 6:...*p_out
d7bf0 2b 2b 20 3d 20 27 36 27 3b 0a 09 09 62 72 65 61  ++ = '6';...brea
d7c00 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 37 3a 0a  k;..    case 7:.
d7c10 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 37 27  ..*p_out++ = '7'
d7c20 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
d7c30 63 61 73 65 20 38 3a 0a 09 09 2a 70 5f 6f 75 74  case 8:...*p_out
d7c40 2b 2b 20 3d 20 27 38 27 3b 0a 09 09 62 72 65 61  ++ = '8';...brea
d7c50 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 39 3a 0a  k;..    case 9:.
d7c60 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 39 27  ..*p_out++ = '9'
d7c70 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
d7c80 63 61 73 65 20 31 30 3a 0a 09 09 2a 70 5f 6f 75  case 10:...*p_ou
d7c90 74 2b 2b 20 3d 20 27 41 27 3b 0a 09 09 62 72 65  t++ = 'A';...bre
d7ca0 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31 31  ak;..    case 11
d7cb0 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27  :...*p_out++ = '
d7cc0 42 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  B';...break;..  
d7cd0 20 20 63 61 73 65 20 31 32 3a 0a 09 09 2a 70 5f    case 12:...*p_
d7ce0 6f 75 74 2b 2b 20 3d 20 27 43 27 3b 0a 09 09 62  out++ = 'C';...b
d7cf0 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
d7d00 31 33 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d  13:...*p_out++ =
d7d10 20 27 44 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   'D';...break;..
d7d20 20 20 20 20 63 61 73 65 20 31 34 3a 0a 09 09 2a      case 14:...*
d7d30 70 5f 6f 75 74 2b 2b 20 3d 20 27 45 27 3b 0a 09  p_out++ = 'E';..
d7d40 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
d7d50 65 20 31 35 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b  e 15:...*p_out++
d7d60 20 3d 20 27 46 27 3b 0a 09 09 62 72 65 61 6b 3b   = 'F';...break;
d7d70 0a 09 20 20 20 20 7d 3b 0a 09 20 20 73 77 69 74  ..    };..  swit
d7d80 63 68 20 28 6c 6f 29 0a 09 20 20 20 20 7b 0a 09  ch (lo)..    {..
d7d90 20 20 20 20 63 61 73 65 20 30 3a 0a 09 09 2a 70      case 0:...*p
d7da0 5f 6f 75 74 2b 2b 20 3d 20 27 30 27 3b 0a 09 09  _out++ = '0';...
d7db0 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
d7dc0 20 31 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d   1:...*p_out++ =
d7dd0 20 27 31 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   '1';...break;..
d7de0 20 20 20 20 63 61 73 65 20 32 3a 0a 09 09 2a 70      case 2:...*p
d7df0 5f 6f 75 74 2b 2b 20 3d 20 27 32 27 3b 0a 09 09  _out++ = '2';...
d7e00 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
d7e10 20 33 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d   3:...*p_out++ =
d7e20 20 27 33 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   '3';...break;..
d7e30 20 20 20 20 63 61 73 65 20 34 3a 0a 09 09 2a 70      case 4:...*p
d7e40 5f 6f 75 74 2b 2b 20 3d 20 27 34 27 3b 0a 09 09  _out++ = '4';...
d7e50 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
d7e60 20 35 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d   5:...*p_out++ =
d7e70 20 27 35 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   '5';...break;..
d7e80 20 20 20 20 63 61 73 65 20 36 3a 0a 09 09 2a 70      case 6:...*p
d7e90 5f 6f 75 74 2b 2b 20 3d 20 27 36 27 3b 0a 09 09  _out++ = '6';...
d7ea0 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
d7eb0 20 37 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d   7:...*p_out++ =
d7ec0 20 27 37 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   '7';...break;..
d7ed0 20 20 20 20 63 61 73 65 20 38 3a 0a 09 09 2a 70      case 8:...*p
d7ee0 5f 6f 75 74 2b 2b 20 3d 20 27 38 27 3b 0a 09 09  _out++ = '8';...
d7ef0 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
d7f00 20 39 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d   9:...*p_out++ =
d7f10 20 27 39 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09   '9';...break;..
d7f20 20 20 20 20 63 61 73 65 20 31 30 3a 0a 09 09 2a      case 10:...*
d7f30 70 5f 6f 75 74 2b 2b 20 3d 20 27 41 27 3b 0a 09  p_out++ = 'A';..
d7f40 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
d7f50 65 20 31 31 3a 0a 09 09 2a 70 5f 6f 75 74 2b 2b  e 11:...*p_out++
d7f60 20 3d 20 27 42 27 3b 0a 09 09 62 72 65 61 6b 3b   = 'B';...break;
d7f70 0a 09 20 20 20 20 63 61 73 65 20 31 32 3a 0a 09  ..    case 12:..
d7f80 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 43 27 3b  .*p_out++ = 'C';
d7f90 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
d7fa0 61 73 65 20 31 33 3a 0a 09 09 2a 70 5f 6f 75 74  ase 13:...*p_out
d7fb0 2b 2b 20 3d 20 27 44 27 3b 0a 09 09 62 72 65 61  ++ = 'D';...brea
d7fc0 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 31 34 3a  k;..    case 14:
d7fd0 0a 09 09 2a 70 5f 6f 75 74 2b 2b 20 3d 20 27 45  ...*p_out++ = 'E
d7fe0 27 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  ';...break;..   
d7ff0 20 63 61 73 65 20 31 35 3a 0a 09 09 2a 70 5f 6f   case 15:...*p_o
d8000 75 74 2b 2b 20 3d 20 27 46 27 3b 0a 09 09 62 72  ut++ = 'F';...br
d8010 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 20 20 20  eak;..    };.   
d8020 20 20 20 7d 0a 20 20 20 20 2a 70 5f 6f 75 74 2b     }.    *p_out+
d8030 2b 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 2a 70  + = '\'';.    *p
d8040 5f 6f 75 74 20 3d 20 27 5c 30 27 3b 0a 20 20 20  _out = '\0';.   
d8050 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 7d   return value;.}
d8060 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
d8070 63 74 5f 73 70 5f 76 61 72 5f 61 72 67 20 28 73  ct_sp_var_arg (s
d8080 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
d8090 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
d80a0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
d80b0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
d80c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
d80d0 53 71 6c 50 72 6f 63 5f 56 61 72 56 61 6c 75 65  SqlProc_VarValue
d80e0 28 54 45 58 54 20 76 61 72 2d 6e 61 6d 65 2c 20  (TEXT var-name, 
d80f0 4e 55 4c 4c 29 0a 2f 20 53 71 6c 50 72 6f 63 5f  NULL)./ SqlProc_
d8100 56 61 72 56 61 6c 75 65 28 54 45 58 54 20 76 61  VarValue(TEXT va
d8110 72 2d 6e 61 6d 65 2c 20 49 4e 54 20 76 61 6c 75  r-name, INT valu
d8120 65 29 0a 2f 20 53 71 6c 50 72 6f 63 5f 56 61 72  e)./ SqlProc_Var
d8130 56 61 6c 75 65 28 54 45 58 54 20 76 61 72 2d 6e  Value(TEXT var-n
d8140 61 6d 65 2c 20 44 4f 55 42 4c 45 20 76 61 6c 75  ame, DOUBLE valu
d8150 65 29 0a 2f 20 53 71 6c 50 72 6f 63 5f 56 61 72  e)./ SqlProc_Var
d8160 56 61 6c 75 65 28 54 45 58 54 20 76 61 72 2d 6e  Value(TEXT var-n
d8170 61 6d 65 2c 20 54 45 58 54 20 76 61 6c 75 65 29  ame, TEXT value)
d8180 0a 2f 20 53 71 6c 50 72 6f 63 5f 56 61 72 56 61  ./ SqlProc_VarVa
d8190 6c 75 65 28 54 45 58 54 20 76 61 72 2d 6e 61 6d  lue(TEXT var-nam
d81a0 65 2c 20 42 4c 4f 42 20 76 61 6c 75 65 29 0a 2f  e, BLOB value)./
d81b0 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 61 6e  ./ returns:./ an
d81c0 20 53 51 4c 20 50 72 6f 63 65 64 75 72 65 20 41   SQL Procedure A
d81d0 72 67 75 6d 65 6e 74 20 2d 20 56 61 72 69 61 62  rgument - Variab
d81e0 6c 65 20 77 69 74 68 20 56 61 6c 75 65 0a 2f 20  le with Value./ 
d81f0 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74  raises an except
d8200 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ion on invalid a
d8210 72 67 75 6d 65 6e 74 73 20 0a 2a 2f 0a 20 20 20  rguments .*/.   
d8220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 72   const char *var
d8230 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  _name;.    const
d8240 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d8250 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c  blob;.    int bl
d8260 6f 62 5f 73 7a 3b 0a 20 20 20 20 63 68 61 72 20  ob_sz;.    char 
d8270 2a 76 61 72 5f 61 72 67 3b 0a 20 20 20 20 63 6f  *var_arg;.    co
d8280 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20  nst char *msg;. 
d8290 20 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a     char *value;.
d82a0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
d82b0 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
d82c0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
d82d0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
d82e0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
d82f0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
d8300 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67  goto invalid_arg
d8310 75 6d 65 6e 74 3b 0a 20 20 20 20 76 61 72 5f 6e  ument;.    var_n
d8320 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d8330 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
d8340 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
d8350 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 73  );.    switch (s
d8360 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
d8370 65 20 28 61 72 67 76 5b 31 5d 29 29 0a 20 20 20  e (argv[1])).   
d8380 20 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20     {.      case 
d8390 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 09 20 20  SQLITE_NULL:..  
d83a0 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
d83b0 6d 70 72 69 6e 74 66 20 28 22 25 73 22 2c 20 22  mprintf ("%s", "
d83c0 4e 55 4c 4c 22 29 3b 0a 09 20 20 62 72 65 61 6b  NULL");..  break
d83d0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
d83e0 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 23 69 66  ITE_INTEGER:.#if
d83f0 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
d8400 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4d   && !defined(__M
d8410 49 4e 47 57 33 32 5f 5f 29 0a 09 20 20 76 61 6c  INGW32__)..  val
d8420 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ue = sqlite3_mpr
d8430 69 6e 74 66 20 28 22 25 49 36 34 64 22 2c 20 73  intf ("%I64d", s
d8440 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
d8450 36 34 20 28 61 72 67 76 5b 31 5d 29 29 3b 0a 23  64 (argv[1]));.#
d8460 65 6c 73 65 0a 09 20 20 76 61 6c 75 65 20 3d 20  else..  value = 
d8470 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
d8480 28 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33  ("%lld", sqlite3
d8490 5f 76 61 6c 75 65 5f 69 6e 74 36 34 20 28 61 72  _value_int64 (ar
d84a0 67 76 5b 31 5d 29 29 3b 0a 23 65 6e 64 69 66 0a  gv[1]));.#endif.
d84b0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
d84c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
d84d0 54 3a 0a 09 20 20 76 61 6c 75 65 20 3d 20 73 71  T:..  value = sq
d84e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22  lite3_mprintf ("
d84f0 25 31 2e 31 30 66 22 2c 20 73 71 6c 69 74 65 33  %1.10f", sqlite3
d8500 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
d8510 72 67 76 5b 31 5d 29 29 3b 0a 09 20 20 62 72 65  rgv[1]));..  bre
d8520 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
d8530 51 4c 49 54 45 5f 54 45 58 54 3a 0a 09 20 20 76  QLITE_TEXT:..  v
d8540 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  alue = sqlite3_m
d8550 70 72 69 6e 74 66 20 28 22 25 73 22 2c 20 73 71  printf ("%s", sq
d8560 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d8570 20 28 61 72 67 76 5b 31 5d 29 29 3b 0a 09 20 20   (argv[1]));..  
d8580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d8590 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
d85a0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20       default:.. 
d85b0 20 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f   blob = sqlite3_
d85c0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
d85d0 5b 31 5d 29 3b 0a 09 20 20 62 6c 6f 62 5f 73 7a  [1]);..  blob_sz
d85e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
d85f0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
d8600 3b 0a 09 20 20 76 61 6c 75 65 20 3d 20 64 6f 5f  ;..  value = do_
d8610 65 6e 63 6f 64 65 5f 62 6c 6f 62 5f 76 61 6c 75  encode_blob_valu
d8620 65 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a  e (blob, blob_sz
d8630 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  );..  break;.   
d8640 20 20 20 7d 3b 0a 0a 20 20 20 20 69 66 20 28 69     };..    if (i
d8650 73 5f 64 65 63 6f 72 61 74 65 64 5f 76 61 72 69  s_decorated_vari
d8660 61 62 6c 65 5f 6e 61 6d 65 20 28 76 61 72 5f 6e  able_name (var_n
d8670 61 6d 65 29 29 0a 09 76 61 72 5f 61 72 67 20 3d  ame))..var_arg =
d8680 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
d8690 20 28 22 25 73 3d 25 73 22 2c 20 76 61 72 5f 6e   ("%s=%s", var_n
d86a0 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20  ame, value);.   
d86b0 20 65 6c 73 65 0a 09 76 61 72 5f 61 72 67 20 3d   else..var_arg =
d86c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
d86d0 20 28 22 40 25 73 40 3d 25 73 22 2c 20 76 61 72   ("@%s@=%s", var
d86e0 5f 6e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 20  _name, value);. 
d86f0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
d8700 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c  t_text (context,
d8710 20 76 61 72 5f 61 72 67 2c 20 73 74 72 6c 65 6e   var_arg, strlen
d8720 20 28 76 61 72 5f 61 72 67 29 2c 20 73 71 6c 69   (var_arg), sqli
d8730 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 73  te3_free);.    s
d8740 71 6c 69 74 65 33 5f 66 72 65 65 20 28 76 61 6c  qlite3_free (val
d8750 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ue);.    return;
d8760 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75  ..  invalid_argu
d8770 6d 65 6e 74 3a 0a 20 20 20 20 6d 73 67 20 3d 20  ment:.    msg = 
d8780 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69  "SqlProc excepti
d8790 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 4e 61 6d  on - illegal Nam
d87a0 65 20 61 72 67 20 5b 6e 6f 74 20 54 45 58 54 5d  e arg [not TEXT]
d87b0 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  .";.    sqlite3_
d87c0 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f  result_error (co
d87d0 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b  ntext, msg, -1);
d87e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
d87f0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
d8800 5f 73 70 5f 69 73 5f 76 61 6c 69 64 5f 76 61 72  _sp_is_valid_var
d8810 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
d8820 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
d8830 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 73   argc,...      s
d8840 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
d8850 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
d8860 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 71 6c 50 72  unction:./ SqlPr
d8870 6f 63 5f 49 73 56 61 6c 69 64 56 61 72 56 61 6c  oc_IsValidVarVal
d8880 75 65 28 54 45 58 54 29 0a 2f 0a 2f 20 72 65 74  ue(TEXT)././ ret
d8890 75 72 6e 73 3a 0a 2f 20 31 20 69 66 20 74 68 65  urns:./ 1 if the
d88a0 20 61 72 67 75 6d 65 6e 74 20 72 65 61 6c 6c 79   argument really
d88b0 20 69 73 20 61 20 76 61 6c 69 64 20 53 51 4c 20   is a valid SQL 
d88c0 56 61 72 69 61 62 6c 65 20 77 69 74 68 20 56 61  Variable with Va
d88d0 6c 75 65 0a 2f 20 30 20 69 66 20 6e 6f 74 0a 2a  lue./ 0 if not.*
d88e0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
d88f0 20 2a 73 74 72 3b 0a 20 20 20 20 47 41 49 41 5f   *str;.    GAIA_
d8900 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
d8910 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
d8920 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
d8930 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
d8940 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
d8950 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
d8960 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
d8970 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
d8980 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
d8990 20 20 20 7d 0a 20 20 20 20 73 74 72 20 3d 20 28     }.    str = (
d89a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
d89b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d89c0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
d89d0 69 66 20 28 67 61 69 61 5f 73 71 6c 5f 70 72 6f  if (gaia_sql_pro
d89e0 63 5f 69 73 5f 76 61 6c 69 64 5f 76 61 72 5f 76  c_is_valid_var_v
d89f0 61 6c 75 65 20 28 73 74 72 29 29 0a 09 73 71 6c  alue (str))..sql
d8a00 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
d8a10 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
d8a20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
d8a30 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
d8a40 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ext, 0);.    ret
d8a50 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  urn;.}..static v
d8a60 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 72 61 77 5f  oid.fnct_sp_raw_
d8a70 73 71 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  sql (sqlite3_con
d8a80 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
d8a90 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
d8aa0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
d8ab0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
d8ac0 6f 6e 3a 0a 2f 20 53 71 6c 50 72 6f 63 5f 52 61  on:./ SqlProc_Ra
d8ad0 77 53 51 4c 28 42 4c 4f 42 29 0a 2f 0a 2f 20 72  wSQL(BLOB)././ r
d8ae0 65 74 75 72 6e 73 3a 0a 2f 20 74 68 65 20 72 61  eturns:./ the ra
d8af0 77 20 53 51 4c 20 62 6f 64 79 20 66 72 6f 6d 20  w SQL body from 
d8b00 61 20 53 51 4c 20 50 72 6f 63 65 64 75 72 65 20  a SQL Procedure 
d8b10 4f 62 6a 65 63 74 0a 2f 20 72 61 69 73 65 73 20  Object./ raises 
d8b20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20  an exception on 
d8b30 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
d8b40 73 20 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  s .*/.    const 
d8b50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d8b60 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f  lob;.    int blo
d8b70 62 5f 73 7a 20 3d 20 30 3b 0a 20 20 20 20 63 6f  b_sz = 0;.    co
d8b80 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20  nst char *sql;. 
d8b90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d     const char *m
d8ba0 73 67 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  sg;.    GAIA_UNU
d8bb0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
d8bc0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
d8bd0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
d8be0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
d8bf0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
d8c00 42 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64  B)..goto invalid
d8c10 5f 61 72 67 75 6d 65 6e 74 3b 0a 20 20 20 20 62  _argument;.    b
d8c20 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
d8c30 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
d8c40 5d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 73 7a 20  ]);.    blob_sz 
d8c50 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
d8c60 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
d8c70 0a 20 20 20 20 69 66 20 28 21 67 61 69 61 5f 73  .    if (!gaia_s
d8c80 71 6c 5f 70 72 6f 63 5f 69 73 5f 76 61 6c 69 64  ql_proc_is_valid
d8c90 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29   (blob, blob_sz)
d8ca0 29 0a 09 67 6f 74 6f 20 6e 6f 74 5f 61 6e 5f 73  )..goto not_an_s
d8cb0 71 6c 5f 70 72 6f 63 3b 0a 20 20 20 20 73 71 6c  ql_proc;.    sql
d8cc0 20 3d 20 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63   = gaia_sql_proc
d8cd0 5f 72 61 77 5f 73 71 6c 20 28 62 6c 6f 62 2c 20  _raw_sql (blob, 
d8ce0 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20 69 66  blob_sz);.    if
d8cf0 20 28 73 71 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09   (sql == NULL)..
d8d00 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
d8d10 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
d8d20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
d8d30 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f  _result_text (co
d8d40 6e 74 65 78 74 2c 20 73 71 6c 2c 20 73 74 72 6c  ntext, sql, strl
d8d50 65 6e 20 28 73 71 6c 29 2c 20 66 72 65 65 29 3b  en (sql), free);
d8d60 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
d8d70 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74  invalid_argument
d8d80 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22 53 71 6c  :.    msg = "Sql
d8d90 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d  Proc exception -
d8da0 20 69 6c 6c 65 67 61 6c 20 53 51 4c 20 50 72 6f   illegal SQL Pro
d8db0 63 65 64 75 72 65 20 61 72 67 20 5b 6e 6f 74 20  cedure arg [not 
d8dc0 61 20 42 4c 4f 42 5d 2e 22 3b 0a 20 20 20 20 73  a BLOB].";.    s
d8dd0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
d8de0 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
d8df0 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  g, -1);.    retu
d8e00 72 6e 3b 0a 0a 20 20 6e 6f 74 5f 61 6e 5f 73 71  rn;..  not_an_sq
d8e10 6c 5f 70 72 6f 63 3a 0a 20 20 20 20 6d 73 67 20  l_proc:.    msg 
d8e20 3d 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70  = "SqlProc excep
d8e30 74 69 6f 6e 20 2d 20 69 6e 76 61 6c 69 64 20 53  tion - invalid S
d8e40 51 4c 20 50 72 6f 63 65 64 75 72 65 20 42 4c 4f  QL Procedure BLO
d8e50 42 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  B.";.    sqlite3
d8e60 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63  _result_error (c
d8e70 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29  ontext, msg, -1)
d8e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ;.    return;.}.
d8e90 0a 73 74 61 74 69 63 20 53 71 6c 50 72 6f 63 5f  .static SqlProc_
d8ea0 56 61 72 4c 69 73 74 50 74 72 0a 67 65 74 5f 73  VarListPtr.get_s
d8eb0 71 6c 5f 70 72 6f 63 5f 76 61 72 69 61 62 6c 65  ql_proc_variable
d8ec0 73 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 63  s (const void *c
d8ed0 61 63 68 65 2c 20 69 6e 74 20 61 72 67 63 2c 20  ache, int argc, 
d8ee0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d8ef0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 63 6f 6d 6d   argv).{./* comm
d8f00 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  on implementatio
d8f10 6e 3a 20 63 72 65 61 74 69 6e 67 20 61 6e 20 53  n: creating an S
d8f20 51 4c 20 50 72 6f 63 65 64 75 72 65 20 56 61 72  QL Procedure Var
d8f30 69 61 62 6c 65 73 20 4c 69 73 74 20 2a 2f 0a 20  iables List */. 
d8f40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
d8f50 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 3b 0a  nst char *text;.
d8f60 20 20 20 20 53 71 6c 50 72 6f 63 5f 56 61 72 4c      SqlProc_VarL
d8f70 69 73 74 50 74 72 20 6c 69 73 74 20 3d 20 67 61  istPtr list = ga
d8f80 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 63 72 65 61  ia_sql_proc_crea
d8f90 74 65 5f 76 61 72 69 61 62 6c 65 73 20 28 29 3b  te_variables ();
d8fa0 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 31 3b  .    for (i = 1;
d8fb0 20 69 20 3c 20 61 72 67 63 3b 20 69 2b 2b 29 0a   i < argc; i++).
d8fc0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
d8fd0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
d8fe0 65 20 28 61 72 67 76 5b 69 5d 29 20 21 3d 20 53  e (argv[i]) != S
d8ff0 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
d9000 20 7b 0a 09 09 63 68 61 72 20 2a 65 72 72 6d 73   {...char *errms
d9010 67 20 3d 0a 09 09 20 20 20 20 73 71 6c 69 74 65  g =...    sqlite
d9020 33 5f 6d 70 72 69 6e 74 66 0a 09 09 20 20 20 20  3_mprintf...    
d9030 28 22 56 61 72 69 61 62 6c 65 20 41 72 67 75 6d  ("Variable Argum
d9040 65 6e 74 20 23 25 64 20 69 73 20 6e 6f 74 20 6f  ent #%d is not o
d9050 66 20 74 68 65 20 54 45 58 54 20 74 79 70 65 2e  f the TEXT type.
d9060 5c 6e 22 2c 0a 09 09 20 20 20 20 20 69 20 2d 20  \n",...     i - 
d9070 31 29 3b 0a 09 09 67 61 69 61 5f 73 71 6c 5f 70  1);...gaia_sql_p
d9080 72 6f 63 5f 73 65 74 5f 65 72 72 6f 72 20 28 63  roc_set_error (c
d9090 61 63 68 65 2c 20 65 72 72 6d 73 67 29 3b 0a 09  ache, errmsg);..
d90a0 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65  .sqlite3_free (e
d90b0 72 72 6d 73 67 29 3b 0a 09 09 6c 69 73 74 2d 3e  rrmsg);...list->
d90c0 45 72 72 6f 72 20 3d 20 31 3b 0a 09 09 67 6f 74  Error = 1;...got
d90d0 6f 20 65 6e 64 3b 0a 09 20 20 20 20 7d 0a 09 20  o end;..    }.. 
d90e0 20 74 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63   text = (const c
d90f0 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
d9100 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
d9110 69 5d 29 3b 0a 09 20 20 69 66 20 28 21 67 61 69  i]);..  if (!gai
d9120 61 5f 73 71 6c 5f 70 72 6f 63 5f 61 64 64 5f 76  a_sql_proc_add_v
d9130 61 72 69 61 62 6c 65 20 28 6c 69 73 74 2c 20 74  ariable (list, t
d9140 65 78 74 29 29 0a 09 20 20 20 20 7b 0a 09 09 63  ext))..    {...c
d9150 68 61 72 20 2a 65 72 72 6d 73 67 20 3d 0a 09 09  har *errmsg =...
d9160 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
d9170 6e 74 66 20 28 22 49 6c 6c 65 67 61 6c 20 56 61  ntf ("Illegal Va
d9180 72 69 61 62 6c 65 20 41 72 67 75 6d 65 6e 74 20  riable Argument 
d9190 23 25 64 3a 20 25 73 5c 6e 22 2c 0a 09 09 09 09  #%d: %s\n",.....
d91a0 20 20 20 20 20 69 20 2d 20 31 2c 20 74 65 78 74       i - 1, text
d91b0 29 3b 0a 09 09 67 61 69 61 5f 73 71 6c 5f 70 72  );...gaia_sql_pr
d91c0 6f 63 5f 73 65 74 5f 65 72 72 6f 72 20 28 63 61  oc_set_error (ca
d91d0 63 68 65 2c 20 65 72 72 6d 73 67 29 3b 0a 09 09  che, errmsg);...
d91e0 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 65 72  sqlite3_free (er
d91f0 72 6d 73 67 29 3b 0a 09 09 6c 69 73 74 2d 3e 45  rmsg);...list->E
d9200 72 72 6f 72 20 3d 20 31 3b 0a 09 09 67 6f 74 6f  rror = 1;...goto
d9210 20 65 6e 64 3b 0a 09 20 20 20 20 7d 0a 20 20 20   end;..    }.   
d9220 20 20 20 7d 0a 20 20 65 6e 64 3a 0a 20 20 20 20     }.  end:.    
d9230 72 65 74 75 72 6e 20 6c 69 73 74 3b 0a 7d 0a 0a  return list;.}..
d9240 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
d9250 5f 73 70 5f 63 6f 6f 6b 65 64 5f 73 71 6c 20 28  _sp_cooked_sql (
d9260 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d9270 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
d9280 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
d9290 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
d92a0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
d92b0 20 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b 65 64 53   SqlProc_CookedS
d92c0 51 4c 28 42 4c 4f 42 20 5b 2c 20 61 72 67 31 20  QL(BLOB [, arg1 
d92d0 54 45 58 54 2c 20 61 72 67 32 20 54 45 58 54 2c  TEXT, arg2 TEXT,
d92e0 20 2e 2e 2e 20 61 72 67 4e 20 54 45 58 54 5d 20   ... argN TEXT] 
d92f0 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f  )././ returns:./
d9300 20 74 68 65 20 63 6f 6f 6b 65 64 20 53 51 4c 20   the cooked SQL 
d9310 62 6f 64 79 20 66 72 6f 6d 20 61 20 53 51 4c 20  body from a SQL 
d9320 50 72 6f 63 65 64 75 72 65 20 4f 62 6a 65 63 74  Procedure Object
d9330 0a 2f 20 72 61 69 73 65 73 20 61 6e 20 65 78 63  ./ raises an exc
d9340 65 70 74 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69  eption on invali
d9350 64 20 61 72 67 75 6d 65 6e 74 73 20 0a 2a 2f 0a  d arguments .*/.
d9360 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
d9370 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20  ed char *blob;. 
d9380 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 20 3d     int blob_sz =
d9390 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71   0;.    char *sq
d93a0 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  l;.    const cha
d93b0 72 20 2a 6d 73 67 3b 0a 20 20 20 20 53 71 6c 50  r *msg;.    SqlP
d93c0 72 6f 63 5f 56 61 72 4c 69 73 74 50 74 72 20 76  roc_VarListPtr v
d93d0 61 72 69 61 62 6c 65 73 20 3d 20 4e 55 4c 4c 3b  ariables = NULL;
d93e0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
d93f0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
d9400 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
d9410 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
d9420 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
d9430 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
d9440 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
d9450 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
d9460 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
d9470 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
d9480 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
d9490 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
d94a0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
d94b0 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
d94c0 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f  )..goto invalid_
d94d0 62 6c 6f 62 5f 61 72 67 75 6d 65 6e 74 3b 0a 20  blob_argument;. 
d94e0 20 20 20 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65     blob = sqlite
d94f0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
d9500 67 76 5b 30 5d 29 3b 0a 20 20 20 20 62 6c 6f 62  gv[0]);.    blob
d9510 5f 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  _sz = sqlite3_va
d9520 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
d9530 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 21 67 61  0]);.    if (!ga
d9540 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 69 73 5f 76  ia_sql_proc_is_v
d9550 61 6c 69 64 20 28 62 6c 6f 62 2c 20 62 6c 6f 62  alid (blob, blob
d9560 5f 73 7a 29 29 0a 09 67 6f 74 6f 20 6e 6f 74 5f  _sz))..goto not_
d9570 61 6e 5f 73 71 6c 5f 70 72 6f 63 3b 0a 0a 2f 2a  an_sql_proc;../*
d9580 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65 20   retrieving the 
d9590 4c 69 73 74 20 6f 66 20 56 61 72 69 61 62 6c 65  List of Variable
d95a0 73 20 77 69 74 68 20 56 61 6c 75 65 73 20 2a 2f  s with Values */
d95b0 0a 20 20 20 20 76 61 72 69 61 62 6c 65 73 20 3d  .    variables =
d95c0 20 67 65 74 5f 73 71 6c 5f 70 72 6f 63 5f 76 61   get_sql_proc_va
d95d0 72 69 61 62 6c 65 73 20 28 63 61 63 68 65 2c 20  riables (cache, 
d95e0 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 20  argc, argv);.   
d95f0 20 69 66 20 28 76 61 72 69 61 62 6c 65 73 20 3d   if (variables =
d9600 3d 20 4e 55 4c 4c 29 0a 09 67 6f 74 6f 20 65 72  = NULL)..goto er
d9610 72 5f 76 61 72 69 61 62 6c 65 73 3b 0a 20 20 20  r_variables;.   
d9620 20 69 66 20 28 76 61 72 69 61 62 6c 65 73 2d 3e   if (variables->
d9630 45 72 72 6f 72 29 0a 09 67 6f 74 6f 20 69 6c 6c  Error)..goto ill
d9640 65 67 61 6c 5f 76 61 72 69 61 62 6c 65 73 3b 0a  egal_variables;.
d9650 0a 2f 2a 20 72 65 70 6c 61 63 69 6e 67 20 56 61  ./* replacing Va
d9660 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69  riables */.    i
d9670 66 20 28 21 67 61 69 61 5f 73 71 6c 5f 70 72 6f  f (!gaia_sql_pro
d9680 63 5f 63 6f 6f 6b 65 64 5f 73 71 6c 0a 09 28 73  c_cooked_sql..(s
d9690 71 6c 69 74 65 2c 20 63 61 63 68 65 2c 20 62 6c  qlite, cache, bl
d96a0 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20 76 61 72  ob, blob_sz, var
d96b0 69 61 62 6c 65 73 2c 20 26 73 71 6c 29 29 0a 09  iables, &sql))..
d96c0 67 6f 74 6f 20 63 6f 6f 6b 69 6e 67 5f 65 72 72  goto cooking_err
d96d0 6f 72 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 20  or;.    if (sql 
d96e0 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
d96f0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
d9700 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
d9710 29 3b 0a 09 20 20 67 6f 74 6f 20 64 6f 6e 65 3b  );..  goto done;
d9720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  .      }.    sql
d9730 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
d9740 20 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 2c 20   (context, sql, 
d9750 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 66 72  strlen (sql), fr
d9760 65 65 29 3b 0a 0a 20 20 64 6f 6e 65 3a 0a 20 20  ee);..  done:.  
d9770 20 20 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63 5f    gaia_sql_proc_
d9780 64 65 73 74 72 6f 79 5f 76 61 72 69 61 62 6c 65  destroy_variable
d9790 73 20 28 76 61 72 69 61 62 6c 65 73 29 3b 0a 20  s (variables);. 
d97a0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e     return;..  in
d97b0 76 61 6c 69 64 5f 62 6c 6f 62 5f 61 72 67 75 6d  valid_blob_argum
d97c0 65 6e 74 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22  ent:.    msg = "
d97d0 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69 6f  SqlProc exceptio
d97e0 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 53 51 4c 20  n - illegal SQL 
d97f0 50 72 6f 63 65 64 75 72 65 20 61 72 67 20 5b 6e  Procedure arg [n
d9800 6f 74 20 61 20 42 4c 4f 42 5d 2e 22 3b 0a 20 20  ot a BLOB].";.  
d9810 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d9820 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
d9830 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
d9840 65 74 75 72 6e 3b 0a 0a 20 20 6e 6f 74 5f 61 6e  eturn;..  not_an
d9850 5f 73 71 6c 5f 70 72 6f 63 3a 0a 20 20 20 20 6d  _sql_proc:.    m
d9860 73 67 20 3d 20 22 53 71 6c 50 72 6f 63 20 65 78  sg = "SqlProc ex
d9870 63 65 70 74 69 6f 6e 20 2d 20 69 6e 76 61 6c 69  ception - invali
d9880 64 20 53 51 4c 20 50 72 6f 63 65 64 75 72 65 20  d SQL Procedure 
d9890 42 4c 4f 42 2e 22 3b 0a 20 20 20 20 73 71 6c 69  BLOB.";.    sqli
d98a0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
d98b0 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20   (context, msg, 
d98c0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
d98d0 0a 0a 20 20 65 72 72 5f 76 61 72 69 61 62 6c 65  ..  err_variable
d98e0 73 3a 0a 20 20 20 20 69 66 20 28 76 61 72 69 61  s:.    if (varia
d98f0 62 6c 65 73 20 21 3d 20 4e 55 4c 4c 29 0a 09 67  bles != NULL)..g
d9900 61 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 64 65 73  aia_sql_proc_des
d9910 74 72 6f 79 5f 76 61 72 69 61 62 6c 65 73 20 28  troy_variables (
d9920 76 61 72 69 61 62 6c 65 73 29 3b 0a 20 20 20 20  variables);.    
d9930 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63 20 65  msg = "SqlProc e
d9940 78 63 65 70 74 69 6f 6e 20 2d 20 75 6e 61 62 6c  xception - unabl
d9950 65 20 74 6f 20 67 65 74 20 61 20 4c 69 73 74 20  e to get a List 
d9960 6f 66 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  of Variables wit
d9970 68 20 56 61 6c 75 65 73 2e 22 3b 0a 20 20 20 20  h Values.";.    
d9980 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
d9990 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d  rror (context, m
d99a0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  sg, -1);.    ret
d99b0 75 72 6e 3b 0a 0a 20 20 69 6c 6c 65 67 61 6c 5f  urn;..  illegal_
d99c0 76 61 72 69 61 62 6c 65 73 3a 0a 20 20 20 20 69  variables:.    i
d99d0 66 20 28 76 61 72 69 61 62 6c 65 73 20 21 3d 20  f (variables != 
d99e0 4e 55 4c 4c 29 0a 09 67 61 69 61 5f 73 71 6c 5f  NULL)..gaia_sql_
d99f0 70 72 6f 63 5f 64 65 73 74 72 6f 79 5f 76 61 72  proc_destroy_var
d9a00 69 61 62 6c 65 73 20 28 76 61 72 69 61 62 6c 65  iables (variable
d9a10 73 29 3b 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22  s);.    msg =.."
d9a20 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69 6f  SqlProc exceptio
d9a30 6e 20 2d 20 74 68 65 20 4c 69 73 74 20 6f 66 20  n - the List of 
d9a40 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 56  Variables with V
d9a50 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73 20 69  alues contains i
d9a60 6c 6c 65 67 61 6c 20 69 74 65 6d 73 2e 22 3b 0a  llegal items.";.
d9a70 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d9a80 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78  lt_error (contex
d9a90 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  t, msg, -1);.   
d9aa0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 63 6f 6f 6b   return;..  cook
d9ab0 69 6e 67 5f 65 72 72 6f 72 3a 0a 20 20 20 20 69  ing_error:.    i
d9ac0 66 20 28 76 61 72 69 61 62 6c 65 73 20 21 3d 20  f (variables != 
d9ad0 4e 55 4c 4c 29 0a 09 67 61 69 61 5f 73 71 6c 5f  NULL)..gaia_sql_
d9ae0 70 72 6f 63 5f 64 65 73 74 72 6f 79 5f 76 61 72  proc_destroy_var
d9af0 69 61 62 6c 65 73 20 28 76 61 72 69 61 62 6c 65  iables (variable
d9b00 73 29 3b 0a 20 20 20 20 6d 73 67 20 3d 20 22 53  s);.    msg = "S
d9b10 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e  qlProc exception
d9b20 20 2d 20 75 6e 61 62 6c 65 20 74 6f 20 63 72 65   - unable to cre
d9b30 61 74 65 20 61 20 43 6f 6f 6b 65 64 20 53 51 4c  ate a Cooked SQL
d9b40 20 42 6f 64 79 2e 22 3b 0a 20 20 20 20 73 71 6c   Body.";.    sql
d9b50 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
d9b60 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c  r (context, msg,
d9b70 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
d9b80 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
d9b90 0a 66 6e 63 74 5f 73 70 5f 65 78 65 63 75 74 65  .fnct_sp_execute
d9ba0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
d9bb0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
d9bc0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
d9bd0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
d9be0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
d9bf0 0a 2f 20 53 71 6c 50 72 6f 63 5f 45 78 65 63 75  ./ SqlProc_Execu
d9c00 74 65 28 42 4c 4f 42 20 5b 2c 20 61 72 67 31 20  te(BLOB [, arg1 
d9c10 54 45 58 54 2c 20 61 72 67 32 20 54 45 58 54 2c  TEXT, arg2 TEXT,
d9c20 20 2e 2e 2e 20 61 72 67 4e 20 54 45 58 54 5d 20   ... argN TEXT] 
d9c30 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f  )././ returns:./
d9c40 20 31 20 6f 6e 20 73 75 63 63 65 73 0a 2f 20 72   1 on succes./ r
d9c50 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74 69  aises an excepti
d9c60 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  on on invalid ar
d9c70 67 75 6d 65 6e 74 73 20 6f 72 20 65 72 72 6f 72  guments or error
d9c80 73 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  s.*/.    const u
d9c90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c  nsigned char *bl
d9ca0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62  ob;.    int blob
d9cb0 5f 73 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  _sz = 0;.    cha
d9cc0 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 6f 6e 73  r *sql;.    cons
d9cd0 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20  t char *msg;.   
d9ce0 20 53 71 6c 50 72 6f 63 5f 56 61 72 4c 69 73 74   SqlProc_VarList
d9cf0 50 74 72 20 76 61 72 69 61 62 6c 65 73 20 3d 20  Ptr variables = 
d9d00 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 74 65  NULL;.    sqlite
d9d10 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69  3 *sqlite = sqli
d9d20 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
d9d30 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b  andle (context);
d9d40 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
d9d50 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
d9d60 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
d9d70 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
d9d80 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
d9d90 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
d9da0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
d9db0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
d9dc0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
d9dd0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
d9de0 5f 42 4c 4f 42 29 0a 09 67 6f 74 6f 20 69 6e 76  _BLOB)..goto inv
d9df0 61 6c 69 64 5f 62 6c 6f 62 5f 61 72 67 75 6d 65  alid_blob_argume
d9e00 6e 74 3b 0a 20 20 20 20 62 6c 6f 62 20 3d 20 73  nt;.    blob = s
d9e10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
d9e20 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
d9e30 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69 74   blob_sz = sqlit
d9e40 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
d9e50 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
d9e60 20 28 21 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63   (!gaia_sql_proc
d9e70 5f 69 73 5f 76 61 6c 69 64 20 28 62 6c 6f 62 2c  _is_valid (blob,
d9e80 20 62 6c 6f 62 5f 73 7a 29 29 0a 09 67 6f 74 6f   blob_sz))..goto
d9e90 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f 63   not_an_sql_proc
d9ea0 3b 0a 0a 2f 2a 20 72 65 74 72 69 65 76 69 6e 67  ;../* retrieving
d9eb0 20 74 68 65 20 4c 69 73 74 20 6f 66 20 56 61 72   the List of Var
d9ec0 69 61 62 6c 65 73 20 77 69 74 68 20 56 61 6c 75  iables with Valu
d9ed0 65 73 20 2a 2f 0a 20 20 20 20 76 61 72 69 61 62  es */.    variab
d9ee0 6c 65 73 20 3d 20 67 65 74 5f 73 71 6c 5f 70 72  les = get_sql_pr
d9ef0 6f 63 5f 76 61 72 69 61 62 6c 65 73 20 28 63 61  oc_variables (ca
d9f00 63 68 65 2c 20 61 72 67 63 2c 20 61 72 67 76 29  che, argc, argv)
d9f10 3b 0a 20 20 20 20 69 66 20 28 76 61 72 69 61 62  ;.    if (variab
d9f20 6c 65 73 20 3d 3d 20 4e 55 4c 4c 29 0a 09 67 6f  les == NULL)..go
d9f30 74 6f 20 65 72 72 5f 76 61 72 69 61 62 6c 65 73  to err_variables
d9f40 3b 0a 20 20 20 20 69 66 20 28 76 61 72 69 61 62  ;.    if (variab
d9f50 6c 65 73 2d 3e 45 72 72 6f 72 29 0a 09 67 6f 74  les->Error)..got
d9f60 6f 20 69 6c 6c 65 67 61 6c 5f 76 61 72 69 61 62  o illegal_variab
d9f70 6c 65 73 3b 0a 0a 2f 2a 20 72 65 70 6c 61 63 69  les;../* replaci
d9f80 6e 67 20 56 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ng Variables */.
d9f90 20 20 20 20 69 66 20 28 21 67 61 69 61 5f 73 71      if (!gaia_sq
d9fa0 6c 5f 70 72 6f 63 5f 63 6f 6f 6b 65 64 5f 73 71  l_proc_cooked_sq
d9fb0 6c 0a 09 28 73 71 6c 69 74 65 2c 20 63 61 63 68  l..(sqlite, cach
d9fc0 65 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a  e, blob, blob_sz
d9fd0 2c 20 76 61 72 69 61 62 6c 65 73 2c 20 26 73 71  , variables, &sq
d9fe0 6c 29 29 0a 09 67 6f 74 6f 20 63 6f 6f 6b 69 6e  l))..goto cookin
d9ff0 67 5f 65 72 72 6f 72 3b 0a 0a 2f 2a 20 65 78 65  g_error;../* exe
da000 63 75 74 69 6e 67 20 74 68 65 20 53 51 4c 20 50  cuting the SQL P
da010 72 6f 63 65 64 75 72 65 20 2a 2f 0a 20 20 20 20  rocedure */.    
da020 69 66 20 28 21 67 61 69 61 5f 73 71 6c 5f 70 72  if (!gaia_sql_pr
da030 6f 63 5f 65 78 65 63 75 74 65 20 28 73 71 6c 69  oc_execute (sqli
da040 74 65 2c 20 63 61 63 68 65 2c 20 73 71 6c 29 29  te, cache, sql))
da050 0a 09 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72  ..goto sql_error
da060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
da070 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
da080 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 73  t, 1);.    if (s
da090 71 6c 20 21 3d 20 4e 55 4c 4c 29 0a 09 66 72 65  ql != NULL)..fre
da0a0 65 20 28 73 71 6c 29 3b 0a 20 20 20 20 67 61 69  e (sql);.    gai
da0b0 61 5f 73 71 6c 5f 70 72 6f 63 5f 64 65 73 74 72  a_sql_proc_destr
da0c0 6f 79 5f 76 61 72 69 61 62 6c 65 73 20 28 76 61  oy_variables (va
da0d0 72 69 61 62 6c 65 73 29 3b 0a 20 20 20 20 72 65  riables);.    re
da0e0 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64  turn;..  invalid
da0f0 5f 62 6c 6f 62 5f 61 72 67 75 6d 65 6e 74 3a 0a  _blob_argument:.
da100 20 20 20 20 6d 73 67 20 3d 20 22 53 71 6c 50 72      msg = "SqlPr
da110 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69  oc exception - i
da120 6c 6c 65 67 61 6c 20 53 51 4c 20 50 72 6f 63 65  llegal SQL Proce
da130 64 75 72 65 20 61 72 67 20 5b 6e 6f 74 20 61 20  dure arg [not a 
da140 42 4c 4f 42 5d 2e 22 3b 0a 20 20 20 20 73 71 6c  BLOB].";.    sql
da150 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
da160 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c  r (context, msg,
da170 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
da180 3b 0a 0a 20 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f  ;..  not_an_sql_
da190 70 72 6f 63 3a 0a 20 20 20 20 6d 73 67 20 3d 20  proc:.    msg = 
da1a0 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69  "SqlProc excepti
da1b0 6f 6e 20 2d 20 69 6e 76 61 6c 69 64 20 53 51 4c  on - invalid SQL
da1c0 20 50 72 6f 63 65 64 75 72 65 20 42 4c 4f 42 2e   Procedure BLOB.
da1d0 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ";.    sqlite3_r
da1e0 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e  esult_error (con
da1f0 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  text, msg, -1);.
da200 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 65      return;..  e
da210 72 72 5f 76 61 72 69 61 62 6c 65 73 3a 0a 20 20  rr_variables:.  
da220 20 20 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63    msg = "SqlProc
da230 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 75 6e 61   exception - una
da240 62 6c 65 20 74 6f 20 67 65 74 20 61 20 4c 69 73  ble to get a Lis
da250 74 20 6f 66 20 56 61 72 69 61 62 6c 65 73 20 77  t of Variables w
da260 69 74 68 20 56 61 6c 75 65 73 2e 22 3b 0a 20 20  ith Values.";.  
da270 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
da280 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
da290 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
da2a0 65 74 75 72 6e 3b 0a 0a 20 20 69 6c 6c 65 67 61  eturn;..  illega
da2b0 6c 5f 76 61 72 69 61 62 6c 65 73 3a 0a 20 20 20  l_variables:.   
da2c0 20 69 66 20 28 76 61 72 69 61 62 6c 65 73 20 21   if (variables !
da2d0 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 5f 73 71  = NULL)..gaia_sq
da2e0 6c 5f 70 72 6f 63 5f 64 65 73 74 72 6f 79 5f 76  l_proc_destroy_v
da2f0 61 72 69 61 62 6c 65 73 20 28 76 61 72 69 61 62  ariables (variab
da300 6c 65 73 29 3b 0a 20 20 20 20 6d 73 67 20 3d 0a  les);.    msg =.
da310 09 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74  ."SqlProc except
da320 69 6f 6e 20 2d 20 74 68 65 20 4c 69 73 74 20 6f  ion - the List o
da330 66 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  f Variables with
da340 20 56 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73   Values contains
da350 20 69 6c 6c 65 67 61 6c 20 69 74 65 6d 73 2e 22   illegal items."
da360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
da370 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
da380 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
da390 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 63 6f     return;..  co
da3a0 6f 6b 69 6e 67 5f 65 72 72 6f 72 3a 0a 20 20 20  oking_error:.   
da3b0 20 69 66 20 28 76 61 72 69 61 62 6c 65 73 20 21   if (variables !
da3c0 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 5f 73 71  = NULL)..gaia_sq
da3d0 6c 5f 70 72 6f 63 5f 64 65 73 74 72 6f 79 5f 76  l_proc_destroy_v
da3e0 61 72 69 61 62 6c 65 73 20 28 76 61 72 69 61 62  ariables (variab
da3f0 6c 65 73 29 3b 0a 20 20 20 20 6d 73 67 20 3d 20  les);.    msg = 
da400 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74 69  "SqlProc excepti
da410 6f 6e 20 2d 20 75 6e 61 62 6c 65 20 74 6f 20 63  on - unable to c
da420 72 65 61 74 65 20 61 20 43 6f 6f 6b 65 64 20 53  reate a Cooked S
da430 51 4c 20 42 6f 64 79 2e 22 3b 0a 20 20 20 20 73  QL Body.";.    s
da440 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
da450 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
da460 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  g, -1);.    retu
da470 72 6e 3b 0a 0a 20 20 73 71 6c 5f 65 72 72 6f 72  rn;..  sql_error
da480 3a 0a 20 20 20 20 69 66 20 28 76 61 72 69 61 62  :.    if (variab
da490 6c 65 73 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61  les != NULL)..ga
da4a0 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 64 65 73 74  ia_sql_proc_dest
da4b0 72 6f 79 5f 76 61 72 69 61 62 6c 65 73 20 28 76  roy_variables (v
da4c0 61 72 69 61 62 6c 65 73 29 3b 0a 20 20 20 20 69  ariables);.    i
da4d0 66 20 28 73 71 6c 20 21 3d 20 4e 55 4c 4c 29 0a  f (sql != NULL).
da4e0 09 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20  .free (sql);.   
da4f0 20 6d 73 67 20 3d 20 22 53 71 6c 50 72 6f 63 20   msg = "SqlProc 
da500 65 78 63 65 70 74 69 6f 6e 20 2d 20 61 20 66 61  exception - a fa
da510 74 61 6c 20 53 51 4c 20 65 72 72 6f 72 20 77 61  tal SQL error wa
da520 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 22 3b  s encountered.";
da530 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
da540 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65  ult_error (conte
da550 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20  xt, msg, -1);.  
da560 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61    return;.}..sta
da570 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70  tic void.fnct_sp
da580 5f 65 78 69 74 20 28 73 71 6c 69 74 65 33 5f 63  _exit (sqlite3_c
da590 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
da5a0 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
da5b0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
da5c0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
da5d0 74 69 6f 6e 3a 0a 2f 20 53 71 6c 50 72 6f 63 5f  tion:./ SqlProc_
da5e0 45 78 69 74 28 20 76 6f 69 64 20 29 0a 2f 20 53  Exit( void )./ S
da5f0 74 6f 72 65 64 50 72 6f 63 5f 45 78 69 74 28 20  toredProc_Exit( 
da600 76 6f 69 64 20 29 0a 2f 0a 2f 20 72 65 74 75 72  void )././ retur
da610 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75 63 63 65  ns:./ 1 on succe
da620 73 0a 2f 20 72 61 69 73 65 73 20 61 6e 20 65 78  s./ raises an ex
da630 63 65 70 74 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c  ception on inval
da640 69 64 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  id arguments or 
da650 65 72 72 6f 72 73 0a 2a 2f 0a 20 20 20 20 63 6f  errors.*/.    co
da660 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20  nst char *msg;. 
da670 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
da680 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
da690 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
da6a0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
da6b0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
da6c0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
da6d0 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
da6e0 20 20 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d      if (cache ==
da6f0 20 4e 55 4c 4c 29 0a 09 67 6f 74 6f 20 6e 6f 5f   NULL)..goto no_
da700 63 61 63 68 65 3b 0a 0a 2f 2a 20 72 65 67 69 73  cache;../* regis
da710 74 72 65 72 69 6e 67 20 61 6e 20 45 58 49 54 20  trering an EXIT 
da720 72 65 71 75 65 73 74 20 2a 2f 0a 20 20 20 20 63  request */.    c
da730 61 63 68 65 2d 3e 53 71 6c 50 72 6f 63 43 6f 6e  ache->SqlProcCon
da740 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 20 20 73  tinue = 0;.    s
da750 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
da760 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
da770 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 6e      return;..  n
da780 6f 5f 63 61 63 68 65 3a 0a 20 20 20 20 6d 73 67  o_cache:.    msg
da790 20 3d 20 22 53 71 6c 50 72 6f 63 5f 45 78 69 74   = "SqlProc_Exit
da7a0 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 75 6e 61   exception - una
da7b0 62 6c 65 20 74 6f 20 66 69 6e 64 20 61 20 43 6f  ble to find a Co
da7c0 6e 6e 65 63 74 69 6f 6e 20 43 61 63 68 65 2e 22  nnection Cache."
da7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
da7e0 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
da7f0 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
da800 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74     return;.}..st
da810 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73  atic void.fnct_s
da820 70 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 73 20  p_create_tables 
da830 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
da840 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
da850 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73  argc,...       s
da860 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
da870 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
da880 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 74 6f 72 65  unction:./ Store
da890 64 50 72 6f 63 5f 43 72 65 61 74 65 54 61 62 6c  dProc_CreateTabl
da8a0 65 73 28 29 0a 2f 0a 2f 20 77 69 6c 6c 20 61 74  es()././ will at
da8b0 74 65 6d 70 74 20 74 6f 20 63 72 65 61 74 65 20  tempt to create 
da8c0 74 68 65 20 53 74 6f 72 65 64 20 50 72 6f 63 65  the Stored Proce
da8d0 64 75 72 65 73 20 74 61 62 6c 65 73 20 69 66 20  dures tables if 
da8e0 6e 6f 74 0a 2f 20 61 6c 72 65 61 64 79 20 65 78  not./ already ex
da8f0 69 73 74 69 6e 67 0a 2f 0a 2f 20 72 65 74 75 72  isting././ retur
da900 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75 63 63 65  ns:./ 1 on succe
da910 73 73 2c 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  ss, 0 on failure
da920 20 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74   .*/.    int ret
da930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
da940 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
da950 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
da960 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
da970 20 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 73 71   void *data = sq
da980 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
da990 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
da9a0 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
da9b0 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
da9c0 45 20 2a 2f 0a 20 20 20 20 72 65 74 20 3d 20 67  E */.    ret = g
da9d0 61 69 61 5f 73 74 6f 72 65 64 5f 70 72 6f 63 5f  aia_stored_proc_
da9e0 63 72 65 61 74 65 5f 74 61 62 6c 65 73 20 28 73  create_tables (s
da9f0 71 6c 69 74 65 2c 20 64 61 74 61 29 3b 0a 20 20  qlite, data);.  
daa00 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
daa10 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
daa20 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
daa30 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 72 65 67 69  oid.fnct_sp_regi
daa40 73 74 65 72 20 28 73 71 6c 69 74 65 33 5f 63 6f  ster (sqlite3_co
daa50 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
daa60 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
daa70 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
daa80 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
daa90 69 6f 6e 3a 0a 2f 20 53 74 6f 72 65 64 50 72 6f  ion:./ StoredPro
daaa0 63 5f 52 65 67 69 73 74 65 72 28 6e 61 6d 65 20  c_Register(name 
daab0 54 45 58 54 2c 20 74 69 74 6c 65 20 54 45 58 54  TEXT, title TEXT
daac0 2c 20 73 71 6c 5f 62 6f 64 79 20 42 4c 4f 42 29  , sql_body BLOB)
daad0 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20  ././ returns:./ 
daae0 31 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 30 20  1 on success, 0 
daaf0 6f 6e 20 66 61 69 6c 75 72 65 20 0a 2f 20 72 61  on failure ./ ra
dab00 69 73 65 73 20 61 6e 20 65 78 63 65 70 74 69 6f  ises an exceptio
dab10 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67  n on invalid arg
dab20 75 6d 65 6e 74 73 20 0a 2a 2f 0a 20 20 20 20 63  uments .*/.    c
dab30 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b  onst char *name;
dab40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dab50 2a 74 69 74 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  *title;.    cons
dab60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
dab70 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62  *blob;.    int b
dab80 6c 6f 62 5f 73 7a 20 3d 20 30 3b 0a 20 20 20 20  lob_sz = 0;.    
dab90 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b  const char *msg;
daba0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
dabb0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
dabc0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
dabd0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
dabe0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
dabf0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
dac00 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
dac10 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
dac20 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
dac30 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
dac40 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
dac50 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
dac60 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
dac70 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
dac80 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f  )..goto invalid_
dac90 61 72 67 75 6d 65 6e 74 5f 31 3b 0a 20 20 20 20  argument_1;.    
daca0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
dacb0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
dacc0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
dacd0 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61  ..goto invalid_a
dace0 72 67 75 6d 65 6e 74 5f 32 3b 0a 20 20 20 20 69  rgument_2;.    i
dacf0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
dad00 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
dad10 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
dad20 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72  .goto invalid_ar
dad30 67 75 6d 65 6e 74 5f 33 3b 0a 20 20 20 20 6e 61  gument_3;.    na
dad40 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
dad50 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
dad60 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
dad70 3b 0a 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63  ;.    title = (c
dad80 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
dad90 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
dada0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 62  (argv[1]);.    b
dadb0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
dadc0 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 32  lue_blob (argv[2
dadd0 5d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 73 7a 20  ]);.    blob_sz 
dade0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
dadf0 62 79 74 65 73 20 28 61 72 67 76 5b 32 5d 29 3b  bytes (argv[2]);
dae00 0a 20 20 20 20 69 66 20 28 21 67 61 69 61 5f 73  .    if (!gaia_s
dae10 71 6c 5f 70 72 6f 63 5f 69 73 5f 76 61 6c 69 64  ql_proc_is_valid
dae20 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29   (blob, blob_sz)
dae30 29 0a 09 67 6f 74 6f 20 6e 6f 74 5f 61 6e 5f 73  )..goto not_an_s
dae40 71 6c 5f 70 72 6f 63 3b 0a 20 20 20 20 69 66 20  ql_proc;.    if 
dae50 28 67 61 69 61 5f 73 74 6f 72 65 64 5f 70 72 6f  (gaia_stored_pro
dae60 63 5f 73 74 6f 72 65 20 28 73 71 6c 69 74 65 2c  c_store (sqlite,
dae70 20 63 61 63 68 65 2c 20 6e 61 6d 65 2c 20 74 69   cache, name, ti
dae80 74 6c 65 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f  tle, blob, blob_
dae90 73 7a 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  sz))..sqlite3_re
daea0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
daeb0 74 2c 20 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a  t, 1);.    else.
daec0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
daed0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29  int (context, 0)
daee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20  ;.    return;.. 
daef0 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e   invalid_argumen
daf00 74 5f 31 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09  t_1:.    msg =..
daf10 22 53 74 6f 72 65 64 50 72 6f 63 20 65 78 63 65  "StoredProc exce
daf20 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20  ption - illegal 
daf30 53 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72 65  Stored Procedure
daf40 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45 58   Name [not a TEX
daf50 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20 20  T string].";.   
daf60 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
daf70 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20  error (context, 
daf80 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  msg, -1);.    re
daf90 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64  turn;..  invalid
dafa0 5f 61 72 67 75 6d 65 6e 74 5f 32 3a 0a 20 20 20  _argument_2:.   
dafb0 20 6d 73 67 20 3d 0a 09 22 53 74 6f 72 65 64 50   msg =.."StoredP
dafc0 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20  roc exception - 
dafd0 69 6c 6c 65 67 61 6c 20 53 74 6f 72 65 64 20 50  illegal Stored P
dafe0 72 6f 63 65 64 75 72 65 20 54 69 74 6c 65 20 5b  rocedure Title [
daff0 6e 6f 74 20 61 20 54 45 58 54 20 73 74 72 69 6e  not a TEXT strin
db000 67 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  g].";.    sqlite
db010 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28  3_result_error (
db020 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31  context, msg, -1
db030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  );.    return;..
db040 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65    invalid_argume
db050 6e 74 5f 33 3a 0a 20 20 20 20 6d 73 67 20 3d 20  nt_3:.    msg = 
db060 22 53 74 6f 72 65 64 50 72 6f 63 20 65 78 63 65  "StoredProc exce
db070 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20  ption - illegal 
db080 53 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72 65  Stored Procedure
db090 20 42 6f 64 79 20 5b 6e 6f 74 20 61 20 42 4c 4f   Body [not a BLO
db0a0 42 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  B].";.    sqlite
db0b0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28  3_result_error (
db0c0 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31  context, msg, -1
db0d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  );.    return;..
db0e0 20 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f    not_an_sql_pro
db0f0 63 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22 53 74  c:.    msg = "St
db100 6f 72 65 64 50 72 6f 63 20 65 78 63 65 70 74 69  oredProc excepti
db110 6f 6e 20 2d 20 69 6e 76 61 6c 69 64 20 53 51 4c  on - invalid SQL
db120 20 50 72 6f 63 65 64 75 72 65 20 42 4c 4f 42 2e   Procedure BLOB.
db130 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ";.    sqlite3_r
db140 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e  esult_error (con
db150 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  text, msg, -1);.
db160 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73      return;.}..s
db170 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
db180 73 70 5f 67 65 74 20 28 73 71 6c 69 74 65 33 5f  sp_get (sqlite3_
db190 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
db1a0 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
db1b0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
db1c0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
db1d0 63 74 69 6f 6e 3a 0a 2f 20 53 74 6f 72 65 64 50  ction:./ StoredP
db1e0 72 6f 63 5f 47 65 74 28 6e 61 6d 65 20 54 45 58  roc_Get(name TEX
db1f0 54 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a  T)././ returns:.
db200 2f 20 61 20 53 51 4c 20 50 72 6f 63 65 64 75 72  / a SQL Procedur
db210 65 20 42 4c 4f 42 20 4f 62 6a 65 63 74 0a 2f 20  e BLOB Object./ 
db220 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74  raises an except
db230 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ion on invalid a
db240 72 67 75 6d 65 6e 74 73 20 0a 2a 2f 0a 20 20 20  rguments .*/.   
db250 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
db260 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
db270 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20  char *blob;.    
db280 69 6e 74 20 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b  int blob_sz = 0;
db290 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
db2a0 2a 6d 73 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  *msg;.    sqlite
db2b0 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69  3 *sqlite = sqli
db2c0 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
db2d0 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b  andle (context);
db2e0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
db2f0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
db300 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
db310 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
db320 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
db330 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
db340 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
db350 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
db360 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
db370 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
db380 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69 6e 76  _TEXT)..goto inv
db390 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 3b 0a 20  alid_argument;. 
db3a0 20 20 20 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74     name = (const
db3b0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
db3c0 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
db3d0 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 67  v[0]);.    if (g
db3e0 61 69 61 5f 73 74 6f 72 65 64 5f 70 72 6f 63 5f  aia_stored_proc_
db3f0 66 65 74 63 68 20 28 73 71 6c 69 74 65 2c 20 63  fetch (sqlite, c
db400 61 63 68 65 2c 20 6e 61 6d 65 2c 20 26 62 6c 6f  ache, name, &blo
db410 62 2c 20 26 62 6c 6f 62 5f 73 7a 29 29 0a 09 73  b, &blob_sz))..s
db420 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
db430 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f  ob (context, blo
db440 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65  b, blob_sz, free
db450 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
db460 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
db470 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
db480 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c  return;..  inval
db490 69 64 5f 61 72 67 75 6d 65 6e 74 3a 0a 20 20 20  id_argument:.   
db4a0 20 6d 73 67 20 3d 0a 09 22 53 74 6f 72 65 64 50   msg =.."StoredP
db4b0 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20  roc exception - 
db4c0 69 6c 6c 65 67 61 6c 20 53 74 6f 72 65 64 20 50  illegal Stored P
db4d0 72 6f 63 65 64 75 72 65 20 4e 61 6d 65 20 5b 6e  rocedure Name [n
db4e0 6f 74 20 61 20 54 45 58 54 20 73 74 72 69 6e 67  ot a TEXT string
db4f0 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ].";.    sqlite3
db500 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63  _result_error (c
db510 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29  ontext, msg, -1)
db520 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  ;.    return;.}.
db530 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
db540 74 5f 73 70 5f 64 65 6c 65 74 65 20 28 73 71 6c  t_sp_delete (sql
db550 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
db560 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
db570 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
db580 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
db590 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 74  L function:./ St
db5a0 6f 72 65 64 50 72 6f 63 5f 44 65 6c 65 74 65 28  oredProc_Delete(
db5b0 6e 61 6d 65 20 54 45 58 54 29 0a 2f 0a 2f 20 72  name TEXT)././ r
db5c0 65 74 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73  eturns:./ 1 on s
db5d0 75 63 63 65 73 73 2c 20 30 20 6f 6e 20 66 61 69  uccess, 0 on fai
db5e0 6c 75 72 65 20 0a 2f 20 72 61 69 73 65 73 20 61  lure ./ raises a
db5f0 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 69  n exception on i
db600 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
db610 20 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63   .*/.    const c
db620 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63  har *name;.    c
db630 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a  onst char *msg;.
db640 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
db650 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
db660 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
db670 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73  (context);.    s
db680 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
db690 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
db6a0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
db6b0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
db6c0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
db6d0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
db6e0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
db6f0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
db700 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
db710 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
db720 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61  ..goto invalid_a
db730 72 67 75 6d 65 6e 74 3b 0a 20 20 20 20 6e 61 6d  rgument;.    nam
db740 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
db750 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
db760 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
db770 0a 20 20 20 20 69 66 20 28 67 61 69 61 5f 73 74  .    if (gaia_st
db780 6f 72 65 64 5f 70 72 6f 63 5f 64 65 6c 65 74 65  ored_proc_delete
db790 20 28 73 71 6c 69 74 65 2c 20 63 61 63 68 65 2c   (sqlite, cache,
db7a0 20 6e 61 6d 65 29 29 0a 09 73 71 6c 69 74 65 33   name))..sqlite3
db7b0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
db7c0 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 65 6c  text, 1);.    el
db7d0 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  se..sqlite3_resu
db7e0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
db7f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
db800 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75  ..  invalid_argu
db810 6d 65 6e 74 3a 0a 20 20 20 20 6d 73 67 20 3d 0a  ment:.    msg =.
db820 09 22 53 74 6f 72 65 64 50 72 6f 63 20 65 78 63  ."StoredProc exc
db830 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c  eption - illegal
db840 20 53 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72   Stored Procedur
db850 65 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45  e Name [not a TE
db860 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20  XT string].";.  
db870 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
db880 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
db890 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
db8a0 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
db8b0 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 75 70   void.fnct_sp_up
db8c0 64 61 74 65 5f 74 69 74 6c 65 20 28 73 71 6c 69  date_title (sqli
db8d0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
db8e0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
db8f0 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
db900 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
db910 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
db920 6e 3a 0a 2f 20 53 74 6f 72 65 64 50 72 6f 63 5f  n:./ StoredProc_
db930 55 70 64 61 74 65 54 69 74 6c 65 28 6e 61 6d 65  UpdateTitle(name
db940 20 54 45 58 54 2c 20 74 69 74 6c 65 20 54 45 58   TEXT, title TEX
db950 54 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a  T)././ returns:.
db960 2f 20 31 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  / 1 on success, 
db970 30 20 6f 6e 20 66 61 69 6c 75 72 65 20 0a 2f 20  0 on failure ./ 
db980 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74  raises an except
db990 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ion on invalid a
db9a0 72 67 75 6d 65 6e 74 73 20 0a 2a 2f 0a 20 20 20  rguments .*/.   
db9b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
db9c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
db9d0 72 20 2a 74 69 74 6c 65 3b 0a 20 20 20 20 63 6f  r *title;.    co
db9e0 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20  nst char *msg;. 
db9f0 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
dba00 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
dba10 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
dba20 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74  context);.    st
dba30 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
dba40 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
dba50 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
dba60 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
dba70 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
dba80 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
dba90 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
dbaa0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
dbab0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
dbac0 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
dbad0 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72  .goto invalid_ar
dbae0 67 75 6d 65 6e 74 5f 31 3b 0a 20 20 20 20 69 66  gument_1;.    if
dbaf0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
dbb00 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
dbb10 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
dbb20 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67  goto invalid_arg
dbb30 75 6d 65 6e 74 5f 32 3b 0a 20 20 20 20 6e 61 6d  ument_2;.    nam
dbb40 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
dbb50 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
dbb60 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
dbb70 0a 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63 6f  .    title = (co
dbb80 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
dbb90 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
dbba0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
dbbb0 20 28 67 61 69 61 5f 73 74 6f 72 65 64 5f 70 72   (gaia_stored_pr
dbbc0 6f 63 5f 75 70 64 61 74 65 5f 74 69 74 6c 65 20  oc_update_title 
dbbd0 28 73 71 6c 69 74 65 2c 20 63 61 63 68 65 2c 20  (sqlite, cache, 
dbbe0 6e 61 6d 65 2c 20 74 69 74 6c 65 29 29 0a 09 73  name, title))..s
dbbf0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
dbc00 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  t (context, 1);.
dbc10 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65      else..sqlite
dbc20 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
dbc30 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72  ntext, 0);.    r
dbc40 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69  eturn;..  invali
dbc50 64 5f 61 72 67 75 6d 65 6e 74 5f 31 3a 0a 20 20  d_argument_1:.  
dbc60 20 20 6d 73 67 20 3d 0a 09 22 53 74 6f 72 65 64    msg =.."Stored
dbc70 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d  Proc exception -
dbc80 20 69 6c 6c 65 67 61 6c 20 53 74 6f 72 65 64 20   illegal Stored 
dbc90 50 72 6f 63 65 64 75 72 65 20 4e 61 6d 65 20 5b  Procedure Name [
dbca0 6e 6f 74 20 61 20 54 45 58 54 20 73 74 72 69 6e  not a TEXT strin
dbcb0 67 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  g].";.    sqlite
dbcc0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28  3_result_error (
dbcd0 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31  context, msg, -1
dbce0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  );.    return;..
dbcf0 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65    invalid_argume
dbd00 6e 74 5f 32 3a 0a 20 20 20 20 6d 73 67 20 3d 0a  nt_2:.    msg =.
dbd10 09 22 53 74 6f 72 65 64 50 72 6f 63 20 65 78 63  ."StoredProc exc
dbd20 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c  eption - illegal
dbd30 20 53 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72   Stored Procedur
dbd40 65 20 54 69 74 6c 65 20 5b 6e 6f 74 20 61 20 54  e Title [not a T
dbd50 45 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20  EXT string].";. 
dbd60 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
dbd70 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74  t_error (context
dbd80 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20  , msg, -1);.    
dbd90 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
dbda0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 75  c void.fnct_sp_u
dbdb0 70 64 61 74 65 5f 73 71 6c 20 28 73 71 6c 69 74  pdate_sql (sqlit
dbdc0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
dbdd0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
dbde0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
dbdf0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
dbe00 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 74 6f 72  function:./ Stor
dbe10 65 64 50 72 6f 63 5f 55 70 64 61 74 65 53 71 6c  edProc_UpdateSql
dbe20 42 6f 64 79 28 6e 61 6d 65 20 54 45 58 54 2c 20  Body(name TEXT, 
dbe30 73 71 6c 20 42 4c 4f 42 29 0a 2f 0a 2f 20 72 65  sql BLOB)././ re
dbe40 74 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75  turns:./ 1 on su
dbe50 63 63 65 73 73 2c 20 30 20 6f 6e 20 66 61 69 6c  ccess, 0 on fail
dbe60 75 72 65 20 0a 2f 20 72 61 69 73 65 73 20 61 6e  ure ./ raises an
dbe70 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 69 6e   exception on in
dbe80 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20  valid arguments 
dbe90 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  .*/.    const ch
dbea0 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  ar *name;.    co
dbeb0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
dbec0 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  r *blob;.    int
dbed0 20 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b 0a 20 20   blob_sz = 0;.  
dbee0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73    const char *ms
dbef0 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  g;.    sqlite3 *
dbf00 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
dbf10 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
dbf20 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
dbf30 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f    struct splite_
dbf40 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a  internal_cache *
dbf50 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  cache = sqlite3_
dbf60 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65  user_data (conte
dbf70 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
dbf80 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
dbf90 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
dbfa0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
dbfb0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
dbfc0 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  0]) != SQLITE_TE
dbfd0 58 54 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69  XT)..goto invali
dbfe0 64 5f 61 72 67 75 6d 65 6e 74 5f 31 3b 0a 20 20  d_argument_1;.  
dbff0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
dc000 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
dc010 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
dc020 42 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64  B)..goto invalid
dc030 5f 61 72 67 75 6d 65 6e 74 5f 32 3b 0a 20 20 20  _argument_2;.   
dc040 20 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63   name = (const c
dc050 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
dc060 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
dc070 30 5d 29 3b 0a 20 20 20 20 62 6c 6f 62 20 3d 20  0]);.    blob = 
dc080 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
dc090 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ob (argv[1]);.  
dc0a0 20 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69    blob_sz = sqli
dc0b0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
dc0c0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
dc0d0 66 20 28 21 67 61 69 61 5f 73 71 6c 5f 70 72 6f  f (!gaia_sql_pro
dc0e0 63 5f 69 73 5f 76 61 6c 69 64 20 28 62 6c 6f 62  c_is_valid (blob
dc0f0 2c 20 62 6c 6f 62 5f 73 7a 29 29 0a 09 67 6f 74  , blob_sz))..got
dc100 6f 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f  o not_an_sql_pro
dc110 63 3b 0a 20 20 20 20 69 66 20 28 67 61 69 61 5f  c;.    if (gaia_
dc120 73 74 6f 72 65 64 5f 70 72 6f 63 5f 75 70 64 61  stored_proc_upda
dc130 74 65 5f 73 71 6c 20 28 73 71 6c 69 74 65 2c 20  te_sql (sqlite, 
dc140 63 61 63 68 65 2c 20 6e 61 6d 65 2c 20 62 6c 6f  cache, name, blo
dc150 62 2c 20 62 6c 6f 62 5f 73 7a 29 29 0a 09 73 71  b, blob_sz))..sq
dc160 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
dc170 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20   (context, 1);. 
dc180 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
dc190 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
dc1a0 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  text, 0);.    re
dc1b0 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64  turn;..  invalid
dc1c0 5f 61 72 67 75 6d 65 6e 74 5f 31 3a 0a 20 20 20  _argument_1:.   
dc1d0 20 6d 73 67 20 3d 0a 09 22 53 74 6f 72 65 64 50   msg =.."StoredP
dc1e0 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20  roc exception - 
dc1f0 69 6c 6c 65 67 61 6c 20 53 74 6f 72 65 64 20 50  illegal Stored P
dc200 72 6f 63 65 64 75 72 65 20 4e 61 6d 65 20 5b 6e  rocedure Name [n
dc210 6f 74 20 61 20 54 45 58 54 20 73 74 72 69 6e 67  ot a TEXT string
dc220 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ].";.    sqlite3
dc230 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63  _result_error (c
dc240 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29  ontext, msg, -1)
dc250 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20  ;.    return;.. 
dc260 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e   invalid_argumen
dc270 74 5f 32 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22  t_2:.    msg = "
dc280 53 74 6f 72 65 64 50 72 6f 63 20 65 78 63 65 70  StoredProc excep
dc290 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 53  tion - illegal S
dc2a0 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72 65 20  tored Procedure 
dc2b0 42 6f 64 79 20 5b 6e 6f 74 20 61 20 42 4c 4f 42  Body [not a BLOB
dc2c0 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ].";.    sqlite3
dc2d0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63  _result_error (c
dc2e0 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29  ontext, msg, -1)
dc2f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20  ;.    return;.. 
dc300 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70 72 6f 63   not_an_sql_proc
dc310 3a 0a 20 20 20 20 6d 73 67 20 3d 20 22 53 74 6f  :.    msg = "Sto
dc320 72 65 64 50 72 6f 63 20 65 78 63 65 70 74 69 6f  redProc exceptio
dc330 6e 20 2d 20 69 6e 76 61 6c 69 64 20 53 51 4c 20  n - invalid SQL 
dc340 50 72 6f 63 65 64 75 72 65 20 42 4c 4f 42 2e 22  Procedure BLOB."
dc350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
dc360 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
dc370 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
dc380 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74     return;.}..st
dc390 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73  atic void.fnct_s
dc3a0 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65  p_stored_execute
dc3b0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
dc3c0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
dc3d0 20 61 72 67 63 2c 0a 09 09 09 73 71 6c 69 74 65   argc,....sqlite
dc3e0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
dc3f0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
dc400 6f 6e 3a 0a 2f 20 53 74 6f 72 65 64 50 72 6f 63  on:./ StoredProc
dc410 5f 45 78 65 63 75 74 65 28 54 45 58 54 20 5b 2c  _Execute(TEXT [,
dc420 20 61 72 67 31 20 54 45 58 54 2c 20 61 72 67 32   arg1 TEXT, arg2
dc430 20 54 45 58 54 2c 20 2e 2e 2e 20 61 72 67 4e 20   TEXT, ... argN 
dc440 54 45 58 54 5d 20 29 0a 2f 0a 2f 20 72 65 74 75  TEXT] )././ retu
dc450 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75 63 63  rns:./ 1 on succ
dc460 65 73 0a 2f 20 72 61 69 73 65 73 20 61 6e 20 65  es./ raises an e
dc470 78 63 65 70 74 69 6f 6e 20 6f 6e 20 69 6e 76 61  xception on inva
dc480 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 6f 72  lid arguments or
dc490 20 65 72 72 6f 72 73 0a 2a 2f 0a 20 20 20 20 63   errors.*/.    c
dc4a0 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b  onst char *name;
dc4b0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
dc4c0 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e  ar *blob;.    in
dc4d0 74 20 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b 0a 20  t blob_sz = 0;. 
dc4e0 20 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20     char *sql;.  
dc4f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73    const char *ms
dc500 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 65 73  g;.    char *mes
dc510 73 61 67 65 3b 0a 20 20 20 20 53 71 6c 50 72 6f  sage;.    SqlPro
dc520 63 5f 56 61 72 4c 69 73 74 50 74 72 20 76 61 72  c_VarListPtr var
dc530 69 61 62 6c 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  iables = NULL;. 
dc540 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
dc550 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
dc560 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
dc570 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74  context);.    st
dc580 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
dc590 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
dc5a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
dc5b0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
dc5c0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
dc5d0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
dc5e0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
dc5f0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
dc600 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
dc610 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
dc620 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 6e 61  .goto invalid_na
dc630 6d 65 5f 61 72 67 75 6d 65 6e 74 3b 0a 20 20 20  me_argument;.   
dc640 20 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63   name = (const c
dc650 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
dc660 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
dc670 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 21 67 61  0]);.    if (!ga
dc680 69 61 5f 73 74 6f 72 65 64 5f 70 72 6f 63 5f 66  ia_stored_proc_f
dc690 65 74 63 68 20 28 73 71 6c 69 74 65 2c 20 63 61  etch (sqlite, ca
dc6a0 63 68 65 2c 20 6e 61 6d 65 2c 20 26 62 6c 6f 62  che, name, &blob
dc6b0 2c 20 26 62 6c 6f 62 5f 73 7a 29 29 0a 09 67 6f  , &blob_sz))..go
dc6c0 74 6f 20 69 6e 76 61 6c 69 64 5f 73 74 6f 72 65  to invalid_store
dc6d0 64 5f 70 72 6f 63 65 64 75 72 65 3b 0a 20 20 20  d_procedure;.   
dc6e0 20 69 66 20 28 21 67 61 69 61 5f 73 71 6c 5f 70   if (!gaia_sql_p
dc6f0 72 6f 63 5f 69 73 5f 76 61 6c 69 64 20 28 62 6c  roc_is_valid (bl
dc700 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29 29 0a 09 67  ob, blob_sz))..g
dc710 6f 74 6f 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f 70  oto not_an_sql_p
dc720 72 6f 63 3b 0a 0a 2f 2a 20 72 65 74 72 69 65 76  roc;../* retriev
dc730 69 6e 67 20 74 68 65 20 4c 69 73 74 20 6f 66 20  ing the List of 
dc740 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 56  Variables with V
dc750 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 76 61 72  alues */.    var
dc760 69 61 62 6c 65 73 20 3d 20 67 65 74 5f 73 71 6c  iables = get_sql
dc770 5f 70 72 6f 63 5f 76 61 72 69 61 62 6c 65 73 20  _proc_variables 
dc780 28 63 61 63 68 65 2c 20 61 72 67 63 2c 20 61 72  (cache, argc, ar
dc790 67 76 29 3b 0a 20 20 20 20 69 66 20 28 76 61 72  gv);.    if (var
dc7a0 69 61 62 6c 65 73 20 3d 3d 20 4e 55 4c 4c 29 0a  iables == NULL).
dc7b0 09 67 6f 74 6f 20 65 72 72 5f 76 61 72 69 61 62  .goto err_variab
dc7c0 6c 65 73 3b 0a 20 20 20 20 69 66 20 28 76 61 72  les;.    if (var
dc7d0 69 61 62 6c 65 73 2d 3e 45 72 72 6f 72 29 0a 09  iables->Error)..
dc7e0 67 6f 74 6f 20 69 6c 6c 65 67 61 6c 5f 76 61 72  goto illegal_var
dc7f0 69 61 62 6c 65 73 3b 0a 0a 2f 2a 20 72 65 70 6c  iables;../* repl
dc800 61 63 69 6e 67 20 56 61 72 69 61 62 6c 65 73 20  acing Variables 
dc810 2a 2f 0a 20 20 20 20 69 66 20 28 21 67 61 69 61  */.    if (!gaia
dc820 5f 73 71 6c 5f 70 72 6f 63 5f 63 6f 6f 6b 65 64  _sql_proc_cooked
dc830 5f 73 71 6c 0a 09 28 73 71 6c 69 74 65 2c 20 63  _sql..(sqlite, c
dc840 61 63 68 65 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62  ache, blob, blob
dc850 5f 73 7a 2c 20 76 61 72 69 61 62 6c 65 73 2c 20  _sz, variables, 
dc860 26 73 71 6c 29 29 0a 09 67 6f 74 6f 20 63 6f 6f  &sql))..goto coo
dc870 6b 69 6e 67 5f 65 72 72 6f 72 3b 0a 20 20 20 20  king_error;.    
dc880 66 72 65 65 20 28 62 6c 6f 62 29 3b 0a 0a 2f 2a  free (blob);../*
dc890 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 53   executing the S
dc8a0 51 4c 20 50 72 6f 63 65 64 75 72 65 20 2a 2f 0a  QL Procedure */.
dc8b0 20 20 20 20 69 66 20 28 21 67 61 69 61 5f 73 71      if (!gaia_sq
dc8c0 6c 5f 70 72 6f 63 5f 65 78 65 63 75 74 65 20 28  l_proc_execute (
dc8d0 73 71 6c 69 74 65 2c 20 63 61 63 68 65 2c 20 73  sqlite, cache, s
dc8e0 71 6c 29 29 0a 09 67 6f 74 6f 20 73 71 6c 5f 65  ql))..goto sql_e
dc8f0 72 72 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rror;.    sqlite
dc900 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
dc910 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 69  ntext, 1);.    i
dc920 66 20 28 73 71 6c 20 21 3d 20 4e 55 4c 4c 29 0a  f (sql != NULL).
dc930 09 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20  .free (sql);.   
dc940 20 67 61 69 61 5f 73 71 6c 5f 70 72 6f 63 5f 64   gaia_sql_proc_d
dc950 65 73 74 72 6f 79 5f 76 61 72 69 61 62 6c 65 73  estroy_variables
dc960 20 28 76 61 72 69 61 62 6c 65 73 29 3b 0a 20 20   (variables);.  
dc970 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76    return;..  inv
dc980 61 6c 69 64 5f 6e 61 6d 65 5f 61 72 67 75 6d 65  alid_name_argume
dc990 6e 74 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22  nt:.    msg =.."
dc9a0 53 74 6f 72 65 64 50 72 6f 63 20 65 78 63 65 70  StoredProc excep
dc9b0 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 53  tion - illegal S
dc9c0 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72 65 20  tored Procedure 
dc9d0 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45 58 54  Name [not a TEXT
dc9e0 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20 20 20   string].";.    
dc9f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
dca00 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d  rror (context, m
dca10 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  sg, -1);.    ret
dca20 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f  urn;..  invalid_
dca30 73 74 6f 72 65 64 5f 70 72 6f 63 65 64 75 72 65  stored_procedure
dca40 3a 0a 20 20 20 20 6d 65 73 73 61 67 65 20 3d 0a  :.    message =.
dca50 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  .sqlite3_mprintf
dca60 0a 09 28 22 53 74 6f 72 65 64 50 72 6f 63 20 65  ..("StoredProc e
dca70 78 63 65 70 74 69 6f 6e 20 2d 20 75 6e 61 62 6c  xception - unabl
dca80 65 20 74 6f 20 72 65 74 72 69 76 65 20 61 20 53  e to retrive a S
dca90 74 6f 72 65 64 20 50 72 6f 63 65 64 75 72 65 20  tored Procedure 
dcaa0 6e 61 6d 65 64 20 5c 22 25 73 5c 22 2e 22 2c 0a  named \"%s\".",.
dcab0 09 20 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  . name);.    sql
dcac0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
dcad0 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 65 73 73  r (context, mess
dcae0 61 67 65 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  age, -1);.    sq
dcaf0 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 65 73 73  lite3_free (mess
dcb00 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
dcb10 3b 0a 0a 20 20 6e 6f 74 5f 61 6e 5f 73 71 6c 5f  ;..  not_an_sql_
dcb20 70 72 6f 63 3a 0a 20 20 20 20 66 72 65 65 20 28  proc:.    free (
dcb30 62 6c 6f 62 29 3b 0a 20 20 20 20 6d 73 67 20 3d  blob);.    msg =
dcb40 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65 70 74   "SqlProc except
dcb50 69 6f 6e 20 2d 20 69 6e 76 61 6c 69 64 20 53 51  ion - invalid SQ
dcb60 4c 20 50 72 6f 63 65 64 75 72 65 20 42 4c 4f 42  L Procedure BLOB
dcb70 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  .";.    sqlite3_
dcb80 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f  result_error (co
dcb90 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b  ntext, msg, -1);
dcba0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
dcbb0 65 72 72 5f 76 61 72 69 61 62 6c 65 73 3a 0a 20  err_variables:. 
dcbc0 20 20 20 66 72 65 65 20 28 62 6c 6f 62 29 3b 0a     free (blob);.
dcbd0 20 20 20 20 6d 73 67 20 3d 20 22 53 71 6c 50 72      msg = "SqlPr
dcbe0 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 75  oc exception - u
dcbf0 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 4c  nable to get a L
dcc00 69 73 74 20 6f 66 20 56 61 72 69 61 62 6c 65 73  ist of Variables
dcc10 20 77 69 74 68 20 56 61 6c 75 65 73 2e 22 3b 0a   with Values.";.
dcc20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
dcc30 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78  lt_error (contex
dcc40 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  t, msg, -1);.   
dcc50 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6c 6c 65   return;..  ille
dcc60 67 61 6c 5f 76 61 72 69 61 62 6c 65 73 3a 0a 20  gal_variables:. 
dcc70 20 20 20 66 72 65 65 20 28 62 6c 6f 62 29 3b 0a     free (blob);.
dcc80 20 20 20 20 67 61 69 61 5f 73 71 6c 5f 70 72 6f      gaia_sql_pro
dcc90 63 5f 64 65 73 74 72 6f 79 5f 76 61 72 69 61 62  c_destroy_variab
dcca0 6c 65 73 20 28 76 61 72 69 61 62 6c 65 73 29 3b  les (variables);
dccb0 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 53 71 6c  .    msg =.."Sql
dccc0 50 72 6f 63 20 65 78 63 65 70 74 69 6f 6e 20 2d  Proc exception -
dccd0 20 74 68 65 20 4c 69 73 74 20 6f 66 20 56 61 72   the List of Var
dcce0 69 61 62 6c 65 73 20 77 69 74 68 20 56 61 6c 75  iables with Valu
dccf0 65 73 20 63 6f 6e 74 61 69 6e 73 20 69 6c 6c 65  es contains ille
dcd00 67 61 6c 20 69 74 65 6d 73 2e 22 3b 0a 20 20 20  gal items.";.   
dcd10 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
dcd20 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20  error (context, 
dcd30 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  msg, -1);.    re
dcd40 74 75 72 6e 3b 0a 0a 20 20 63 6f 6f 6b 69 6e 67  turn;..  cooking
dcd50 5f 65 72 72 6f 72 3a 0a 20 20 20 20 67 61 69 61  _error:.    gaia
dcd60 5f 73 71 6c 5f 70 72 6f 63 5f 64 65 73 74 72 6f  _sql_proc_destro
dcd70 79 5f 76 61 72 69 61 62 6c 65 73 20 28 76 61 72  y_variables (var
dcd80 69 61 62 6c 65 73 29 3b 0a 20 20 20 20 66 72 65  iables);.    fre
dcd90 65 20 28 62 6c 6f 62 29 3b 0a 20 20 20 20 6d 73  e (blob);.    ms
dcda0 67 20 3d 20 22 53 71 6c 50 72 6f 63 20 65 78 63  g = "SqlProc exc
dcdb0 65 70 74 69 6f 6e 20 2d 20 75 6e 61 62 6c 65 20  eption - unable 
dcdc0 74 6f 20 63 72 65 61 74 65 20 61 20 43 6f 6f 6b  to create a Cook
dcdd0 65 64 20 53 51 4c 20 42 6f 64 79 2e 22 3b 0a 20  ed SQL Body.";. 
dcde0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
dcdf0 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74  t_error (context
dce00 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20  , msg, -1);.    
dce10 72 65 74 75 72 6e 3b 0a 0a 20 20 73 71 6c 5f 65  return;..  sql_e
dce20 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 73 71  rror:.    if (sq
dce30 6c 20 21 3d 20 4e 55 4c 4c 29 0a 09 66 72 65 65  l != NULL)..free
dce40 20 28 73 71 6c 29 3b 0a 20 20 20 20 67 61 69 61   (sql);.    gaia
dce50 5f 73 71 6c 5f 70 72 6f 63 5f 64 65 73 74 72 6f  _sql_proc_destro
dce60 79 5f 76 61 72 69 61 62 6c 65 73 20 28 76 61 72  y_variables (var
dce70 69 61 62 6c 65 73 29 3b 0a 20 20 20 20 6d 73 67  iables);.    msg
dce80 20 3d 20 22 53 71 6c 50 72 6f 63 20 65 78 63 65   = "SqlProc exce
dce90 70 74 69 6f 6e 20 2d 20 61 20 66 61 74 61 6c 20  ption - a fatal 
dcea0 53 51 4c 20 65 72 72 6f 72 20 77 61 73 20 65 6e  SQL error was en
dceb0 63 6f 75 6e 74 65 72 65 64 2e 22 3b 0a 20 20 20  countered.";.   
dcec0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
dced0 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20  error (context, 
dcee0 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  msg, -1);.    re
dcef0 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  turn;.}..static 
dcf00 76 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 76 61 72  void.fnct_sp_var
dcf10 5f 72 65 67 69 73 74 65 72 20 28 73 71 6c 69 74  _register (sqlit
dcf20 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
dcf30 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
dcf40 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
dcf50 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
dcf60 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
dcf70 3a 0a 2f 20 53 74 6f 72 65 64 56 61 72 5f 52 65  :./ StoredVar_Re
dcf80 67 69 73 74 65 72 28 6e 61 6d 65 20 54 45 58 54  gister(name TEXT
dcf90 2c 20 74 69 74 6c 65 20 54 45 58 54 2c 20 76 61  , title TEXT, va
dcfa0 6c 75 65 20 4e 55 4c 4c 29 0a 2f 20 53 74 6f 72  lue NULL)./ Stor
dcfb0 65 64 56 61 72 5f 52 65 67 69 73 74 65 72 28 6e  edVar_Register(n
dcfc0 61 6d 65 20 54 45 58 54 2c 20 74 69 74 6c 65 20  ame TEXT, title 
dcfd0 54 45 58 54 2c 20 76 61 6c 75 65 20 49 4e 54 29  TEXT, value INT)
dcfe0 0a 2f 20 53 74 6f 72 65 64 56 61 72 5f 52 65 67  ./ StoredVar_Reg
dcff0 69 73 74 65 72 28 6e 61 6d 65 20 54 45 58 54 2c  ister(name TEXT,
dd000 20 74 69 74 6c 65 20 54 45 58 54 2c 20 76 61 6c   title TEXT, val
dd010 75 65 20 44 4f 55 42 4c 45 29 0a 2f 20 53 74 6f  ue DOUBLE)./ Sto
dd020 72 65 64 56 61 72 5f 52 65 67 69 73 74 65 72 28  redVar_Register(
dd030 6e 61 6d 65 20 54 45 58 54 2c 20 74 69 74 6c 65  name TEXT, title
dd040 20 54 45 58 54 2c 20 76 61 6c 75 65 20 54 45 58   TEXT, value TEX
dd050 54 29 0a 2f 20 53 74 6f 72 65 64 56 61 72 5f 52  T)./ StoredVar_R
dd060 65 67 69 73 74 65 72 28 6e 61 6d 65 20 54 45 58  egister(name TEX
dd070 54 2c 20 74 69 74 6c 65 20 54 45 58 54 2c 20 76  T, title TEXT, v
dd080 61 6c 75 65 20 42 4c 4f 42 29 0a 2f 0a 2f 20 72  alue BLOB)././ r
dd090 65 74 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73  eturns:./ 1 on s
dd0a0 75 63 63 65 73 73 2c 20 30 20 6f 6e 20 66 61 69  uccess, 0 on fai
dd0b0 6c 75 72 65 20 0a 2f 20 72 61 69 73 65 73 20 61  lure ./ raises a
dd0c0 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 69  n exception on i
dd0d0 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
dd0e0 20 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63   .*/.    const c
dd0f0 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63  har *name;.    c
dd100 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 74 6c 65  onst char *title
dd110 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
dd120 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
dd130 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a  .    int blob_sz
dd140 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 61 6c 75  ;.    char *valu
dd150 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  e = NULL;.    co
dd160 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20  nst char *msg;. 
dd170 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
dd180 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
dd190 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
dd1a0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74  context);.    st
dd1b0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
dd1c0 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
dd1d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
dd1e0 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
dd1f0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
dd200 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
dd210 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
dd220 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
dd230 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
dd240 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
dd250 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72  .goto invalid_ar
dd260 67 75 6d 65 6e 74 5f 31 3b 0a 20 20 20 20 69 66  gument_1;.    if
dd270 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
dd280 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
dd290 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
dd2a0 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67  goto invalid_arg
dd2b0 75 6d 65 6e 74 5f 32 3b 0a 20 20 20 20 6e 61 6d  ument_2;.    nam
dd2c0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
dd2d0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
dd2e0 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
dd2f0 0a 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63 6f  .    title = (co
dd300 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
dd310 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
dd320 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 73 77  argv[1]);.    sw
dd330 69 74 63 68 20 28 73 71 6c 69 74 65 33 5f 76 61  itch (sqlite3_va
dd340 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
dd350 5d 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ])).      {.    
dd360 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
dd370 4c 4c 3a 0a 09 20 20 76 61 6c 75 65 20 3d 20 73  LL:..  value = s
dd380 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
dd390 22 25 73 22 2c 20 22 4e 55 4c 4c 22 29 3b 0a 09  "%s", "NULL");..
dd3a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
dd3b0 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
dd3c0 45 52 3a 0a 09 20 20 76 61 6c 75 65 20 3d 20 73  ER:..  value = s
dd3d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
dd3e0 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%d", sqlite3_va
dd3f0 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
dd400 29 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  ));..  break;.  
dd410 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
dd420 46 4c 4f 41 54 3a 0a 09 20 20 76 61 6c 75 65 20  FLOAT:..  value 
dd430 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
dd440 66 20 28 22 25 31 2e 31 30 66 22 2c 20 73 71 6c  f ("%1.10f", sql
dd450 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
dd460 65 20 28 61 72 67 76 5b 32 5d 29 29 3b 0a 09 20  e (argv[2]));.. 
dd470 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dd480 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
dd490 09 20 20 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  .  value = sqlit
dd4a0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 22  e3_mprintf ("%s"
dd4b0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
dd4c0 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 29 3b  text (argv[2]));
dd4d0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
dd4e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
dd4f0 42 3a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  B:.      default
dd500 3a 0a 09 20 20 62 6c 6f 62 20 3d 20 73 71 6c 69  :..  blob = sqli
dd510 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
dd520 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 62 6c 6f  argv[2]);..  blo
dd530 62 5f 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  b_sz = sqlite3_v
dd540 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
dd550 5b 32 5d 29 3b 0a 09 20 20 76 61 6c 75 65 20 3d  [2]);..  value =
dd560 20 64 6f 5f 65 6e 63 6f 64 65 5f 62 6c 6f 62 5f   do_encode_blob_
dd570 76 61 6c 75 65 20 28 62 6c 6f 62 2c 20 62 6c 6f  value (blob, blo
dd580 62 5f 73 7a 29 3b 0a 09 20 20 62 72 65 61 6b 3b  b_sz);..  break;
dd590 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 69 66  .      };.    if
dd5a0 20 28 67 61 69 61 5f 73 74 6f 72 65 64 5f 76 61   (gaia_stored_va
dd5b0 72 5f 73 74 6f 72 65 20 28 73 71 6c 69 74 65 2c  r_store (sqlite,
dd5c0 20 63 61 63 68 65 2c 20 6e 61 6d 65 2c 20 74 69   cache, name, ti
dd5d0 74 6c 65 2c 20 76 61 6c 75 65 29 29 0a 09 73 71  tle, value))..sq
dd5e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
dd5f0 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20   (context, 1);. 
dd600 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
dd610 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
dd620 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  text, 0);.    if
dd630 20 28 76 61 6c 75 65 20 21 3d 20 4e 55 4c 4c 29   (value != NULL)
dd640 0a 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28  ..sqlite3_free (
dd650 76 61 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75  value);.    retu
dd660 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61  rn;..  invalid_a
dd670 72 67 75 6d 65 6e 74 5f 31 3a 0a 20 20 20 20 6d  rgument_1:.    m
dd680 73 67 20 3d 0a 09 22 53 74 6f 72 65 64 56 61 72  sg =.."StoredVar
dd690 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c   exception - ill
dd6a0 65 67 61 6c 20 53 74 6f 72 65 64 20 56 61 72 69  egal Stored Vari
dd6b0 61 62 6c 65 20 4e 61 6d 65 20 5b 6e 6f 74 20 61  able Name [not a
dd6c0 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b   TEXT string].";
dd6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
dd6e0 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65  ult_error (conte
dd6f0 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20  xt, msg, -1);.  
dd700 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76    return;..  inv
dd710 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 32 3a  alid_argument_2:
dd720 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 53 74 6f  .    msg =.."Sto
dd730 72 65 64 56 61 72 20 65 78 63 65 70 74 69 6f 6e  redVar exception
dd740 20 2d 20 69 6c 6c 65 67 61 6c 20 53 74 6f 72 65   - illegal Store
dd750 64 20 56 61 72 69 61 62 6c 65 20 54 69 74 6c 65  d Variable Title
dd760 20 5b 6e 6f 74 20 61 20 54 45 58 54 20 73 74 72   [not a TEXT str
dd770 69 6e 67 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69  ing].";.    sqli
dd780 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
dd790 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20   (context, msg, 
dd7a0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
dd7b0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
dd7c0 66 6e 63 74 5f 73 70 5f 76 61 72 5f 67 65 74 20  fnct_sp_var_get 
dd7d0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
dd7e0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
dd7f0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
dd800 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
dd810 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
dd820 2f 20 53 74 6f 72 65 64 56 61 72 5f 47 65 74 28  / StoredVar_Get(
dd830 6e 61 6d 65 20 54 45 58 54 29 0a 2f 0a 2f 20 72  name TEXT)././ r
dd840 65 74 75 72 6e 73 3a 0a 2f 20 61 20 56 61 72 69  eturns:./ a Vari
dd850 61 62 6c 65 20 77 69 74 68 20 56 61 6c 75 65 20  able with Value 
dd860 73 74 72 69 6e 67 0a 2f 20 72 61 69 73 65 73 20  string./ raises 
dd870 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20  an exception on 
dd880 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
dd890 73 20 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  s .*/.    const 
dd8a0 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20  char *name;.    
dd8b0 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 20  char *value;.   
dd8c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67   const char *msg
dd8d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
dd8e0 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
dd8f0 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
dd900 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
dd910 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
dd920 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
dd930 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
dd940 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
dd950 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
dd960 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
dd970 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
dd980 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
dd990 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
dd9a0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
dd9b0 54 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64  T)..goto invalid
dd9c0 5f 61 72 67 75 6d 65 6e 74 3b 0a 20 20 20 20 6e  _argument;.    n
dd9d0 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
dd9e0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
dd9f0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
dda00 29 3b 0a 20 20 20 20 69 66 20 28 21 67 61 69 61  );.    if (!gaia
dda10 5f 73 74 6f 72 65 64 5f 76 61 72 5f 66 65 74 63  _stored_var_fetc
dda20 68 20 28 73 71 6c 69 74 65 2c 20 63 61 63 68 65  h (sqlite, cache
dda30 2c 20 6e 61 6d 65 2c 20 31 2c 20 26 76 61 6c 75  , name, 1, &valu
dda40 65 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  e))..sqlite3_res
dda50 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
dda60 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
dda70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
dda80 74 20 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c 75  t (context, valu
dda90 65 2c 20 73 74 72 6c 65 6e 20 28 76 61 6c 75 65  e, strlen (value
ddaa0 29 2c 20 66 72 65 65 29 3b 0a 20 20 20 20 72 65  ), free);.    re
ddab0 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64  turn;..  invalid
ddac0 5f 61 72 67 75 6d 65 6e 74 3a 0a 20 20 20 20 6d  _argument:.    m
ddad0 73 67 20 3d 0a 09 22 53 74 6f 72 65 64 56 61 72  sg =.."StoredVar
ddae0 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c   exception - ill
ddaf0 65 67 61 6c 20 53 74 6f 72 65 64 20 56 61 72 69  egal Stored Vari
ddb00 61 62 6c 65 20 4e 61 6d 65 20 5b 6e 6f 74 20 61  able Name [not a
ddb10 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b   TEXT string].";
ddb20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
ddb30 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65  ult_error (conte
ddb40 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20  xt, msg, -1);.  
ddb50 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61    return;.}..sta
ddb60 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70  tic void.fnct_sp
ddb70 5f 76 61 72 5f 67 65 74 5f 76 61 6c 75 65 20 28  _var_get_value (
ddb80 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ddb90 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
ddba0 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71  rgc,...       sq
ddbb0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ddbc0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
ddbd0 6e 63 74 69 6f 6e 3a 0a 2f 20 53 74 6f 72 65 64  nction:./ Stored
ddbe0 56 61 72 5f 47 65 74 56 61 6c 75 65 28 6e 61 6d  Var_GetValue(nam
ddbf0 65 20 54 45 58 54 29 0a 2f 0a 2f 20 72 65 74 75  e TEXT)././ retu
ddc00 72 6e 73 3a 0a 2f 20 61 20 56 61 72 69 61 62 6c  rns:./ a Variabl
ddc10 65 20 77 69 74 68 20 56 61 6c 75 65 20 73 74 72  e with Value str
ddc20 69 6e 67 0a 2f 20 72 61 69 73 65 73 20 61 6e 20  ing./ raises an 
ddc30 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 69 6e 76  exception on inv
ddc40 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 0a  alid arguments .
ddc50 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
ddc60 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61  r *name;.    cha
ddc70 72 20 2a 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  r *value;.    co
ddc80 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20  nst char *msg;. 
ddc90 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
ddca0 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
ddcb0 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
ddcc0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74  context);.    st
ddcd0 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
ddce0 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
ddcf0 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
ddd00 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
ddd10 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
ddd20 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
ddd30 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
ddd40 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
ddd50 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
ddd60 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
ddd70 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72  .goto invalid_ar
ddd80 67 75 6d 65 6e 74 3b 0a 20 20 20 20 6e 61 6d 65  gument;.    name
ddd90 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
ddda0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
dddb0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
dddc0 20 20 20 20 69 66 20 28 21 67 61 69 61 5f 73 74      if (!gaia_st
dddd0 6f 72 65 64 5f 76 61 72 5f 66 65 74 63 68 20 28  ored_var_fetch (
ddde0 73 71 6c 69 74 65 2c 20 63 61 63 68 65 2c 20 6e  sqlite, cache, n
dddf0 61 6d 65 2c 20 30 2c 20 26 76 61 6c 75 65 29 29  ame, 0, &value))
dde00 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
dde10 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
dde20 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
dde30 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20 28  e3_result_text (
dde40 63 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65 2c 20  context, value, 
dde50 73 74 72 6c 65 6e 20 28 76 61 6c 75 65 29 2c 20  strlen (value), 
dde60 66 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 72  free);.    retur
dde70 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72  n;..  invalid_ar
dde80 67 75 6d 65 6e 74 3a 0a 20 20 20 20 6d 73 67 20  gument:.    msg 
dde90 3d 0a 09 22 53 74 6f 72 65 64 56 61 72 20 65 78  =.."StoredVar ex
ddea0 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61  ception - illega
ddeb0 6c 20 53 74 6f 72 65 64 20 56 61 72 69 61 62 6c  l Stored Variabl
ddec0 65 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45  e Name [not a TE
dded0 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20  XT string].";.  
ddee0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ddef0 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
ddf00 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
ddf10 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
ddf20 20 76 6f 69 64 0a 66 6e 63 74 5f 73 70 5f 76 61   void.fnct_sp_va
ddf30 72 5f 64 65 6c 65 74 65 20 28 73 71 6c 69 74 65  r_delete (sqlite
ddf40 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ddf50 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ddf60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ddf70 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
ddf80 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 74 6f 72 65  unction:./ Store
ddf90 64 56 61 72 5f 44 65 6c 65 74 65 28 6e 61 6d 65  dVar_Delete(name
ddfa0 20 54 45 58 54 29 0a 2f 0a 2f 20 72 65 74 75 72   TEXT)././ retur
ddfb0 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75 63 63 65  ns:./ 1 on succe
ddfc0 73 73 2c 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  ss, 0 on failure
ddfd0 20 0a 2f 20 72 61 69 73 65 73 20 61 6e 20 65 78   ./ raises an ex
ddfe0 63 65 70 74 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c  ception on inval
ddff0 69 64 20 61 72 67 75 6d 65 6e 74 73 20 0a 2a 2f  id arguments .*/
de000 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
de010 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  *name;.    const
de020 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20 20   char *msg;.    
de030 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
de040 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
de050 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
de060 74 65 78 74 29 3b 0a 20 20 20 20 73 74 72 75 63  text);.    struc
de070 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
de080 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
de090 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
de0a0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
de0b0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
de0c0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
de0d0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
de0e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
de0f0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
de100 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 67 6f  SQLITE_TEXT)..go
de110 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d  to invalid_argum
de120 65 6e 74 3b 0a 20 20 20 20 6e 61 6d 65 20 3d 20  ent;.    name = 
de130 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
de140 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
de150 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
de160 20 69 66 20 28 67 61 69 61 5f 73 74 6f 72 65 64   if (gaia_stored
de170 5f 76 61 72 5f 64 65 6c 65 74 65 20 28 73 71 6c  _var_delete (sql
de180 69 74 65 2c 20 63 61 63 68 65 2c 20 6e 61 6d 65  ite, cache, name
de190 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  ))..sqlite3_resu
de1a0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
de1b0 20 31 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73   1);.    else..s
de1c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
de1d0 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
de1e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69      return;..  i
de1f0 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 3a  nvalid_argument:
de200 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 53 74 6f  .    msg =.."Sto
de210 72 65 64 56 61 72 20 65 78 63 65 70 74 69 6f 6e  redVar exception
de220 20 2d 20 69 6c 6c 65 67 61 6c 20 53 74 6f 72 65   - illegal Store
de230 64 20 56 61 72 69 61 62 6c 65 20 4e 61 6d 65 20  d Variable Name 
de240 5b 6e 6f 74 20 61 20 54 45 58 54 20 73 74 72 69  [not a TEXT stri
de250 6e 67 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74  ng].";.    sqlit
de260 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20  e3_result_error 
de270 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d  (context, msg, -
de280 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
de290 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
de2a0 6e 63 74 5f 73 70 5f 76 61 72 5f 75 70 64 61 74  nct_sp_var_updat
de2b0 65 5f 74 69 74 6c 65 20 28 73 71 6c 69 74 65 33  e_title (sqlite3
de2c0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
de2d0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
de2e0 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
de2f0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
de300 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53  QL function:./ S
de310 74 6f 72 65 64 56 61 72 5f 55 70 64 61 74 65 54  toredVar_UpdateT
de320 69 74 6c 65 28 6e 61 6d 65 20 54 45 58 54 2c 20  itle(name TEXT, 
de330 74 69 74 6c 65 20 54 45 58 54 29 0a 2f 0a 2f 20  title TEXT)././ 
de340 72 65 74 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20  returns:./ 1 on 
de350 73 75 63 63 65 73 73 2c 20 30 20 6f 6e 20 66 61  success, 0 on fa
de360 69 6c 75 72 65 20 0a 2f 20 72 61 69 73 65 73 20  ilure ./ raises 
de370 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20  an exception on 
de380 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
de390 73 20 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  s .*/.    const 
de3a0 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20  char *name;.    
de3b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 74 6c  const char *titl
de3c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
de3d0 72 20 2a 6d 73 67 3b 0a 20 20 20 20 73 71 6c 69  r *msg;.    sqli
de3e0 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71  te3 *sqlite = sq
de3f0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
de400 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
de410 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  );.    struct sp
de420 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
de430 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
de440 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
de450 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
de460 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
de470 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
de480 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
de490 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
de4a0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
de4b0 54 45 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69  TE_TEXT)..goto i
de4c0 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f  nvalid_argument_
de4d0 31 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  1;.    if (sqlit
de4e0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
de4f0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
de500 45 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69 6e  E_TEXT)..goto in
de510 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 32  valid_argument_2
de520 3b 0a 20 20 20 20 6e 61 6d 65 20 3d 20 28 63 6f  ;.    name = (co
de530 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
de540 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
de550 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 74 69  argv[0]);.    ti
de560 74 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tle = (const cha
de570 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
de580 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
de590 29 3b 0a 20 20 20 20 69 66 20 28 67 61 69 61 5f  );.    if (gaia_
de5a0 73 74 6f 72 65 64 5f 76 61 72 5f 75 70 64 61 74  stored_var_updat
de5b0 65 5f 74 69 74 6c 65 20 28 73 71 6c 69 74 65 2c  e_title (sqlite,
de5c0 20 63 61 63 68 65 2c 20 6e 61 6d 65 2c 20 74 69   cache, name, ti
de5d0 74 6c 65 29 29 0a 09 73 71 6c 69 74 65 33 5f 72  tle))..sqlite3_r
de5e0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
de5f0 78 74 2c 20 31 29 3b 0a 20 20 20 20 65 6c 73 65  xt, 1);.    else
de600 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
de610 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
de620 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  );.    return;..
de630 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65    invalid_argume
de640 6e 74 5f 31 3a 0a 20 20 20 20 6d 73 67 20 3d 0a  nt_1:.    msg =.
de650 09 22 53 74 6f 72 65 64 56 61 72 20 65 78 63 65  ."StoredVar exce
de660 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20  ption - illegal 
de670 53 74 6f 72 65 64 20 56 61 72 69 61 62 6c 65 20  Stored Variable 
de680 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45 58 54  Name [not a TEXT
de690 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20 20 20   string].";.    
de6a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
de6b0 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d  rror (context, m
de6c0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  sg, -1);.    ret
de6d0 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f  urn;..  invalid_
de6e0 61 72 67 75 6d 65 6e 74 5f 32 3a 0a 20 20 20 20  argument_2:.    
de6f0 6d 73 67 20 3d 0a 09 22 53 74 6f 72 65 64 56 61  msg =.."StoredVa
de700 72 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c  r exception - il
de710 6c 65 67 61 6c 20 53 74 6f 72 65 64 20 56 61 72  legal Stored Var
de720 69 61 62 6c 65 20 54 69 74 6c 65 20 5b 6e 6f 74  iable Title [not
de730 20 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e   a TEXT string].
de740 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ";.    sqlite3_r
de750 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e  esult_error (con
de760 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  text, msg, -1);.
de770 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73      return;.}..s
de780 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
de790 73 70 5f 76 61 72 5f 75 70 64 61 74 65 5f 76 61  sp_var_update_va
de7a0 6c 75 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lue (sqlite3_con
de7b0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
de7c0 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73  int argc,....  s
de7d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
de7e0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
de7f0 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 74 6f 72 65  unction:./ Store
de800 64 56 61 72 5f 55 70 64 61 74 65 56 61 6c 75 65  dVar_UpdateValue
de810 28 6e 61 6d 65 20 54 45 58 54 2c 20 76 61 6c 75  (name TEXT, valu
de820 65 20 4e 55 4c 4c 29 0a 2f 20 53 74 6f 72 65 64  e NULL)./ Stored
de830 56 61 72 5f 55 70 64 61 74 65 56 61 6c 75 65 28  Var_UpdateValue(
de840 6e 61 6d 65 20 54 45 58 54 2c 20 76 61 6c 75 65  name TEXT, value
de850 20 49 4e 54 29 0a 2f 20 53 74 6f 72 65 64 56 61   INT)./ StoredVa
de860 72 5f 55 70 64 61 74 65 56 61 6c 75 65 28 6e 61  r_UpdateValue(na
de870 6d 65 20 54 45 58 54 2c 20 76 61 6c 75 65 20 44  me TEXT, value D
de880 4f 55 42 4c 45 29 0a 2f 20 53 74 6f 72 65 64 56  OUBLE)./ StoredV
de890 61 72 5f 55 70 64 61 74 65 56 61 6c 75 65 28 6e  ar_UpdateValue(n
de8a0 61 6d 65 20 54 45 58 54 2c 20 76 61 6c 75 65 20  ame TEXT, value 
de8b0 54 45 58 54 29 0a 2f 20 53 74 6f 72 65 64 56 61  TEXT)./ StoredVa
de8c0 72 5f 55 70 64 61 74 65 56 61 6c 75 65 28 6e 61  r_UpdateValue(na
de8d0 6d 65 20 54 45 58 54 2c 20 76 61 6c 75 65 20 42  me TEXT, value B
de8e0 4c 4f 42 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  LOB)././ returns
de8f0 3a 0a 2f 20 31 20 6f 6e 20 73 75 63 63 65 73 73  :./ 1 on success
de900 2c 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 20 0a  , 0 on failure .
de910 2f 20 72 61 69 73 65 73 20 61 6e 20 65 78 63 65  / raises an exce
de920 70 74 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64  ption on invalid
de930 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
de940 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
de950 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  me;.    const un
de960 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f  signed char *blo
de970 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f  b;.    int blob_
de980 73 7a 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 61  sz;.    char *va
de990 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  lue = NULL;.    
de9a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 3b  const char *msg;
de9b0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
de9c0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
de9d0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
de9e0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
de9f0 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
dea00 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
dea10 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
dea20 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
dea30 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
dea40 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
dea50 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
dea60 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
dea70 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
dea80 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
dea90 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f  )..goto invalid_
deaa0 61 72 67 75 6d 65 6e 74 5f 31 3b 0a 20 20 20 20  argument_1;.    
deab0 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
deac0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
dead0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
deae0 5d 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  ]);.    switch (
deaf0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
deb00 70 65 20 28 61 72 67 76 5b 31 5d 29 29 0a 20 20  pe (argv[1])).  
deb10 20 20 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65      {.      case
deb20 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 09 20   SQLITE_NULL:.. 
deb30 20 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33   value = sqlite3
deb40 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 22 2c 20  _mprintf ("%s", 
deb50 22 4e 55 4c 4c 22 29 3b 0a 09 20 20 62 72 65 61  "NULL");..  brea
deb60 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
deb70 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 23 69  LITE_INTEGER:.#i
deb80 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
deb90 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
deba0 4d 49 4e 47 57 33 32 5f 5f 29 0a 09 20 20 76 61  MINGW32__)..  va
debb0 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  lue = sqlite3_mp
debc0 72 69 6e 74 66 20 28 22 25 49 36 34 64 22 2c 20  rintf ("%I64d", 
debd0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
debe0 74 36 34 20 28 61 72 67 76 5b 31 5d 29 29 3b 0a  t64 (argv[1]));.
debf0 23 65 6c 73 65 0a 09 20 20 76 61 6c 75 65 20 3d  #else..  value =
dec00 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
dec10 20 28 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65   ("%lld", sqlite
dec20 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 20 28 61  3_value_int64 (a
dec30 72 67 76 5b 31 5d 29 29 3b 0a 23 65 6e 64 69 66  rgv[1]));.#endif
dec40 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
dec50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
dec60 41 54 3a 0a 09 20 20 76 61 6c 75 65 20 3d 20 73  AT:..  value = s
dec70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28  qlite3_mprintf (
dec80 22 25 31 2e 31 30 66 22 2c 20 73 71 6c 69 74 65  "%1.10f", sqlite
dec90 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
deca0 61 72 67 76 5b 31 5d 29 29 3b 0a 09 20 20 62 72  argv[1]));..  br
decb0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
decc0 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 09 20 20  SQLITE_TEXT:..  
decd0 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
dece0 6d 70 72 69 6e 74 66 20 28 22 25 73 22 2c 20 73  mprintf ("%s", s
decf0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
ded00 74 20 28 61 72 67 76 5b 31 5d 29 29 3b 0a 09 20  t (argv[1]));.. 
ded10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ded20 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
ded30 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09        default:..
ded40 20 20 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33    blob = sqlite3
ded50 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
ded60 76 5b 31 5d 29 3b 0a 09 20 20 62 6c 6f 62 5f 73  v[1]);..  blob_s
ded70 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
ded80 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d  e_bytes (argv[1]
ded90 29 3b 0a 09 20 20 76 61 6c 75 65 20 3d 20 64 6f  );..  value = do
deda0 5f 65 6e 63 6f 64 65 5f 62 6c 6f 62 5f 76 61 6c  _encode_blob_val
dedb0 75 65 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73  ue (blob, blob_s
dedc0 7a 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  z);..  break;.  
dedd0 20 20 20 20 7d 3b 0a 20 20 20 20 69 66 20 28 67      };.    if (g
dede0 61 69 61 5f 73 74 6f 72 65 64 5f 76 61 72 5f 75  aia_stored_var_u
dedf0 70 64 61 74 65 5f 76 61 6c 75 65 20 28 73 71 6c  pdate_value (sql
dee00 69 74 65 2c 20 63 61 63 68 65 2c 20 6e 61 6d 65  ite, cache, name
dee10 2c 20 76 61 6c 75 65 29 29 0a 09 73 71 6c 69 74  , value))..sqlit
dee20 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
dee30 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  ontext, 1);.    
dee40 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
dee50 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
dee60 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 76  t, 0);.    if (v
dee70 61 6c 75 65 20 21 3d 20 4e 55 4c 4c 29 0a 09 73  alue != NULL)..s
dee80 71 6c 69 74 65 33 5f 66 72 65 65 20 28 76 61 6c  qlite3_free (val
dee90 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ue);.    return;
deea0 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75  ..  invalid_argu
deeb0 6d 65 6e 74 5f 31 3a 0a 20 20 20 20 6d 73 67 20  ment_1:.    msg 
deec0 3d 0a 09 22 53 74 6f 72 65 64 56 61 72 20 65 78  =.."StoredVar ex
deed0 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61  ception - illega
deee0 6c 20 53 74 6f 72 65 64 20 56 61 72 69 61 62 6c  l Stored Variabl
deef0 65 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45  e Name [not a TE
def00 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20  XT string].";.  
def10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
def20 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
def30 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
def40 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
def50 20 76 6f 69 64 0a 66 6e 63 74 5f 63 72 65 61 74   void.fnct_creat
def60 65 5f 72 6f 75 74 69 6e 67 5f 6e 6f 64 65 73 20  e_routing_nodes 
def70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
def80 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
def90 61 72 67 63 2c 0a 09 09 09 20 20 20 73 71 6c 69  argc,....   sqli
defa0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
defb0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
defc0 74 69 6f 6e 3a 0a 2f 20 43 72 65 61 74 65 52 6f  tion:./ CreateRo
defd0 75 74 69 6e 67 4e 6f 64 65 73 28 64 62 2d 70 72  utingNodes(db-pr
defe0 65 66 69 78 20 54 45 58 54 2c 20 69 6e 70 75 74  efix TEXT, input
deff0 2d 74 61 62 6c 65 20 54 45 58 54 20 2c 20 67 65  -table TEXT , ge
df000 6f 6d 2d 63 6f 6c 75 6d 6e 20 54 45 58 54 2c 0a  om-column TEXT,.
df010 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
df020 20 20 20 20 20 6e 6f 64 65 2d 66 72 6f 6d 2d 63       node-from-c
df030 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20 6e 6f 64  olumn TEXT , nod
df040 65 2d 74 6f 2d 63 6f 6c 75 6d 6e 20 54 45 58 54  e-to-column TEXT
df050 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a   )././ returns:.
df060 2f 20 31 20 6f 6e 20 73 75 63 63 65 73 0a 2f 20  / 1 on succes./ 
df070 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74  raises an except
df080 69 6f 6e 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61  ion on invalid a
df090 72 67 75 6d 65 6e 74 73 20 6f 72 20 65 72 72 6f  rguments or erro
df0a0 72 73 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  rs.*/.    const 
df0b0 63 68 61 72 20 2a 64 62 5f 70 72 65 66 69 78 3b  char *db_prefix;
df0c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
df0d0 2a 69 6e 70 75 74 5f 74 61 62 6c 65 3b 0a 20 20  *input_table;.  
df0e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 67 65    const char *ge
df0f0 6f 6d 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63  om_column;.    c
df100 6f 6e 73 74 20 63 68 61 72 20 2a 66 72 6f 6d 5f  onst char *from_
df110 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73  column;.    cons
df120 74 20 63 68 61 72 20 2a 74 6f 5f 63 6f 6c 75 6d  t char *to_colum
df130 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
df140 72 20 2a 6d 73 67 3b 0a 20 20 20 20 73 71 6c 69  r *msg;.    sqli
df150 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71  te3 *sqlite = sq
df160 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
df170 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
df180 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  );.    struct sp
df190 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
df1a0 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
df1b0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
df1c0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
df1d0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
df1e0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
df1f0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
df200 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
df210 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49  argv[0]) == SQLI
df220 54 45 5f 4e 55 4c 4c 29 0a 09 64 62 5f 70 72 65  TE_NULL)..db_pre
df230 66 69 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  fix = NULL;.    
df240 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
df250 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
df260 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
df270 54 45 58 54 29 0a 09 64 62 5f 70 72 65 66 69 78  TEXT)..db_prefix
df280 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
df290 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
df2a0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
df2b0 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 69      else..goto i
df2c0 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f  nvalid_argument_
df2d0 31 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  1;.    if (sqlit
df2e0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
df2f0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
df300 45 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69 6e  E_TEXT)..goto in
df310 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 32  valid_argument_2
df320 3b 0a 20 20 20 20 65 6c 73 65 0a 09 69 6e 70 75  ;.    else..inpu
df330 74 5f 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74  t_table = (const
df340 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
df350 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
df360 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73  v[1]);.    if (s
df370 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
df380 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
df390 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 67 65 6f  QLITE_NULL)..geo
df3a0 6d 5f 63 6f 6c 75 6d 6e 20 3d 20 4e 55 4c 4c 3b  m_column = NULL;
df3b0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
df3c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
df3d0 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
df3e0 4c 49 54 45 5f 54 45 58 54 29 0a 09 67 65 6f 6d  LITE_TEXT)..geom
df3f0 5f 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f 6e 73 74  _column = (const
df400 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
df410 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
df420 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a  v[2]);.    else.
df430 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72  .goto invalid_ar
df440 67 75 6d 65 6e 74 5f 33 3b 0a 20 20 20 20 69 66  gument_3;.    if
df450 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
df460 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 21  type (argv[3]) !
df470 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
df480 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67  goto invalid_arg
df490 75 6d 65 6e 74 5f 34 3b 0a 20 20 20 20 66 72 6f  ument_4;.    fro
df4a0 6d 5f 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f 6e 73  m_column = (cons
df4b0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
df4c0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
df4d0 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[3]);.    if (
df4e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
df4f0 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21 3d 20  pe (argv[4]) != 
df500 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 67 6f  SQLITE_TEXT)..go
df510 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d  to invalid_argum
df520 65 6e 74 5f 35 3b 0a 20 20 20 20 74 6f 5f 63 6f  ent_5;.    to_co
df530 6c 75 6d 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  lumn = (const ch
df540 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
df550 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 34  lue_text (argv[4
df560 5d 29 3b 0a 20 20 20 20 69 66 20 28 67 61 69 61  ]);.    if (gaia
df570 5f 63 72 65 61 74 65 5f 72 6f 75 74 69 6e 67 5f  _create_routing_
df580 6e 6f 64 65 73 0a 09 28 73 71 6c 69 74 65 2c 20  nodes..(sqlite, 
df590 63 61 63 68 65 2c 20 64 62 5f 70 72 65 66 69 78  cache, db_prefix
df5a0 2c 20 69 6e 70 75 74 5f 74 61 62 6c 65 2c 20 67  , input_table, g
df5b0 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 66 72 6f 6d  eom_column, from
df5c0 5f 63 6f 6c 75 6d 6e 2c 0a 09 20 74 6f 5f 63 6f  _column,.. to_co
df5d0 6c 75 6d 6e 29 29 0a 09 73 71 6c 69 74 65 33 5f  lumn))..sqlite3_
df5e0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
df5f0 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 65 6c 73  ext, 1);.    els
df600 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  e.      {..  /* 
df610 74 68 65 72 65 20 77 61 73 20 61 6e 20 65 72 72  there was an err
df620 6f 72 2c 20 72 61 69 73 69 6e 67 20 61 6e 20 45  or, raising an E
df630 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 09 20 20 63  xception */..  c
df640 68 61 72 20 2a 6d 73 67 5f 65 72 72 3b 0a 09 20  har *msg_err;.. 
df650 20 6d 73 67 20 3d 20 67 61 69 61 5f 63 72 65 61   msg = gaia_crea
df660 74 65 5f 72 6f 75 74 69 6e 67 5f 67 65 74 5f 6c  te_routing_get_l
df670 61 73 74 5f 65 72 72 6f 72 20 28 63 61 63 68 65  ast_error (cache
df680 29 3b 0a 09 20 20 69 66 20 28 6d 73 67 20 3d 3d  );..  if (msg ==
df690 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 6d 73   NULL)..      ms
df6a0 67 5f 65 72 72 20 3d 0a 09 09 20 20 73 71 6c 69  g_err =...  sqli
df6b0 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 20 20  te3_mprintf...  
df6c0 28 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67 4e  ("CreateRoutingN
df6d0 6f 64 65 73 20 65 78 63 65 70 74 69 6f 6e 20 2d  odes exception -
df6e0 20 55 6e 6b 6e 6f 77 6e 20 72 65 61 73 6f 6e 22   Unknown reason"
df6f0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
df700 20 20 6d 73 67 5f 65 72 72 20 3d 0a 09 09 20 20    msg_err =...  
df710 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20  sqlite3_mprintf 
df720 28 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67 4e  ("CreateRoutingN
df730 6f 64 65 73 20 65 78 63 65 70 74 69 6f 6e 20 2d  odes exception -
df740 20 25 73 22 2c 20 6d 73 67 29 3b 0a 09 20 20 73   %s", msg);..  s
df750 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
df760 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73  ror (context, ms
df770 67 5f 65 72 72 2c 20 2d 31 29 3b 0a 09 20 20 73  g_err, -1);..  s
df780 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67  qlite3_free (msg
df790 5f 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _err);.      }. 
df7a0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e     return;..  in
df7b0 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 31  valid_argument_1
df7c0 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72  :.    msg =.."Cr
df7d0 65 61 74 65 52 6f 75 74 69 6e 67 4e 6f 64 65 73  eateRoutingNodes
df7e0 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c   exception - ill
df7f0 65 67 61 6c 20 44 42 2d 70 72 65 66 69 78 20 5b  egal DB-prefix [
df800 6e 6f 74 20 61 20 54 45 58 54 20 73 74 72 69 6e  not a TEXT strin
df810 67 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  g].";.    sqlite
df820 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28  3_result_error (
df830 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31  context, msg, -1
df840 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  );.    return;..
df850 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65    invalid_argume
df860 6e 74 5f 32 3a 0a 20 20 20 20 6d 73 67 20 3d 0a  nt_2:.    msg =.
df870 09 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67 4e  ."CreateRoutingN
df880 6f 64 65 73 20 65 78 63 65 70 74 69 6f 6e 20 2d  odes exception -
df890 20 69 6c 6c 65 67 61 6c 20 53 70 61 74 69 61 6c   illegal Spatial
df8a0 2d 54 61 62 6c 65 20 4e 61 6d 65 20 5b 6e 6f 74  -Table Name [not
df8b0 20 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e   a TEXT string].
df8c0 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ";.    sqlite3_r
df8d0 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e  esult_error (con
df8e0 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  text, msg, -1);.
df8f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69      return;..  i
df900 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f  nvalid_argument_
df910 33 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43  3:.    msg =.."C
df920 72 65 61 74 65 52 6f 75 74 69 6e 67 4e 6f 64 65  reateRoutingNode
df930 73 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c  s exception - il
df940 6c 65 67 61 6c 20 47 65 6f 6d 65 74 72 79 20 43  legal Geometry C
df950 6f 6c 75 6d 6e 20 4e 61 6d 65 20 5b 6e 6f 74 20  olumn Name [not 
df960 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e 22  a TEXT string]."
df970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
df980 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
df990 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
df9a0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e     return;..  in
df9b0 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 34  valid_argument_4
df9c0 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72  :.    msg =.."Cr
df9d0 65 61 74 65 52 6f 75 74 69 6e 67 4e 6f 64 65 73  eateRoutingNodes
df9e0 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c   exception - ill
df9f0 65 67 61 6c 20 46 72 6f 6d 4e 6f 64 65 20 43 6f  egal FromNode Co
dfa00 6c 75 6d 6e 20 4e 61 6d 65 20 5b 6e 6f 74 20 61  lumn Name [not a
dfa10 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b   TEXT string].";
dfa20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
dfa30 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65  ult_error (conte
dfa40 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20  xt, msg, -1);.  
dfa50 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76    return;..  inv
dfa60 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 35 3a  alid_argument_5:
dfa70 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72 65  .    msg =.."Cre
dfa80 61 74 65 52 6f 75 74 69 6e 67 4e 6f 64 65 73 20  ateRoutingNodes 
dfa90 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65  exception - ille
dfaa0 67 61 6c 20 54 6f 4e 6f 64 65 20 43 6f 6c 75 6d  gal ToNode Colum
dfab0 6e 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45  n Name [not a TE
dfac0 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20  XT string].";.  
dfad0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
dfae0 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
dfaf0 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
dfb00 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
dfb10 20 76 6f 69 64 0a 66 6e 63 74 5f 63 72 65 61 74   void.fnct_creat
dfb20 65 5f 72 6f 75 74 69 6e 67 20 28 73 71 6c 69 74  e_routing (sqlit
dfb30 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
dfb40 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
dfb50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
dfb60 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
dfb70 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43 72 65 61  function:./ Crea
dfb80 74 65 52 6f 75 74 69 6e 67 28 72 6f 75 74 69 6e  teRouting(routin
dfb90 67 2d 64 61 74 61 2d 74 61 62 6c 65 20 54 45 58  g-data-table TEX
dfba0 54 20 2c 20 76 69 72 74 75 61 6c 2d 72 6f 75 74  T , virtual-rout
dfbb0 69 6e 67 2d 74 61 62 6c 65 20 54 45 58 54 20 2c  ing-table TEXT ,
dfbc0 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   ./             
dfbd0 20 20 69 6e 70 75 74 2d 74 61 62 6c 65 20 54 45    input-table TE
dfbe0 58 54 20 2c 20 66 72 6f 6d 2d 63 6f 6c 75 6d 6e  XT , from-column
dfbf0 20 54 45 58 54 20 2c 20 74 6f 2d 63 6f 6c 75 6d   TEXT , to-colum
dfc00 6e 20 54 45 58 54 20 2c 20 0a 2f 20 20 20 20 20  n TEXT , ./     
dfc10 20 20 20 20 20 20 20 20 20 20 67 65 6f 6d 2d 63            geom-c
dfc20 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20 63 6f 73  olumn TEXT , cos
dfc30 74 2d 63 6f 6c 75 6d 6e 20 54 45 58 54 20 29 0a  t-column TEXT ).
dfc40 2f 20 43 72 65 61 74 65 52 6f 75 74 69 6e 67 28  / CreateRouting(
dfc50 72 6f 75 74 69 6e 67 2d 64 61 74 61 2d 74 61 62  routing-data-tab
dfc60 6c 65 20 54 45 58 54 20 2c 20 76 69 72 74 75 61  le TEXT , virtua
dfc70 6c 2d 72 6f 75 74 69 6e 67 2d 74 61 62 6c 65 20  l-routing-table 
dfc80 54 45 58 54 20 2c 20 0a 2f 20 20 20 20 20 20 20  TEXT , ./       
dfc90 20 20 20 20 20 20 20 20 69 6e 70 75 74 2d 74 61          input-ta
dfca0 62 6c 65 20 54 45 58 54 20 2c 20 66 72 6f 6d 2d  ble TEXT , from-
dfcb0 63 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20 74 6f  column TEXT , to
dfcc0 2d 63 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20 0a  -column TEXT , .
dfcd0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
dfce0 67 65 6f 6d 2d 63 6f 6c 75 6d 6e 20 54 45 58 54  geom-column TEXT
dfcf0 20 2c 20 63 6f 73 74 2d 63 6f 6c 75 6d 6e 20 54   , cost-column T
dfd00 45 58 54 20 2c 20 6e 61 6d 65 2d 63 6f 6c 75 6d  EXT , name-colum
dfd10 6e 20 54 45 58 54 20 2c 0a 2f 20 20 20 20 20 20  n TEXT ,./      
dfd20 20 20 20 20 20 20 20 20 20 61 2d 73 74 61 72 2d           a-star-
dfd30 65 6e 61 62 6c 65 64 20 42 4f 4f 4c 45 41 4e 20  enabled BOOLEAN 
dfd40 2c 20 62 69 64 69 72 65 63 74 69 6f 6e 61 6c 20  , bidirectional 
dfd50 42 4f 4f 4c 45 41 4e 20 29 0a 2f 20 43 72 65 61  BOOLEAN )./ Crea
dfd60 74 65 52 6f 75 74 69 6e 67 28 72 6f 75 74 69 6e  teRouting(routin
dfd70 67 2d 64 61 74 61 2d 74 61 62 6c 65 20 54 45 58  g-data-table TEX
dfd80 54 20 2c 20 76 69 72 74 75 61 6c 2d 72 6f 75 74  T , virtual-rout
dfd90 69 6e 67 2d 74 61 62 6c 65 20 54 45 58 54 20 2c  ing-table TEXT ,
dfda0 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   ./             
dfdb0 20 20 69 6e 70 75 74 2d 74 61 62 6c 65 20 54 45    input-table TE
dfdc0 58 54 20 2c 20 66 72 6f 6d 2d 63 6f 6c 75 6d 6e  XT , from-column
dfdd0 20 54 45 58 54 20 2c 20 74 6f 2d 63 6f 6c 75 6d   TEXT , to-colum
dfde0 6e 20 54 45 58 54 20 2c 20 0a 2f 20 20 20 20 20  n TEXT , ./     
dfdf0 20 20 20 20 20 20 20 20 20 20 67 65 6f 6d 2d 63            geom-c
dfe00 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20 63 6f 73  olumn TEXT , cos
dfe10 74 2d 63 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20  t-column TEXT , 
dfe20 6e 61 6d 65 2d 63 6f 6c 75 6d 6e 20 54 45 58 54  name-column TEXT
dfe30 20 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20   ,./            
dfe40 20 20 20 61 2d 73 74 61 72 2d 65 6e 61 62 6c 65     a-star-enable
dfe50 64 20 42 4f 4f 4c 45 41 4e 20 2c 20 62 69 64 69  d BOOLEAN , bidi
dfe60 72 65 63 74 69 6f 6e 61 6c 20 42 4f 4f 4c 45 41  rectional BOOLEA
dfe70 4e 20 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20  N ,./           
dfe80 20 20 20 20 6f 6e 65 77 61 79 2d 66 72 6f 6d 20      oneway-from 
dfe90 54 45 58 54 20 2c 20 6f 6e 65 77 61 79 2d 74 6f  TEXT , oneway-to
dfea0 20 54 45 58 54 20 29 0a 2f 20 43 72 65 61 74 65   TEXT )./ Create
dfeb0 52 6f 75 74 69 6e 67 28 72 6f 75 74 69 6e 67 2d  Routing(routing-
dfec0 64 61 74 61 2d 74 61 62 6c 65 20 54 45 58 54 20  data-table TEXT 
dfed0 2c 20 76 69 72 74 75 61 6c 2d 72 6f 75 74 69 6e  , virtual-routin
dfee0 67 2d 74 61 62 6c 65 20 54 45 58 54 20 2c 20 0a  g-table TEXT , .
dfef0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
dff00 69 6e 70 75 74 2d 74 61 62 6c 65 20 54 45 58 54  input-table TEXT
dff10 20 2c 20 66 72 6f 6d 2d 63 6f 6c 75 6d 6e 20 54   , from-column T
dff20 45 58 54 20 2c 20 74 6f 2d 63 6f 6c 75 6d 6e 20  EXT , to-column 
dff30 54 45 58 54 20 2c 20 0a 2f 20 20 20 20 20 20 20  TEXT , ./       
dff40 20 20 20 20 20 20 20 20 67 65 6f 6d 2d 63 6f 6c          geom-col
dff50 75 6d 6e 20 54 45 58 54 20 2c 20 63 6f 73 74 2d  umn TEXT , cost-
dff60 63 6f 6c 75 6d 6e 20 54 45 58 54 20 2c 20 6e 61  column TEXT , na
dff70 6d 65 2d 63 6f 6c 75 6d 6e 20 54 45 58 54 20 2c  me-column TEXT ,
dff80 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ./              
dff90 20 61 2d 73 74 61 72 2d 65 6e 61 62 6c 65 64 20   a-star-enabled 
dffa0 42 4f 4f 4c 45 41 4e 20 2c 20 62 69 64 69 72 65  BOOLEAN , bidire
dffb0 63 74 69 6f 6e 61 6c 20 42 4f 4f 4c 45 41 4e 20  ctional BOOLEAN 
dffc0 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  ,./             
dffd0 20 20 6f 6e 65 77 61 79 2d 66 72 6f 6d 20 54 45    oneway-from TE
dffe0 58 54 20 2c 20 6f 6e 65 77 61 79 2d 74 6f 20 54  XT , oneway-to T
dfff0 45 58 54 20 2c 20 6f 76 65 72 77 72 69 74 65 20  EXT , overwrite 
e0000 42 4f 4f 4c 45 41 4e 20 29 0a 2f 0a 2f 20 72 65  BOOLEAN )././ re
e0010 74 75 72 6e 73 3a 0a 2f 20 31 20 6f 6e 20 73 75  turns:./ 1 on su
e0020 63 63 65 73 0a 2f 20 72 61 69 73 65 73 20 61 6e  cces./ raises an
e0030 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 69 6e   exception on in
e0040 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20  valid arguments 
e0050 6f 72 20 65 72 72 6f 72 73 0a 2a 2f 0a 20 20 20  or errors.*/.   
e0060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 6f 75   const char *rou
e0070 74 69 6e 67 5f 64 61 74 61 5f 74 61 62 6c 65 3b  ting_data_table;
e0080 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e0090 2a 76 69 72 74 75 61 6c 5f 72 6f 75 74 69 6e 67  *virtual_routing
e00a0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  _table;.    cons
e00b0 74 20 63 68 61 72 20 2a 69 6e 70 75 74 5f 74 61  t char *input_ta
e00c0 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
e00d0 68 61 72 20 2a 66 72 6f 6d 5f 63 6f 6c 75 6d 6e  har *from_column
e00e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e00f0 20 2a 74 6f 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20   *to_column;.   
e0100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 67 65 6f   const char *geo
e0110 6d 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f  m_column;.    co
e0120 6e 73 74 20 63 68 61 72 20 2a 63 6f 73 74 5f 63  nst char *cost_c
e0130 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  olumn;.    const
e0140 20 63 68 61 72 20 2a 6e 61 6d 65 5f 63 6f 6c 75   char *name_colu
e0150 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 61 5f 73 74  mn;.    int a_st
e0160 61 72 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  ar_enabled = 1;.
e0170 20 20 20 20 69 6e 74 20 62 69 64 69 72 65 63 74      int bidirect
e0180 69 6f 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 63  ional = 1;.    c
e0190 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e 65 77 61  onst char *onewa
e01a0 79 5f 66 72 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20  y_from = NULL;. 
e01b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f     const char *o
e01c0 6e 65 77 61 79 5f 74 6f 20 3d 20 4e 55 4c 4c 3b  neway_to = NULL;
e01d0 0a 20 20 20 20 69 6e 74 20 6f 76 65 72 77 72 69  .    int overwri
e01e0 74 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  te = 0;.    cons
e01f0 74 20 63 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20  t char *msg;.   
e0200 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
e0210 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
e0220 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
e0230 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74 72 75  ntext);.    stru
e0240 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
e0250 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
e0260 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
e0270 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
e0280 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
e0290 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
e02a0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
e02b0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
e02c0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
e02d0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 67   SQLITE_TEXT)..g
e02e0 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67 75  oto invalid_argu
e02f0 6d 65 6e 74 5f 31 3b 0a 20 20 20 20 72 6f 75 74  ment_1;.    rout
e0300 69 6e 67 5f 64 61 74 61 5f 74 61 62 6c 65 20 3d  ing_data_table =
e0310 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
e0320 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e0330 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
e0340 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e0350 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
e0360 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
e0370 54 29 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64  T)..goto invalid
e0380 5f 61 72 67 75 6d 65 6e 74 5f 32 3b 0a 20 20 20  _argument_2;.   
e0390 20 76 69 72 74 75 61 6c 5f 72 6f 75 74 69 6e 67   virtual_routing
e03a0 5f 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20  _table = (const 
e03b0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
e03c0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
e03d0 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71  [1]);.    if (sq
e03e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
e03f0 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51   (argv[2]) != SQ
e0400 4c 49 54 45 5f 54 45 58 54 29 0a 09 67 6f 74 6f  LITE_TEXT)..goto
e0410 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e   invalid_argumen
e0420 74 5f 33 3b 0a 20 20 20 20 69 6e 70 75 74 5f 74  t_3;.    input_t
e0430 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  able = (const ch
e0440 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
e0450 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32  lue_text (argv[2
e0460 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ]);.    if (sqli
e0470 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
e0480 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49  argv[3]) != SQLI
e0490 54 45 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69  TE_TEXT)..goto i
e04a0 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f  nvalid_argument_
e04b0 34 3b 0a 20 20 20 20 66 72 6f 6d 5f 63 6f 6c 75  4;.    from_colu
e04c0 6d 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  mn = (const char
e04d0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
e04e0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 33 5d 29  e_text (argv[3])
e04f0 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
e0500 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
e0510 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[4]) != SQLITE
e0520 5f 54 45 58 54 29 0a 09 67 6f 74 6f 20 69 6e 76  _TEXT)..goto inv
e0530 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 35 3b  alid_argument_5;
e0540 0a 20 20 20 20 74 6f 5f 63 6f 6c 75 6d 6e 20 3d  .    to_column =
e0550 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
e0560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e0570 78 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20  xt (argv[4]);.  
e0580 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e0590 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
e05a0 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ]) == SQLITE_NUL
e05b0 4c 29 0a 09 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 20  L)..geom_column 
e05c0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 6c 73 65  = NULL;.    else
e05d0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e05e0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d  ue_type (argv[5]
e05f0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
e0600 29 0a 09 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 20 3d  )..geom_column =
e0610 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
e0620 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e0630 78 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20  xt (argv[5]);.  
e0640 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20 69 6e 76    else..goto inv
e0650 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 36 3b  alid_argument_6;
e0660 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
e0670 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e0680 76 5b 36 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[6]) == SQLITE_
e0690 4e 55 4c 4c 29 0a 09 63 6f 73 74 5f 63 6f 6c 75  NULL)..cost_colu
e06a0 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65  mn = NULL;.    e
e06b0 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
e06c0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
e06d0 5b 36 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [6]) == SQLITE_T
e06e0 45 58 54 29 0a 09 63 6f 73 74 5f 63 6f 6c 75 6d  EXT)..cost_colum
e06f0 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  n = (const char 
e0700 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
e0710 5f 74 65 78 74 20 28 61 72 67 76 5b 36 5d 29 3b  _text (argv[6]);
e0720 0a 20 20 20 20 65 6c 73 65 0a 09 67 6f 74 6f 20  .    else..goto 
e0730 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74  invalid_argument
e0740 5f 37 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63  _7;.    if (argc
e0750 20 3e 3d 20 31 30 29 0a 20 20 20 20 20 20 7b 0a   >= 10).      {.
e0760 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
e0770 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
e0780 37 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55  7]) == SQLITE_NU
e0790 4c 4c 29 0a 09 20 20 20 20 20 20 6e 61 6d 65 5f  LL)..      name_
e07a0 63 6f 6c 75 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 09  column = NULL;..
e07b0 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
e07c0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
e07d0 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[7]) == SQLIT
e07e0 45 5f 54 45 58 54 29 0a 09 20 20 20 20 20 20 6e  E_TEXT)..      n
e07f0 61 6d 65 5f 63 6f 6c 75 6d 6e 20 3d 20 28 63 6f  ame_column = (co
e0800 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
e0810 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
e0820 61 72 67 76 5b 37 5d 29 3b 0a 09 20 20 65 6c 73  argv[7]);..  els
e0830 65 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 69 6e  e..      goto in
e0840 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 38  valid_argument_8
e0850 3b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  ;..  if (sqlite3
e0860 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e0870 76 5b 38 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[8]) != SQLITE_
e0880 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20  INTEGER)..      
e0890 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72 67  goto invalid_arg
e08a0 75 6d 65 6e 74 5f 39 3b 0a 09 20 20 61 5f 73 74  ument_9;..  a_st
e08b0 61 72 5f 65 6e 61 62 6c 65 64 20 3d 20 73 71 6c  ar_enabled = sql
e08c0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
e08d0 61 72 67 76 5b 38 5d 29 3b 0a 09 20 20 69 66 20  argv[8]);..  if 
e08e0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
e08f0 79 70 65 20 28 61 72 67 76 5b 39 5d 29 20 21 3d  ype (argv[9]) !=
e0900 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
e0910 0a 09 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 76  ..      goto inv
e0920 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 31 30  alid_argument_10
e0930 3b 0a 09 20 20 62 69 64 69 72 65 63 74 69 6f 6e  ;..  bidirection
e0940 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
e0950 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 39 5d 29  ue_int (argv[9])
e0960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
e0970 20 28 61 72 67 63 20 3e 3d 20 31 32 29 0a 20 20   (argc >= 12).  
e0980 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
e0990 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
e09a0 28 61 72 67 76 5b 31 30 5d 29 20 3d 3d 20 53 51  (argv[10]) == SQ
e09b0 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 20 20 20 20  LITE_NULL)..    
e09c0 20 20 6f 6e 65 77 61 79 5f 66 72 6f 6d 20 3d 20    oneway_from = 
e09d0 4e 55 4c 4c 3b 0a 09 20 20 65 6c 73 65 20 69 66  NULL;..  else if
e09e0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
e09f0 74 79 70 65 20 28 61 72 67 76 5b 31 30 5d 29 20  type (argv[10]) 
e0a00 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
e0a10 09 20 20 20 20 20 20 6f 6e 65 77 61 79 5f 66 72  .      oneway_fr
e0a20 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  om = (const char
e0a30 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
e0a40 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 30 5d  e_text (argv[10]
e0a50 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
e0a60 20 20 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61    goto invalid_a
e0a70 72 67 75 6d 65 6e 74 5f 31 31 3b 0a 09 20 20 69  rgument_11;..  i
e0a80 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
e0a90 5f 74 79 70 65 20 28 61 72 67 76 5b 31 31 5d 29  _type (argv[11])
e0aa0 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29   == SQLITE_NULL)
e0ab0 0a 09 20 20 20 20 20 20 6f 6e 65 77 61 79 5f 74  ..      oneway_t
e0ac0 6f 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 65 6c 73  o = NULL;..  els
e0ad0 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
e0ae0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
e0af0 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45  1]) == SQLITE_TE
e0b00 58 54 29 0a 09 20 20 20 20 20 20 6f 6e 65 77 61  XT)..      onewa
e0b10 79 5f 74 6f 20 3d 20 28 63 6f 6e 73 74 20 63 68  y_to = (const ch
e0b20 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
e0b30 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
e0b40 31 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  1]);..  else..  
e0b50 20 20 20 20 67 6f 74 6f 20 69 6e 76 61 6c 69 64      goto invalid
e0b60 5f 61 72 67 75 6d 65 6e 74 5f 31 32 3b 0a 20 20  _argument_12;.  
e0b70 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
e0b80 67 63 20 3e 3d 20 31 33 29 0a 20 20 20 20 20 20  gc >= 13).      
e0b90 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
e0ba0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e0bb0 76 5b 31 32 5d 29 20 21 3d 20 53 51 4c 49 54 45  v[12]) != SQLITE
e0bc0 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20  _INTEGER)..     
e0bd0 20 67 6f 74 6f 20 69 6e 76 61 6c 69 64 5f 61 72   goto invalid_ar
e0be0 67 75 6d 65 6e 74 5f 31 33 3b 0a 09 20 20 6f 76  gument_13;..  ov
e0bf0 65 72 77 72 69 74 65 20 3d 20 73 71 6c 69 74 65  erwrite = sqlite
e0c00 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
e0c10 76 5b 31 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  v[12]);.      }.
e0c20 20 20 20 20 69 66 20 28 67 61 69 61 5f 63 72 65      if (gaia_cre
e0c30 61 74 65 5f 72 6f 75 74 69 6e 67 0a 09 28 73 71  ate_routing..(sq
e0c40 6c 69 74 65 2c 20 63 61 63 68 65 2c 20 72 6f 75  lite, cache, rou
e0c50 74 69 6e 67 5f 64 61 74 61 5f 74 61 62 6c 65 2c  ting_data_table,
e0c60 20 76 69 72 74 75 61 6c 5f 72 6f 75 74 69 6e 67   virtual_routing
e0c70 5f 74 61 62 6c 65 2c 0a 09 20 69 6e 70 75 74 5f  _table,.. input_
e0c80 74 61 62 6c 65 2c 20 66 72 6f 6d 5f 63 6f 6c 75  table, from_colu
e0c90 6d 6e 2c 20 74 6f 5f 63 6f 6c 75 6d 6e 2c 20 67  mn, to_column, g
e0ca0 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 63 6f 73 74  eom_column, cost
e0cb0 5f 63 6f 6c 75 6d 6e 2c 0a 09 20 6e 61 6d 65 5f  _column,.. name_
e0cc0 63 6f 6c 75 6d 6e 2c 20 61 5f 73 74 61 72 5f 65  column, a_star_e
e0cd0 6e 61 62 6c 65 64 2c 20 62 69 64 69 72 65 63 74  nabled, bidirect
e0ce0 69 6f 6e 61 6c 2c 20 6f 6e 65 77 61 79 5f 66 72  ional, oneway_fr
e0cf0 6f 6d 2c 20 6f 6e 65 77 61 79 5f 74 6f 2c 0a 09  om, oneway_to,..
e0d00 20 6f 76 65 72 77 72 69 74 65 29 29 0a 09 73 71   overwrite))..sq
e0d10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
e0d20 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20   (context, 1);. 
e0d30 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
e0d40 09 20 20 2f 2a 20 74 68 65 72 65 20 77 61 73 20  .  /* there was 
e0d50 61 6e 20 65 72 72 6f 72 2c 20 72 61 69 73 69 6e  an error, raisin
e0d60 67 20 61 6e 20 45 78 63 65 70 74 69 6f 6e 20 2a  g an Exception *
e0d70 2f 0a 09 20 20 63 68 61 72 20 2a 6d 73 67 5f 65  /..  char *msg_e
e0d80 72 72 3b 0a 09 20 20 6d 73 67 20 3d 20 67 61 69  rr;..  msg = gai
e0d90 61 5f 63 72 65 61 74 65 5f 72 6f 75 74 69 6e 67  a_create_routing
e0da0 5f 67 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 20  _get_last_error 
e0db0 28 63 61 63 68 65 29 3b 0a 09 20 20 69 66 20 28  (cache);..  if (
e0dc0 6d 73 67 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20  msg == NULL)..  
e0dd0 20 20 20 20 6d 73 67 5f 65 72 72 20 3d 0a 09 09      msg_err =...
e0de0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
e0df0 66 20 28 22 43 72 65 61 74 65 52 6f 75 74 69 6e  f ("CreateRoutin
e0e00 67 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 55 6e  g exception - Un
e0e10 6b 6e 6f 77 6e 20 72 65 61 73 6f 6e 22 29 3b 0a  known reason");.
e0e20 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 6d  .  else..      m
e0e30 73 67 5f 65 72 72 20 3d 20 73 71 6c 69 74 65 33  sg_err = sqlite3
e0e40 5f 6d 70 72 69 6e 74 66 20 28 22 43 72 65 61 74  _mprintf ("Creat
e0e50 65 52 6f 75 74 69 6e 67 20 65 78 63 65 70 74 69  eRouting excepti
e0e60 6f 6e 20 2d 20 25 73 22 2c 20 6d 73 67 29 3b 0a  on - %s", msg);.
e0e70 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
e0e80 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74  t_error (context
e0e90 2c 20 6d 73 67 5f 65 72 72 2c 20 2d 31 29 3b 0a  , msg_err, -1);.
e0ea0 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20  .  sqlite3_free 
e0eb0 28 6d 73 67 5f 65 72 72 29 3b 0a 20 20 20 20 20  (msg_err);.     
e0ec0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a   }.    return;..
e0ed0 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65    invalid_argume
e0ee0 6e 74 5f 31 3a 0a 20 20 20 20 6d 73 67 20 3d 0a  nt_1:.    msg =.
e0ef0 09 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67 20  ."CreateRouting 
e0f00 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65  exception - ille
e0f10 67 61 6c 20 52 6f 75 74 69 6e 67 2d 44 61 74 61  gal Routing-Data
e0f20 20 54 61 62 6c 65 20 4e 61 6d 65 20 5b 6e 6f 74   Table Name [not
e0f30 20 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e   a TEXT string].
e0f40 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ";.    sqlite3_r
e0f50 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e  esult_error (con
e0f60 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  text, msg, -1);.
e0f70 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69      return;..  i
e0f80 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f  nvalid_argument_
e0f90 32 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43  2:.    msg =.."C
e0fa0 72 65 61 74 65 52 6f 75 74 69 6e 67 20 65 78 63  reateRouting exc
e0fb0 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c  eption - illegal
e0fc0 20 56 69 72 74 75 61 6c 52 6f 75 74 69 6e 67 2d   VirtualRouting-
e0fd0 54 61 62 6c 65 20 4e 61 6d 65 20 5b 6e 6f 74 20  Table Name [not 
e0fe0 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e 22  a TEXT string]."
e0ff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
e1000 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
e1010 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
e1020 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e     return;..  in
e1030 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 33  valid_argument_3
e1040 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72  :.    msg =.."Cr
e1050 65 61 74 65 52 6f 75 74 69 6e 67 20 65 78 63 65  eateRouting exce
e1060 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20  ption - illegal 
e1070 49 6e 70 75 74 2d 54 61 62 6c 65 20 4e 61 6d 65  Input-Table Name
e1080 20 5b 6e 6f 74 20 61 20 54 45 58 54 20 73 74 72   [not a TEXT str
e1090 69 6e 67 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69  ing].";.    sqli
e10a0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
e10b0 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20   (context, msg, 
e10c0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
e10d0 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75  ..  invalid_argu
e10e0 6d 65 6e 74 5f 34 3a 0a 20 20 20 20 6d 73 67 20  ment_4:.    msg 
e10f0 3d 0a 09 22 43 72 65 61 74 65 52 6f 75 74 69 6e  =.."CreateRoutin
e1100 67 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69 6c  g exception - il
e1110 6c 65 67 61 6c 20 46 72 6f 6d 4e 6f 64 65 20 43  legal FromNode C
e1120 6f 6c 75 6d 6e 20 4e 61 6d 65 20 5b 6e 6f 74 20  olumn Name [not 
e1130 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d 2e 22  a TEXT string]."
e1140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
e1150 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
e1160 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
e1170 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e     return;..  in
e1180 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 35  valid_argument_5
e1190 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72  :.    msg =.."Cr
e11a0 65 61 74 65 52 6f 75 74 69 6e 67 20 65 78 63 65  eateRouting exce
e11b0 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20  ption - illegal 
e11c0 54 6f 4e 6f 64 65 20 43 6f 6c 75 6d 6e 20 4e 61  ToNode Column Na
e11d0 6d 65 20 5b 6e 6f 74 20 61 20 54 45 58 54 20 73  me [not a TEXT s
e11e0 74 72 69 6e 67 5d 2e 22 3b 0a 20 20 20 20 73 71  tring].";.    sq
e11f0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
e1200 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67  or (context, msg
e1210 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
e1220 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72  n;..  invalid_ar
e1230 67 75 6d 65 6e 74 5f 36 3a 0a 20 20 20 20 6d 73  gument_6:.    ms
e1240 67 20 3d 0a 09 22 43 72 65 61 74 65 52 6f 75 74  g =.."CreateRout
e1250 69 6e 67 20 65 78 63 65 70 74 69 6f 6e 20 2d 20  ing exception - 
e1260 69 6c 6c 65 67 61 6c 20 47 65 6f 6d 65 74 72 79  illegal Geometry
e1270 20 43 6f 6c 75 6d 6e 20 4e 61 6d 65 20 5b 6e 6f   Column Name [no
e1280 74 20 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d  t a TEXT string]
e1290 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  .";.    sqlite3_
e12a0 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f  result_error (co
e12b0 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b  ntext, msg, -1);
e12c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
e12d0 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74  invalid_argument
e12e0 5f 37 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22  _7:.    msg =.."
e12f0 43 72 65 61 74 65 52 6f 75 74 69 6e 67 20 65 78  CreateRouting ex
e1300 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61  ception - illega
e1310 6c 20 43 6f 73 74 20 43 6f 6c 75 6d 6e 20 4e 61  l Cost Column Na
e1320 6d 65 20 5b 6e 6f 74 20 61 20 54 45 58 54 20 73  me [not a TEXT s
e1330 74 72 69 6e 67 5d 2e 22 3b 0a 20 20 20 20 73 71  tring].";.    sq
e1340 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
e1350 6f 72 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67  or (context, msg
e1360 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
e1370 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72  n;..  invalid_ar
e1380 67 75 6d 65 6e 74 5f 38 3a 0a 20 20 20 20 6d 73  gument_8:.    ms
e1390 67 20 3d 0a 09 22 43 72 65 61 74 65 52 6f 75 74  g =.."CreateRout
e13a0 69 6e 67 20 65 78 63 65 70 74 69 6f 6e 20 2d 20  ing exception - 
e13b0 69 6c 6c 65 67 61 6c 20 52 6f 61 64 4e 61 6d 65  illegal RoadName
e13c0 20 43 6f 6c 75 6d 6e 20 4e 61 6d 65 20 5b 6e 6f   Column Name [no
e13d0 74 20 61 20 54 45 58 54 20 73 74 72 69 6e 67 5d  t a TEXT string]
e13e0 2e 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  .";.    sqlite3_
e13f0 72 65 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f  result_error (co
e1400 6e 74 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b  ntext, msg, -1);
e1410 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
e1420 69 6e 76 61 6c 69 64 5f 61 72 67 75 6d 65 6e 74  invalid_argument
e1430 5f 39 3a 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22  _9:.    msg =.."
e1440 43 72 65 61 74 65 52 6f 75 74 69 6e 67 20 65 78  CreateRouting ex
e1450 63 65 70 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61  ception - illega
e1460 6c 20 41 2a 20 45 6e 61 62 6c 65 64 20 6f 70 74  l A* Enabled opt
e1470 69 6f 6e 20 5b 6e 6f 74 20 61 6e 20 49 4e 54 45  ion [not an INTE
e1480 47 45 52 5d 2e 22 3b 0a 20 20 20 20 73 71 6c 69  GER].";.    sqli
e1490 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
e14a0 20 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20   (context, msg, 
e14b0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
e14c0 0a 0a 20 20 69 6e 76 61 6c 69 64 5f 61 72 67 75  ..  invalid_argu
e14d0 6d 65 6e 74 5f 31 30 3a 0a 20 20 20 20 6d 73 67  ment_10:.    msg
e14e0 20 3d 0a 09 22 43 72 65 61 74 65 52 6f 75 74 69   =.."CreateRouti
e14f0 6e 67 20 65 78 63 65 70 74 69 6f 6e 20 2d 20 69  ng exception - i
e1500 6c 6c 65 67 61 6c 20 42 69 64 69 72 65 63 74 69  llegal Bidirecti
e1510 6f 6e 61 6c 20 6f 70 74 69 6f 6e 20 5b 6e 6f 74  onal option [not
e1520 20 61 6e 20 49 4e 54 45 47 45 52 5d 2e 22 3b 0a   an INTEGER].";.
e1530 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e1540 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78  lt_error (contex
e1550 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  t, msg, -1);.   
e1560 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61   return;..  inva
e1570 6c 69 64 5f 61 72 67 75 6d 65 6e 74 5f 31 31 3a  lid_argument_11:
e1580 0a 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72 65  .    msg =.."Cre
e1590 61 74 65 52 6f 75 74 69 6e 67 20 65 78 63 65 70  ateRouting excep
e15a0 74 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 4f  tion - illegal O
e15b0 6e 65 77 61 79 46 72 6f 6d 54 6f 20 43 6f 6c 75  newayFromTo Colu
e15c0 6d 6e 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54  mn Name [not a T
e15d0 45 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20  EXT string].";. 
e15e0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
e15f0 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74  t_error (context
e1600 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20  , msg, -1);.    
e1610 72 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c  return;..  inval
e1620 69 64 5f 61 72 67 75 6d 65 6e 74 5f 31 32 3a 0a  id_argument_12:.
e1630 20 20 20 20 6d 73 67 20 3d 0a 09 22 43 72 65 61      msg =.."Crea
e1640 74 65 52 6f 75 74 69 6e 67 20 65 78 63 65 70 74  teRouting except
e1650 69 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 4f 6e  ion - illegal On
e1660 65 77 61 79 54 6f 46 72 6f 6d 20 43 6f 6c 75 6d  ewayToFrom Colum
e1670 6e 20 4e 61 6d 65 20 5b 6e 6f 74 20 61 20 54 45  n Name [not a TE
e1680 58 54 20 73 74 72 69 6e 67 5d 2e 22 3b 0a 20 20  XT string].";.  
e1690 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e16a0 5f 65 72 72 6f 72 20 28 63 6f 6e 74 65 78 74 2c  _error (context,
e16b0 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 72   msg, -1);.    r
e16c0 65 74 75 72 6e 3b 0a 0a 20 20 69 6e 76 61 6c 69  eturn;..  invali
e16d0 64 5f 61 72 67 75 6d 65 6e 74 5f 31 33 3a 0a 20  d_argument_13:. 
e16e0 20 20 20 6d 73 67 20 3d 0a 09 22 43 72 65 61 74     msg =.."Creat
e16f0 65 52 6f 75 74 69 6e 67 20 65 78 63 65 70 74 69  eRouting excepti
e1700 6f 6e 20 2d 20 69 6c 6c 65 67 61 6c 20 4f 76 65  on - illegal Ove
e1710 72 57 72 69 74 65 20 6f 70 74 69 6f 6e 20 5b 6e  rWrite option [n
e1720 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 5d 2e 22  ot an INTEGER]."
e1730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
e1740 73 75 6c 74 5f 65 72 72 6f 72 20 28 63 6f 6e 74  sult_error (cont
e1750 65 78 74 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  ext, msg, -1);. 
e1760 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74     return;.}..st
e1770 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63  atic void.fnct_c
e1780 72 65 61 74 65 5f 72 6f 75 74 69 6e 67 5f 67 65  reate_routing_ge
e1790 74 5f 6c 61 73 74 5f 65 72 72 6f 72 20 28 73 71  t_last_error (sq
e17a0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
e17b0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
e17c0 63 2c 0a 09 09 09 09 20 20 20 20 73 71 6c 69 74  c,.....    sqlit
e17d0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
e17e0 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
e17f0 69 6f 6e 3a 0a 2f 20 43 72 65 61 74 65 52 6f 75  ion:./ CreateRou
e1800 74 69 6e 67 5f 47 65 74 4c 61 73 74 45 72 72 6f  ting_GetLastErro
e1810 72 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a  r()././ returns:
e1820 0a 2f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ./ the most rece
e1830 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nt error message
e1840 20 72 61 69 73 65 64 20 62 79 20 43 72 65 61 74   raised by Creat
e1850 65 52 6f 75 74 69 6e 67 0a 2f 20 6f 72 20 4e 55  eRouting./ or NU
e1860 4c 4c 20 69 66 20 6e 6f 20 73 75 63 68 20 6d 65  LL if no such me
e1870 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
e1880 6c 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  le.*/.    const 
e1890 63 68 61 72 20 2a 65 72 72 5f 6d 73 67 3b 0a 20  char *err_msg;. 
e18a0 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
e18b0 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
e18c0 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
e18d0 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
e18e0 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
e18f0 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
e1900 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
e1910 20 20 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d      if (cache ==
e1920 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
e1930 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e1940 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
e1950 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
e1960 20 20 7d 0a 0a 20 20 20 20 65 72 72 5f 6d 73 67    }..    err_msg
e1970 20 3d 20 67 61 69 61 5f 63 72 65 61 74 65 5f 72   = gaia_create_r
e1980 6f 75 74 69 6e 67 5f 67 65 74 5f 6c 61 73 74 5f  outing_get_last_
e1990 65 72 72 6f 72 20 28 63 61 63 68 65 29 3b 0a 20  error (cache);. 
e19a0 20 20 20 69 66 20 28 65 72 72 5f 6d 73 67 20 3d     if (err_msg =
e19b0 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
e19c0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e19d0 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
e19e0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
e19f0 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
e1a00 65 72 72 5f 6d 73 67 2c 20 73 74 72 6c 65 6e 20  err_msg, strlen 
e1a10 28 65 72 72 5f 6d 73 67 29 2c 20 53 51 4c 49 54  (err_msg), SQLIT
e1a20 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 23 69  E_STATIC);.}..#i
e1a30 66 6e 64 65 66 20 4f 4d 49 54 5f 46 52 45 45 58  fndef OMIT_FREEX
e1a40 4c 09 09 2f 2a 20 46 52 45 45 58 4c 20 69 73 20  L../* FREEXL is 
e1a50 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
e1a60 63 20 76 6f 69 64 0a 66 6e 63 74 5f 49 6d 70 6f  c void.fnct_Impo
e1a70 72 74 58 4c 53 20 28 73 71 6c 69 74 65 33 5f 63  rtXLS (sqlite3_c
e1a80 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
e1a90 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
e1aa0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
e1ab0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
e1ac0 74 69 6f 6e 3a 0a 2f 20 49 6d 70 6f 72 74 58 4c  tion:./ ImportXL
e1ad0 53 28 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c  S(TEXT filename,
e1ae0 20 54 45 58 54 20 74 61 62 6c 65 29 0a 2f 20 49   TEXT table)./ I
e1af0 6d 70 6f 72 74 58 4c 53 28 54 45 58 54 20 66 69  mportXLS(TEXT fi
e1b00 6c 65 6e 61 6d 65 2c 20 54 45 58 54 20 74 61 62  lename, TEXT tab
e1b10 6c 65 2c 20 49 4e 54 20 77 6f 72 6b 73 68 65 65  le, INT workshee
e1b20 74 5f 69 6e 64 65 78 29 0a 2f 20 49 6d 70 6f 72  t_index)./ Impor
e1b30 74 58 4c 53 28 54 45 58 54 20 66 69 6c 65 6e 61  tXLS(TEXT filena
e1b40 6d 65 2c 20 54 45 58 54 20 74 61 62 6c 65 2c 20  me, TEXT table, 
e1b50 49 4e 54 20 77 6f 72 6b 73 68 65 65 74 5f 69 6e  INT worksheet_in
e1b60 64 65 78 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  dex,./          
e1b70 49 4e 54 20 66 69 72 73 74 5f 6c 69 6e 65 5f 74  INT first_line_t
e1b80 69 74 6c 65 73 29 0a 2f 0a 2f 20 72 65 74 75 72  itles)././ retur
e1b90 6e 73 3a 0a 2f 20 74 68 65 20 6e 75 6d 62 65 72  ns:./ the number
e1ba0 20 6f 66 20 69 6e 73 65 72 74 65 64 20 72 6f 77   of inserted row
e1bb0 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61  s./ NULL on inva
e1bc0 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
e1bd0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e1be0 2a 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 63  *filename;.    c
e1bf0 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65  onst char *table
e1c00 3b 0a 20 20 20 20 69 6e 74 20 77 69 64 78 3b 0a  ;.    int widx;.
e1c10 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
e1c20 20 77 6f 72 6b 73 68 65 65 74 5f 69 6e 64 65 78   worksheet_index
e1c30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 69   = 0;.    int fi
e1c40 72 73 74 5f 6c 69 6e 65 5f 74 69 74 6c 65 73 20  rst_line_titles 
e1c50 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  = 0;.    int ret
e1c60 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
e1c70 6e 74 20 72 6f 77 73 3b 0a 20 20 20 20 73 71 6c  nt rows;.    sql
e1c80 69 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20  ite3 *db_handle 
e1c90 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
e1ca0 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
e1cb0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
e1cc0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
e1cd0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
e1ce0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
e1cf0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e1d00 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
e1d10 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
e1d20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e1d30 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
e1d40 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
e1d50 20 7d 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 20   }.    filename 
e1d60 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
e1d70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
e1d80 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
e1d90 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
e1da0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
e1db0 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  1]) != SQLITE_TE
e1dc0 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
e1dd0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e1de0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
e1df0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
e1e00 0a 20 20 20 20 74 61 62 6c 65 20 3d 20 28 63 6f  .    table = (co
e1e10 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
e1e20 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
e1e30 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
e1e40 20 28 61 72 67 63 20 3e 20 32 29 0a 20 20 20 20   (argc > 2).    
e1e50 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
e1e60 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
e1e70 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[2]) != SQLIT
e1e80 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
e1e90 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
e1ea0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
e1eb0 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
e1ec0 20 20 7d 0a 09 20 20 77 69 64 78 20 3d 20 73 71    }..  widx = sq
e1ed0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
e1ee0 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 69 66  (argv[2]);..  if
e1ef0 20 28 77 69 64 78 20 3c 20 30 29 0a 09 20 20 20   (widx < 0)..   
e1f00 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
e1f10 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
e1f20 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
e1f30 20 20 20 7d 0a 09 20 20 77 6f 72 6b 73 68 65 65     }..  workshee
e1f40 74 5f 69 6e 64 65 78 20 3d 20 77 69 64 78 3b 0a  t_index = widx;.
e1f50 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
e1f60 61 72 67 63 20 3e 20 33 29 0a 20 20 20 20 20 20  argc > 3).      
e1f70 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
e1f80 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e1f90 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[3]) != SQLITE_
e1fa0 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
e1fb0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
e1fc0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
e1fd0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
e1fe0 7d 0a 09 20 20 66 69 72 73 74 5f 6c 69 6e 65 5f  }..  first_line_
e1ff0 74 69 74 6c 65 73 20 3d 20 73 71 6c 69 74 65 33  titles = sqlite3
e2000 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
e2010 5b 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  [3]);.      }.. 
e2020 20 20 20 72 65 74 20 3d 0a 09 6c 6f 61 64 5f 58     ret =..load_X
e2030 4c 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20 66 69  L (db_handle, fi
e2040 6c 65 6e 61 6d 65 2c 20 74 61 62 6c 65 2c 20 77  lename, table, w
e2050 6f 72 6b 73 68 65 65 74 5f 69 6e 64 65 78 2c 0a  orksheet_index,.
e2060 09 09 20 66 69 72 73 74 5f 6c 69 6e 65 5f 74 69  .. first_line_ti
e2070 74 6c 65 73 2c 20 26 72 6f 77 73 2c 20 4e 55 4c  tles, &rows, NUL
e2080 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 72 65  L);..    if (!re
e2090 74 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  t)..sqlite3_resu
e20a0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
e20b0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
e20c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
e20d0 28 63 6f 6e 74 65 78 74 2c 20 72 6f 77 73 29 3b  (context, rows);
e20e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64  .}.#endif /* end
e20f0 20 46 52 45 45 58 4c 20 73 75 70 70 6f 72 74 20   FREEXL support 
e2100 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54  */..#ifndef OMIT
e2110 5f 49 43 4f 4e 56 09 09 2f 2a 20 49 43 4f 4e 56  _ICONV../* ICONV
e2120 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   is supported */
e2130 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
e2140 74 5f 49 6d 70 6f 72 74 44 42 46 20 28 73 71 6c  t_ImportDBF (sql
e2150 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
e2160 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
e2170 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
e2180 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
e2190 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 49 6d  L function:./ Im
e21a0 70 6f 72 74 44 42 46 28 54 45 58 54 20 66 69 6c  portDBF(TEXT fil
e21b0 65 6e 61 6d 65 2c 20 54 45 58 54 20 74 61 62 6c  ename, TEXT tabl
e21c0 65 2c 20 54 45 58 54 20 63 68 61 72 73 65 74 29  e, TEXT charset)
e21d0 0a 2f 20 49 6d 70 6f 72 74 44 42 46 28 54 45 58  ./ ImportDBF(TEX
e21e0 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58 54  T filename, TEXT
e21f0 20 74 61 62 6c 65 2c 20 54 45 58 54 20 63 68 61   table, TEXT cha
e2200 72 73 65 74 2c 20 54 45 58 54 20 70 6b 5f 63 6f  rset, TEXT pk_co
e2210 6c 75 6d 6e 29 0a 2f 20 49 6d 70 6f 72 74 44 42  lumn)./ ImportDB
e2220 46 28 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c  F(TEXT filename,
e2230 20 54 45 58 54 20 74 61 62 6c 65 2c 20 54 45 58   TEXT table, TEX
e2240 54 20 63 68 61 72 73 65 74 2c 20 54 45 58 54 20  T charset, TEXT 
e2250 70 6b 5f 63 6f 6c 75 6d 6e 2c 0a 2f 20 20 20 20  pk_column,./    
e2260 20 20 20 20 20 20 20 49 4e 54 45 47 45 52 20 74         INTEGER t
e2270 65 78 74 5f 64 61 74 65 73 29 0a 2f 20 49 6d 70  ext_dates)./ Imp
e2280 6f 72 74 44 42 46 28 54 45 58 54 20 66 69 6c 65  ortDBF(TEXT file
e2290 6e 61 6d 65 2c 20 54 45 58 54 20 74 61 62 6c 65  name, TEXT table
e22a0 2c 20 54 45 58 54 20 63 68 61 72 73 65 74 2c 20  , TEXT charset, 
e22b0 54 45 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e 2c 0a  TEXT pk_column,.
e22c0 2f 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  /           INTE
e22d0 47 45 52 20 74 65 78 74 5f 64 61 74 65 73 2c 20  GER text_dates, 
e22e0 49 4e 54 45 47 45 52 20 63 6f 6c 6e 61 6d 65 5f  INTEGER colname_
e22f0 63 61 73 65 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  case)././ return
e2300 73 3a 0a 2f 20 74 68 65 20 6e 75 6d 62 65 72 20  s:./ the number 
e2310 6f 66 20 69 6e 73 65 72 74 65 64 20 72 6f 77 73  of inserted rows
e2320 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76 61 6c  ./ NULL on inval
e2330 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
e2340 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
e2350 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20   char *table;.  
e2360 20 20 63 68 61 72 20 2a 70 61 74 68 3b 0a 20 20    char *path;.  
e2370 20 20 63 68 61 72 20 2a 63 68 61 72 73 65 74 3b    char *charset;
e2380 0a 20 20 20 20 63 68 61 72 20 2a 70 6b 5f 63 6f  .    char *pk_co
e2390 6c 75 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  lumn = NULL;.   
e23a0 20 69 6e 74 20 74 65 78 74 5f 64 61 74 65 73 20   int text_dates 
e23b0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6c  = 0;.    int col
e23c0 6e 61 6d 65 5f 63 61 73 65 20 3d 20 47 41 49 41  name_case = GAIA
e23d0 5f 44 42 46 5f 43 4f 4c 4e 41 4d 45 5f 4c 4f 57  _DBF_COLNAME_LOW
e23e0 45 52 43 41 53 45 3b 0a 20 20 20 20 69 6e 74 20  ERCASE;.    int 
e23f0 72 6f 77 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  rows;.    sqlite
e2400 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d 20 73  3 *db_handle = s
e2410 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
e2420 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
e2430 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
e2440 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
e2450 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
e2460 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e2470 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
e2480 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
e2490 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
e24a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
e24b0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
e24c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
e24d0 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72      path = (char
e24e0 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
e24f0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
e2500 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
e2510 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
e2520 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
e2530 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
e2540 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e2550 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
e2560 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
e2570 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d 20    }.    table = 
e2580 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33  (char *) sqlite3
e2590 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
e25a0 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73  v[1]);.    if (s
e25b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
e25c0 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53  e (argv[2]) != S
e25d0 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20  QLITE_TEXT).    
e25e0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
e25f0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
e2600 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
e2610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 68 61  .      }.    cha
e2620 72 73 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  rset = (char *) 
e2630 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e2640 78 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  xt (argv[2]);.  
e2650 20 20 69 66 20 28 61 72 67 63 20 3e 20 33 29 0a    if (argc > 3).
e2660 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
e2670 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
e2680 65 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53  e (argv[3]) != S
e2690 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
e26a0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
e26b0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
e26c0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
e26d0 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
e26e0 20 20 20 20 70 6b 5f 63 6f 6c 75 6d 6e 20 3d 20      pk_column = 
e26f0 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33  (char *) sqlite3
e2700 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
e2710 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[3]);.      }. 
e2720 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 34 29     if (argc > 4)
e2730 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
e2740 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
e2750 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21 3d 20  pe (argv[4]) != 
e2760 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
e2770 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
e2780 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e2790 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
e27a0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
e27b0 0a 09 20 20 20 20 20 20 74 65 78 74 5f 64 61 74  ..      text_dat
e27c0 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
e27d0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 34 5d 29  ue_int (argv[4])
e27e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
e27f0 20 28 61 72 67 63 20 3e 20 35 29 0a 20 20 20 20   (argc > 5).    
e2800 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
e2810 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
e2820 72 67 76 5b 35 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[5]) != SQLIT
e2830 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09  E_TEXT)..    {..
e2840 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
e2850 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
e2860 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
e2870 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
e2880 09 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61  ..const char *va
e2890 6c 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c  l = (char *) sql
e28a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
e28b0 28 61 72 67 76 5b 35 5d 29 3b 0a 09 09 69 66 20  (argv[5]);...if 
e28c0 28 73 74 72 63 61 73 65 63 6d 70 20 28 76 61 6c  (strcasecmp (val
e28d0 2c 20 22 55 50 50 45 52 22 29 20 3d 3d 20 30 0a  , "UPPER") == 0.
e28e0 09 09 20 20 20 20 7c 7c 20 73 74 72 63 61 73 65  ..    || strcase
e28f0 63 6d 70 20 28 76 61 6c 2c 20 22 55 50 50 45 52  cmp (val, "UPPER
e2900 43 41 53 45 22 29 20 3d 3d 20 30 29 0a 09 09 20  CASE") == 0)... 
e2910 20 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20     colname_case 
e2920 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41  = GAIA_DBF_COLNA
e2930 4d 45 5f 55 50 50 45 52 43 41 53 45 3b 0a 09 09  ME_UPPERCASE;...
e2940 65 6c 73 65 20 69 66 20 28 73 74 72 63 61 73 65  else if (strcase
e2950 63 6d 70 20 28 76 61 6c 2c 20 22 53 41 4d 45 22  cmp (val, "SAME"
e2960 29 20 3d 3d 20 30 0a 09 09 09 20 7c 7c 20 73 74  ) == 0.... || st
e2970 72 63 61 73 65 63 6d 70 20 28 76 61 6c 2c 20 22  rcasecmp (val, "
e2980 53 41 4d 45 43 41 53 45 22 29 20 3d 3d 20 30 29  SAMECASE") == 0)
e2990 0a 09 09 20 20 20 20 63 6f 6c 6e 61 6d 65 5f 63  ...    colname_c
e29a0 61 73 65 20 3d 20 47 41 49 41 5f 44 42 46 5f 43  ase = GAIA_DBF_C
e29b0 4f 4c 4e 41 4d 45 5f 43 41 53 45 5f 49 47 4e 4f  OLNAME_CASE_IGNO
e29c0 52 45 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20  RE;...else...   
e29d0 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20 3d 20   colname_case = 
e29e0 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41 4d 45  GAIA_DBF_COLNAME
e29f0 5f 4c 4f 57 45 52 43 41 53 45 3b 0a 09 20 20 20  _LOWERCASE;..   
e2a00 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
e2a10 72 65 74 20 3d 0a 09 6c 6f 61 64 5f 64 62 66 5f  ret =..load_dbf_
e2a20 65 78 33 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20  ex3 (db_handle, 
e2a30 70 61 74 68 2c 20 74 61 62 6c 65 2c 20 70 6b 5f  path, table, pk_
e2a40 63 6f 6c 75 6d 6e 2c 20 63 68 61 72 73 65 74 2c  column, charset,
e2a50 20 31 2c 0a 09 09 20 20 20 20 20 20 74 65 78 74   1,...      text
e2a60 5f 64 61 74 65 73 2c 20 26 72 6f 77 73 2c 20 63  _dates, &rows, c
e2a70 6f 6c 6e 61 6d 65 5f 63 61 73 65 2c 20 4e 55 4c  olname_case, NUL
e2a80 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 6f 77  L);..    if (row
e2a90 73 20 3c 20 30 20 7c 7c 20 21 72 65 74 29 0a 09  s < 0 || !ret)..
e2aa0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
e2ab0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
e2ac0 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
e2ad0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
e2ae0 74 65 78 74 2c 20 72 6f 77 73 29 3b 0a 7d 0a 0a  text, rows);.}..
e2af0 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
e2b00 5f 45 78 70 6f 72 74 44 42 46 20 28 73 71 6c 69  _ExportDBF (sqli
e2b10 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
e2b20 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
e2b30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
e2b40 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
e2b50 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45 78 70   function:./ Exp
e2b60 6f 72 74 44 42 46 28 54 45 58 54 20 74 61 62 6c  ortDBF(TEXT tabl
e2b70 65 2c 20 54 45 58 54 20 66 69 6c 65 6e 61 6d 65  e, TEXT filename
e2b80 2c 20 54 45 58 54 20 63 68 61 72 73 65 74 29 0a  , TEXT charset).
e2b90 2f 20 45 78 70 6f 72 74 44 42 46 28 54 45 58 54  / ExportDBF(TEXT
e2ba0 20 74 61 62 6c 65 2c 20 54 45 58 54 20 66 69 6c   table, TEXT fil
e2bb0 65 6e 61 6d 65 2c 20 54 45 58 54 20 63 68 61 72  ename, TEXT char
e2bc0 73 65 74 2c 20 54 45 58 54 20 63 6f 6c 6e 61 6d  set, TEXT colnam
e2bd0 65 5f 63 61 73 65 29 0a 2f 0a 2f 20 72 65 74 75  e_case)././ retu
e2be0 72 6e 73 3a 0a 2f 20 74 68 65 20 6e 75 6d 62 65  rns:./ the numbe
e2bf0 72 20 6f 66 20 65 78 70 6f 72 74 65 64 20 72 6f  r of exported ro
e2c00 77 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e 76  ws./ NULL on inv
e2c10 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
e2c20 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
e2c30 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a     char *table;.
e2c40 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 3b 0a      char *path;.
e2c50 20 20 20 20 63 68 61 72 20 2a 63 68 61 72 73 65      char *charse
e2c60 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 73 3b  t;.    int rows;
e2c70 0a 20 20 20 20 69 6e 74 20 63 6f 6c 6e 61 6d 65  .    int colname
e2c80 5f 63 61 73 65 20 3d 20 47 41 49 41 5f 44 42 46  _case = GAIA_DBF
e2c90 5f 43 4f 4c 4e 41 4d 45 5f 4c 4f 57 45 52 43 41  _COLNAME_LOWERCA
e2ca0 53 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  SE;.    sqlite3 
e2cb0 2a 64 62 5f 68 61 6e 64 6c 65 20 3d 20 73 71 6c  *db_handle = sql
e2cc0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
e2cd0 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
e2ce0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
e2cf0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
e2d00 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
e2d10 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
e2d20 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
e2d30 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
e2d40 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
e2d50 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
e2d60 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
e2d70 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
e2d80 20 20 74 61 62 6c 65 20 3d 20 28 63 68 61 72 20    table = (char 
e2d90 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
e2da0 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
e2db0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
e2dc0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e2dd0 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
e2de0 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
e2df0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e2e00 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
e2e10 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
e2e20 20 7d 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63   }.    path = (c
e2e30 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
e2e40 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
e2e50 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  1]);.    if (sql
e2e60 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
e2e70 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c  (argv[2]) != SQL
e2e80 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
e2e90 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
e2ea0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
e2eb0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
e2ec0 20 20 20 20 20 7d 0a 20 20 20 20 63 68 61 72 73       }.    chars
e2ed0 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71  et = (char *) sq
e2ee0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
e2ef0 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20   (argv[2]);.    
e2f00 69 66 20 28 61 72 67 63 20 3e 20 33 29 0a 20 20  if (argc > 3).  
e2f10 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
e2f20 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
e2f30 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c  (argv[3]) != SQL
e2f40 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b  ITE_TEXT)..    {
e2f50 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
e2f60 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
e2f70 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
e2f80 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
e2f90 7b 0a 09 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  {...const char *
e2fa0 76 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 20 73  val = (char *) s
e2fb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e2fc0 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 09 69  t (argv[3]);...i
e2fd0 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28 76  f (strcasecmp (v
e2fe0 61 6c 2c 20 22 55 50 50 45 52 22 29 20 3d 3d 20  al, "UPPER") == 
e2ff0 30 0a 09 09 20 20 20 20 7c 7c 20 73 74 72 63 61  0...    || strca
e3000 73 65 63 6d 70 20 28 76 61 6c 2c 20 22 55 50 50  secmp (val, "UPP
e3010 45 52 43 41 53 45 22 29 20 3d 3d 20 30 29 0a 09  ERCASE") == 0)..
e3020 09 20 20 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73  .    colname_cas
e3030 65 20 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c  e = GAIA_DBF_COL
e3040 4e 41 4d 45 5f 55 50 50 45 52 43 41 53 45 3b 0a  NAME_UPPERCASE;.
e3050 09 09 65 6c 73 65 20 69 66 20 28 73 74 72 63 61  ..else if (strca
e3060 73 65 63 6d 70 20 28 76 61 6c 2c 20 22 53 41 4d  secmp (val, "SAM
e3070 45 22 29 20 3d 3d 20 30 0a 09 09 09 20 7c 7c 20  E") == 0.... || 
e3080 73 74 72 63 61 73 65 63 6d 70 20 28 76 61 6c 2c  strcasecmp (val,
e3090 20 22 53 41 4d 45 43 41 53 45 22 29 20 3d 3d 20   "SAMECASE") == 
e30a0 30 29 0a 09 09 20 20 20 20 63 6f 6c 6e 61 6d 65  0)...    colname
e30b0 5f 63 61 73 65 20 3d 20 47 41 49 41 5f 44 42 46  _case = GAIA_DBF
e30c0 5f 43 4f 4c 4e 41 4d 45 5f 43 41 53 45 5f 49 47  _COLNAME_CASE_IG
e30d0 4e 4f 52 45 3b 0a 09 09 65 6c 73 65 0a 09 09 20  NORE;...else... 
e30e0 20 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20     colname_case 
e30f0 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41  = GAIA_DBF_COLNA
e3100 4d 45 5f 4c 4f 57 45 52 43 41 53 45 3b 0a 09 20  ME_LOWERCASE;.. 
e3110 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e3120 20 20 72 65 74 20 3d 0a 09 64 75 6d 70 5f 64 62    ret =..dump_db
e3130 66 5f 65 78 32 20 28 64 62 5f 68 61 6e 64 6c 65  f_ex2 (db_handle
e3140 2c 20 74 61 62 6c 65 2c 20 70 61 74 68 2c 20 63  , table, path, c
e3150 68 61 72 73 65 74 2c 20 26 72 6f 77 73 2c 20 63  harset, &rows, c
e3160 6f 6c 6e 61 6d 65 5f 63 61 73 65 2c 0a 09 09 20  olname_case,... 
e3170 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20       NULL);..   
e3180 20 69 66 20 28 72 6f 77 73 20 3c 3d 20 30 20 7c   if (rows <= 0 |
e3190 7c 20 21 72 65 74 29 0a 09 73 71 6c 69 74 65 33  | !ret)..sqlite3
e31a0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e31b0 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
e31c0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
e31d0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
e31e0 6f 77 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ows);.}..static 
e31f0 76 6f 69 64 0a 66 6e 63 74 5f 49 6d 70 6f 72 74  void.fnct_Import
e3200 53 48 50 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  SHP (sqlite3_con
e3210 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
e3220 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
e3230 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
e3240 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
e3250 6f 6e 3a 0a 2f 20 49 6d 70 6f 72 74 53 48 50 28  on:./ ImportSHP(
e3260 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54  TEXT filename, T
e3270 45 58 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20  EXT table, TEXT 
e3280 63 68 61 72 73 65 74 29 0a 2f 20 49 6d 70 6f 72  charset)./ Impor
e3290 74 53 48 50 28 54 45 58 54 20 66 69 6c 65 6e 61  tSHP(TEXT filena
e32a0 6d 65 2c 20 54 45 58 54 20 74 61 62 6c 65 2c 20  me, TEXT table, 
e32b0 54 45 58 54 20 63 68 61 72 73 65 74 2c 20 49 4e  TEXT charset, IN
e32c0 54 20 73 72 69 64 29 0a 2f 20 49 6d 70 6f 72 74  T srid)./ Import
e32d0 53 48 50 28 54 45 58 54 20 66 69 6c 65 6e 61 6d  SHP(TEXT filenam
e32e0 65 2c 20 54 45 58 54 20 74 61 62 6c 65 2c 20 54  e, TEXT table, T
e32f0 45 58 54 20 63 68 61 72 73 65 74 2c 20 49 4e 54  EXT charset, INT
e3300 20 73 72 69 64 2c 20 0a 2f 20 20 20 20 20 20 20   srid, ./       
e3310 20 20 20 20 54 45 58 54 20 67 65 6f 6d 5f 63 6f      TEXT geom_co
e3320 6c 75 6d 6e 29 0a 2f 20 49 6d 70 6f 72 74 53 48  lumn)./ ImportSH
e3330 50 28 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c  P(TEXT filename,
e3340 20 54 45 58 54 20 74 61 62 6c 65 2c 20 54 45 58   TEXT table, TEX
e3350 54 20 63 68 61 72 73 65 74 2c 20 49 4e 54 20 73  T charset, INT s
e3360 72 69 64 2c 20 0a 2f 20 20 20 20 20 20 20 20 20  rid, ./         
e3370 20 20 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75    TEXT geom_colu
e3380 6d 6e 2c 20 54 45 58 54 20 70 6b 5f 63 6f 6c 75  mn, TEXT pk_colu
e3390 6d 6e 29 0a 2f 20 49 6d 70 6f 72 74 53 48 50 28  mn)./ ImportSHP(
e33a0 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54  TEXT filename, T
e33b0 45 58 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20  EXT table, TEXT 
e33c0 63 68 61 72 73 65 74 2c 20 49 4e 54 20 73 72 69  charset, INT sri
e33d0 64 2c 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20  d, ./           
e33e0 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e  TEXT geom_column
e33f0 2c 20 54 45 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e  , TEXT pk_column
e3400 2c 20 54 45 58 54 20 67 65 6f 6d 5f 74 79 70 65  , TEXT geom_type
e3410 29 0a 2f 20 49 6d 70 6f 72 74 53 48 50 28 54 45  )./ ImportSHP(TE
e3420 58 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58  XT filename, TEX
e3430 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20 63 68  T table, TEXT ch
e3440 61 72 73 65 74 2c 20 49 4e 54 20 73 72 69 64 2c  arset, INT srid,
e3450 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20 54 45   ./           TE
e3460 58 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20  XT geom_column, 
e3470 54 45 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e 2c 20  TEXT pk_column, 
e3480 54 45 58 54 20 67 65 6f 6d 5f 74 79 70 65 2c 0a  TEXT geom_type,.
e3490 2f 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 20  /           INT 
e34a0 63 6f 65 72 63 65 32 64 29 20 0a 2f 20 49 6d 70  coerce2d) ./ Imp
e34b0 6f 72 74 53 48 50 28 54 45 58 54 20 66 69 6c 65  ortSHP(TEXT file
e34c0 6e 61 6d 65 2c 20 54 45 58 54 20 74 61 62 6c 65  name, TEXT table
e34d0 2c 20 54 45 58 54 20 63 68 61 72 73 65 74 2c 20  , TEXT charset, 
e34e0 49 4e 54 20 73 72 69 64 2c 20 0a 2f 20 20 20 20  INT srid, ./    
e34f0 20 20 20 20 20 20 20 54 45 58 54 20 67 65 6f 6d         TEXT geom
e3500 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 70 6b  _column, TEXT pk
e3510 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 67 65  _column, TEXT ge
e3520 6f 6d 5f 74 79 70 65 2c 0a 2f 20 20 20 20 20 20  om_type,./      
e3530 20 20 20 20 20 49 4e 54 20 63 6f 65 72 63 65 32       INT coerce2
e3540 64 2c 20 49 4e 54 20 63 6f 6d 70 72 65 73 73 65  d, INT compresse
e3550 64 29 20 0a 2f 20 49 6d 70 6f 72 74 53 48 50 28  d) ./ ImportSHP(
e3560 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54  TEXT filename, T
e3570 45 58 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20  EXT table, TEXT 
e3580 63 68 61 72 73 65 74 2c 20 49 4e 54 20 73 72 69  charset, INT sri
e3590 64 2c 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20  d, ./           
e35a0 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e  TEXT geom_column
e35b0 2c 20 54 45 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e  , TEXT pk_column
e35c0 2c 20 54 45 58 54 20 67 65 6f 6d 5f 74 79 70 65  , TEXT geom_type
e35d0 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 49 4e  ,./           IN
e35e0 54 20 63 6f 65 72 63 65 32 64 2c 20 49 4e 54 20  T coerce2d, INT 
e35f0 63 6f 6d 70 72 65 73 73 65 64 2c 20 49 4e 54 20  compressed, INT 
e3600 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 29 20 0a  spatial_index) .
e3610 2f 20 49 6d 70 6f 72 74 53 48 50 28 54 45 58 54  / ImportSHP(TEXT
e3620 20 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58 54 20   filename, TEXT 
e3630 74 61 62 6c 65 2c 20 54 45 58 54 20 63 68 61 72  table, TEXT char
e3640 73 65 74 2c 20 49 4e 54 20 73 72 69 64 2c 20 0a  set, INT srid, .
e3650 2f 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54  /           TEXT
e3660 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 54 45   geom_column, TE
e3670 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e 2c 20 54 45  XT pk_column, TE
e3680 58 54 20 67 65 6f 6d 5f 74 79 70 65 2c 0a 2f 20  XT geom_type,./ 
e3690 20 20 20 20 20 20 20 20 20 20 49 4e 54 20 63 6f            INT co
e36a0 65 72 63 65 32 64 2c 20 49 4e 54 20 63 6f 6d 70  erce2d, INT comp
e36b0 72 65 73 73 65 64 2c 20 49 4e 54 20 73 70 61 74  ressed, INT spat
e36c0 69 61 6c 5f 69 6e 64 65 78 2c 0a 2f 20 20 20 20  ial_index,./    
e36d0 20 20 20 20 20 20 20 49 4e 54 20 74 65 78 74 5f         INT text_
e36e0 64 61 74 65 73 29 0a 2f 20 49 6d 70 6f 72 74 53  dates)./ ImportS
e36f0 48 50 28 54 45 58 54 20 66 69 6c 65 6e 61 6d 65  HP(TEXT filename
e3700 2c 20 54 45 58 54 20 74 61 62 6c 65 2c 20 54 45  , TEXT table, TE
e3710 58 54 20 63 68 61 72 73 65 74 2c 20 49 4e 54 20  XT charset, INT 
e3720 73 72 69 64 2c 20 0a 2f 20 20 20 20 20 20 20 20  srid, ./        
e3730 20 20 20 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c     TEXT geom_col
e3740 75 6d 6e 2c 20 54 45 58 54 20 70 6b 5f 63 6f 6c  umn, TEXT pk_col
e3750 75 6d 6e 2c 20 54 45 58 54 20 67 65 6f 6d 5f 74  umn, TEXT geom_t
e3760 79 70 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  ype,./          
e3770 20 49 4e 54 20 63 6f 65 72 63 65 32 64 2c 20 49   INT coerce2d, I
e3780 4e 54 20 63 6f 6d 70 72 65 73 73 65 64 2c 20 49  NT compressed, I
e3790 4e 54 20 73 70 61 74 69 61 6c 5f 69 6e 64 65 78  NT spatial_index
e37a0 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 49 4e  ,./           IN
e37b0 54 20 74 65 78 74 5f 64 61 74 65 73 2c 20 54 45  T text_dates, TE
e37c0 58 54 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 29  XT colname_case)
e37d0 0a 2f 20 49 6d 70 6f 72 74 53 48 50 28 54 45 58  ./ ImportSHP(TEX
e37e0 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58 54  T filename, TEXT
e37f0 20 74 61 62 6c 65 2c 20 54 45 58 54 20 63 68 61   table, TEXT cha
e3800 72 73 65 74 2c 20 49 4e 54 20 73 72 69 64 2c 20  rset, INT srid, 
e3810 0a 2f 20 20 20 20 20 20 20 20 20 20 20 54 45 58  ./           TEX
e3820 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 54  T geom_column, T
e3830 45 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e 2c 20 54  EXT pk_column, T
e3840 45 58 54 20 67 65 6f 6d 5f 74 79 70 65 2c 0a 2f  EXT geom_type,./
e3850 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 20 63             INT c
e3860 6f 65 72 63 65 32 64 2c 20 49 4e 54 20 63 6f 6d  oerce2d, INT com
e3870 70 72 65 73 73 65 64 2c 20 49 4e 54 20 73 70 61  pressed, INT spa
e3880 74 69 61 6c 5f 69 6e 64 65 78 2c 0a 2f 20 20 20  tial_index,./   
e3890 20 20 20 20 20 20 20 20 49 4e 54 20 74 65 78 74          INT text
e38a0 5f 64 61 74 65 73 2c 20 54 45 58 54 20 63 6f 6c  _dates, TEXT col
e38b0 6e 61 6d 65 5f 63 61 73 65 2c 20 49 4e 54 20 75  name_case, INT u
e38c0 70 64 61 74 65 5f 73 74 61 74 69 73 74 69 63 73  pdate_statistics
e38d0 29 0a 2f 20 49 6d 70 6f 72 74 53 48 50 28 54 45  )./ ImportSHP(TE
e38e0 58 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58  XT filename, TEX
e38f0 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20 63 68  T table, TEXT ch
e3900 61 72 73 65 74 2c 20 49 4e 54 20 73 72 69 64 2c  arset, INT srid,
e3910 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20 54 45   ./           TE
e3920 58 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20  XT geom_column, 
e3930 54 45 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e 2c 20  TEXT pk_column, 
e3940 54 45 58 54 20 67 65 6f 6d 5f 74 79 70 65 2c 0a  TEXT geom_type,.
e3950 2f 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 20  /           INT 
e3960 63 6f 65 72 63 65 32 64 2c 20 49 4e 54 20 63 6f  coerce2d, INT co
e3970 6d 70 72 65 73 73 65 64 2c 20 49 4e 54 20 73 70  mpressed, INT sp
e3980 61 74 69 61 6c 5f 69 6e 64 65 78 2c 0a 2f 20 20  atial_index,./  
e3990 20 20 20 20 20 20 20 20 20 49 4e 54 20 74 65 78           INT tex
e39a0 74 5f 64 61 74 65 73 2c 20 54 45 58 54 20 63 6f  t_dates, TEXT co
e39b0 6c 6e 61 6d 65 5f 63 61 73 65 2c 20 49 4e 54 20  lname_case, INT 
e39c0 75 70 64 61 74 65 5f 73 74 61 74 69 73 74 69 63  update_statistic
e39d0 73 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 49  s,./           I
e39e0 4e 54 20 76 65 72 62 6f 73 65 29 0a 2f 0a 2f 20  NT verbose)././ 
e39f0 72 65 74 75 72 6e 73 3a 0a 2f 20 74 68 65 20 6e  returns:./ the n
e3a00 75 6d 62 65 72 20 6f 66 20 69 6d 70 6f 72 74 65  umber of importe
e3a10 64 20 72 6f 77 73 0a 2f 20 4e 55 4c 4c 20 6f 6e  d rows./ NULL on
e3a20 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
e3a30 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
e3a40 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 61 62  t;.    char *tab
e3a50 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 61  le;.    char *pa
e3a60 74 68 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  th;.    char *ch
e3a70 61 72 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 73  arset;.    int s
e3a80 72 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  rid = -1;.    in
e3a90 74 20 63 6f 65 72 63 65 32 64 20 3d 20 30 3b 0a  t coerce2d = 0;.
e3aa0 20 20 20 20 69 6e 74 20 63 6f 6d 70 72 65 73 73      int compress
e3ab0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
e3ac0 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 20 3d 20  spatial_index = 
e3ad0 30 3b 0a 20 20 20 20 69 6e 74 20 74 65 78 74 5f  0;.    int text_
e3ae0 64 61 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  dates = 0;.    i
e3af0 6e 74 20 75 70 64 61 74 65 5f 73 74 61 74 69 73  nt update_statis
e3b00 74 69 63 73 20 3d 20 31 3b 0a 20 20 20 20 69 6e  tics = 1;.    in
e3b10 74 20 76 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  t verbose = 1;. 
e3b20 20 20 20 63 68 61 72 20 2a 70 6b 5f 63 6f 6c 75     char *pk_colu
e3b30 6d 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  mn = NULL;.    c
e3b40 68 61 72 20 2a 67 65 6f 5f 63 6f 6c 75 6d 6e 20  har *geo_column 
e3b50 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
e3b60 20 2a 67 65 6f 6d 5f 74 79 70 65 20 3d 20 4e 55   *geom_type = NU
e3b70 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6c 6e  LL;.    int coln
e3b80 61 6d 65 5f 63 61 73 65 20 3d 20 47 41 49 41 5f  ame_case = GAIA_
e3b90 44 42 46 5f 43 4f 4c 4e 41 4d 45 5f 4c 4f 57 45  DBF_COLNAME_LOWE
e3ba0 52 43 41 53 45 3b 0a 20 20 20 20 69 6e 74 20 72  RCASE;.    int r
e3bb0 6f 77 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ows;.    sqlite3
e3bc0 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d 20 73 71   *db_handle = sq
e3bd0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
e3be0 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
e3bf0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
e3c00 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
e3c10 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
e3c20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e3c30 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
e3c40 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e3c50 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
e3c60 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
e3c70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
e3c80 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
e3c90 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
e3ca0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
e3cb0 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
e3cc0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
e3cd0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e3ce0 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
e3cf0 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
e3d00 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e3d10 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
e3d20 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
e3d30 20 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d 20 28   }.    table = (
e3d40 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
e3d50 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
e3d60 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71  [1]);.    if (sq
e3d70 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
e3d80 20 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51   (argv[2]) != SQ
e3d90 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
e3da0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
e3db0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
e3dc0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
e3dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 63 68 61 72        }.    char
e3de0 73 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 73  set = (char *) s
e3df0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e3e00 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  t (argv[2]);.   
e3e10 20 69 66 20 28 61 72 67 63 20 3e 20 33 29 0a 20   if (argc > 3). 
e3e20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
e3e30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
e3e40 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51   (argv[3]) != SQ
e3e50 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
e3e60 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
e3e70 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
e3e80 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
e3e90 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
e3ea0 20 20 20 20 20 20 73 72 69 64 20 3d 20 73 71 6c        srid = sql
e3eb0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
e3ec0 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20  argv[3]);.      
e3ed0 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e  }.    if (argc >
e3ee0 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   4).      {..  i
e3ef0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
e3f00 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20  _type (argv[4]) 
e3f10 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
e3f20 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
e3f30 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e3f40 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
e3f50 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
e3f60 0a 09 20 20 20 20 20 20 67 65 6f 5f 63 6f 6c 75  ..      geo_colu
e3f70 6d 6e 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71  mn = (char *) sq
e3f80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
e3f90 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20   (argv[4]);.    
e3fa0 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
e3fb0 20 3e 20 35 29 0a 20 20 20 20 20 20 7b 0a 09 20   > 5).      {.. 
e3fc0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e3fd0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d  ue_type (argv[5]
e3fe0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e3ff0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
e4000 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
e4010 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
e4020 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  rn;..    }..  el
e4030 73 65 0a 09 20 20 20 20 20 20 70 6b 5f 63 6f 6c  se..      pk_col
e4040 75 6d 6e 20 3d 20 28 63 68 61 72 20 2a 29 20 73  umn = (char *) s
e4050 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e4060 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20  t (argv[5]);.   
e4070 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
e4080 63 20 3e 20 36 29 0a 20 20 20 20 20 20 7b 0a 09  c > 6).      {..
e4090 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e40a0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36  lue_type (argv[6
e40b0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
e40c0 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  T)..    {...sqli
e40d0 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
e40e0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
e40f0 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  urn;..    }..  e
e4100 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f 6d 5f  lse..      geom_
e4110 74 79 70 65 20 3d 20 28 63 68 61 72 20 2a 29 20  type = (char *) 
e4120 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e4130 78 74 20 28 61 72 67 76 5b 36 5d 29 3b 0a 20 20  xt (argv[6]);.  
e4140 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
e4150 67 63 20 3e 20 37 29 0a 20 20 20 20 20 20 7b 0a  gc > 7).      {.
e4160 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
e4170 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
e4180 37 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  7]) != SQLITE_IN
e4190 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
e41a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
e41b0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
e41c0 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
e41d0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 63  .  else..      c
e41e0 6f 65 72 63 65 32 64 20 3d 20 73 71 6c 69 74 65  oerce2d = sqlite
e41f0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
e4200 76 5b 37 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[7]);.      }. 
e4210 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 38 29     if (argc > 8)
e4220 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
e4230 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
e4240 70 65 20 28 61 72 67 76 5b 38 5d 29 20 21 3d 20  pe (argv[8]) != 
e4250 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
e4260 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
e4270 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e4280 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
e4290 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
e42a0 0a 09 20 20 20 20 20 20 63 6f 6d 70 72 65 73 73  ..      compress
e42b0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ed = sqlite3_val
e42c0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 38 5d 29  ue_int (argv[8])
e42d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
e42e0 20 28 61 72 67 63 20 3e 20 39 29 0a 20 20 20 20   (argc > 9).    
e42f0 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
e4300 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
e4310 72 67 76 5b 39 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[9]) != SQLIT
e4320 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
e4330 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
e4340 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
e4350 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
e4360 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
e4370 20 20 20 73 70 61 74 69 61 6c 5f 69 6e 64 65 78     spatial_index
e4380 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
e4390 5f 69 6e 74 20 28 61 72 67 76 5b 39 5d 29 3b 0a  _int (argv[9]);.
e43a0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
e43b0 61 72 67 63 20 3e 20 31 30 29 0a 20 20 20 20 20  argc > 10).     
e43c0 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
e43d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
e43e0 67 76 5b 31 30 5d 29 20 21 3d 20 53 51 4c 49 54  gv[10]) != SQLIT
e43f0 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
e4400 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
e4410 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
e4420 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
e4430 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
e4440 20 20 20 74 65 78 74 5f 64 61 74 65 73 20 3d 20     text_dates = 
e4450 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
e4460 74 20 28 61 72 67 76 5b 31 30 5d 29 3b 0a 20 20  t (argv[10]);.  
e4470 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
e4480 67 63 20 3e 20 31 31 29 0a 20 20 20 20 20 20 7b  gc > 11).      {
e4490 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
e44a0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
e44b0 5b 31 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  [11]) != SQLITE_
e44c0 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
e44d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e44e0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
e44f0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
e4500 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
e4510 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 6c 20  const char *val 
e4520 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74  = (char *) sqlit
e4530 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
e4540 72 67 76 5b 31 31 5d 29 3b 0a 09 09 69 66 20 28  rgv[11]);...if (
e4550 73 74 72 63 61 73 65 63 6d 70 20 28 76 61 6c 2c  strcasecmp (val,
e4560 20 22 55 50 50 45 52 22 29 20 3d 3d 20 30 0a 09   "UPPER") == 0..
e4570 09 20 20 20 20 7c 7c 20 73 74 72 63 61 73 65 63  .    || strcasec
e4580 6d 70 20 28 76 61 6c 2c 20 22 55 50 50 45 52 43  mp (val, "UPPERC
e4590 41 53 45 22 29 20 3d 3d 20 30 29 0a 09 09 20 20  ASE") == 0)...  
e45a0 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20 3d    colname_case =
e45b0 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41 4d   GAIA_DBF_COLNAM
e45c0 45 5f 55 50 50 45 52 43 41 53 45 3b 0a 09 09 65  E_UPPERCASE;...e
e45d0 6c 73 65 20 69 66 20 28 73 74 72 63 61 73 65 63  lse if (strcasec
e45e0 6d 70 20 28 76 61 6c 2c 20 22 53 41 4d 45 22 29  mp (val, "SAME")
e45f0 20 3d 3d 20 30 0a 09 09 09 20 7c 7c 20 73 74 72   == 0.... || str
e4600 63 61 73 65 63 6d 70 20 28 76 61 6c 2c 20 22 53  casecmp (val, "S
e4610 41 4d 45 43 41 53 45 22 29 20 3d 3d 20 30 29 0a  AMECASE") == 0).
e4620 09 09 20 20 20 20 63 6f 6c 6e 61 6d 65 5f 63 61  ..    colname_ca
e4630 73 65 20 3d 20 47 41 49 41 5f 44 42 46 5f 43 4f  se = GAIA_DBF_CO
e4640 4c 4e 41 4d 45 5f 43 41 53 45 5f 49 47 4e 4f 52  LNAME_CASE_IGNOR
e4650 45 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  E;...else...    
e4660 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20 3d 20 47  colname_case = G
e4670 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41 4d 45 5f  AIA_DBF_COLNAME_
e4680 4c 4f 57 45 52 43 41 53 45 3b 0a 09 20 20 20 20  LOWERCASE;..    
e4690 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  }.      }.    if
e46a0 20 28 61 72 67 63 20 3e 20 31 32 29 0a 20 20 20   (argc > 12).   
e46b0 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
e46c0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
e46d0 61 72 67 76 5b 31 32 5d 29 20 21 3d 20 53 51 4c  argv[12]) != SQL
e46e0 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
e46f0 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
e4700 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
e4710 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
e4720 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
e4730 20 20 20 20 20 75 70 64 61 74 65 5f 73 74 61 74       update_stat
e4740 69 73 74 69 63 73 20 3d 20 73 71 6c 69 74 65 33  istics = sqlite3
e4750 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
e4760 5b 31 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [12]);.      }. 
e4770 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 31 33     if (argc > 13
e4780 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
e4790 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
e47a0 79 70 65 20 28 61 72 67 76 5b 31 33 5d 29 20 21  ype (argv[13]) !
e47b0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
e47c0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
e47d0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
e47e0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
e47f0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  rn;..    }..  el
e4800 73 65 0a 09 20 20 20 20 20 20 76 65 72 62 6f 73  se..      verbos
e4810 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
e4820 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 33 5d 29  e_int (argv[13])
e4830 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 72  ;.      }..    r
e4840 65 74 20 3d 0a 09 6c 6f 61 64 5f 73 68 61 70 65  et =..load_shape
e4850 66 69 6c 65 5f 65 78 33 20 28 64 62 5f 68 61 6e  file_ex3 (db_han
e4860 64 6c 65 2c 20 70 61 74 68 2c 20 74 61 62 6c 65  dle, path, table
e4870 2c 20 63 68 61 72 73 65 74 2c 20 73 72 69 64 2c  , charset, srid,
e4880 20 67 65 6f 5f 63 6f 6c 75 6d 6e 2c 0a 09 09 09   geo_column,....
e4890 20 20 20 20 67 65 6f 6d 5f 74 79 70 65 2c 20 70      geom_type, p
e48a0 6b 5f 63 6f 6c 75 6d 6e 2c 20 63 6f 65 72 63 65  k_column, coerce
e48b0 32 64 2c 20 63 6f 6d 70 72 65 73 73 65 64 2c 0a  2d, compressed,.
e48c0 09 09 09 20 20 20 20 76 65 72 62 6f 73 65 2c 20  ...    verbose, 
e48d0 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 2c 20 74  spatial_index, t
e48e0 65 78 74 5f 64 61 74 65 73 2c 20 26 72 6f 77 73  ext_dates, &rows
e48f0 2c 0a 09 09 09 20 20 20 20 63 6f 6c 6e 61 6d 65  ,....    colname
e4900 5f 63 61 73 65 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  _case, NULL);.. 
e4910 20 20 20 69 66 20 28 72 6f 77 73 20 3c 20 30 20     if (rows < 0 
e4920 7c 7c 20 21 72 65 74 29 0a 09 73 71 6c 69 74 65  || !ret)..sqlite
e4930 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
e4940 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
e4950 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  e.      {..  if 
e4960 28 75 70 64 61 74 65 5f 73 74 61 74 69 73 74 69  (update_statisti
e4970 63 73 29 0a 09 20 20 20 20 20 20 75 70 64 61 74  cs)..      updat
e4980 65 5f 6c 61 79 65 72 5f 73 74 61 74 69 73 74 69  e_layer_statisti
e4990 63 73 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20 74  cs (db_handle, t
e49a0 61 62 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  able, NULL);..  
e49b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
e49c0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 6f 77  nt (context, row
e49d0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73  s);.      }.}..s
e49e0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
e49f0 45 78 70 6f 72 74 53 48 50 20 28 73 71 6c 69 74  ExportSHP (sqlit
e4a00 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
e4a10 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
e4a20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e4a30 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
e4a40 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45 78 70 6f  function:./ Expo
e4a50 72 74 53 48 50 28 54 45 58 54 20 74 61 62 6c 65  rtSHP(TEXT table
e4a60 2c 20 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75  , TEXT geom_colu
e4a70 6d 6e 2c 20 54 45 58 54 20 66 69 6c 65 6e 61 6d  mn, TEXT filenam
e4a80 65 2c 20 54 45 58 54 20 63 68 61 72 73 65 74 29  e, TEXT charset)
e4a90 0a 2f 20 45 78 70 6f 72 74 53 48 50 28 54 45 58  ./ ExportSHP(TEX
e4aa0 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20 67 65  T table, TEXT ge
e4ab0 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20  om_column, TEXT 
e4ac0 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58 54 20 63  filename, TEXT c
e4ad0 68 61 72 73 65 74 2c 0a 2f 20 20 20 20 20 20 20  harset,./       
e4ae0 20 20 20 20 54 45 58 54 20 67 65 6f 6d 5f 74 79      TEXT geom_ty
e4af0 70 65 29 0a 2f 20 45 78 70 6f 72 74 53 48 50 28  pe)./ ExportSHP(
e4b00 54 45 58 54 20 74 61 62 6c 65 2c 20 54 45 58 54  TEXT table, TEXT
e4b10 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 54 45   geom_column, TE
e4b20 58 54 20 66 69 6c 65 6e 61 6d 65 2c 20 54 45 58  XT filename, TEX
e4b30 54 20 63 68 61 72 73 65 74 2c 0a 2f 20 20 20 20  T charset,./    
e4b40 20 20 20 20 20 20 20 54 45 58 54 20 67 65 6f 6d         TEXT geom
e4b50 5f 74 79 70 65 2c 20 54 45 58 54 20 63 6f 6c 6e  _type, TEXT coln
e4b60 61 6d 65 5f 63 61 73 65 29 0a 2f 0a 2f 20 72 65  ame_case)././ re
e4b70 74 75 72 6e 73 3a 0a 2f 20 74 68 65 20 6e 75 6d  turns:./ the num
e4b80 62 65 72 20 6f 66 20 65 78 70 6f 72 74 65 64 20  ber of exported 
e4b90 72 6f 77 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69  rows./ NULL on i
e4ba0 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
e4bb0 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  .*/.    int ret;
e4bc0 0a 20 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65  .    char *table
e4bd0 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6f 6c 75  ;.    char *colu
e4be0 6d 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 61  mn;.    char *pa
e4bf0 74 68 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  th;.    char *ch
e4c00 61 72 73 65 74 3b 0a 20 20 20 20 63 68 61 72 20  arset;.    char 
e4c10 2a 67 65 6f 6d 5f 74 79 70 65 20 3d 20 4e 55 4c  *geom_type = NUL
e4c20 4c 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6c 6e 61  L;.    int colna
e4c30 6d 65 5f 63 61 73 65 20 3d 20 47 41 49 41 5f 44  me_case = GAIA_D
e4c40 42 46 5f 43 4f 4c 4e 41 4d 45 5f 43 41 53 45 5f  BF_COLNAME_CASE_
e4c50 49 47 4e 4f 52 45 3b 0a 20 20 20 20 69 6e 74 20  IGNORE;.    int 
e4c60 72 6f 77 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  rows;.    sqlite
e4c70 33 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d 20 73  3 *db_handle = s
e4c80 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
e4c90 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
e4ca0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
e4cb0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
e4cc0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
e4cd0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e4ce0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
e4cf0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
e4d00 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
e4d10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
e4d20 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
e4d30 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
e4d40 20 20 20 20 74 61 62 6c 65 20 3d 20 28 63 68 61      table = (cha
e4d50 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
e4d60 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
e4d70 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  );.    if (sqlit
e4d80 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
e4d90 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
e4da0 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
e4db0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
e4dc0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
e4dd0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
e4de0 20 20 20 7d 0a 20 20 20 20 63 6f 6c 75 6d 6e 20     }.    column 
e4df0 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74  = (char *) sqlit
e4e00 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
e4e10 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[1]);.    if 
e4e20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
e4e30 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21 3d  ype (argv[2]) !=
e4e40 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20   SQLITE_TEXT).  
e4e50 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
e4e60 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e4e70 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
e4e80 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70  n;.      }.    p
e4e90 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 20 73  ath = (char *) s
e4ea0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e4eb0 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  t (argv[2]);.   
e4ec0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e4ed0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
e4ee0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e4ef0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
e4f00 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
e4f10 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
e4f20 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
e4f30 20 20 20 63 68 61 72 73 65 74 20 3d 20 28 63 68     charset = (ch
e4f40 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
e4f50 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 33  lue_text (argv[3
e4f60 5d 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63  ]);.    if (argc
e4f70 20 3e 20 34 29 0a 20 20 20 20 20 20 7b 0a 09 20   > 4).      {.. 
e4f80 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e4f90 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d  ue_type (argv[4]
e4fa0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e4fb0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
e4fc0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
e4fd0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
e4fe0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  rn;..    }..  el
e4ff0 73 65 0a 09 20 20 20 20 20 20 67 65 6f 6d 5f 74  se..      geom_t
e5000 79 70 65 20 3d 20 28 63 68 61 72 20 2a 29 20 73  ype = (char *) s
e5010 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e5020 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20  t (argv[4]);.   
e5030 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
e5040 63 20 3e 20 35 29 0a 20 20 20 20 20 20 7b 0a 09  c > 5).      {..
e5050 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e5060 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
e5070 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
e5080 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  T)..    {...sqli
e5090 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
e50a0 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
e50b0 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  urn;..    }..  e
e50c0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 63 6f 6e  lse..    {...con
e50d0 73 74 20 63 68 61 72 20 2a 76 61 6c 20 3d 20 28  st char *val = (
e50e0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
e50f0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
e5100 5b 35 5d 29 3b 0a 09 09 69 66 20 28 73 74 72 63  [5]);...if (strc
e5110 61 73 65 63 6d 70 20 28 76 61 6c 2c 20 22 55 50  asecmp (val, "UP
e5120 50 45 52 22 29 20 3d 3d 20 30 0a 09 09 20 20 20  PER") == 0...   
e5130 20 7c 7c 20 73 74 72 63 61 73 65 63 6d 70 20 28   || strcasecmp (
e5140 76 61 6c 2c 20 22 55 50 50 45 52 43 41 53 45 22  val, "UPPERCASE"
e5150 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 63 6f  ) == 0)...    co
e5160 6c 6e 61 6d 65 5f 63 61 73 65 20 3d 20 47 41 49  lname_case = GAI
e5170 41 5f 44 42 46 5f 43 4f 4c 4e 41 4d 45 5f 55 50  A_DBF_COLNAME_UP
e5180 50 45 52 43 41 53 45 3b 0a 09 09 65 6c 73 65 20  PERCASE;...else 
e5190 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
e51a0 76 61 6c 2c 20 22 53 41 4d 45 22 29 20 3d 3d 20  val, "SAME") == 
e51b0 30 0a 09 09 09 20 7c 7c 20 73 74 72 63 61 73 65  0.... || strcase
e51c0 63 6d 70 20 28 76 61 6c 2c 20 22 53 41 4d 45 43  cmp (val, "SAMEC
e51d0 41 53 45 22 29 20 3d 3d 20 30 29 0a 09 09 20 20  ASE") == 0)...  
e51e0 20 20 63 6f 6c 6e 61 6d 65 5f 63 61 73 65 20 3d    colname_case =
e51f0 20 47 41 49 41 5f 44 42 46 5f 43 4f 4c 4e 41 4d   GAIA_DBF_COLNAM
e5200 45 5f 43 41 53 45 5f 49 47 4e 4f 52 45 3b 0a 09  E_CASE_IGNORE;..
e5210 09 65 6c 73 65 0a 09 09 20 20 20 20 63 6f 6c 6e  .else...    coln
e5220 61 6d 65 5f 63 61 73 65 20 3d 20 47 41 49 41 5f  ame_case = GAIA_
e5230 44 42 46 5f 43 4f 4c 4e 41 4d 45 5f 4c 4f 57 45  DBF_COLNAME_LOWE
e5240 52 43 41 53 45 3b 0a 09 20 20 20 20 7d 0a 20 20  RCASE;..    }.  
e5250 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 20 3d      }..    ret =
e5260 0a 09 64 75 6d 70 5f 73 68 61 70 65 66 69 6c 65  ..dump_shapefile
e5270 5f 65 78 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20  _ex (db_handle, 
e5280 74 61 62 6c 65 2c 20 63 6f 6c 75 6d 6e 2c 20 70  table, column, p
e5290 61 74 68 2c 20 63 68 61 72 73 65 74 2c 20 67 65  ath, charset, ge
e52a0 6f 6d 5f 74 79 70 65 2c 0a 09 09 09 20 20 20 31  om_type,....   1
e52b0 2c 20 26 72 6f 77 73 2c 20 63 6f 6c 6e 61 6d 65  , &rows, colname
e52c0 5f 63 61 73 65 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  _case, NULL);.. 
e52d0 20 20 20 69 66 20 28 72 6f 77 73 20 3c 20 30 20     if (rows < 0 
e52e0 7c 7c 20 21 72 65 74 29 0a 09 73 71 6c 69 74 65  || !ret)..sqlite
e52f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
e5300 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
e5310 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
e5320 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
e5330 72 6f 77 73 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rows);.}..#endif
e5340 20 2f 2a 20 65 6e 64 20 49 43 4f 4e 56 20 73 75   /* end ICONV su
e5350 70 70 6f 72 74 65 64 20 2a 2f 0a 0a 73 74 61 74  pported */..stat
e5360 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 45 78 70  ic void.fnct_Exp
e5370 6f 72 74 4b 4d 4c 20 28 73 71 6c 69 74 65 33 5f  ortKML (sqlite3_
e5380 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
e5390 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
e53a0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
e53b0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
e53c0 63 74 69 6f 6e 3a 0a 2f 20 45 78 70 6f 72 74 4b  ction:./ ExportK
e53d0 4d 4c 28 54 45 58 54 20 74 61 62 6c 65 2c 20 54  ML(TEXT table, T
e53e0 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c  EXT geom_column,
e53f0 20 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 29 0a   TEXT filename).
e5400 2f 20 45 78 70 6f 72 74 4b 4d 4c 28 54 45 58 54  / ExportKML(TEXT
e5410 20 74 61 62 6c 65 2c 20 54 45 58 54 20 67 65 6f   table, TEXT geo
e5420 6d 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 66  m_column, TEXT f
e5430 69 6c 65 6e 61 6d 65 2c 20 49 4e 54 20 70 72 65  ilename, INT pre
e5440 63 69 73 69 6f 6e 29 0a 2f 20 45 78 70 6f 72 74  cision)./ Export
e5450 4b 4d 4c 28 54 45 58 54 20 74 61 62 6c 65 2c 20  KML(TEXT table, 
e5460 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75 6d 6e  TEXT geom_column
e5470 2c 20 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 2c  , TEXT filename,
e5480 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e 2c 0a   INT precision,.
e5490 2f 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54  /           TEXT
e54a0 20 6e 61 6d 65 5f 63 6f 6c 75 6d 6e 29 0a 2f 20   name_column)./ 
e54b0 45 78 70 6f 72 74 4b 4d 4c 28 54 45 58 54 20 74  ExportKML(TEXT t
e54c0 61 62 6c 65 2c 20 54 45 58 54 20 67 65 6f 6d 5f  able, TEXT geom_
e54d0 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 66 69 6c  column, TEXT fil
e54e0 65 6e 61 6d 65 2c 20 49 4e 54 20 70 72 65 63 69  ename, INT preci
e54f0 73 69 6f 6e 2c 0a 2f 20 20 20 20 20 20 20 20 20  sion,./         
e5500 20 20 54 45 58 54 20 6e 61 6d 65 5f 63 6f 6c 75    TEXT name_colu
e5510 6d 6e 2c 20 54 45 58 54 20 64 65 73 63 72 69 70  mn, TEXT descrip
e5520 74 69 6f 6e 5f 63 6f 6c 75 6d 6e 29 0a 2f 0a 2f  tion_column)././
e5530 20 72 65 74 75 72 6e 73 3a 0a 2f 20 74 68 65 20   returns:./ the 
e5540 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 6f 72 74  number of export
e5550 65 64 20 72 6f 77 73 0a 2f 20 4e 55 4c 4c 20 6f  ed rows./ NULL o
e5560 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
e5570 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72  nts.*/.    int r
e5580 65 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 61  et;.    char *ta
e5590 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 67  ble;.    char *g
e55a0 65 6f 6d 5f 63 6f 6c 3b 0a 20 20 20 20 63 68 61  eom_col;.    cha
e55b0 72 20 2a 70 61 74 68 3b 0a 20 20 20 20 69 6e 74  r *path;.    int
e55c0 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 38 3b 0a   precision = 8;.
e55d0 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 5f 63      char *name_c
e55e0 6f 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  ol = NULL;.    c
e55f0 68 61 72 20 2a 64 65 73 63 72 5f 63 6f 6c 20 3d  har *descr_col =
e5600 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
e5610 6f 77 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ows;.    sqlite3
e5620 20 2a 64 62 5f 68 61 6e 64 6c 65 20 3d 20 73 71   *db_handle = sq
e5630 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
e5640 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
e5650 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
e5660 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
e5670 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
e5680 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e5690 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
e56a0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e56b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
e56c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
e56d0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
e56e0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
e56f0 20 20 20 74 61 62 6c 65 20 3d 20 28 63 68 61 72     table = (char
e5700 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
e5710 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
e5720 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  ;.    if (sqlite
e5730 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
e5740 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
e5750 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
e5760 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e5770 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
e5780 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
e5790 20 20 7d 0a 20 20 20 20 67 65 6f 6d 5f 63 6f 6c    }.    geom_col
e57a0 20 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69   = (char *) sqli
e57b0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
e57c0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
e57d0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
e57e0 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 21  type (argv[2]) !
e57f0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
e5800 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
e5810 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
e5820 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
e5830 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
e5840 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 20  path = (char *) 
e5850 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
e5860 78 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  xt (argv[2]);.  
e5870 20 20 69 66 20 28 61 72 67 63 20 3e 20 33 29 0a    if (argc > 3).
e5880 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
e5890 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
e58a0 65 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53  e (argv[3]) != S
e58b0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
e58c0 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
e58d0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
e58e0 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
e58f0 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
e5900 09 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e  .      precision
e5910 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
e5920 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a  _int (argv[3]);.
e5930 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
e5940 61 72 67 63 20 3e 20 34 29 0a 20 20 20 20 20 20  argc > 4).      
e5950 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
e5960 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e5970 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[4]) != SQLITE_
e5980 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
e5990 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e59a0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
e59b0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
e59c0 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 6e 61    else..      na
e59d0 6d 65 5f 63 6f 6c 20 3d 20 28 63 68 61 72 20 2a  me_col = (char *
e59e0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
e59f0 74 65 78 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a  text (argv[4]);.
e5a00 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
e5a10 61 72 67 63 20 3e 20 35 29 0a 20 20 20 20 20 20  argc > 5).      
e5a20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
e5a30 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e5a40 76 5b 35 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[5]) != SQLITE_
e5a50 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73  TEXT)..    {...s
e5a60 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e5a70 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
e5a80 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
e5a90 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 64 65    else..      de
e5aa0 73 63 72 5f 63 6f 6c 20 3d 20 28 63 68 61 72 20  scr_col = (char 
e5ab0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
e5ac0 5f 74 65 78 74 20 28 61 72 67 76 5b 35 5d 29 3b  _text (argv[5]);
e5ad0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  .      }..    re
e5ae0 74 20 3d 0a 09 64 75 6d 70 5f 6b 6d 6c 5f 65 78  t =..dump_kml_ex
e5af0 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20 74 61 62   (db_handle, tab
e5b00 6c 65 2c 20 67 65 6f 6d 5f 63 6f 6c 2c 20 70 61  le, geom_col, pa
e5b10 74 68 2c 20 6e 61 6d 65 5f 63 6f 6c 2c 20 64 65  th, name_col, de
e5b20 73 63 72 5f 63 6f 6c 2c 0a 09 09 20 20 20 20 20  scr_col,...     
e5b30 70 72 65 63 69 73 69 6f 6e 2c 20 26 72 6f 77 73  precision, &rows
e5b40 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 6f 77 73  );..    if (rows
e5b50 20 3c 20 30 20 7c 7c 20 21 72 65 74 29 0a 09 73   < 0 || !ret)..s
e5b60 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e5b70 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
e5b80 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
e5b90 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
e5ba0 65 78 74 2c 20 72 6f 77 73 29 3b 0a 7d 0a 0a 73  ext, rows);.}..s
e5bb0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
e5bc0 45 78 70 6f 72 74 47 65 6f 4a 53 4f 4e 20 28 73  ExportGeoJSON (s
e5bd0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
e5be0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
e5bf0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
e5c00 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
e5c10 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
e5c20 45 78 70 6f 72 74 47 65 6f 4a 53 4f 4e 28 54 45  ExportGeoJSON(TE
e5c30 58 54 20 74 61 62 6c 65 2c 20 54 45 58 54 20 67  XT table, TEXT g
e5c40 65 6f 6d 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54  eom_column, TEXT
e5c50 20 66 69 6c 65 6e 61 6d 65 29 0a 2f 20 45 78 70   filename)./ Exp
e5c60 6f 72 74 47 65 6f 4a 53 4f 4e 28 54 45 58 54 20  ortGeoJSON(TEXT 
e5c70 74 61 62 6c 65 2c 20 54 45 58 54 20 67 65 6f 6d  table, TEXT geom
e5c80 5f 63 6f 6c 75 6d 6e 2c 20 54 45 58 54 20 66 69  _column, TEXT fi
e5c90 6c 65 6e 61 6d 65 2c 20 0a 2f 20 20 20 20 20 20  lename, ./      
e5ca0 20 20 20 20 20 20 20 20 20 54 45 58 54 20 66 6f           TEXT fo
e5cb0 72 6d 61 74 29 0a 2f 20 45 78 70 6f 72 74 47 65  rmat)./ ExportGe
e5cc0 6f 4a 53 4f 4e 28 54 45 58 54 20 74 61 62 6c 65  oJSON(TEXT table
e5cd0 2c 20 54 45 58 54 20 67 65 6f 6d 5f 63 6f 6c 75  , TEXT geom_colu
e5ce0 6d 6e 2c 20 54 45 58 54 20 66 69 6c 65 6e 61 6d  mn, TEXT filenam
e5cf0 65 2c 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20  e, ./           
e5d00 20 20 20 20 54 45 58 54 20 66 6f 72 6d 61 74 2c      TEXT format,
e5d10 20 49 4e 54 20 70 72 65 63 69 73 69 6f 6e 29 0a   INT precision).
e5d20 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 0a 2f 20 74  /./ returns:./ t
e5d30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70  he number of exp
e5d40 6f 72 74 65 64 20 72 6f 77 73 0a 2f 20 4e 55 4c  orted rows./ NUL
e5d50 4c 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67  L on invalid arg
e5d60 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e  uments.*/.    in
e5d70 74 20 72 65 74 3b 0a 20 20 20 20 63 68 61 72 20  t ret;.    char 
e5d80 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  *table;.    char
e5d90 20 2a 67 65 6f 6d 5f 63 6f 6c 3b 0a 20 20 20 20   *geom_col;.    
e5da0 63 68 61 72 20 2a 70 61 74 68 3b 0a 20 20 20 20  char *path;.    
e5db0 69 6e 74 20 66 6f 72 6d 61 74 20 3d 20 30 3b 0a  int format = 0;.
e5dc0 20 20 20 20 69 6e 74 20 70 72 65 63 69 73 69 6f      int precisio
e5dd0 6e 20 3d 20 38 3b 0a 20 20 20 20 63 68 61 72 20  n = 8;.    char 
e5de0 2a 66 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *fmt = NULL;.   
e5df0 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 20 20 73   int rows;.    s
e5e00 71 6c 69 74 65 33 20 2a 64 62 5f 68 61 6e 64 6c  qlite3 *db_handl
e5e10 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
e5e20 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
e5e30 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
e5e40 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
e5e50 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
e5e60 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
e5e70 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
e5e80 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
e5e90 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
e5ea0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
e5eb0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
e5ec0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
e5ed0 20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d     }.    table =
e5ee0 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65   (char *) sqlite
e5ef0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
e5f00 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[0]);.    if (
e5f10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
e5f20 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
e5f30 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
e5f40 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
e5f50 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
e5f60 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
e5f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65  ;.      }.    ge
e5f80 6f 6d 5f 63 6f 6c 20 3d 20 28 63 68 61 72 20 2a  om_col = (char *
e5f90 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
e5fa0 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
e5fb0 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
e5fc0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
e5fd0 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [2]) != SQLITE_T
e5fe0 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
e5ff0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
e6000 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
e6010 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
e6020 7d 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68  }.    path = (ch
e6030 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
e6040 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32  lue_text (argv[2
e6050 5d 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63  ]);.    if (argc
e6060 20 3e 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20   > 3).      {.. 
e6070 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e6080 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
e6090 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e60a0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
e60b0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
e60c0 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
e60d0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  rn;..    }..  el
e60e0 73 65 0a 09 20 20 20 20 7b 0a 09 09 66 6d 74 20  se..    {...fmt 
e60f0 3d 20 28 63 68 61 72 20 2a 29 20 73 71 6c 69 74  = (char *) sqlit
e6100 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
e6110 72 67 76 5b 33 5d 29 3b 0a 09 09 69 66 20 28 73  rgv[3]);...if (s
e6120 74 72 63 61 73 65 63 6d 70 20 28 66 6d 74 2c 20  trcasecmp (fmt, 
e6130 22 6e 6f 6e 65 22 29 20 3d 3d 20 30 29 0a 09 09  "none") == 0)...
e6140 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 30 3b 0a      format = 0;.
e6150 09 09 65 6c 73 65 20 69 66 20 28 73 74 72 63 61  ..else if (strca
e6160 73 65 63 6d 70 20 28 66 6d 74 2c 20 22 4d 42 52  secmp (fmt, "MBR
e6170 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 66  ") == 0)...    f
e6180 6f 72 6d 61 74 20 3d 20 31 3b 0a 09 09 65 6c 73  ormat = 1;...els
e6190 65 20 69 66 20 28 73 74 72 63 61 73 65 63 6d 70  e if (strcasecmp
e61a0 20 28 66 6d 74 2c 20 22 77 69 74 68 53 68 6f 72   (fmt, "withShor
e61b0 74 43 52 53 22 29 20 3d 3d 20 30 29 0a 09 09 20  tCRS") == 0)... 
e61c0 20 20 20 66 6f 72 6d 61 74 20 3d 20 32 3b 0a 09     format = 2;..
e61d0 09 65 6c 73 65 20 69 66 20 28 73 74 72 63 61 73  .else if (strcas
e61e0 65 63 6d 70 20 28 66 6d 74 2c 20 22 4d 42 52 77  ecmp (fmt, "MBRw
e61f0 69 74 68 53 68 6f 72 74 43 52 53 22 29 20 3d 3d  ithShortCRS") ==
e6200 20 30 29 0a 09 09 20 20 20 20 66 6f 72 6d 61 74   0)...    format
e6210 20 3d 20 33 3b 0a 09 09 65 6c 73 65 20 69 66 20   = 3;...else if 
e6220 28 73 74 72 63 61 73 65 63 6d 70 20 28 66 6d 74  (strcasecmp (fmt
e6230 2c 20 22 77 69 74 68 4c 6f 6e 67 43 52 53 22 29  , "withLongCRS")
e6240 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 66 6f 72   == 0)...    for
e6250 6d 61 74 20 3d 20 34 3b 0a 09 09 65 6c 73 65 20  mat = 4;...else 
e6260 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 20 28  if (strcasecmp (
e6270 66 6d 74 2c 20 22 4d 42 52 77 69 74 68 4c 6f 6e  fmt, "MBRwithLon
e6280 67 43 52 53 22 29 20 3d 3d 20 30 29 0a 09 09 20  gCRS") == 0)... 
e6290 20 20 20 66 6f 72 6d 61 74 20 3d 20 35 3b 0a 09     format = 5;..
e62a0 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20  .else...  {...  
e62b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e62c0 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
e62d0 29 3b 0a 09 09 20 20 20 20 20 20 72 65 74 75 72  );...      retur
e62e0 6e 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a  n;...  }..    }.
e62f0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
e6300 61 72 67 63 20 3e 20 34 29 0a 20 20 20 20 20 20  argc > 4).      
e6310 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
e6320 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
e6330 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[4]) != SQLITE_
e6340 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
e6350 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
e6360 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
e6370 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
e6380 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  }..  else..     
e6390 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 73 71 6c   precision = sql
e63a0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
e63b0 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 20 20  argv[4]);.      
e63c0 7d 0a 0a 20 20 20 20 72 65 74 20 3d 0a 09 64 75  }..    ret =..du
e63d0 6d 70 5f 67 65 6f 6a 73 6f 6e 5f 65 78 20 28 64  mp_geojson_ex (d
e63e0 62 5f 68 61 6e 64 6c 65 2c 20 74 61 62 6c 65 2c  b_handle, table,
e63f0 20 67 65 6f 6d 5f 63 6f 6c 2c 20 70 61 74 68 2c   geom_col, path,
e6400 20 70 72 65 63 69 73 69 6f 6e 2c 20 66 6f 72 6d   precision, form
e6410 61 74 2c 0a 09 09 09 20 26 72 6f 77 73 29 3b 0a  at,.... &rows);.
e6420 0a 20 20 20 20 69 66 20 28 72 6f 77 73 20 3c 20  .    if (rows < 
e6430 30 20 7c 7c 20 21 72 65 74 29 0a 09 73 71 6c 69  0 || !ret)..sqli
e6440 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
e6450 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
e6460 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  lse..sqlite3_res
e6470 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
e6480 2c 20 72 6f 77 73 29 3b 0a 7d 0a 0a 23 69 66 64  , rows);.}..#ifd
e6490 65 66 20 45 4e 41 42 4c 45 5f 4c 49 42 58 4d 4c  ef ENABLE_LIBXML
e64a0 32 09 09 2f 2a 20 69 6e 63 6c 75 64 69 6e 67 20  2../* including 
e64b0 4c 49 42 58 4d 4c 32 20 2a 2f 0a 73 74 61 74 69  LIBXML2 */.stati
e64c0 63 20 76 6f 69 64 0a 77 66 73 5f 70 61 67 65 5f  c void.wfs_page_
e64d0 64 6f 6e 65 20 28 69 6e 74 20 66 65 61 74 75 72  done (int featur
e64e0 65 73 2c 20 76 6f 69 64 20 2a 70 74 72 29 0a 7b  es, void *ptr).{
e64f0 0a 2f 2a 20 57 46 53 20 70 72 6f 67 72 65 73 73  ./* WFS progress
e6500 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
e6510 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 74 72  k */.    if (ptr
e6520 20 3d 3d 20 4e 55 4c 4c 29 0a 09 70 74 72 20 3d   == NULL)..ptr =
e6530 20 4e 55 4c 4c 3b 09 09 2f 2a 20 73 69 6c 65 6e   NULL;../* silen
e6540 63 69 6e 67 20 73 74 75 70 69 64 20 63 6f 6d 70  cing stupid comp
e6550 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f  iler warnings */
e6560 0a 20 20 20 20 69 66 20 28 69 73 61 74 74 79 20  .    if (isatty 
e6570 28 31 29 29 0a 09 73 70 61 74 69 61 6c 69 74 65  (1))..spatialite
e6580 5f 65 20 28 22 57 46 53 20 46 65 61 74 75 72 65  _e ("WFS Feature
e6590 73 20 6c 6f 61 64 65 64 20 73 69 6e 63 65 20 6e  s loaded since n
e65a0 6f 77 3a 20 25 64 5c 72 22 2c 20 66 65 61 74 75  ow: %d\r", featu
e65b0 72 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  res);.}..static 
e65c0 76 6f 69 64 0a 66 6e 63 74 5f 49 6d 70 6f 72 74  void.fnct_Import
e65d0 57 46 53 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  WFS (sqlite3_con
e65e0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
e65f0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
e6600 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
e6610 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
e6620 6f 6e 3a 0a 2f 20 49 6d 70 6f 72 74 57 46 53 28  on:./ ImportWFS(
e6630 54 45 58 54 20 66 69 6c 65 6e 61 6d 65 5f 6f 72  TEXT filename_or
e6640 5f 75 72 6c 2c 20 54 45 58 54 20 6c 61 79 65 72  _url, TEXT layer
e6650 5f 6e 61 6d 65 2c 20 54 45 58 54 20 74 61 62 6c  _name, TEXT tabl
e6660 65 29 0a 2f 20 49 6d 70 6f 72 74 57 46 53 28 54  e)./ ImportWFS(T
e6670 45 58 54 20 66 69 6c 65 6e 61 6d 65 5f 6f 72 5f  EXT filename_or_
e6680 75 72 6c 2c 20 54 45 58 54 20 6c 61 79 65 72 5f  url, TEXT layer_
e6690 6e 61 6d 65 2c 20 54 45 58 54 20 74 61 62 6c 65  name, TEXT table
e66a0 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 54 45  ,./           TE
e66b0 58 54 20 70 6b 5f 63 6f 6c 75 6d 6e 29 0a 2f 20  XT pk_column)./ 
e66c0 49 6d 70 6f 72 74 57 46 53 28 54 45 58 54 20 66  ImportWFS(TEXT f
e66d0 69 6c 65 6e 61 6d 65 5f 6f 72 5f 75 72 6c 2c 20  ilename_or_url, 
e66e0 54 45 58 54 20 6c 61 79 65 72 5f 6e 61 6d 65 2c  TEXT layer_name,
e66f0 20 54 45 58 54 20 74 61 62 6c 65 2c 0a 2f 20 20   TEXT table,./  
e6700 20 20 20 20 20 20 20 20 20 54 45 58 54 20 70 6b           TEXT pk
e6710 5f 63 6f 6c 75 6d 6e 2c 20 49 4e 54 20 73 77 61  _column, INT swa
e6720 70 5f 61 78 65 73 29 0a 2f 20 49 6d 70 6f 72 74  p_axes)./ Import
e6730 57 46 53 28 54 45 58 54 20 66 69 6c 65 6e 61 6d  WFS(TEXT filenam
e6740 65 5f 6f 72 5f 75 72 6c 2c 20 54 45 58 54 20 6c  e_or_url, TEXT l
e6750 61 79 65 72 5f 6e 61 6d 65 2c 20 54 45 58 54 20  ayer_name, TEXT 
e6760 74 61 62 6c 65 2c 0a 2f 20 20 20 20 20 20 20 20  table,./        
e6770 20 20 20 54 45 58 54 20 70 6b 5f 63 6f 6c 75 6d     TEXT pk_colum
e6780 6e 2c 20 49 4e 54 20 73 77 61 70 5f 61 78 65 73  n, INT swap_axes
e6790 2c 20 49 4e 54 20 70 61 67 65 5f 73 69 7a 65 29  , INT page_size)
e67a0 0a 2f 20 49 6d 70 6f 72 74 57 46 53 28 54 45 58  ./ ImportWFS(TEX
e67b0 54 20 66 69 6c 65 6e 61 6d 65 5f 6f 72 5f 75 72  T filename_or_ur
e67c0 6c 2c 20 54 45 58 54 20 6c 61 79 65 72 5f 6e 61  l, TEXT layer_na
e67d0 6d 65 2c 20 54 45 58 54 20 74 61 62 6c 65 2c 0a  me, TEXT table,.
e67e0 2f 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54  /           TEXT
e67f0 20 70 6b 5f 63 6f 6c 75 6d 6e 2c 20 49 4e 54 20   pk_column, INT 
e6800 73 77 61 70 5f 61 78 65 73 2c 20 49 4e 54 20 70  swap_axes, INT p
e6810 61 67 65 5f 73 69 7a 65 2c 0a 2f 20 20 20 20 20  age_size,./     
e6820 20 20 20 20 20 20 49 4e 54 20 73 70 61 74 69 61        INT spatia
e6830 6c 5f 69 6e 64 65 78 29 0a 2f 0a 2f 20 72 65 74  l_index)././ ret
e6840 75 72 6e 73 3a 0a 2f 20 74 68 65 20 6e 75 6d 62  urns:./ the numb
e6850 65 72 20 6f 66 20 69 6d 70 6f 72 74 65 64 20 72  er of imported r
e6860 6f 77 73 0a 2f 20 4e 55 4c 4c 20 6f 6e 20 69 6e  ows./ NULL on in
e6870 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
e6880 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
e6890 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 5f 6f      char *path_o
e68a0 72 5f 75 72 6c 3b 0a 20 20 20 20 63 68 61 72 20  r_url;.    char 
e68b0 2a 6c 61 79 65 72 5f 6e 61 6d 65 3b 0a 20 20 20  *layer_name;.   
e68c0 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20   char *table;.  
e68d0 20 20 69 6e 74 20 73 77 61 70 5f 61 78 65 73 20    int swap_axes 
e68e0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 70 61  = 0;.    int spa
e68f0 74 69 61 6c 5f 69 6e 64 65 78 20 3d 20 30 3b 0a  tial_index = 0;.
e6900 20 20 20 20 69 6e 74 20 70 61 67 65 5f 73 69 7a      int page_siz
e6910 65 20 3d 20 2d 31 3b 0a 20 20 20 20 63 68 61 72  e = -1;.    char
e6920 20 2a 70 6b 5f 63 6f 6c 75 6d 6e 20 3d 20 4e 55   *pk_column = NU
e6930 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 73  LL;.    int rows
e6940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
e6950 62 5f 68 61 6e 64 6c 65 20 3d 20 73 71 6c 69 74  b_handle = sqlit
e6960 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
e6970 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
e6980 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
e6990 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
e69a0 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
e69b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
e69c0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
e69d0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
e69e0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
e69f0 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
e6a00 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
e6a10 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
e6a20 70 61 74 68 5f 6f 72 5f 75 72 6c 20 3d 20 28 63  path_or_url = (c
e6a30 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
e6a40 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
e6a50 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c  0]);.    if (sql
e6a60 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
e6a70 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
e6a80 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
e6a90 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
e6aa0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
e6ab0 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
e6ac0 20 20 20 20 20 7d 0a 20 20 20 20 6c 61 79 65 72       }.    layer
e6ad0 5f 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  _name = (char *)
e6ae0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
e6af0 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ext (argv[1]);. 
e6b00 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
e6b10 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
e6b20 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45  2]) != SQLITE_TE
e6b30 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  XT).      {..  s
e6b40 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e6b50 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
e6b60 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
e6b70 0a 20 20 20 20 74 61 62 6c 65 20 3d 20 28 63 68  .    table = (ch
e6b80 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
e6b90 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32  lue_text (argv[2
e6ba0 5d 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63  ]);.    if (argc
e6bb0 20 3e 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20   > 3).      {.. 
e6bc0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
e6bd0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
e6be0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
e6bf0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
e6c00 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
e6c10 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
e6c20 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  rn;..    }..  el
e6c30 73 65 0a 09 20 20 20 20 20 20 70 6b 5f 63 6f 6c  se..      pk_col
e6c40 75 6d 6e 20 3d 20 28 63 68 61 72 20 2a 29 20 73  umn = (char *) s
e6c50 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e6c60 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  t (argv[3]);.   
e6c70 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
e6c80 63 20 3e 20 34 29 0a 20 20 20 20 20 20 7b 0a 09  c > 4).      {..
e6c90 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
e6ca0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34  lue_type (argv[4
e6cb0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) != SQLITE_INT
e6cc0 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73  EGER)..    {...s
e6cd0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
e6ce0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
e6cf0 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09  return;..    }..
e6d00 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 77    else..      sw
e6d10 61 70 5f 61 78 65 73 20 3d 20 73 71 6c 69 74 65  ap_axes = sqlite
e6d20 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
e6d30 76 5b 34 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[4]);.      }. 
e6d40 20 20 20 69 66 20 28 61 72 67 63 20 3e 20 35 29     if (argc > 5)
e6d50 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
e6d60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
e6d70 70 65 20 28 61 72 67 76 5b 35 5d 29 20 21 3d 20  pe (argv[5]) != 
e6d80 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
e6d90 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
e6da0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
e6db0 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
e6dc0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
e6dd0 0a 09 20 20 20 20 20 20 70 61 67 65 5f 73 69 7a  ..      page_siz
e6de0 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
e6df0 65 5f 69 6e 74 20 28 61 72 67 76 5b 35 5d 29 3b  e_int (argv[5]);
e6e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
e6e10 28 61 72 67 63 20 3e 20 36 29 0a 20 20 20 20 20  (argc > 6).     
e6e20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
e6e30 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
e6e40 67 76 5b 36 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[6]) != SQLITE
e6e50 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
e6e60 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
e6e70 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
e6e80 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
e6e90 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
e6ea0 20 20 73 70 61 74 69 61 6c 5f 69 6e 64 65 78 20    spatial_index 
e6eb0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
e6ec0 69 6e 74 20 28 61 72 67 76 5b 36 5d 29 3b 0a 20  int (argv[6]);. 
e6ed0 20 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 20       }..    ret 
e6ee0 3d 0a 09 6c 6f 61 64 5f 66 72 6f 6d 5f 77 66 73  =..load_from_wfs
e6ef0 5f 70 61 67 65 64 20 28 64 62 5f 68 61 6e 64 6c  _paged (db_handl
e6f00 65 2c 20 70 61 74 68 5f 6f 72 5f 75 72 6c 2c 20  e, path_or_url, 
e6f10 4e 55 4c 4c 2c 20 6c 61 79 65 72 5f 6e 61 6d 65  NULL, layer_name
e6f20 2c 0a 09 09 09 20 20 20 20 20 73 77 61 70 5f 61  ,....     swap_a
e6f30 78 65 73 2c 20 74 61 62 6c 65 2c 20 70 6b 5f 63  xes, table, pk_c
e6f40 6f 6c 75 6d 6e 2c 20 73 70 61 74 69 61 6c 5f 69  olumn, spatial_i
e6f50 6e 64 65 78 2c 0a 09 09 09 20 20 20 20 20 70 61  ndex,....     pa
e6f60 67 65 5f 73 69 7a 65 2c 20 26 72 6f 77 73 2c 20  ge_size, &rows, 
e6f70 4e 55 4c 4c 2c 20 77 66 73 5f 70 61 67 65 5f 64  NULL, wfs_page_d
e6f80 6f 6e 65 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  one, NULL);..   
e6f90 20 69 66 20 28 72 6f 77 73 20 3c 20 30 20 7c 7c   if (rows < 0 ||
e6fa0 20 21 72 65 74 29 0a 09 73 71 6c 69 74 65 33 5f   !ret)..sqlite3_
e6fb0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
e6fc0 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
e6fd0 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
e6fe0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 6f  int (context, ro
e6ff0 77 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ws);.}.#endif /*
e7000 20 65 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 4c   end including L
e7010 49 42 58 4d 4c 32 20 2a 2f 0a 0a 73 74 61 74 69  IBXML2 */..stati
e7020 63 20 69 6e 74 0a 69 73 5f 77 6f 72 64 5f 64 65  c int.is_word_de
e7030 6c 69 6d 69 74 65 72 20 28 63 6f 6e 73 74 20 63  limiter (const c
e7040 68 61 72 20 78 2c 20 69 6e 74 20 70 6f 73 74 29  har x, int post)
e7050 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f  .{./* testing fo
e7060 72 20 61 20 53 51 4c 20 77 6f 72 64 20 64 65 6c  r a SQL word del
e7070 69 6d 69 74 65 72 20 2a 2f 0a 20 20 20 20 69 66  imiter */.    if
e7080 20 28 78 20 3d 3d 20 27 20 27 20 7c 7c 20 78 20   (x == ' ' || x 
e7090 3d 3d 20 27 5c 74 27 20 7c 7c 20 78 20 3d 3d 20  == '\t' || x == 
e70a0 27 5c 6e 27 20 7c 7c 20 78 20 3d 3d 20 27 5c 72  '\n' || x == '\r
e70b0 27 20 7c 7c 20 78 20 3d 3d 20 27 28 27 29 0a 09  ' || x == '(')..
e70c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
e70d0 20 28 70 6f 73 74 20 26 26 20 78 20 3d 3d 20 27   (post && x == '
e70e0 28 27 29 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20  (')..return 1;. 
e70f0 20 20 20 69 66 20 28 21 70 6f 73 74 20 26 26 20     if (!post && 
e7100 78 20 3d 3d 20 27 2c 27 29 0a 09 72 65 74 75 72  x == ',')..retur
e7110 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 1;.    return 
e7120 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
e7130 0a 64 6f 5f 63 68 65 63 6b 5f 65 76 61 6c 20 28  .do_check_eval (
e7140 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 29  const char *str)
e7150 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e 67 20 69 66  .{./* testing if
e7160 20 61 20 54 72 69 67 67 65 72 20 61 74 74 65 6d   a Trigger attem
e7170 70 74 73 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  pts calling the 
e7180 64 61 6e 67 65 72 6f 75 73 20 45 76 61 6c 28 29  dangerous Eval()
e7190 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
e71a0 20 20 69 6e 74 20 63 6f 6e 74 61 69 6e 73 5f 65    int contains_e
e71b0 76 61 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  val = 0;.    con
e71c0 73 74 20 63 68 61 72 20 2a 73 74 61 72 74 20 3d  st char *start =
e71d0 20 73 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20   str;.    const 
e71e0 63 68 61 72 20 2a 70 74 72 3b 0a 20 20 20 20 77  char *ptr;.    w
e71f0 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b  hile (1).      {
e7200 0a 09 20 20 63 68 61 72 20 70 72 65 3b 0a 09 20  ..  char pre;.. 
e7210 20 63 68 61 72 20 70 6f 73 74 3b 0a 09 20 20 70   char post;..  p
e7220 74 72 20 3d 20 73 74 72 73 74 72 20 28 73 74 61  tr = strstr (sta
e7230 72 74 2c 20 22 65 76 61 6c 22 29 3b 0a 09 20 20  rt, "eval");..  
e7240 69 66 20 28 70 74 72 20 3d 3d 20 4e 55 4c 4c 29  if (ptr == NULL)
e7250 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09  ..      break;..
e7260 20 20 69 66 20 28 70 74 72 20 3e 20 73 74 72 29    if (ptr > str)
e7270 0a 09 20 20 20 20 20 20 70 72 65 20 3d 20 2a 28  ..      pre = *(
e7280 70 74 72 20 2d 20 31 29 3b 0a 09 20 20 65 6c 73  ptr - 1);..  els
e7290 65 0a 09 20 20 20 20 20 20 70 72 65 20 3d 20 27  e..      pre = '
e72a0 20 27 3b 0a 09 20 20 70 6f 73 74 20 3d 20 2a 28   ';..  post = *(
e72b0 70 74 72 20 2b 20 34 29 3b 0a 09 20 20 69 66 20  ptr + 4);..  if 
e72c0 28 69 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69 74  (is_word_delimit
e72d0 65 72 20 28 70 72 65 2c 20 30 29 20 26 26 20 69  er (pre, 0) && i
e72e0 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69 74 65 72  s_word_delimiter
e72f0 20 28 70 6f 73 74 2c 20 31 29 29 0a 09 20 20 20   (post, 1))..   
e7300 20 20 20 63 6f 6e 74 61 69 6e 73 5f 65 76 61 6c     contains_eval
e7310 20 3d 20 31 3b 0a 09 20 20 73 74 61 72 74 20 3d   = 1;..  start =
e7320 20 70 74 72 20 2b 20 34 3b 0a 20 20 20 20 20 20   ptr + 4;.      
e7330 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6e  }.    return con
e7340 74 61 69 6e 73 5f 65 76 61 6c 3b 0a 7d 0a 0a 73  tains_eval;.}..s
e7350 74 61 74 69 63 20 69 6e 74 0a 64 6f 5f 63 68 65  tatic int.do_che
e7360 63 6b 5f 62 6c 6f 62 5f 66 72 6f 6d 5f 66 69 6c  ck_blob_from_fil
e7370 65 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  e (const char *s
e7380 74 72 29 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e 67  tr).{./* testing
e7390 20 69 66 20 61 20 54 72 69 67 67 65 72 20 61 74   if a Trigger at
e73a0 74 65 6d 70 74 73 20 63 61 6c 6c 69 6e 67 20 74  tempts calling t
e73b0 68 65 20 64 61 6e 67 65 72 6f 75 73 20 42 6c 6f  he dangerous Blo
e73c0 62 46 72 6f 6d 46 69 6c 65 28 29 20 66 75 6e 63  bFromFile() func
e73d0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  tion */..    int
e73e0 20 63 6f 6e 74 61 69 6e 73 5f 62 6c 6f 62 5f 66   contains_blob_f
e73f0 72 6f 6d 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  rom_file = 0;.  
e7400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74    const char *st
e7410 61 72 74 20 3d 20 73 74 72 3b 0a 20 20 20 20 63  art = str;.    c
e7420 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 3b 0a  onst char *ptr;.
e7430 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20      while (1).  
e7440 20 20 20 20 7b 0a 09 20 20 63 68 61 72 20 70 72      {..  char pr
e7450 65 3b 0a 09 20 20 63 68 61 72 20 70 6f 73 74 3b  e;..  char post;
e7460 0a 09 20 20 70 74 72 20 3d 20 73 74 72 73 74 72  ..  ptr = strstr
e7470 20 28 73 74 61 72 74 2c 20 22 62 6c 6f 62 66 72   (start, "blobfr
e7480 6f 6d 66 69 6c 65 22 29 3b 0a 09 20 20 69 66 20  omfile");..  if 
e7490 28 70 74 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20  (ptr == NULL).. 
e74a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 69       break;..  i
e74b0 66 20 28 70 74 72 20 3e 20 73 74 72 29 0a 09 20  f (ptr > str).. 
e74c0 20 20 20 20 20 70 72 65 20 3d 20 2a 28 70 74 72       pre = *(ptr
e74d0 20 2d 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09   - 1);..  else..
e74e0 20 20 20 20 20 20 70 72 65 20 3d 20 27 20 27 3b        pre = ' ';
e74f0 0a 09 20 20 70 6f 73 74 20 3d 20 2a 28 70 74 72  ..  post = *(ptr
e7500 20 2b 20 31 32 29 3b 0a 09 20 20 69 66 20 28 69   + 12);..  if (i
e7510 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69 74 65 72  s_word_delimiter
e7520 20 28 70 72 65 2c 20 30 29 20 26 26 20 69 73 5f   (pre, 0) && is_
e7530 77 6f 72 64 5f 64 65 6c 69 6d 69 74 65 72 20 28  word_delimiter (
e7540 70 6f 73 74 2c 20 31 29 29 0a 09 20 20 20 20 20  post, 1))..     
e7550 20 63 6f 6e 74 61 69 6e 73 5f 62 6c 6f 62 5f 66   contains_blob_f
e7560 72 6f 6d 5f 66 69 6c 65 20 3d 20 31 3b 0a 09 20  rom_file = 1;.. 
e7570 20 73 74 61 72 74 20 3d 20 70 74 72 20 2b 20 31   start = ptr + 1
e7580 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  2;.      }.    r
e7590 65 74 75 72 6e 20 63 6f 6e 74 61 69 6e 73 5f 62  eturn contains_b
e75a0 6c 6f 62 5f 66 72 6f 6d 5f 66 69 6c 65 3b 0a 7d  lob_from_file;.}
e75b0 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 64 6f 5f  ..static int.do_
e75c0 63 68 65 63 6b 5f 62 6c 6f 62 5f 74 6f 5f 66 69  check_blob_to_fi
e75d0 6c 65 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  le (const char *
e75e0 73 74 72 29 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e  str).{./* testin
e75f0 67 20 69 66 20 61 20 54 72 69 67 67 65 72 20 61  g if a Trigger a
e7600 74 74 65 6d 70 74 73 20 63 61 6c 6c 69 6e 67 20  ttempts calling 
e7610 74 68 65 20 64 61 6e 67 65 72 6f 75 73 20 42 6c  the dangerous Bl
e7620 6f 62 54 6f 46 69 6c 65 28 29 20 66 75 6e 63 74  obToFile() funct
e7630 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ion */..    int 
e7640 63 6f 6e 74 61 69 6e 73 5f 62 6c 6f 62 5f 74 6f  contains_blob_to
e7650 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63  _file = 0;.    c
e7660 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 61 72 74  onst char *start
e7670 20 3d 20 73 74 72 3b 0a 20 20 20 20 63 6f 6e 73   = str;.    cons
e7680 74 20 63 68 61 72 20 2a 70 74 72 3b 0a 20 20 20  t char *ptr;.   
e7690 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20   while (1).     
e76a0 20 7b 0a 09 20 20 63 68 61 72 20 70 72 65 3b 0a   {..  char pre;.
e76b0 09 20 20 63 68 61 72 20 70 6f 73 74 3b 0a 09 20  .  char post;.. 
e76c0 20 70 74 72 20 3d 20 73 74 72 73 74 72 20 28 73   ptr = strstr (s
e76d0 74 61 72 74 2c 20 22 62 6c 6f 62 74 6f 66 69 6c  tart, "blobtofil
e76e0 65 22 29 3b 0a 09 20 20 69 66 20 28 70 74 72 20  e");..  if (ptr 
e76f0 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20  == NULL)..      
e7700 62 72 65 61 6b 3b 0a 09 20 20 69 66 20 28 70 74  break;..  if (pt
e7710 72 20 3e 20 73 74 72 29 0a 09 20 20 20 20 20 20  r > str)..      
e7720 70 72 65 20 3d 20 2a 28 70 74 72 20 2d 20 31 29  pre = *(ptr - 1)
e7730 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20  ;..  else..     
e7740 20 70 72 65 20 3d 20 27 20 27 3b 0a 09 20 20 70   pre = ' ';..  p
e7750 6f 73 74 20 3d 20 2a 28 70 74 72 20 2b 20 31 30  ost = *(ptr + 10
e7760 29 3b 0a 09 20 20 69 66 20 28 69 73 5f 77 6f 72  );..  if (is_wor
e7770 64 5f 64 65 6c 69 6d 69 74 65 72 20 28 70 72 65  d_delimiter (pre
e7780 2c 20 30 29 20 26 26 20 69 73 5f 77 6f 72 64 5f  , 0) && is_word_
e7790 64 65 6c 69 6d 69 74 65 72 20 28 70 6f 73 74 2c  delimiter (post,
e77a0 20 31 29 29 0a 09 20 20 20 20 20 20 63 6f 6e 74   1))..      cont
e77b0 61 69 6e 73 5f 62 6c 6f 62 5f 74 6f 5f 66 69 6c  ains_blob_to_fil
e77c0 65 20 3d 20 31 3b 0a 09 20 20 73 74 61 72 74 20  e = 1;..  start 
e77d0 3d 20 70 74 72 20 2b 20 31 30 3b 0a 20 20 20 20  = ptr + 10;.    
e77e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63    }.    return c
e77f0 6f 6e 74 61 69 6e 73 5f 62 6c 6f 62 5f 74 6f 5f  ontains_blob_to_
e7800 66 69 6c 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  file;.}..static 
e7810 69 6e 74 0a 64 6f 5f 63 68 65 63 6b 5f 6c 6f 61  int.do_check_loa
e7820 64 5f 78 6d 6c 20 28 63 6f 6e 73 74 20 63 68 61  d_xml (const cha
e7830 72 20 2a 73 74 72 29 0a 7b 0a 2f 2a 20 74 65 73  r *str).{./* tes
e7840 74 69 6e 67 20 69 66 20 61 20 54 72 69 67 67 65  ting if a Trigge
e7850 72 20 61 74 74 65 6d 70 74 73 20 63 61 6c 6c 69  r attempts calli
e7860 6e 67 20 74 68 65 20 64 61 6e 67 65 72 6f 75 73  ng the dangerous
e7870 20 58 42 5f 4c 6f 61 64 58 6d 6c 28 29 20 66 75   XB_LoadXml() fu
e7880 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69  nction */..    i
e7890 6e 74 20 63 6f 6e 74 61 69 6e 73 5f 6c 6f 61 64  nt contains_load
e78a0 5f 78 6d 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  _xml = 0;.    co
e78b0 6e 73 74 20 63 68 61 72 20 2a 73 74 61 72 74 20  nst char *start 
e78c0 3d 20 73 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74  = str;.    const
e78d0 20 63 68 61 72 20 2a 70 74 72 3b 0a 20 20 20 20   char *ptr;.    
e78e0 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20  while (1).      
e78f0 7b 0a 09 20 20 63 68 61 72 20 70 72 65 3b 0a 09  {..  char pre;..
e7900 20 20 63 68 61 72 20 70 6f 73 74 3b 0a 09 20 20    char post;..  
e7910 70 74 72 20 3d 20 73 74 72 73 74 72 20 28 73 74  ptr = strstr (st
e7920 61 72 74 2c 20 22 78 62 5f 6c 6f 61 64 78 6d 6c  art, "xb_loadxml
e7930 22 29 3b 0a 09 20 20 69 66 20 28 70 74 72 20 3d  ");..  if (ptr =
e7940 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 62  = NULL)..      b
e7950 72 65 61 6b 3b 0a 09 20 20 69 66 20 28 70 74 72  reak;..  if (ptr
e7960 20 3e 20 73 74 72 29 0a 09 20 20 20 20 20 20 70   > str)..      p
e7970 72 65 20 3d 20 2a 28 70 74 72 20 2d 20 31 29 3b  re = *(ptr - 1);
e7980 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
e7990 70 72 65 20 3d 20 27 20 27 3b 0a 09 20 20 70 6f  pre = ' ';..  po
e79a0 73 74 20 3d 20 2a 28 70 74 72 20 2b 20 31 30 29  st = *(ptr + 10)
e79b0 3b 0a 09 20 20 69 66 20 28 69 73 5f 77 6f 72 64  ;..  if (is_word
e79c0 5f 64 65 6c 69 6d 69 74 65 72 20 28 70 72 65 2c  _delimiter (pre,
e79d0 20 30 29 20 26 26 20 69 73 5f 77 6f 72 64 5f 64   0) && is_word_d
e79e0 65 6c 69 6d 69 74 65 72 20 28 70 6f 73 74 2c 20  elimiter (post, 
e79f0 31 29 29 0a 09 20 20 20 20 20 20 63 6f 6e 74 61  1))..      conta
e7a00 69 6e 73 5f 6c 6f 61 64 5f 78 6d 6c 20 3d 20 31  ins_load_xml = 1
e7a10 3b 0a 09 20 20 73 74 61 72 74 20 3d 20 70 74 72  ;..  start = ptr
e7a20 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 7d 0a 20   + 10;.      }. 
e7a30 20 20 20 72 65 74 75 72 6e 20 63 6f 6e 74 61 69     return contai
e7a40 6e 73 5f 6c 6f 61 64 5f 78 6d 6c 3b 0a 7d 0a 0a  ns_load_xml;.}..
e7a50 73 74 61 74 69 63 20 69 6e 74 0a 64 6f 5f 63 68  static int.do_ch
e7a60 65 63 6b 5f 73 74 6f 72 65 5f 78 6d 6c 20 28 63  eck_store_xml (c
e7a70 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 29 0a  onst char *str).
e7a80 7b 0a 2f 2a 20 74 65 73 74 69 6e 67 20 69 66 20  {./* testing if 
e7a90 61 20 54 72 69 67 67 65 72 20 61 74 74 65 6d 70  a Trigger attemp
e7aa0 74 73 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 64  ts calling the d
e7ab0 61 6e 67 65 72 6f 75 73 20 58 42 5f 53 74 6f 72  angerous XB_Stor
e7ac0 65 58 6d 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  eXml() function 
e7ad0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 63 6f 6e 74  */..    int cont
e7ae0 61 69 6e 73 5f 73 74 6f 72 65 5f 78 6d 6c 20 3d  ains_store_xml =
e7af0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
e7b00 61 72 20 2a 73 74 61 72 74 20 3d 20 73 74 72 3b  ar *start = str;
e7b10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e7b20 2a 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 20  *ptr;.    while 
e7b30 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 63  (1).      {..  c
e7b40 68 61 72 20 70 72 65 3b 0a 09 20 20 63 68 61 72  har pre;..  char
e7b50 20 70 6f 73 74 3b 0a 09 20 20 70 74 72 20 3d 20   post;..  ptr = 
e7b60 73 74 72 73 74 72 20 28 73 74 61 72 74 2c 20 22  strstr (start, "
e7b70 78 62 5f 73 74 6f 72 65 78 6d 6c 22 29 3b 0a 09  xb_storexml");..
e7b80 20 20 69 66 20 28 70 74 72 20 3d 3d 20 4e 55 4c    if (ptr == NUL
e7b90 4c 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b  L)..      break;
e7ba0 0a 09 20 20 69 66 20 28 70 74 72 20 3e 20 73 74  ..  if (ptr > st
e7bb0 72 29 0a 09 20 20 20 20 20 20 70 72 65 20 3d 20  r)..      pre = 
e7bc0 2a 28 70 74 72 20 2d 20 31 29 3b 0a 09 20 20 65  *(ptr - 1);..  e
e7bd0 6c 73 65 0a 09 20 20 20 20 20 20 70 72 65 20 3d  lse..      pre =
e7be0 20 27 20 27 3b 0a 09 20 20 70 6f 73 74 20 3d 20   ' ';..  post = 
e7bf0 2a 28 70 74 72 20 2b 20 31 31 29 3b 0a 09 20 20  *(ptr + 11);..  
e7c00 69 66 20 28 69 73 5f 77 6f 72 64 5f 64 65 6c 69  if (is_word_deli
e7c10 6d 69 74 65 72 20 28 70 72 65 2c 20 30 29 20 26  miter (pre, 0) &
e7c20 26 20 69 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69  & is_word_delimi
e7c30 74 65 72 20 28 70 6f 73 74 2c 20 31 29 29 0a 09  ter (post, 1))..
e7c40 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 5f 73        contains_s
e7c50 74 6f 72 65 5f 78 6d 6c 20 3d 20 31 3b 0a 09 20  tore_xml = 1;.. 
e7c60 20 73 74 61 72 74 20 3d 20 70 74 72 20 2b 20 31   start = ptr + 1
e7c70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  1;.      }.    r
e7c80 65 74 75 72 6e 20 63 6f 6e 74 61 69 6e 73 5f 73  eturn contains_s
e7c90 74 6f 72 65 5f 78 6d 6c 3b 0a 7d 0a 0a 73 74 61  tore_xml;.}..sta
e7ca0 74 69 63 20 69 6e 74 0a 64 6f 5f 63 68 65 63 6b  tic int.do_check
e7cb0 5f 65 78 70 6f 72 74 5f 67 65 6f 5f 6a 73 6f 6e  _export_geo_json
e7cc0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74   (const char *st
e7cd0 72 29 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e 67 20  r).{./* testing 
e7ce0 69 66 20 61 20 54 72 69 67 67 65 72 20 61 74 74  if a Trigger att
e7cf0 65 6d 70 74 73 20 63 61 6c 6c 69 6e 67 20 74 68  empts calling th
e7d00 65 20 64 61 6e 67 65 72 6f 75 73 20 45 78 70 6f  e dangerous Expo
e7d10 72 74 47 65 6f 4a 53 4f 4e 28 29 20 66 75 6e 63  rtGeoJSON() func
e7d20 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  tion */..    int
e7d30 20 63 6f 6e 74 61 69 6e 73 5f 65 78 70 6f 72 74   contains_export
e7d40 5f 67 65 6f 5f 6a 73 6f 6e 20 3d 20 30 3b 0a 20  _geo_json = 0;. 
e7d50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
e7d60 74 61 72 74 20 3d 20 73 74 72 3b 0a 20 20 20 20  tart = str;.    
e7d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 3b  const char *ptr;
e7d80 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20  .    while (1). 
e7d90 20 20 20 20 20 7b 0a 09 20 20 63 68 61 72 20 70       {..  char p
e7da0 72 65 3b 0a 09 20 20 63 68 61 72 20 70 6f 73 74  re;..  char post
e7db0 3b 0a 09 20 20 70 74 72 20 3d 20 73 74 72 73 74  ;..  ptr = strst
e7dc0 72 20 28 73 74 61 72 74 2c 20 22 65 78 70 6f 72  r (start, "expor
e7dd0 74 67 65 6f 6a 73 6f 6e 22 29 3b 0a 09 20 20 69  tgeojson");..  i
e7de0 66 20 28 70 74 72 20 3d 3d 20 4e 55 4c 4c 29 0a  f (ptr == NULL).
e7df0 09 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20  .      break;.. 
e7e00 20 69 66 20 28 70 74 72 20 3e 20 73 74 72 29 0a   if (ptr > str).
e7e10 09 20 20 20 20 20 20 70 72 65 20 3d 20 2a 28 70  .      pre = *(p
e7e20 74 72 20 2d 20 31 29 3b 0a 09 20 20 65 6c 73 65  tr - 1);..  else
e7e30 0a 09 20 20 20 20 20 20 70 72 65 20 3d 20 27 20  ..      pre = ' 
e7e40 27 3b 0a 09 20 20 70 6f 73 74 20 3d 20 2a 28 70  ';..  post = *(p
e7e50 74 72 20 2b 20 31 33 29 3b 0a 09 20 20 69 66 20  tr + 13);..  if 
e7e60 28 69 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69 74  (is_word_delimit
e7e70 65 72 20 28 70 72 65 2c 20 30 29 20 26 26 20 69  er (pre, 0) && i
e7e80 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69 74 65 72  s_word_delimiter
e7e90 20 28 70 6f 73 74 2c 20 31 29 29 0a 09 20 20 20   (post, 1))..   
e7ea0 20 20 20 63 6f 6e 74 61 69 6e 73 5f 65 78 70 6f     contains_expo
e7eb0 72 74 5f 67 65 6f 5f 6a 73 6f 6e 20 3d 20 31 3b  rt_geo_json = 1;
e7ec0 0a 09 20 20 73 74 61 72 74 20 3d 20 70 74 72 20  ..  start = ptr 
e7ed0 2b 20 31 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20  + 13;.      }.  
e7ee0 20 20 72 65 74 75 72 6e 20 63 6f 6e 74 61 69 6e    return contain
e7ef0 73 5f 65 78 70 6f 72 74 5f 67 65 6f 5f 6a 73 6f  s_export_geo_jso
e7f00 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  n;.}..static int
e7f10 0a 64 6f 5f 63 68 65 63 6b 5f 69 6d 70 65 78 70  .do_check_impexp
e7f20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74   (const char *st
e7f30 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72  r, const char *r
e7f40 65 66 29 0a 7b 0a 2f 2a 20 0a 2f 20 74 65 73 74  ef).{./* ./ test
e7f50 69 6e 67 20 69 66 20 61 20 54 72 69 67 67 65 72  ing if a Trigger
e7f60 20 61 74 74 65 6d 70 74 73 20 63 61 6c 6c 69 6e   attempts callin
e7f70 67 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 61 6e  g one of the dan
e7f80 67 65 72 6f 75 73 20 45 78 70 6f 72 74 44 58 46  gerous ExportDXF
e7f90 28 29 2c 20 0a 2f 20 49 6d 70 6f 72 74 44 58 46  (), ./ ImportDXF
e7fa0 28 29 2c 20 45 78 70 6f 72 74 44 42 46 28 29 2c  (), ExportDBF(),
e7fb0 20 49 6d 70 6f 72 74 44 42 46 28 29 2c 20 20 45   ImportDBF(),  E
e7fc0 78 70 6f 72 74 53 48 50 28 29 2c 20 45 78 70 6f  xportSHP(), Expo
e7fd0 72 74 53 48 50 28 29 2c 0a 2f 20 45 78 70 6f 72  rtSHP(),./ Expor
e7fe0 74 4b 4d 4c 28 29 2c 20 49 6d 70 6f 72 74 57 46  tKML(), ImportWF
e7ff0 53 28 29 20 6f 72 20 49 6d 70 6f 72 74 58 4c 53  S() or ImportXLS
e8000 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  () functions */.
e8010 0a 20 20 20 20 69 6e 74 20 63 6f 6e 74 61 69 6e  .    int contain
e8020 73 5f 69 6d 70 65 78 70 20 3d 20 30 3b 0a 20 20  s_impexp = 0;.  
e8030 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74    const char *st
e8040 61 72 74 20 3d 20 73 74 72 3b 0a 20 20 20 20 63  art = str;.    c
e8050 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 3b 0a  onst char *ptr;.
e8060 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20      while (1).  
e8070 20 20 20 20 7b 0a 09 20 20 63 68 61 72 20 70 72      {..  char pr
e8080 65 3b 0a 09 20 20 63 68 61 72 20 70 6f 73 74 3b  e;..  char post;
e8090 0a 09 20 20 70 74 72 20 3d 20 73 74 72 73 74 72  ..  ptr = strstr
e80a0 20 28 73 74 61 72 74 2c 20 72 65 66 29 3b 0a 09   (start, ref);..
e80b0 20 20 69 66 20 28 70 74 72 20 3d 3d 20 4e 55 4c    if (ptr == NUL
e80c0 4c 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b  L)..      break;
e80d0 0a 09 20 20 69 66 20 28 70 74 72 20 3e 20 73 74  ..  if (ptr > st
e80e0 72 29 0a 09 20 20 20 20 20 20 70 72 65 20 3d 20  r)..      pre = 
e80f0 2a 28 70 74 72 20 2d 20 31 29 3b 0a 09 20 20 65  *(ptr - 1);..  e
e8100 6c 73 65 0a 09 20 20 20 20 20 20 70 72 65 20 3d  lse..      pre =
e8110 20 27 20 27 3b 0a 09 20 20 70 6f 73 74 20 3d 20   ' ';..  post = 
e8120 2a 28 70 74 72 20 2b 20 39 29 3b 0a 09 20 20 69  *(ptr + 9);..  i
e8130 66 20 28 69 73 5f 77 6f 72 64 5f 64 65 6c 69 6d  f (is_word_delim
e8140 69 74 65 72 20 28 70 72 65 2c 20 30 29 20 26 26  iter (pre, 0) &&
e8150 20 69 73 5f 77 6f 72 64 5f 64 65 6c 69 6d 69 74   is_word_delimit
e8160 65 72 20 28 70 6f 73 74 2c 20 31 29 29 0a 09 20  er (post, 1)).. 
e8170 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 5f 69 6d       contains_im
e8180 70 65 78 70 20 3d 20 31 3b 0a 09 20 20 73 74 61  pexp = 1;..  sta
e8190 72 74 20 3d 20 70 74 72 20 2b 20 39 3b 0a 20 20  rt = ptr + 9;.  
e81a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
e81b0 20 63 6f 6e 74 61 69 6e 73 5f 69 6d 70 65 78 70   contains_impexp
e81c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
e81d0 0a 66 6e 63 74 5f 43 6f 75 6e 74 55 6e 73 61 66  .fnct_CountUnsaf
e81e0 65 54 72 69 67 67 65 72 73 20 28 73 71 6c 69 74  eTriggers (sqlit
e81f0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
e8200 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
e8210 09 09 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ...  sqlite3_val
e8220 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
e8230 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
e8240 20 43 6f 75 6e 74 55 6e 73 61 66 65 54 72 69 67   CountUnsafeTrig
e8250 67 65 72 73 28 29 0a 2f 0a 2f 20 72 65 74 75 72  gers()././ retur
e8260 6e 73 3a 0a 2f 20 74 68 65 20 74 6f 74 61 6c 20  ns:./ the total 
e8270 63 6f 75 6e 74 20 6f 66 20 2a 75 6e 73 61 66 65  count of *unsafe
e8280 2a 20 74 72 69 67 67 65 72 73 20 66 6f 75 6e 64  * triggers found
e8290 0a 2f 20 30 20 69 66 20 6e 6f 20 64 75 62 69 6f  ./ 0 if no dubio
e82a0 75 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62  us trigger has b
e82b0 65 65 6e 20 69 64 65 6e 74 69 66 69 65 64 0a 2a  een identified.*
e82c0 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
e82d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
e82e0 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a 20 20  ar **results;.  
e82f0 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 20 20    int rows;.    
e8300 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20 20 20  int columns;.   
e8310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
e8320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
e8330 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
e8340 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
e8350 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
e8360 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a   int count = 0;.
e8370 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
e8380 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
e8390 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20 63 68  L_LINE */../* ch
e83a0 65 63 6b 69 6e 67 20 61 6c 6c 20 54 72 69 67 67  ecking all Trigg
e83b0 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d  ers */.    sql =
e83c0 20 22 53 45 4c 45 43 54 20 4c 6f 77 65 72 28 73   "SELECT Lower(s
e83d0 71 6c 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ql) FROM sqlite_
e83e0 6d 61 73 74 65 72 20 57 48 45 52 45 20 22 0a 09  master WHERE "..
e83f0 22 74 79 70 65 20 49 4e 20 28 27 74 72 69 67 67  "type IN ('trigg
e8400 65 72 27 2c 20 27 76 69 65 77 27 29 20 41 4e 44  er', 'view') AND
e8410 20 28 73 71 6c 20 4c 49 4b 45 20 27 25 42 6c 6f   (sql LIKE '%Blo
e8420 62 46 72 6f 6d 46 69 6c 65 25 27 20 22 0a 09 22  bFromFile%' ".."
e8430 4f 52 20 73 71 6c 20 4c 49 4b 45 20 27 25 42 6c  OR sql LIKE '%Bl
e8440 6f 62 54 6f 46 69 6c 65 25 27 20 4f 52 20 73 71  obToFile%' OR sq
e8450 6c 20 4c 49 4b 45 20 27 25 58 42 5f 4c 6f 61 64  l LIKE '%XB_Load
e8460 58 4d 4c 25 27 20 22 0a 09 22 4f 52 20 73 71 6c  XML%' ".."OR sql
e8470 20 4c 49 4b 45 20 27 25 58 42 5f 53 74 6f 72 65   LIKE '%XB_Store
e8480 58 4d 4c 25 27 20 4f 52 20 73 71 6c 20 4c 49 4b  XML%' OR sql LIK
e8490 45 20 27 25 49 6d 70 6f 72 74 44 58 46 25 27 20  E '%ImportDXF%' 
e84a0 22 0a 09 22 4f 52 20 73 71 6c 20 4c 49 4b 45 20  ".."OR sql LIKE 
e84b0 27 25 45 78 70 6f 72 74 44 58 46 25 27 20 4f 52  '%ExportDXF%' OR
e84c0 20 73 71 6c 20 4c 49 4b 45 20 27 25 49 6d 70 6f   sql LIKE '%Impo
e84d0 72 74 44 42 46 25 27 20 22 0a 09 22 4f 52 20 73  rtDBF%' ".."OR s
e84e0 71 6c 20 4c 49 4b 45 20 27 25 45 78 70 6f 72 74  ql LIKE '%Export
e84f0 44 42 46 25 27 20 4f 52 20 73 71 6c 20 4c 49 4b  DBF%' OR sql LIK
e8500 45 20 27 25 49 6d 70 6f 72 74 53 48 50 25 27 20  E '%ImportSHP%' 
e8510 22 0a 09 22 4f 52 20 73 71 6c 20 4c 49 4b 45 20  ".."OR sql LIKE 
e8520 27 25 45 78 70 6f 72 74 53 48 50 25 27 20 4f 52  '%ExportSHP%' OR
e8530 20 73 71 6c 20 4c 49 4b 45 20 27 25 45 78 70 6f   sql LIKE '%Expo
e8540 72 74 4b 4d 4c 25 27 20 22 0a 09 22 4f 52 20 73  rtKML%' ".."OR s
e8550 71 6c 20 4c 49 4b 45 20 27 25 45 78 70 6f 72 74  ql LIKE '%Export
e8560 47 65 6f 4a 53 4f 4e 25 27 20 4f 52 20 28 73 71  GeoJSON%' OR (sq
e8570 6c 20 4c 49 4b 45 20 27 25 65 76 61 6c 25 27 20  l LIKE '%eval%' 
e8580 41 4e 44 20 73 71 6c 20 4c 49 4b 45 20 27 25 28  AND sql LIKE '%(
e8590 25 27 29 20 22 0a 09 22 4f 52 20 73 71 6c 20 4c  %') ".."OR sql L
e85a0 49 4b 45 20 27 25 49 6d 70 6f 72 74 57 46 53 25  IKE '%ImportWFS%
e85b0 27 20 4f 52 20 73 71 6c 20 4c 49 4b 45 20 27 25  ' OR sql LIKE '%
e85c0 49 6d 70 6f 72 74 58 4c 53 25 27 29 22 3b 0a 20  ImportXLS%')";. 
e85d0 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
e85e0 5f 67 65 74 5f 74 61 62 6c 65 20 28 73 71 6c 69  _get_table (sqli
e85f0 74 65 2c 20 73 71 6c 2c 20 26 72 65 73 75 6c 74  te, sql, &result
e8600 73 2c 20 26 72 6f 77 73 2c 20 26 63 6f 6c 75 6d  s, &rows, &colum
e8610 6e 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ns, NULL);.    i
e8620 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45  f (ret != SQLITE
e8630 5f 4f 4b 29 0a 09 67 6f 74 6f 20 75 6e 6b 6e 6f  _OK)..goto unkno
e8640 77 6e 3b 0a 20 20 20 20 69 66 20 28 72 6f 77 73  wn;.    if (rows
e8650 20 3c 20 31 29 0a 09 3b 0a 20 20 20 20 65 6c 73   < 1)..;.    els
e8660 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 66 6f 72  e.      {..  for
e8670 20 28 69 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f   (i = 1; i <= ro
e8680 77 73 3b 20 69 2b 2b 29 0a 09 20 20 20 20 7b 0a  ws; i++)..    {.
e8690 09 09 69 6e 74 20 64 61 6e 67 65 72 6f 75 73 20  ..int dangerous 
e86a0 3d 20 30 3b 0a 09 09 69 66 20 28 64 6f 5f 63 68  = 0;...if (do_ch
e86b0 65 63 6b 5f 62 6c 6f 62 5f 66 72 6f 6d 5f 66 69  eck_blob_from_fi
e86c0 6c 65 20 28 72 65 73 75 6c 74 73 5b 28 69 20 2a  le (results[(i *
e86d0 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 29 29   columns) + 0]))
e86e0 0a 09 09 20 20 20 20 64 61 6e 67 65 72 6f 75 73  ...    dangerous
e86f0 20 3d 20 31 3b 0a 09 09 69 66 20 28 64 6f 5f 63   = 1;...if (do_c
e8700 68 65 63 6b 5f 62 6c 6f 62 5f 74 6f 5f 66 69 6c  heck_blob_to_fil
e8710 65 20 28 72 65 73 75 6c 74 73 5b 28 69 20 2a 20  e (results[(i * 
e8720 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 29 29 0a  columns) + 0])).
e8730 09 09 20 20 20 20 64 61 6e 67 65 72 6f 75 73 20  ..    dangerous 
e8740 3d 20 31 3b 0a 09 09 69 66 20 28 64 6f 5f 63 68  = 1;...if (do_ch
e8750 65 63 6b 5f 6c 6f 61 64 5f 78 6d 6c 20 28 72 65  eck_load_xml (re
e8760 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d  sults[(i * colum
e8770 6e 73 29 20 2b 20 30 5d 29 29 0a 09 09 20 20 20  ns) + 0]))...   
e8780 20 64 61 6e 67 65 72 6f 75 73 20 3d 20 31 3b 0a   dangerous = 1;.
e8790 09 09 69 66 20 28 64 6f 5f 63 68 65 63 6b 5f 73  ..if (do_check_s
e87a0 74 6f 72 65 5f 78 6d 6c 20 28 72 65 73 75 6c 74  tore_xml (result
e87b0 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20  s[(i * columns) 
e87c0 2b 20 30 5d 29 29 0a 09 09 20 20 20 20 64 61 6e  + 0]))...    dan
e87d0 67 65 72 6f 75 73 20 3d 20 31 3b 0a 09 09 69 66  gerous = 1;...if
e87e0 20 28 64 6f 5f 63 68 65 63 6b 5f 65 78 70 6f 72   (do_check_expor
e87f0 74 5f 67 65 6f 5f 6a 73 6f 6e 20 28 72 65 73 75  t_geo_json (resu
e8800 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73  lts[(i * columns
e8810 29 20 2b 20 30 5d 29 29 0a 09 09 20 20 20 20 64  ) + 0]))...    d
e8820 61 6e 67 65 72 6f 75 73 20 3d 20 31 3b 0a 09 09  angerous = 1;...
e8830 69 66 20 28 64 6f 5f 63 68 65 63 6b 5f 69 6d 70  if (do_check_imp
e8840 65 78 70 20 28 72 65 73 75 6c 74 73 5b 28 69 20  exp (results[(i 
e8850 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 2c  * columns) + 0],
e8860 20 22 69 6d 70 6f 72 74 64 78 66 22 29 29 0a 09   "importdxf"))..
e8870 09 20 20 20 20 64 61 6e 67 65 72 6f 75 73 20 3d  .    dangerous =
e8880 20 31 3b 0a 09 09 69 66 20 28 64 6f 5f 63 68 65   1;...if (do_che
e8890 63 6b 5f 69 6d 70 65 78 70 20 28 72 65 73 75 6c  ck_impexp (resul
e88a0 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29  ts[(i * columns)
e88b0 20 2b 20 30 5d 2c 20 22 65 78 70 6f 72 74 64 78   + 0], "exportdx
e88c0 66 22 29 29 0a 09 09 20 20 20 20 64 61 6e 67 65  f"))...    dange
e88d0 72 6f 75 73 20 3d 20 31 3b 0a 09 09 69 66 20 28  rous = 1;...if (
e88e0 64 6f 5f 63 68 65 63 6b 5f 69 6d 70 65 78 70 20  do_check_impexp 
e88f0 28 72 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f  (results[(i * co
e8900 6c 75 6d 6e 73 29 20 2b 20 30 5d 2c 20 22 69 6d  lumns) + 0], "im
e8910 70 6f 72 74 64 62 66 22 29 29 0a 09 09 20 20 20  portdbf"))...   
e8920 20 64 61 6e 67 65 72 6f 75 73 20 3d 20 31 3b 0a   dangerous = 1;.
e8930 09 09 69 66 20 28 64 6f 5f 63 68 65 63 6b 5f 69  ..if (do_check_i
e8940 6d 70 65 78 70 20 28 72 65 73 75 6c 74 73 5b 28  mpexp (results[(
e8950 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30  i * columns) + 0
e8960 5d 2c 20 22 65 78 70 6f 72 74 64 62 66 22 29 29  ], "exportdbf"))
e8970 0a 09 09 20 20 20 20 64 61 6e 67 65 72 6f 75 73  ...    dangerous
e8980 20 3d 20 31 3b 0a 09 09 69 66 20 28 64 6f 5f 63   = 1;...if (do_c
e8990 68 65 63 6b 5f 69 6d 70 65 78 70 20 28 72 65 73  heck_impexp (res
e89a0 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e  ults[(i * column
e89b0 73 29 20 2b 20 30 5d 2c 20 22 69 6d 70 6f 72 74  s) + 0], "import
e89c0 73 68 70 22 29 29 0a 09 09 20 20 20 20 64 61 6e  shp"))...    dan
e89d0 67 65 72 6f 75 73 20 3d 20 31 3b 0a 09 09 69 66  gerous = 1;...if
e89e0 20 28 64 6f 5f 63 68 65 63 6b 5f 69 6d 70 65 78   (do_check_impex
e89f0 70 20 28 72 65 73 75 6c 74 73 5b 28 69 20 2a 20  p (results[(i * 
e8a00 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 2c 20 22  columns) + 0], "
e8a10 65 78 70 6f 72 74 73 68 70 22 29 29 0a 09 09 20  exportshp"))... 
e8a20 20 20 20 64 61 6e 67 65 72 6f 75 73 20 3d 20 31     dangerous = 1
e8a30 3b 0a 09 09 69 66 20 28 64 6f 5f 63 68 65 63 6b  ;...if (do_check
e8a40 5f 69 6d 70 65 78 70 20 28 72 65 73 75 6c 74 73  _impexp (results
e8a50 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b  [(i * columns) +
e8a60 20 30 5d 2c 20 22 65 78 70 6f 72 74 6b 6d 6c 22   0], "exportkml"
e8a70 29 29 0a 09 09 20 20 20 20 64 61 6e 67 65 72 6f  ))...    dangero
e8a80 75 73 20 3d 20 31 3b 0a 09 09 69 66 20 28 64 6f  us = 1;...if (do
e8a90 5f 63 68 65 63 6b 5f 69 6d 70 65 78 70 20 28 72  _check_impexp (r
e8aa0 65 73 75 6c 74 73 5b 28 69 20 2a 20 63 6f 6c 75  esults[(i * colu
e8ab0 6d 6e 73 29 20 2b 20 30 5d 2c 20 22 69 6d 70 6f  mns) + 0], "impo
e8ac0 72 74 77 66 73 22 29 29 0a 09 09 20 20 20 20 64  rtwfs"))...    d
e8ad0 61 6e 67 65 72 6f 75 73 20 3d 20 31 3b 0a 09 09  angerous = 1;...
e8ae0 69 66 20 28 64 6f 5f 63 68 65 63 6b 5f 69 6d 70  if (do_check_imp
e8af0 65 78 70 20 28 72 65 73 75 6c 74 73 5b 28 69 20  exp (results[(i 
e8b00 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d 2c  * columns) + 0],
e8b10 20 22 69 6d 70 6f 72 74 78 6c 73 22 29 29 0a 09   "importxls"))..
e8b20 09 20 20 20 20 64 61 6e 67 65 72 6f 75 73 20 3d  .    dangerous =
e8b30 20 31 3b 0a 09 09 69 66 20 28 64 6f 5f 63 68 65   1;...if (do_che
e8b40 63 6b 5f 65 76 61 6c 20 28 72 65 73 75 6c 74 73  ck_eval (results
e8b50 5b 28 69 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b  [(i * columns) +
e8b60 20 30 5d 29 29 0a 09 09 20 20 20 20 64 61 6e 67   0]))...    dang
e8b70 65 72 6f 75 73 20 3d 20 31 3b 0a 09 09 69 66 20  erous = 1;...if 
e8b80 28 64 61 6e 67 65 72 6f 75 73 29 0a 09 09 20 20  (dangerous)...  
e8b90 20 20 63 6f 75 6e 74 2b 2b 3b 0a 09 20 20 20 20    count++;..    
e8ba0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71  }.      }.    sq
e8bb0 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c 65  lite3_free_table
e8bc0 20 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 75 6e   (results);.  un
e8bd0 6b 6e 6f 77 6e 3a 0a 20 20 20 20 73 71 6c 69 74  known:.    sqlit
e8be0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
e8bf0 6f 6e 74 65 78 74 2c 20 63 6f 75 6e 74 29 3b 0a  ontext, count);.
e8c00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
e8c10 6e 63 74 5f 47 65 6f 64 65 73 69 63 4c 65 6e 67  nct_GeodesicLeng
e8c20 74 68 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  th (sqlite3_cont
e8c30 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
e8c40 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
e8c50 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
e8c60 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
e8c70 6e 3a 0a 2f 20 47 65 6f 64 65 73 69 63 4c 65 6e  n:./ GeodesicLen
e8c80 67 74 68 28 42 4c 4f 42 20 65 6e 63 6f 64 65 64  gth(BLOB encoded
e8c90 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54   GEOMETRYCOLLECT
e8ca0 49 4f 4e 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  ION)././ returns
e8cb0 20 20 74 68 65 20 74 6f 74 61 6c 20 47 65 6f 64    the total Geod
e8cc0 65 73 69 63 20 6c 65 6e 67 74 68 20 66 6f 72 20  esic length for 
e8cd0 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79  current geometry
e8ce0 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
e8cf0 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
e8d00 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75  untered.*/.    u
e8d10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
e8d20 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
e8d30 62 79 74 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c  bytes;.    doubl
e8d40 65 20 6c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e l;.    double 
e8d50 6c 65 6e 67 74 68 20 3d 20 30 2e 30 3b 0a 20 20  length = 0.0;.  
e8d60 20 20 64 6f 75 62 6c 65 20 61 3b 0a 20 20 20 20    double a;.    
e8d70 64 6f 75 62 6c 65 20 62 3b 0a 20 20 20 20 64 6f  double b;.    do
e8d80 75 62 6c 65 20 72 66 3b 0a 20 20 20 20 67 61 69  uble rf;.    gai
e8d90 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
e8da0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
e8db0 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c  aLinestringPtr l
e8dc0 69 6e 65 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c  ine;.    gaiaPol
e8dd0 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 3b 0a 20  ygonPtr polyg;. 
e8de0 20 20 20 67 61 69 61 52 69 6e 67 50 74 72 20 72     gaiaRingPtr r
e8df0 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 69 62 3b  ing;.    int ib;
e8e00 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
e8e10 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
e8e20 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
e8e30 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
e8e40 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  int gpkg_amphibi
e8e50 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ous = 0;.    int
e8e60 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
e8e70 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
e8e80 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
e8e90 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
e8ea0 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
e8eb0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
e8ec0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
e8ed0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
e8ee0 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 21  .    if (cache !
e8ef0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
e8f00 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f  .  gpkg_amphibio
e8f10 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67  us = cache->gpkg
e8f20 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65  _amphibious_mode
e8f30 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d  ;..  gpkg_mode =
e8f40 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
e8f50 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  e;.      }.    i
e8f60 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
e8f70 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
e8f80 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  != SQLITE_BLOB).
e8f90 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
e8fa0 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
e8fb0 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
e8fc0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
e8fd0 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
e8fe0 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
e8ff0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
e9000 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
e9010 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
e9020 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
e9030 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20 3d  v[0]);.    geo =
e9040 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  ..gaiaFromSpatia
e9050 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70  LiteBlobWkbEx (p
e9060 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20  _blob, n_bytes, 
e9070 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20  gpkg_mode,..... 
e9080 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69      gpkg_amphibi
e9090 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21 67  ous);.    if (!g
e90a0 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  eo)..sqlite3_res
e90b0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
e90c0 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  t);.    else.   
e90d0 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 74 45     {..  if (getE
e90e0 6c 6c 69 70 73 6f 69 64 50 61 72 61 6d 73 20 28  llipsoidParams (
e90f0 73 71 6c 69 74 65 2c 20 67 65 6f 2d 3e 53 72 69  sqlite, geo->Sri
e9100 64 2c 20 26 61 2c 20 26 62 2c 20 26 72 66 29 29  d, &a, &b, &rf))
e9110 0a 09 20 20 20 20 7b 0a 09 09 6c 69 6e 65 20 3d  ..    {...line =
e9120 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69 6e 65 73   geo->FirstLines
e9130 74 72 69 6e 67 3b 0a 09 09 77 68 69 6c 65 20 28  tring;...while (
e9140 6c 69 6e 65 29 0a 09 09 20 20 7b 0a 09 09 20 20  line)...  {...  
e9150 20 20 20 20 2f 2a 20 4c 69 6e 65 73 74 72 69 6e      /* Linestrin
e9160 67 73 20 2a 2f 0a 09 09 20 20 20 20 20 20 6c 20  gs */...      l 
e9170 3d 20 67 61 69 61 47 65 6f 64 65 73 69 63 54 6f  = gaiaGeodesicTo
e9180 74 61 6c 4c 65 6e 67 74 68 20 28 61 2c 20 62 2c  talLength (a, b,
e9190 20 72 66 2c 0a 09 09 09 09 09 09 20 20 20 6c 69   rf,.......   li
e91a0 6e 65 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  ne->DimensionMod
e91b0 65 6c 2c 0a 09 09 09 09 09 09 20 20 20 6c 69 6e  el,.......   lin
e91c0 65 2d 3e 43 6f 6f 72 64 73 2c 20 6c 69 6e 65 2d  e->Coords, line-
e91d0 3e 50 6f 69 6e 74 73 29 3b 0a 09 09 20 20 20 20  >Points);...    
e91e0 20 20 69 66 20 28 6c 20 3c 20 30 2e 30 29 0a 09    if (l < 0.0)..
e91f0 09 09 7b 0a 09 09 09 20 20 20 20 6c 65 6e 67 74  ..{....    lengt
e9200 68 20 3d 20 2d 31 2e 30 3b 0a 09 09 09 20 20 20  h = -1.0;....   
e9210 20 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 20   break;....}... 
e9220 20 20 20 20 20 6c 65 6e 67 74 68 20 2b 3d 20 6c       length += l
e9230 3b 0a 09 09 20 20 20 20 20 20 6c 69 6e 65 20 3d  ;...      line =
e9240 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a 09 09 20   line->Next;... 
e9250 20 7d 0a 09 09 69 66 20 28 6c 65 6e 67 74 68 20   }...if (length 
e9260 3e 3d 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20  >= 0)...  {...  
e9270 20 20 20 20 2f 2a 20 50 6f 6c 79 67 6f 6e 73 20      /* Polygons 
e9280 2a 2f 0a 09 09 20 20 20 20 20 20 70 6f 6c 79 67  */...      polyg
e9290 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 6c   = geo->FirstPol
e92a0 79 67 6f 6e 3b 0a 09 09 20 20 20 20 20 20 77 68  ygon;...      wh
e92b0 69 6c 65 20 28 70 6f 6c 79 67 29 0a 09 09 09 7b  ile (polyg)....{
e92c0 0a 09 09 09 20 20 20 20 2f 2a 20 65 78 74 65 72  ....    /* exter
e92d0 69 6f 72 20 52 69 6e 67 20 2a 2f 0a 09 09 09 20  ior Ring */.... 
e92e0 20 20 20 72 69 6e 67 20 3d 20 70 6f 6c 79 67 2d     ring = polyg-
e92f0 3e 45 78 74 65 72 69 6f 72 3b 0a 09 09 09 20 20  >Exterior;....  
e9300 20 20 6c 20 3d 20 67 61 69 61 47 65 6f 64 65 73    l = gaiaGeodes
e9310 69 63 54 6f 74 61 6c 4c 65 6e 67 74 68 20 28 61  icTotalLength (a
e9320 2c 20 62 2c 20 72 66 2c 0a 09 09 09 09 09 09 09  , b, rf,........
e9330 20 72 69 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e   ring->Dimension
e9340 4d 6f 64 65 6c 2c 0a 09 09 09 09 09 09 09 20 72  Model,........ r
e9350 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 0a 09 09 09  ing->Coords,....
e9360 09 09 09 09 20 72 69 6e 67 2d 3e 50 6f 69 6e 74  .... ring->Point
e9370 73 29 3b 0a 09 09 09 20 20 20 20 69 66 20 28 6c  s);....    if (l
e9380 20 3c 20 30 2e 30 29 0a 09 09 09 20 20 20 20 20   < 0.0)....     
e9390 20 7b 0a 09 09 09 09 20 20 6c 65 6e 67 74 68 20   {.....  length 
e93a0 3d 20 2d 31 2e 30 3b 0a 09 09 09 09 20 20 62 72  = -1.0;.....  br
e93b0 65 61 6b 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a  eak;....      }.
e93c0 09 09 09 20 20 20 20 6c 65 6e 67 74 68 20 2b 3d  ...    length +=
e93d0 20 6c 3b 0a 09 09 09 20 20 20 20 66 6f 72 20 28   l;....    for (
e93e0 69 62 20 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c  ib = 0; ib < pol
e93f0 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73  yg->NumInteriors
e9400 3b 20 69 62 2b 2b 29 0a 09 09 09 20 20 20 20 20  ; ib++)....     
e9410 20 7b 0a 09 09 09 09 20 20 2f 2a 20 69 6e 74 65   {.....  /* inte
e9420 72 69 6f 72 20 52 69 6e 67 73 20 2a 2f 0a 09 09  rior Rings */...
e9430 09 09 20 20 72 69 6e 67 20 3d 20 70 6f 6c 79 67  ..  ring = polyg
e9440 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62  ->Interiors + ib
e9450 3b 0a 09 09 09 09 20 20 6c 20 3d 20 67 61 69 61  ;.....  l = gaia
e9460 47 65 6f 64 65 73 69 63 54 6f 74 61 6c 4c 65 6e  GeodesicTotalLen
e9470 67 74 68 20 28 61 2c 20 62 2c 20 72 66 2c 0a 09  gth (a, b, rf,..
e9480 09 09 09 09 09 09 20 20 20 20 20 20 20 72 69 6e  ......       rin
e9490 67 2d 3e 0a 09 09 09 09 09 09 09 20 20 20 20 20  g->........     
e94a0 20 20 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c    DimensionModel
e94b0 2c 0a 09 09 09 09 09 09 09 20 20 20 20 20 20 20  ,........       
e94c0 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 0a 09 09  ring->Coords,...
e94d0 09 09 09 09 09 20 20 20 20 20 20 20 72 69 6e 67  .....       ring
e94e0 2d 3e 50 6f 69 6e 74 73 29 3b 0a 09 09 09 09 20  ->Points);..... 
e94f0 20 69 66 20 28 6c 20 3c 20 30 2e 30 29 0a 09 09   if (l < 0.0)...
e9500 09 09 20 20 20 20 7b 0a 09 09 09 09 09 6c 65 6e  ..    {......len
e9510 67 74 68 20 3d 20 2d 31 2e 30 3b 0a 09 09 09 09  gth = -1.0;.....
e9520 09 62 72 65 61 6b 3b 0a 09 09 09 09 20 20 20 20  .break;.....    
e9530 7d 0a 09 09 09 09 20 20 6c 65 6e 67 74 68 20 2b  }.....  length +
e9540 3d 20 6c 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a  = l;....      }.
e9550 09 09 09 20 20 20 20 69 66 20 28 6c 65 6e 67 74  ...    if (lengt
e9560 68 20 3c 20 30 2e 30 29 0a 09 09 09 09 62 72 65  h < 0.0).....bre
e9570 61 6b 3b 0a 09 09 09 20 20 20 20 70 6f 6c 79 67  ak;....    polyg
e9580 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b 0a   = polyg->Next;.
e9590 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 69 66 20  ...}...  }...if 
e95a0 28 6c 65 6e 67 74 68 20 3c 20 30 2e 30 29 0a 09  (length < 0.0)..
e95b0 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
e95c0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
e95d0 74 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20  t);...else...   
e95e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e95f0 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
e9600 20 6c 65 6e 67 74 68 29 3b 0a 09 20 20 20 20 7d   length);..    }
e9610 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
e9620 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
e9630 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
e9640 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
e9650 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20  ll (geo);.      
e9660 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
e9670 0a 66 6e 63 74 5f 47 72 65 61 74 43 69 72 63 6c  .fnct_GreatCircl
e9680 65 4c 65 6e 67 74 68 20 28 73 71 6c 69 74 65 33  eLength (sqlite3
e9690 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
e96a0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
e96b0 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
e96c0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
e96d0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 72 65   function:./ Gre
e96e0 61 74 43 69 72 63 6c 65 4c 65 6e 67 74 68 28 42  atCircleLength(B
e96f0 4c 4f 42 20 65 6e 63 6f 64 65 64 20 47 45 4f 4d  LOB encoded GEOM
e9700 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a  ETRYCOLLECTION).
e9710 2f 0a 2f 20 72 65 74 75 72 6e 73 20 20 74 68 65  /./ returns  the
e9720 20 74 6f 74 61 6c 20 47 72 65 61 74 20 43 69 72   total Great Cir
e9730 63 6c 65 20 6c 65 6e 67 74 68 20 66 6f 72 20 63  cle length for c
e9740 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72 79 20  urrent geometry 
e9750 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
e9760 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
e9770 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
e9780 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
e9790 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
e97a0 79 74 65 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65  ytes;.    double
e97b0 20 6c 65 6e 67 74 68 20 3d 20 30 2e 30 3b 0a 20   length = 0.0;. 
e97c0 20 20 20 64 6f 75 62 6c 65 20 61 3b 0a 20 20 20     double a;.   
e97d0 20 64 6f 75 62 6c 65 20 62 3b 0a 20 20 20 20 64   double b;.    d
e97e0 6f 75 62 6c 65 20 72 66 3b 0a 20 20 20 20 67 61  ouble rf;.    ga
e97f0 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
e9800 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  o = NULL;.    ga
e9810 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20  iaLinestringPtr 
e9820 6c 69 6e 65 3b 0a 20 20 20 20 67 61 69 61 50 6f  line;.    gaiaPo
e9830 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 3b 0a  lygonPtr polyg;.
e9840 20 20 20 20 67 61 69 61 52 69 6e 67 50 74 72 20      gaiaRingPtr 
e9850 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 69 62  ring;.    int ib
e9860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
e9870 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
e9880 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
e9890 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
e98a0 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69 62   int gpkg_amphib
e98b0 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ious = 0;.    in
e98c0 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b  t gpkg_mode = 0;
e98d0 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
e98e0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
e98f0 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
e9900 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
e9910 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
e9920 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
e9930 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
e9940 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
e9950 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  != NULL).      {
e9960 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69  ..  gpkg_amphibi
e9970 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ous = cache->gpk
e9980 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f 64  g_amphibious_mod
e9990 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20  e;..  gpkg_mode 
e99a0 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
e99b0 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
e99c0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
e99d0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
e99e0 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   != SQLITE_BLOB)
e99f0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
e9a00 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
e9a10 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
e9a20 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
e9a30 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69    p_blob = (unsi
e9a40 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
e9a50 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
e9a60 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
e9a70 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
e9a80 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
e9a90 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 20  gv[0]);.    geo 
e9aa0 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
e9ab0 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
e9ac0 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
e9ad0 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
e9ae0 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
e9af0 69 6f 75 73 29 3b 0a 20 20 20 20 69 66 20 28 21  ious);.    if (!
e9b00 67 65 6f 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  geo)..sqlite3_re
e9b10 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
e9b20 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  xt);.    else.  
e9b30 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 74      {..  if (get
e9b40 45 6c 6c 69 70 73 6f 69 64 50 61 72 61 6d 73 20  EllipsoidParams 
e9b50 28 73 71 6c 69 74 65 2c 20 67 65 6f 2d 3e 53 72  (sqlite, geo->Sr
e9b60 69 64 2c 20 26 61 2c 20 26 62 2c 20 26 72 66 29  id, &a, &b, &rf)
e9b70 29 0a 09 20 20 20 20 7b 0a 09 09 6c 69 6e 65 20  )..    {...line 
e9b80 3d 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69 6e 65  = geo->FirstLine
e9b90 73 74 72 69 6e 67 3b 0a 09 09 77 68 69 6c 65 20  string;...while 
e9ba0 28 6c 69 6e 65 29 0a 09 09 20 20 7b 0a 09 09 20  (line)...  {... 
e9bb0 20 20 20 20 20 2f 2a 20 4c 69 6e 65 73 74 72 69       /* Linestri
e9bc0 6e 67 73 20 2a 2f 0a 09 09 20 20 20 20 20 20 6c  ngs */...      l
e9bd0 65 6e 67 74 68 20 2b 3d 0a 09 09 09 20 20 67 61  ength +=....  ga
e9be0 69 61 47 72 65 61 74 43 69 72 63 6c 65 54 6f 74  iaGreatCircleTot
e9bf0 61 6c 4c 65 6e 67 74 68 20 28 61 2c 20 62 2c 0a  alLength (a, b,.
e9c00 09 09 09 09 09 09 20 20 20 20 20 20 6c 69 6e 65  ......      line
e9c10 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
e9c20 2c 0a 09 09 09 09 09 09 20 20 20 20 20 20 6c 69  ,.......      li
e9c30 6e 65 2d 3e 43 6f 6f 72 64 73 2c 0a 09 09 09 09  ne->Coords,.....
e9c40 09 09 20 20 20 20 20 20 6c 69 6e 65 2d 3e 50 6f  ..      line->Po
e9c50 69 6e 74 73 29 3b 0a 09 09 20 20 20 20 20 20 6c  ints);...      l
e9c60 69 6e 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74  ine = line->Next
e9c70 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 6c 65  ;...  }...if (le
e9c80 6e 67 74 68 20 3e 3d 20 30 29 0a 09 09 20 20 7b  ngth >= 0)...  {
e9c90 0a 09 09 20 20 20 20 20 20 2f 2a 20 50 6f 6c 79  ...      /* Poly
e9ca0 67 6f 6e 73 20 2a 2f 0a 09 09 20 20 20 20 20 20  gons */...      
e9cb0 70 6f 6c 79 67 20 3d 20 67 65 6f 2d 3e 46 69 72  polyg = geo->Fir
e9cc0 73 74 50 6f 6c 79 67 6f 6e 3b 0a 09 09 20 20 20  stPolygon;...   
e9cd0 20 20 20 77 68 69 6c 65 20 28 70 6f 6c 79 67 29     while (polyg)
e9ce0 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20  ....{....    /* 
e9cf0 65 78 74 65 72 69 6f 72 20 52 69 6e 67 20 2a 2f  exterior Ring */
e9d00 0a 09 09 09 20 20 20 20 72 69 6e 67 20 3d 20 70  ....    ring = p
e9d10 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a  olyg->Exterior;.
e9d20 09 09 09 20 20 20 20 6c 65 6e 67 74 68 20 2b 3d  ...    length +=
e9d30 0a 09 09 09 09 67 61 69 61 47 72 65 61 74 43 69  .....gaiaGreatCi
e9d40 72 63 6c 65 54 6f 74 61 6c 4c 65 6e 67 74 68 20  rcleTotalLength 
e9d50 28 61 2c 20 62 2c 0a 09 09 09 09 09 09 09 20 20  (a, b,........  
e9d60 20 20 72 69 6e 67 2d 3e 0a 09 09 09 09 09 09 09    ring->........
e9d70 20 20 20 20 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64      DimensionMod
e9d80 65 6c 2c 0a 09 09 09 09 09 09 09 20 20 20 20 72  el,........    r
e9d90 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 0a 09 09 09  ing->Coords,....
e9da0 09 09 09 09 20 20 20 20 72 69 6e 67 2d 3e 50 6f  ....    ring->Po
e9db0 69 6e 74 73 29 3b 0a 09 09 09 20 20 20 20 66 6f  ints);....    fo
e9dc0 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20  r (ib = 0; ib < 
e9dd0 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69  polyg->NumInteri
e9de0 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 09 09 20 20  ors; ib++)....  
e9df0 20 20 20 20 7b 0a 09 09 09 09 20 20 2f 2a 20 69      {.....  /* i
e9e00 6e 74 65 72 69 6f 72 20 52 69 6e 67 73 20 2a 2f  nterior Rings */
e9e10 0a 09 09 09 09 20 20 72 69 6e 67 20 3d 20 70 6f  .....  ring = po
e9e20 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b  lyg->Interiors +
e9e30 20 69 62 3b 0a 09 09 09 09 20 20 6c 65 6e 67 74   ib;.....  lengt
e9e40 68 20 2b 3d 0a 09 09 09 09 20 20 20 20 20 20 67  h +=.....      g
e9e50 61 69 61 47 72 65 61 74 43 69 72 63 6c 65 54 6f  aiaGreatCircleTo
e9e60 74 61 6c 4c 65 6e 67 74 68 20 28 61 2c 20 62 2c  talLength (a, b,
e9e70 0a 09 09 09 09 09 09 09 09 20 20 72 69 6e 67 2d  .........  ring-
e9e80 3e 0a 09 09 09 09 09 09 09 09 20 20 44 69 6d 65  >.........  Dime
e9e90 6e 73 69 6f 6e 4d 6f 64 65 6c 2c 0a 09 09 09 09  nsionModel,.....
e9ea0 09 09 09 09 20 20 72 69 6e 67 2d 3e 43 6f 6f 72  ....  ring->Coor
e9eb0 64 73 2c 0a 09 09 09 09 09 09 09 09 20 20 72 69  ds,.........  ri
e9ec0 6e 67 2d 3e 50 6f 69 6e 74 73 29 3b 0a 09 09 09  ng->Points);....
e9ed0 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 70        }....    p
e9ee0 6f 6c 79 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65  olyg = polyg->Ne
e9ef0 78 74 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09  xt;....}...  }..
e9f00 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
e9f10 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
e9f20 20 6c 65 6e 67 74 68 29 3b 0a 09 20 20 20 20 7d   length);..    }
e9f30 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
e9f40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
e9f50 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
e9f60 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
e9f70 6c 6c 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20  ll (geo);.      
e9f80 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
e9f90 0a 66 6e 63 74 5f 47 65 6f 64 65 73 69 63 41 72  .fnct_GeodesicAr
e9fa0 63 4c 65 6e 67 74 68 20 28 73 71 6c 69 74 65 33  cLength (sqlite3
e9fb0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
e9fc0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
e9fd0 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
e9fe0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
e9ff0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f   function:./ Geo
ea000 64 65 73 69 63 41 72 63 4c 65 6e 67 74 68 28 67  desicArcLength(g
ea010 65 6f 6d 31 20 47 65 6f 6d 65 74 72 79 2c 20 67  eom1 Geometry, g
ea020 65 6f 6d 32 20 47 65 6f 6d 65 74 72 79 29 0a 2f  eom2 Geometry)./
ea030 20 47 65 6f 64 65 73 69 63 41 72 63 4c 65 6e 67   GeodesicArcLeng
ea040 74 68 28 67 65 6f 6d 31 20 47 65 6f 6d 65 74 72  th(geom1 Geometr
ea050 79 2c 20 67 65 6f 6d 32 20 47 65 6f 6d 65 74 72  y, geom2 Geometr
ea060 79 2c 20 6d 65 74 65 72 73 20 49 6e 74 65 67 65  y, meters Intege
ea070 72 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74  r)././ returns t
ea080 68 65 20 41 72 63 20 4c 65 6e 67 74 68 20 62 65  he Arc Length be
ea090 74 77 65 65 6e 20 70 6f 69 6e 74 73 20 31 20 61  tween points 1 a
ea0a0 6e 64 20 32 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  nd 2./ or NULL i
ea0b0 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
ea0c0 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 2a  ncountered././ *
ea0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea110 2a 2a 0a 2f 20 74 68 69 73 20 53 51 4c 20 66 75  **./ this SQL fu
ea120 6e 63 74 69 6f 6e 20 77 61 73 20 6b 69 6e 64 6c  nction was kindl
ea130 79 20 63 6f 6e 74 72 69 62 75 74 65 64 20 62 79  y contributed by
ea140 20 4d 61 72 6b 20 4a 6f 68 6e 73 6f 6e 20 0a 2f   Mark Johnson ./
ea150 20 3c 6d 6a 31 30 37 37 37 40 67 6f 6f 67 6c 65   <mj10777@google
ea160 6d 61 69 6c 2e 63 6f 6d 3e 0a 2a 2f 0a 20 20 20  mail.com>.*/.   
ea170 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ea180 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
ea190 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69  n_bytes;.    gai
ea1a0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
ea1b0 6d 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  m1 = NULL;.    g
ea1c0 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
ea1d0 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  eom2 = NULL;.   
ea1e0 20 69 6e 74 20 72 65 74 75 72 6e 5f 74 79 70 65   int return_type
ea1f0 20 3d 20 47 41 49 41 5f 47 45 4f 44 45 53 49 43   = GAIA_GEODESIC
ea200 5f 41 52 43 5f 4c 45 4e 47 54 48 5f 4d 45 54 45  _ARC_LENGTH_METE
ea210 52 53 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  RS;.    double r
ea220 65 74 76 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  etval;.    sqlit
ea230 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
ea240 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
ea250 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
ea260 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 61  ;.    int gpkg_a
ea270 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b 0a 20  mphibious = 0;. 
ea280 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65     int gpkg_mode
ea290 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
ea2a0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
ea2b0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
ea2c0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
ea2d0 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
ea2e0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
ea2f0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
ea300 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
ea310 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
ea320 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
ea330 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
ea340 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
ea350 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
ea360 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
ea370 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20 20 7d  kg_mode;.      }
ea380 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
ea390 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
ea3a0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
ea3b0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
ea3c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ea3d0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
ea3e0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
ea3f0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
ea400 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
ea410 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
ea420 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
ea430 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
ea440 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
ea450 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
ea460 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
ea470 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a  c >= 3).      {.
ea480 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
ea490 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
ea4a0 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) != SQLITE_IN
ea4b0 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
ea4c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ea4d0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
ea4e0 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
ea4f0 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
ea500 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32  alue_int (argv[2
ea510 5d 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20  ]) == 0)..      
ea520 72 65 74 75 72 6e 5f 74 79 70 65 20 3d 20 47 41  return_type = GA
ea530 49 41 5f 47 45 4f 44 45 53 49 43 5f 41 52 43 5f  IA_GEODESIC_ARC_
ea540 4c 45 4e 47 54 48 5f 44 45 47 52 45 45 53 3b 0a  LENGTH_DEGREES;.
ea550 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
ea560 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
ea570 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
ea580 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
ea590 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
ea5a0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
ea5b0 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
ea5c0 3b 0a 20 20 20 20 67 65 6f 6d 31 20 3d 0a 09 67  ;.    geom1 =..g
ea5d0 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
ea5e0 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
ea5f0 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
ea600 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
ea610 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
ea620 29 3b 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20  );.    p_blob = 
ea630 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
ea640 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
ea650 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a  blob (argv[1]);.
ea660 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
ea670 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
ea680 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  s (argv[1]);.   
ea690 20 67 65 6f 6d 32 20 3d 0a 09 67 61 69 61 46 72   geom2 =..gaiaFr
ea6a0 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62  omSpatiaLiteBlob
ea6b0 57 6b 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e  WkbEx (p_blob, n
ea6c0 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64  _bytes, gpkg_mod
ea6d0 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67  e,.....     gpkg
ea6e0 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 0a 20  _amphibious);.. 
ea6f0 20 20 20 69 66 20 28 67 65 6f 6d 31 20 3d 3d 20     if (geom1 == 
ea700 4e 55 4c 4c 20 7c 7c 20 67 65 6f 6d 32 20 3d 3d  NULL || geom2 ==
ea710 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f   NULL)..sqlite3_
ea720 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
ea730 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
ea740 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67        {..  if (g
ea750 61 69 61 47 65 6f 64 65 73 69 63 41 72 63 4c 65  aiaGeodesicArcLe
ea760 6e 67 74 68 0a 09 20 20 20 20 20 20 28 73 71 6c  ngth..      (sql
ea770 69 74 65 2c 20 63 61 63 68 65 2c 20 67 65 6f 6d  ite, cache, geom
ea780 31 2c 20 67 65 6f 6d 32 2c 20 72 65 74 75 72 6e  1, geom2, return
ea790 5f 74 79 70 65 2c 20 26 72 65 74 76 61 6c 29 29  _type, &retval))
ea7a0 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
ea7b0 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20 28 63  result_double (c
ea7c0 6f 6e 74 65 78 74 2c 20 72 65 74 76 61 6c 29 3b  ontext, retval);
ea7d0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
ea7e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ea7f0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
ea800 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 67       }.    if (g
ea810 65 6f 6d 31 20 21 3d 20 4e 55 4c 4c 29 0a 09 67  eom1 != NULL)..g
ea820 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20  aiaFreeGeomColl 
ea830 28 67 65 6f 6d 31 29 3b 0a 20 20 20 20 69 66 20  (geom1);.    if 
ea840 28 67 65 6f 6d 32 20 21 3d 20 4e 55 4c 4c 29 0a  (geom2 != NULL).
ea850 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c  .gaiaFreeGeomCol
ea860 6c 20 28 67 65 6f 6d 32 29 3b 0a 7d 0a 0a 73 74  l (geom2);.}..st
ea870 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47  atic void.fnct_G
ea880 65 6f 64 65 73 69 63 43 68 6f 72 64 4c 65 6e 67  eodesicChordLeng
ea890 74 68 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  th (sqlite3_cont
ea8a0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
ea8b0 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71  nt argc,....  sq
ea8c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ea8d0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
ea8e0 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 64 65 73  nction:./ Geodes
ea8f0 69 63 43 68 6f 72 64 4c 65 6e 67 74 68 28 67 65  icChordLength(ge
ea900 6f 6d 31 20 47 65 6f 6d 65 74 72 79 2c 20 67 65  om1 Geometry, ge
ea910 6f 6d 32 20 47 65 6f 6d 65 74 72 79 29 0a 2f 20  om2 Geometry)./ 
ea920 47 65 6f 64 65 73 69 63 43 68 6f 72 64 4c 65 6e  GeodesicChordLen
ea930 67 74 68 28 67 65 6f 6d 31 20 47 65 6f 6d 65 74  gth(geom1 Geomet
ea940 72 79 2c 20 67 65 6f 6d 32 20 47 65 6f 6d 65 74  ry, geom2 Geomet
ea950 72 79 2c 20 6d 65 74 65 72 73 20 49 6e 74 65 67  ry, meters Integ
ea960 65 72 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20  er)././ returns 
ea970 74 68 65 20 43 68 6f 72 64 20 4c 65 6e 67 74 68  the Chord Length
ea980 20 62 65 74 77 65 65 6e 20 70 6f 69 6e 74 73 20   between points 
ea990 31 20 61 6e 64 20 32 0a 2f 20 6f 72 20 4e 55 4c  1 and 2./ or NUL
ea9a0 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
ea9b0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a  s encountered./.
ea9c0 2f 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  / **************
ea9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eaa00 2a 2a 2a 2a 2a 0a 2f 20 74 68 69 73 20 53 51 4c  *****./ this SQL
eaa10 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6b 69   function was ki
eaa20 6e 64 6c 79 20 63 6f 6e 74 72 69 62 75 74 65 64  ndly contributed
eaa30 20 62 79 20 4d 61 72 6b 20 4a 6f 68 6e 73 6f 6e   by Mark Johnson
eaa40 20 0a 2f 20 3c 6d 6a 31 30 37 37 37 40 67 6f 6f   ./ <mj10777@goo
eaa50 67 6c 65 6d 61 69 6c 2e 63 6f 6d 3e 0a 2a 2f 0a  glemail.com>.*/.
eaa60 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
eaa70 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
eaa80 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
eaa90 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
eaaa0 67 65 6f 6d 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20  geom1 = NULL;.  
eaab0 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
eaac0 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
eaad0 20 20 20 20 69 6e 74 20 72 65 74 75 72 6e 5f 74      int return_t
eaae0 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 44 45  ype = GAIA_GEODE
eaaf0 53 49 43 5f 43 48 4f 52 44 5f 4c 45 4e 47 54 48  SIC_CHORD_LENGTH
eab00 5f 4d 45 54 45 52 53 3b 0a 20 20 20 20 64 6f 75  _METERS;.    dou
eab10 62 6c 65 20 72 65 74 76 61 6c 3b 0a 20 20 20 20  ble retval;.    
eab20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
eab30 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
eab40 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
eab50 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20 67  text);.    int g
eab60 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
eab70 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
eab80 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
eab90 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
eaba0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
eabb0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
eabc0 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
eabd0 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
eabe0 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
eabf0 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
eac00 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
eac10 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
eac20 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
eac30 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
eac40 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
eac50 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
eac60 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
eac70 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
eac80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
eac90 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
eaca0 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
eacb0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
eacc0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
eacd0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
eace0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
eacf0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
ead00 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
ead10 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
ead20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
ead30 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
ead40 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
ead50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
ead60 20 28 61 72 67 63 20 3e 3d 20 33 29 0a 20 20 20   (argc >= 3).   
ead70 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
ead80 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
ead90 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49  argv[2]) != SQLI
eada0 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
eadb0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
eadc0 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
eadd0 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
eade0 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
eadf0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
eae00 72 67 76 5b 32 5d 29 20 3d 3d 20 30 29 0a 09 20  rgv[2]) == 0).. 
eae10 20 20 20 20 20 72 65 74 75 72 6e 5f 74 79 70 65       return_type
eae20 20 3d 20 47 41 49 41 5f 47 45 4f 44 45 53 49 43   = GAIA_GEODESIC
eae30 5f 43 48 4f 52 44 5f 4c 45 4e 47 54 48 5f 44 45  _CHORD_LENGTH_DE
eae40 47 52 45 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  GREES;.      }. 
eae50 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
eae60 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
eae70 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
eae80 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
eae90 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
eaea0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
eaeb0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[0]);.    geo
eaec0 6d 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  m1 =..gaiaFromSp
eaed0 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
eaee0 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  x (p_blob, n_byt
eaef0 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09  es, gpkg_mode,..
eaf00 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70  ...     gpkg_amp
eaf10 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f  hibious);.    p_
eaf20 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
eaf30 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
eaf40 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
eaf50 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[1]);.    n_byt
eaf60 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
eaf70 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31  ue_bytes (argv[1
eaf80 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 32 20 3d 0a  ]);.    geom2 =.
eaf90 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c  .gaiaFromSpatiaL
eafa0 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f  iteBlobWkbEx (p_
eafb0 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67  blob, n_bytes, g
eafc0 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20  pkg_mode,.....  
eafd0 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f     gpkg_amphibio
eafe0 75 73 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 67  us);..    if (!g
eaff0 65 6f 6d 31 20 7c 7c 20 21 67 65 6f 6d 32 29 0a  eom1 || !geom2).
eb000 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
eb010 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
eb020 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
eb030 0a 09 20 20 69 66 20 28 67 61 69 61 47 65 6f 64  ..  if (gaiaGeod
eb040 65 73 69 63 41 72 63 4c 65 6e 67 74 68 0a 09 20  esicArcLength.. 
eb050 20 20 20 20 20 28 73 71 6c 69 74 65 2c 20 63 61       (sqlite, ca
eb060 63 68 65 2c 20 67 65 6f 6d 31 2c 20 67 65 6f 6d  che, geom1, geom
eb070 32 2c 20 72 65 74 75 72 6e 5f 74 79 70 65 2c 20  2, return_type, 
eb080 26 72 65 74 76 61 6c 29 29 0a 09 20 20 20 20 20  &retval))..     
eb090 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
eb0a0 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c  double (context,
eb0b0 20 72 65 74 76 61 6c 29 3b 0a 09 20 20 65 6c 73   retval);..  els
eb0c0 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  e..      sqlite3
eb0d0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
eb0e0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
eb0f0 20 20 20 20 69 66 20 28 67 65 6f 6d 31 20 21 3d      if (geom1 !=
eb100 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65   NULL)..gaiaFree
eb110 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 31 29  GeomColl (geom1)
eb120 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 32 20  ;.    if (geom2 
eb130 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72  != NULL)..gaiaFr
eb140 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
eb150 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
eb160 69 64 0a 66 6e 63 74 5f 47 65 6f 64 65 73 69 63  id.fnct_Geodesic
eb170 43 65 6e 74 72 61 6c 41 6e 67 6c 65 20 28 73 71  CentralAngle (sq
eb180 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
eb190 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
eb1a0 63 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33  c,....   sqlite3
eb1b0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
eb1c0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
eb1d0 6e 3a 0a 2f 20 47 65 6f 64 65 73 69 63 43 65 6e  n:./ GeodesicCen
eb1e0 74 72 61 6c 41 6e 67 6c 65 28 67 65 6f 6d 31 20  tralAngle(geom1 
eb1f0 47 65 6f 6d 65 74 72 79 2c 20 67 65 6f 6d 32 20  Geometry, geom2 
eb200 47 65 6f 6d 65 74 72 79 29 0a 2f 20 47 65 6f 64  Geometry)./ Geod
eb210 65 73 69 63 43 65 6e 74 72 61 6c 41 6e 67 6c 65  esicCentralAngle
eb220 28 67 65 6f 6d 31 20 47 65 6f 6d 65 74 72 79 2c  (geom1 Geometry,
eb230 20 67 65 6f 6d 32 20 47 65 6f 6d 65 74 72 79 2c   geom2 Geometry,
eb240 20 72 61 64 69 61 6e 73 20 49 6e 74 65 67 65 72   radians Integer
eb250 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68  )././ returns th
eb260 65 20 43 65 6e 74 72 61 6c 20 41 6e 67 6c 65 20  e Central Angle 
eb270 66 6f 72 20 74 68 65 20 41 72 63 20 62 65 74 77  for the Arc betw
eb280 65 65 6e 20 70 6f 69 6e 74 73 20 31 20 61 6e 64  een points 1 and
eb290 20 32 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20   2./ or NULL if 
eb2a0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
eb2b0 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 2a 2a 2a  ountered././ ***
eb2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb300 0a 2f 20 74 68 69 73 20 53 51 4c 20 66 75 6e 63  ./ this SQL func
eb310 74 69 6f 6e 20 77 61 73 20 6b 69 6e 64 6c 79 20  tion was kindly 
eb320 63 6f 6e 74 72 69 62 75 74 65 64 20 62 79 20 4d  contributed by M
eb330 61 72 6b 20 4a 6f 68 6e 73 6f 6e 20 0a 2f 20 3c  ark Johnson ./ <
eb340 6d 6a 31 30 37 37 37 40 67 6f 6f 67 6c 65 6d 61  mj10777@googlema
eb350 69 6c 2e 63 6f 6d 3e 0a 2a 2f 0a 20 20 20 20 75  il.com>.*/.    u
eb360 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
eb370 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
eb380 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47  bytes;.    gaiaG
eb390 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 31  eomCollPtr geom1
eb3a0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
eb3b0 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
eb3c0 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  m2 = NULL;.    i
eb3d0 6e 74 20 72 65 74 75 72 6e 5f 74 79 70 65 20 3d  nt return_type =
eb3e0 20 47 41 49 41 5f 47 45 4f 44 45 53 49 43 5f 43   GAIA_GEODESIC_C
eb3f0 45 4e 54 52 41 4c 5f 41 4e 47 4c 45 5f 52 41 44  ENTRAL_ANGLE_RAD
eb400 49 41 4e 53 3b 0a 20 20 20 20 64 6f 75 62 6c 65  IANS;.    double
eb410 20 72 65 74 76 61 6c 3b 0a 20 20 20 20 73 71 6c   retval;.    sql
eb420 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
eb430 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
eb440 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
eb450 74 29 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67  t);.    int gpkg
eb460 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 30 3b  _amphibious = 0;
eb470 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f 6d 6f  .    int gpkg_mo
eb480 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  de = 0;.    stru
eb490 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
eb4a0 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
eb4b0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
eb4c0 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
eb4d0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
eb4e0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
eb4f0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
eb500 28 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a  (cache != NULL).
eb510 20 20 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f        {..  gpkg_
eb520 61 6d 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63  amphibious = cac
eb530 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
eb540 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b  ous_mode;..  gpk
eb550 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e  g_mode = cache->
eb560 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20 20 20 20  gpkg_mode;.     
eb570 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
eb580 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
eb590 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
eb5a0 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
eb5b0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
eb5c0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
eb5d0 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
eb5e0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
eb5f0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
eb600 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
eb610 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
eb620 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
eb630 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
eb640 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
eb650 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
eb660 72 67 63 20 3e 3d 20 33 29 0a 20 20 20 20 20 20  rgc >= 3).      
eb670 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
eb680 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
eb690 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[2]) != SQLITE_
eb6a0 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
eb6b0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
eb6c0 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
eb6d0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
eb6e0 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  }..  if (sqlite3
eb6f0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
eb700 5b 32 5d 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  [2]) == 0)..    
eb710 20 20 72 65 74 75 72 6e 5f 74 79 70 65 20 3d 20    return_type = 
eb720 47 41 49 41 5f 47 45 4f 44 45 53 49 43 5f 43 45  GAIA_GEODESIC_CE
eb730 4e 54 52 41 4c 5f 41 4e 47 4c 45 5f 44 45 47 52  NTRAL_ANGLE_DEGR
eb740 45 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EES;.      }.   
eb750 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67   p_blob = (unsig
eb760 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69  ned char *) sqli
eb770 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
eb780 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
eb790 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
eb7a0 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
eb7b0 76 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 31  v[0]);.    geom1
eb7c0 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74   =..gaiaFromSpat
eb7d0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
eb7e0 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
eb7f0 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09  , gpkg_mode,....
eb800 09 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69  .     gpkg_amphi
eb810 62 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c  bious);.    p_bl
eb820 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ob = (unsigned c
eb830 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
eb840 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
eb850 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  1]);.    n_bytes
eb860 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
eb870 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
eb880 3b 0a 20 20 20 20 67 65 6f 6d 32 20 3d 0a 09 67  ;.    geom2 =..g
eb890 61 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74  aiaFromSpatiaLit
eb8a0 65 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c  eBlobWkbEx (p_bl
eb8b0 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b  ob, n_bytes, gpk
eb8c0 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
eb8d0 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
eb8e0 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 67 65 6f  );..    if (!geo
eb8f0 6d 31 20 7c 7c 20 21 67 65 6f 6d 32 29 0a 09 73  m1 || !geom2)..s
eb900 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
eb910 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
eb920 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
eb930 20 20 69 66 20 28 67 61 69 61 47 65 6f 64 65 73    if (gaiaGeodes
eb940 69 63 41 72 63 4c 65 6e 67 74 68 0a 09 20 20 20  icArcLength..   
eb950 20 20 20 28 73 71 6c 69 74 65 2c 20 63 61 63 68     (sqlite, cach
eb960 65 2c 20 67 65 6f 6d 31 2c 20 67 65 6f 6d 32 2c  e, geom1, geom2,
eb970 20 72 65 74 75 72 6e 5f 74 79 70 65 2c 20 26 72   return_type, &r
eb980 65 74 76 61 6c 29 29 0a 09 20 20 20 20 20 20 73  etval))..      s
eb990 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
eb9a0 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 72  uble (context, r
eb9b0 65 74 76 61 6c 29 3b 0a 09 20 20 65 6c 73 65 0a  etval);..  else.
eb9c0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
eb9d0 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
eb9e0 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
eb9f0 20 20 69 66 20 28 67 65 6f 6d 31 20 21 3d 20 4e    if (geom1 != N
eba00 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65 47 65  ULL)..gaiaFreeGe
eba10 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 31 29 3b 0a  omColl (geom1);.
eba20 20 20 20 20 69 66 20 28 67 65 6f 6d 32 20 21 3d      if (geom2 !=
eba30 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65   NULL)..gaiaFree
eba40 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29  GeomColl (geom2)
eba50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
eba60 0a 66 6e 63 74 5f 47 65 6f 64 65 73 69 63 41 72  .fnct_GeodesicAr
eba70 63 41 72 65 61 20 28 73 71 6c 69 74 65 33 5f 63  cArea (sqlite3_c
eba80 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
eba90 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20  , int argc,...  
ebaa0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
ebab0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
ebac0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
ebad0 47 65 6f 64 65 73 69 63 41 72 63 41 72 65 61 28  GeodesicArcArea(
ebae0 67 65 6f 6d 31 20 47 65 6f 6d 65 74 72 79 2c 20  geom1 Geometry, 
ebaf0 67 65 6f 6d 32 20 47 65 6f 6d 65 74 72 79 29 0a  geom2 Geometry).
ebb00 2f 0a 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20  /./ returns the 
ebb10 41 72 65 61 20 28 69 6e 20 73 71 2e 20 6d 65 74  Area (in sq. met
ebb20 65 72 73 29 20 66 6f 72 20 74 68 65 20 41 72 63  ers) for the Arc
ebb30 20 62 65 74 77 65 65 6e 20 70 6f 69 6e 74 73 20   between points 
ebb40 31 20 61 6e 64 20 32 0a 2f 20 6f 72 20 4e 55 4c  1 and 2./ or NUL
ebb50 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
ebb60 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2f 0a  s encountered./.
ebb70 2f 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  / **************
ebb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebbb0 2a 2a 2a 2a 2a 0a 2f 20 74 68 69 73 20 53 51 4c  *****./ this SQL
ebbc0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6b 69   function was ki
ebbd0 6e 64 6c 79 20 63 6f 6e 74 72 69 62 75 74 65 64  ndly contributed
ebbe0 20 62 79 20 4d 61 72 6b 20 4a 6f 68 6e 73 6f 6e   by Mark Johnson
ebbf0 20 0a 2f 20 3c 6d 6a 31 30 37 37 37 40 67 6f 6f   ./ <mj10777@goo
ebc00 67 6c 65 6d 61 69 6c 2e 63 6f 6d 3e 0a 2a 2f 0a  glemail.com>.*/.
ebc10 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
ebc20 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
ebc30 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
ebc40 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
ebc50 67 65 6f 6d 31 20 3d 20 4e 55 4c 4c 3b 0a 20 20  geom1 = NULL;.  
ebc60 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
ebc70 72 20 67 65 6f 6d 32 20 3d 20 4e 55 4c 4c 3b 0a  r geom2 = NULL;.
ebc80 20 20 20 20 64 6f 75 62 6c 65 20 72 65 74 76 61      double retva
ebc90 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  l;.    sqlite3 *
ebca0 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
ebcb0 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
ebcc0 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
ebcd0 20 20 69 6e 74 20 67 70 6b 67 5f 61 6d 70 68 69    int gpkg_amphi
ebce0 62 69 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 69  bious = 0;.    i
ebcf0 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30  nt gpkg_mode = 0
ebd00 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
ebd10 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
ebd20 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
ebd30 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
ebd40 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
ebd50 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
ebd60 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
ebd70 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  */.    if (cache
ebd80 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
ebd90 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70 68 69 62  {..  gpkg_amphib
ebda0 69 6f 75 73 20 3d 20 63 61 63 68 65 2d 3e 67 70  ious = cache->gp
ebdb0 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f 6d 6f  kg_amphibious_mo
ebdc0 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65  de;..  gpkg_mode
ebdd0 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d   = cache->gpkg_m
ebde0 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
ebdf0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
ebe00 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
ebe10 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
ebe20 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
ebe30 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
ebe40 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
ebe50 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
ebe60 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
ebe70 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
ebe80 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  1]) != SQLITE_BL
ebe90 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
ebea0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ebeb0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
ebec0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ebed0 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75  .    p_blob = (u
ebee0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
ebef0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
ebf00 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
ebf10 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69    n_bytes = sqli
ebf20 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
ebf30 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67  (argv[0]);.    g
ebf40 65 6f 6d 31 20 3d 0a 09 67 61 69 61 46 72 6f 6d  eom1 =..gaiaFrom
ebf50 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
ebf60 62 45 78 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  bEx (p_blob, n_b
ebf70 79 74 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  ytes, gpkg_mode,
ebf80 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
ebf90 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
ebfa0 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
ebfb0 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
ebfc0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
ebfd0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[1]);.    n_b
ebfe0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
ebff0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
ec000 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 32 20  [1]);.    geom2 
ec010 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
ec020 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
ec030 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
ec040 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
ec050 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
ec060 69 6f 75 73 29 3b 0a 0a 20 20 20 20 69 66 20 28  ious);..    if (
ec070 21 67 65 6f 6d 31 20 7c 7c 20 21 67 65 6f 6d 32  !geom1 || !geom2
ec080 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
ec090 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
ec0a0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
ec0b0 20 7b 0a 09 20 20 69 66 20 28 67 61 69 61 47 65   {..  if (gaiaGe
ec0c0 6f 64 65 73 69 63 41 72 63 4c 65 6e 67 74 68 0a  odesicArcLength.
ec0d0 09 20 20 20 20 20 20 28 73 71 6c 69 74 65 2c 20  .      (sqlite, 
ec0e0 63 61 63 68 65 2c 20 67 65 6f 6d 31 2c 20 67 65  cache, geom1, ge
ec0f0 6f 6d 32 2c 20 47 41 49 41 5f 47 45 4f 44 45 53  om2, GAIA_GEODES
ec100 49 43 5f 41 52 43 5f 41 52 45 41 5f 4d 45 54 45  IC_ARC_AREA_METE
ec110 52 53 2c 0a 09 20 20 20 20 20 20 20 26 72 65 74  RS,..       &ret
ec120 76 61 6c 29 29 0a 09 20 20 20 20 20 20 73 71 6c  val))..      sql
ec130 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
ec140 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  le (context, ret
ec150 76 61 6c 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20  val);..  else.. 
ec160 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
ec170 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
ec180 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
ec190 69 66 20 28 67 65 6f 6d 31 20 21 3d 20 4e 55 4c  if (geom1 != NUL
ec1a0 4c 29 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d  L)..gaiaFreeGeom
ec1b0 43 6f 6c 6c 20 28 67 65 6f 6d 31 29 3b 0a 20 20  Coll (geom1);.  
ec1c0 20 20 69 66 20 28 67 65 6f 6d 32 20 21 3d 20 4e    if (geom2 != N
ec1d0 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 65 47 65  ULL)..gaiaFreeGe
ec1e0 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a  omColl (geom2);.
ec1f0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
ec200 6e 63 74 5f 47 65 6f 64 65 73 69 63 41 72 63 48  nct_GeodesicArcH
ec210 65 69 67 68 74 20 28 73 71 6c 69 74 65 33 5f 63  eight (sqlite3_c
ec220 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
ec230 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 73  , int argc,....s
ec240 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ec250 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
ec260 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 6f 64 65  unction:./ Geode
ec270 73 69 63 41 72 63 48 65 69 67 68 74 28 67 65 6f  sicArcHeight(geo
ec280 6d 31 20 47 65 6f 6d 65 74 72 79 2c 20 67 65 6f  m1 Geometry, geo
ec290 6d 32 20 47 65 6f 6d 65 74 72 79 29 0a 2f 0a 2f  m2 Geometry)././
ec2a0 20 72 65 74 75 72 6e 73 20 74 68 65 20 48 65 69   returns the Hei
ec2b0 67 68 74 20 28 69 6e 20 6d 65 74 65 72 73 29 20  ght (in meters) 
ec2c0 66 6f 72 20 74 68 65 20 41 72 63 20 62 65 74 77  for the Arc betw
ec2d0 65 65 6e 20 70 6f 69 6e 74 73 20 31 20 61 6e 64  een points 1 and
ec2e0 20 32 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20   2./ or NULL if 
ec2f0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
ec300 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 2a 2a 2a  ountered././ ***
ec310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec350 0a 2f 20 74 68 69 73 20 53 51 4c 20 66 75 6e 63  ./ this SQL func
ec360 74 69 6f 6e 20 77 61 73 20 6b 69 6e 64 6c 79 20  tion was kindly 
ec370 63 6f 6e 74 72 69 62 75 74 65 64 20 62 79 20 4d  contributed by M
ec380 61 72 6b 20 4a 6f 68 6e 73 6f 6e 20 0a 2f 20 3c  ark Johnson ./ <
ec390 6d 6a 31 30 37 37 37 40 67 6f 6f 67 6c 65 6d 61  mj10777@googlema
ec3a0 69 6c 2e 63 6f 6d 3e 0a 2a 2f 0a 20 20 20 20 75  il.com>.*/.    u
ec3b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
ec3c0 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  blob;.    int n_
ec3d0 62 79 74 65 73 3b 0a 20 20 20 20 67 61 69 61 47  bytes;.    gaiaG
ec3e0 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 31  eomCollPtr geom1
ec3f0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69   = NULL;.    gai
ec400 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
ec410 6d 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  m2 = NULL;.    d
ec420 6f 75 62 6c 65 20 72 65 74 76 61 6c 3b 0a 20 20  ouble retval;.  
ec430 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
ec440 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
ec450 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
ec460 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74  ontext);.    int
ec470 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
ec480 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
ec490 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
ec4a0 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
ec4b0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
ec4c0 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
ec4d0 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
ec4e0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
ec4f0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
ec500 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
ec510 20 20 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e    if (cache != N
ec520 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
ec530 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20  gpkg_amphibious 
ec540 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d  = cache->gpkg_am
ec550 70 68 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09  phibious_mode;..
ec560 20 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61    gpkg_mode = ca
ec570 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a  che->gpkg_mode;.
ec580 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
ec590 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
ec5a0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
ec5b0 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
ec5c0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
ec5d0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
ec5e0 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
ec5f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
ec600 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
ec610 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
ec620 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
ec630 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
ec640 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
ec650 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
ec660 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
ec670 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
ec680 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
ec690 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
ec6a0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
ec6b0 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
ec6c0 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
ec6d0 5b 30 5d 29 3b 0a 20 20 20 20 67 65 6f 6d 31 20  [0]);.    geom1 
ec6e0 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70 61 74 69  =..gaiaFromSpati
ec6f0 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28  aLiteBlobWkbEx (
ec700 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
ec710 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09   gpkg_mode,.....
ec720 20 20 20 20 20 67 70 6b 67 5f 61 6d 70 68 69 62       gpkg_amphib
ec730 69 6f 75 73 29 3b 0a 20 20 20 20 70 5f 62 6c 6f  ious);.    p_blo
ec740 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
ec750 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
ec760 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31  lue_blob (argv[1
ec770 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
ec780 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
ec790 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b  bytes (argv[1]);
ec7a0 0a 20 20 20 20 67 65 6f 6d 32 20 3d 0a 09 67 61  .    geom2 =..ga
ec7b0 69 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65  iaFromSpatiaLite
ec7c0 42 6c 6f 62 57 6b 62 45 78 20 28 70 5f 62 6c 6f  BlobWkbEx (p_blo
ec7d0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67  b, n_bytes, gpkg
ec7e0 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
ec7f0 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 29  gpkg_amphibious)
ec800 3b 0a 0a 20 20 20 20 69 66 20 28 21 67 65 6f 6d  ;..    if (!geom
ec810 31 20 7c 7c 20 21 67 65 6f 6d 32 29 0a 09 73 71  1 || !geom2)..sq
ec820 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
ec830 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
ec840 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
ec850 20 69 66 20 28 67 61 69 61 47 65 6f 64 65 73 69   if (gaiaGeodesi
ec860 63 41 72 63 4c 65 6e 67 74 68 0a 09 20 20 20 20  cArcLength..    
ec870 20 20 28 73 71 6c 69 74 65 2c 20 63 61 63 68 65    (sqlite, cache
ec880 2c 20 67 65 6f 6d 31 2c 20 67 65 6f 6d 32 2c 20  , geom1, geom2, 
ec890 47 41 49 41 5f 47 45 4f 44 45 53 49 43 5f 41 52  GAIA_GEODESIC_AR
ec8a0 43 5f 48 45 49 47 48 54 5f 4d 45 54 45 52 53 2c  C_HEIGHT_METERS,
ec8b0 0a 09 20 20 20 20 20 20 20 26 72 65 74 76 61 6c  ..       &retval
ec8c0 29 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65  ))..      sqlite
ec8d0 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 20  3_result_double 
ec8e0 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 76 61 6c  (context, retval
ec8f0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  );..  else..    
ec900 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ec910 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
ec920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
ec930 28 67 65 6f 6d 31 20 21 3d 20 4e 55 4c 4c 29 0a  (geom1 != NULL).
ec940 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c  .gaiaFreeGeomCol
ec950 6c 20 28 67 65 6f 6d 31 29 3b 0a 20 20 20 20 69  l (geom1);.    i
ec960 66 20 28 67 65 6f 6d 32 20 21 3d 20 4e 55 4c 4c  f (geom2 != NULL
ec970 29 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43  )..gaiaFreeGeomC
ec980 6f 6c 6c 20 28 67 65 6f 6d 32 29 3b 0a 7d 0a 0a  oll (geom2);.}..
ec990 73 74 61 74 69 63 20 76 6f 69 64 0a 63 6f 6e 76  static void.conv
ec9a0 65 72 74 55 6e 69 74 20 28 73 71 6c 69 74 65 33  ertUnit (sqlite3
ec9b0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ec9c0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
ec9d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ec9e0 72 67 76 2c 0a 09 20 20 20 20 20 69 6e 74 20 75  rgv,..     int u
ec9f0 6e 69 74 5f 66 72 6f 6d 2c 20 69 6e 74 20 75 6e  nit_from, int un
eca00 69 74 5f 74 6f 29 0a 7b 0a 2f 2a 20 53 51 4c 20  it_to).{./* SQL 
eca10 66 75 6e 63 74 69 6f 6e 73 3a 0a 2f 20 43 76 74  functions:./ Cvt
eca20 54 6f 4b 6d 28 29 2c 20 43 76 74 54 6f 44 6d 28  ToKm(), CvtToDm(
eca30 29 2c 20 43 76 74 54 6f 43 6d 28 29 2c 20 43 76  ), CvtToCm(), Cv
eca40 74 54 6f 4d 6d 28 29 2c 20 43 76 74 54 6f 4b 6d  tToMm(), CvtToKm
eca50 69 28 29 2c 20 43 76 74 54 6f 49 6e 28 29 2c 20  i(), CvtToIn(), 
eca60 43 76 74 54 6f 46 74 28 29 2c 0a 2f 20 43 76 74  CvtToFt(),./ Cvt
eca70 54 6f 59 64 28 29 2c 20 43 76 74 54 6f 4d 69 28  ToYd(), CvtToMi(
eca80 29 2c 20 43 76 74 54 6f 46 61 74 68 28 29 2c 20  ), CvtToFath(), 
eca90 43 76 74 54 6f 43 68 28 29 2c 20 43 76 74 54 6f  CvtToCh(), CvtTo
ecaa0 4c 69 6e 6b 28 29 2c 20 43 76 74 54 6f 55 73 49  Link(), CvtToUsI
ecab0 6e 28 29 2c 20 0a 2f 20 43 76 74 54 6f 55 73 46  n(), ./ CvtToUsF
ecac0 74 28 29 2c 20 43 76 74 54 6f 55 73 59 64 28 29  t(), CvtToUsYd()
ecad0 2c 20 43 76 74 54 6f 55 73 43 68 28 29 2c 20 43  , CvtToUsCh(), C
ecae0 76 74 54 6f 55 73 4d 69 28 29 2c 20 43 76 74 54  vtToUsMi(), CvtT
ecaf0 6f 49 6e 64 46 74 28 29 2c 20 0a 2f 20 43 76 74  oIndFt(), ./ Cvt
ecb00 54 6f 49 6e 64 59 64 28 29 2c 20 43 76 74 54 6f  ToIndYd(), CvtTo
ecb10 49 6e 64 43 68 28 29 2c 20 0a 2f 20 43 76 74 46  IndCh(), ./ CvtF
ecb20 72 6f 6d 4b 6d 28 29 2c 20 43 76 74 46 72 6f 6d  romKm(), CvtFrom
ecb30 44 6d 28 29 2c 20 43 76 74 46 72 6f 6d 43 6d 28  Dm(), CvtFromCm(
ecb40 29 2c 20 43 76 74 46 72 6f 6d 4d 6d 28 29 2c 20  ), CvtFromMm(), 
ecb50 43 76 74 46 72 6f 6d 4b 6d 69 28 29 2c 20 0a 2f  CvtFromKmi(), ./
ecb60 20 43 76 74 46 72 6f 6d 49 6e 28 29 2c 20 43 76   CvtFromIn(), Cv
ecb70 74 46 72 6f 6d 46 74 28 29 2c 20 43 76 74 46 72  tFromFt(), CvtFr
ecb80 6f 6d 59 64 28 29 2c 20 43 76 74 46 72 6f 6d 4d  omYd(), CvtFromM
ecb90 69 28 29 2c 20 43 76 74 46 72 6f 6d 46 61 74 68  i(), CvtFromFath
ecba0 28 29 2c 20 0a 2f 20 43 76 74 46 72 6f 6d 43 68  (), ./ CvtFromCh
ecbb0 28 29 2c 20 43 76 74 46 72 6f 6d 4c 69 6e 6b 28  (), CvtFromLink(
ecbc0 29 2c 20 43 76 74 46 72 6f 6d 55 73 49 6e 28 29  ), CvtFromUsIn()
ecbd0 2c 20 43 76 74 46 72 6f 6d 55 73 46 74 28 29 2c  , CvtFromUsFt(),
ecbe0 20 43 76 74 46 72 6f 6d 55 73 59 64 28 29 2c 20   CvtFromUsYd(), 
ecbf0 0a 2f 20 43 76 74 46 72 6f 6d 55 73 43 68 28 29  ./ CvtFromUsCh()
ecc00 2c 20 43 76 74 46 72 6f 6d 55 73 4d 69 28 29 2c  , CvtFromUsMi(),
ecc10 20 43 76 74 46 72 6f 6d 49 6e 64 46 74 28 29 2c   CvtFromIndFt(),
ecc20 20 43 76 74 46 72 6f 6d 49 6e 64 59 64 28 29 2c   CvtFromIndYd(),
ecc30 20 0a 2f 20 43 76 74 46 72 6f 6d 49 6e 64 43 68   ./ CvtFromIndCh
ecc40 28 29 0a 2f 0a 2f 20 63 6f 6e 76 65 72 74 73 20  ()././ converts 
ecc50 61 20 4c 65 6e 67 74 68 20 66 72 6f 6d 20 6f 6e  a Length from on
ecc60 65 20 75 6e 69 74 20 74 6f 20 61 20 64 69 66 66  e unit to a diff
ecc70 65 72 65 6e 74 20 6f 6e 65 0a 2f 20 6f 72 20 4e  erent one./ or N
ecc80 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ULL if any error
ecc90 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
ecca0 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 76  */.    double cv
eccb0 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  t;.    double va
eccc0 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74  lue;.    int int
eccd0 5f 76 61 6c 75 65 3b 0a 20 20 20 20 47 41 49 41  _value;.    GAIA
ecce0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
eccf0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
ecd00 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
ecd10 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
ecd20 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
ecd30 5f 46 4c 4f 41 54 29 0a 09 76 61 6c 75 65 20 3d  _FLOAT)..value =
ecd40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
ecd50 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b  ouble (argv[0]);
ecd60 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71  .    else if (sq
ecd70 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
ecd80 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
ecd90 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
ecda0 20 20 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c      {..  int_val
ecdb0 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
ecdc0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
ecdd0 3b 0a 09 20 20 76 61 6c 75 65 20 3d 20 69 6e 74  ;..  value = int
ecde0 5f 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  _value;.      }.
ecdf0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
ece00 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
ece10 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
ece20 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
ece30 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 67      }.    if (!g
ece40 61 69 61 43 6f 6e 76 65 72 74 4c 65 6e 67 74 68  aiaConvertLength
ece50 20 28 76 61 6c 75 65 2c 20 75 6e 69 74 5f 66 72   (value, unit_fr
ece60 6f 6d 2c 20 75 6e 69 74 5f 74 6f 2c 20 26 63 76  om, unit_to, &cv
ece70 74 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  t))..sqlite3_res
ece80 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
ece90 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
ecea0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
eceb0 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 63 76  ble (context, cv
ecec0 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
eced0 69 64 0a 66 6e 63 74 5f 63 76 74 54 6f 4b 6d 20  id.fnct_cvtToKm 
ecee0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ecef0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
ecf00 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ecf10 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
ecf20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28     convertUnit (
ecf30 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
ecf40 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49  rgv, GAIA_M, GAI
ecf50 41 5f 4b 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  A_KM);.}..static
ecf60 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 54 6f   void.fnct_cvtTo
ecf70 44 6d 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Dm (sqlite3_cont
ecf80 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
ecf90 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
ecfa0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
ecfb0 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69  {.    convertUni
ecfc0 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  t (context, argc
ecfd0 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20  , argv, GAIA_M, 
ecfe0 47 41 49 41 5f 44 4d 29 3b 0a 7d 0a 0a 73 74 61  GAIA_DM);.}..sta
ecff0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76  tic void.fnct_cv
ed000 74 54 6f 43 6d 20 28 73 71 6c 69 74 65 33 5f 63  tToCm (sqlite3_c
ed010 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
ed020 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
ed030 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
ed040 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74  v).{.    convert
ed050 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61  Unit (context, a
ed060 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f  rgc, argv, GAIA_
ed070 4d 2c 20 47 41 49 41 5f 43 4d 29 3b 0a 7d 0a 0a  M, GAIA_CM);.}..
ed080 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
ed090 5f 63 76 74 54 6f 4d 6d 20 28 73 71 6c 69 74 65  _cvtToMm (sqlite
ed0a0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ed0b0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ed0c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ed0d0 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76  argv).{.    conv
ed0e0 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74  ertUnit (context
ed0f0 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41  , argc, argv, GA
ed100 49 41 5f 4d 2c 20 47 41 49 41 5f 4d 4d 29 3b 0a  IA_M, GAIA_MM);.
ed110 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
ed120 6e 63 74 5f 63 76 74 54 6f 4b 6d 69 20 28 73 71  nct_cvtToKmi (sq
ed130 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
ed140 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ed150 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
ed160 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
ed170 63 6f 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e  convertUnit (con
ed180 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
ed190 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49 41 5f 4b  , GAIA_M, GAIA_K
ed1a0 4d 49 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  MI);.}..static v
ed1b0 6f 69 64 0a 66 6e 63 74 5f 63 76 74 54 6f 49 6e  oid.fnct_cvtToIn
ed1c0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
ed1d0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
ed1e0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ed1f0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
ed200 20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20      convertUnit 
ed210 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
ed220 61 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20 47 41  argv, GAIA_M, GA
ed230 49 41 5f 49 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69  IA_IN);.}..stati
ed240 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 54  c void.fnct_cvtT
ed250 6f 46 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  oFt (sqlite3_con
ed260 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
ed270 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
ed280 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
ed290 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74 55 6e  .{.    convertUn
ed2a0 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  it (context, arg
ed2b0 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4d 2c  c, argv, GAIA_M,
ed2c0 20 47 41 49 41 5f 46 54 29 3b 0a 7d 0a 0a 73 74   GAIA_FT);.}..st
ed2d0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63  atic void.fnct_c
ed2e0 76 74 54 6f 59 64 20 28 73 71 6c 69 74 65 33 5f  vtToYd (sqlite3_
ed2f0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
ed300 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
ed310 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
ed320 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72  gv).{.    conver
ed330 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20  tUnit (context, 
ed340 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41  argc, argv, GAIA
ed350 5f 4d 2c 20 47 41 49 41 5f 59 44 29 3b 0a 7d 0a  _M, GAIA_YD);.}.
ed360 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
ed370 74 5f 63 76 74 54 6f 4d 69 20 28 73 71 6c 69 74  t_cvtToMi (sqlit
ed380 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
ed390 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
ed3a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
ed3b0 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e   argv).{.    con
ed3c0 76 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78  vertUnit (contex
ed3d0 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47  t, argc, argv, G
ed3e0 41 49 41 5f 4d 2c 20 47 41 49 41 5f 4d 49 29 3b  AIA_M, GAIA_MI);
ed3f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
ed400 66 6e 63 74 5f 63 76 74 54 6f 46 61 74 68 20 28  fnct_cvtToFath (
ed410 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ed420 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
ed430 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
ed440 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
ed450 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28 63    convertUnit (c
ed460 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
ed470 67 76 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49 41  gv, GAIA_M, GAIA
ed480 5f 46 41 54 48 29 3b 0a 7d 0a 0a 73 74 61 74 69  _FATH);.}..stati
ed490 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 54  c void.fnct_cvtT
ed4a0 6f 43 68 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  oCh (sqlite3_con
ed4b0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
ed4c0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
ed4d0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
ed4e0 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74 55 6e  .{.    convertUn
ed4f0 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  it (context, arg
ed500 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4d 2c  c, argv, GAIA_M,
ed510 20 47 41 49 41 5f 43 48 29 3b 0a 7d 0a 0a 73 74   GAIA_CH);.}..st
ed520 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63  atic void.fnct_c
ed530 76 74 54 6f 4c 69 6e 6b 20 28 73 71 6c 69 74 65  vtToLink (sqlite
ed540 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ed550 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ed560 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ed570 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76  argv).{.    conv
ed580 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74  ertUnit (context
ed590 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41  , argc, argv, GA
ed5a0 49 41 5f 4d 2c 20 47 41 49 41 5f 4c 49 4e 4b 29  IA_M, GAIA_LINK)
ed5b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ed5c0 0a 66 6e 63 74 5f 63 76 74 54 6f 55 73 49 6e 20  .fnct_cvtToUsIn 
ed5d0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ed5e0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
ed5f0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ed600 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
ed610 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28     convertUnit (
ed620 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
ed630 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49  rgv, GAIA_M, GAI
ed640 41 5f 55 53 5f 49 4e 29 3b 0a 7d 0a 0a 73 74 61  A_US_IN);.}..sta
ed650 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76  tic void.fnct_cv
ed660 74 54 6f 55 73 46 74 20 28 73 71 6c 69 74 65 33  tToUsFt (sqlite3
ed670 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ed680 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
ed690 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ed6a0 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65  rgv).{.    conve
ed6b0 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c  rtUnit (context,
ed6c0 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49   argc, argv, GAI
ed6d0 41 5f 4d 2c 20 47 41 49 41 5f 55 53 5f 46 54 29  A_M, GAIA_US_FT)
ed6e0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ed6f0 0a 66 6e 63 74 5f 63 76 74 54 6f 55 73 59 64 20  .fnct_cvtToUsYd 
ed700 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ed710 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
ed720 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ed730 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
ed740 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28     convertUnit (
ed750 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
ed760 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49  rgv, GAIA_M, GAI
ed770 41 5f 55 53 5f 59 44 29 3b 0a 7d 0a 0a 73 74 61  A_US_YD);.}..sta
ed780 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76  tic void.fnct_cv
ed790 74 54 6f 55 73 43 68 20 28 73 71 6c 69 74 65 33  tToUsCh (sqlite3
ed7a0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ed7b0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
ed7c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ed7d0 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65  rgv).{.    conve
ed7e0 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c  rtUnit (context,
ed7f0 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49   argc, argv, GAI
ed800 41 5f 4d 2c 20 47 41 49 41 5f 55 53 5f 43 48 29  A_M, GAIA_US_CH)
ed810 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ed820 0a 66 6e 63 74 5f 63 76 74 54 6f 55 73 4d 69 20  .fnct_cvtToUsMi 
ed830 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ed840 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
ed850 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ed860 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
ed870 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28     convertUnit (
ed880 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
ed890 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49  rgv, GAIA_M, GAI
ed8a0 41 5f 55 53 5f 4d 49 29 3b 0a 7d 0a 0a 73 74 61  A_US_MI);.}..sta
ed8b0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76  tic void.fnct_cv
ed8c0 74 54 6f 49 6e 64 46 74 20 28 73 71 6c 69 74 65  tToIndFt (sqlite
ed8d0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ed8e0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ed8f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ed900 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76  argv).{.    conv
ed910 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74  ertUnit (context
ed920 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41  , argc, argv, GA
ed930 49 41 5f 4d 2c 20 47 41 49 41 5f 49 4e 44 5f 46  IA_M, GAIA_IND_F
ed940 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  T);.}..static vo
ed950 69 64 0a 66 6e 63 74 5f 63 76 74 54 6f 49 6e 64  id.fnct_cvtToInd
ed960 59 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Yd (sqlite3_cont
ed970 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
ed980 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
ed990 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
ed9a0 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69  {.    convertUni
ed9b0 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  t (context, argc
ed9c0 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4d 2c 20  , argv, GAIA_M, 
ed9d0 47 41 49 41 5f 49 4e 44 5f 59 44 29 3b 0a 7d 0a  GAIA_IND_YD);.}.
ed9e0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
ed9f0 74 5f 63 76 74 54 6f 49 6e 64 43 68 20 28 73 71  t_cvtToIndCh (sq
eda00 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
eda10 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
eda20 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
eda30 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
eda40 63 6f 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e  convertUnit (con
eda50 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
eda60 2c 20 47 41 49 41 5f 4d 2c 20 47 41 49 41 5f 49  , GAIA_M, GAIA_I
eda70 4e 44 5f 43 48 29 3b 0a 7d 0a 0a 73 74 61 74 69  ND_CH);.}..stati
eda80 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46  c void.fnct_cvtF
eda90 72 6f 6d 4b 6d 20 28 73 71 6c 69 74 65 33 5f 63  romKm (sqlite3_c
edaa0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
edab0 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
edac0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
edad0 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74  v).{.    convert
edae0 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61  Unit (context, a
edaf0 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f  rgc, argv, GAIA_
edb00 4b 4d 2c 20 47 41 49 41 5f 4d 29 3b 0a 7d 0a 0a  KM, GAIA_M);.}..
edb10 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
edb20 5f 63 76 74 46 72 6f 6d 44 6d 20 28 73 71 6c 69  _cvtFromDm (sqli
edb30 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
edb40 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
edb50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
edb60 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f  * argv).{.    co
edb70 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65  nvertUnit (conte
edb80 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
edb90 47 41 49 41 5f 44 4d 2c 20 47 41 49 41 5f 4d 29  GAIA_DM, GAIA_M)
edba0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
edbb0 0a 66 6e 63 74 5f 63 76 74 46 72 6f 6d 43 6d 20  .fnct_cvtFromCm 
edbc0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
edbd0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
edbe0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
edbf0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
edc00 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28     convertUnit (
edc10 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
edc20 72 67 76 2c 20 47 41 49 41 5f 43 4d 2c 20 47 41  rgv, GAIA_CM, GA
edc30 49 41 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  IA_M);.}..static
edc40 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46 72   void.fnct_cvtFr
edc50 6f 6d 4d 6d 20 28 73 71 6c 69 74 65 33 5f 63 6f  omMm (sqlite3_co
edc60 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
edc70 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
edc80 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
edc90 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74 55  ).{.    convertU
edca0 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  nit (context, ar
edcb0 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4d  gc, argv, GAIA_M
edcc0 4d 2c 20 47 41 49 41 5f 4d 29 3b 0a 7d 0a 0a 73  M, GAIA_M);.}..s
edcd0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
edce0 63 76 74 46 72 6f 6d 4b 6d 69 20 28 73 71 6c 69  cvtFromKmi (sqli
edcf0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
edd00 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
edd10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
edd20 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f  * argv).{.    co
edd30 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65  nvertUnit (conte
edd40 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
edd50 47 41 49 41 5f 4b 4d 49 2c 20 47 41 49 41 5f 4d  GAIA_KMI, GAIA_M
edd60 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
edd70 64 0a 66 6e 63 74 5f 63 76 74 46 72 6f 6d 49 6e  d.fnct_cvtFromIn
edd80 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
edd90 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
edda0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
eddb0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
eddc0 20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20      convertUnit 
eddd0 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
edde0 61 72 67 76 2c 20 47 41 49 41 5f 49 4e 2c 20 47  argv, GAIA_IN, G
eddf0 41 49 41 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69  AIA_M);.}..stati
ede00 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46  c void.fnct_cvtF
ede10 72 6f 6d 46 74 20 28 73 71 6c 69 74 65 33 5f 63  romFt (sqlite3_c
ede20 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
ede30 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
ede40 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
ede50 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74  v).{.    convert
ede60 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61  Unit (context, a
ede70 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f  rgc, argv, GAIA_
ede80 46 54 2c 20 47 41 49 41 5f 4d 29 3b 0a 7d 0a 0a  FT, GAIA_M);.}..
ede90 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
edea0 5f 63 76 74 46 72 6f 6d 59 64 20 28 73 71 6c 69  _cvtFromYd (sqli
edeb0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
edec0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
eded0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
edee0 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f  * argv).{.    co
edef0 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65  nvertUnit (conte
edf00 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
edf10 47 41 49 41 5f 59 44 2c 20 47 41 49 41 5f 4d 29  GAIA_YD, GAIA_M)
edf20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
edf30 0a 66 6e 63 74 5f 63 76 74 46 72 6f 6d 4d 69 20  .fnct_cvtFromMi 
edf40 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
edf50 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
edf60 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
edf70 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
edf80 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28     convertUnit (
edf90 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
edfa0 72 67 76 2c 20 47 41 49 41 5f 4d 49 2c 20 47 41  rgv, GAIA_MI, GA
edfb0 49 41 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  IA_M);.}..static
edfc0 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46 72   void.fnct_cvtFr
edfd0 6f 6d 46 61 74 68 20 28 73 71 6c 69 74 65 33 5f  omFath (sqlite3_
edfe0 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
edff0 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
ee000 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
ee010 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72  gv).{.    conver
ee020 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20  tUnit (context, 
ee030 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41  argc, argv, GAIA
ee040 5f 46 41 54 48 2c 20 47 41 49 41 5f 4d 29 3b 0a  _FATH, GAIA_M);.
ee050 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
ee060 6e 63 74 5f 63 76 74 46 72 6f 6d 43 68 20 28 73  nct_cvtFromCh (s
ee070 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ee080 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
ee090 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ee0a0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
ee0b0 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28 63 6f   convertUnit (co
ee0c0 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
ee0d0 76 2c 20 47 41 49 41 5f 43 48 2c 20 47 41 49 41  v, GAIA_CH, GAIA
ee0e0 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  _M);.}..static v
ee0f0 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46 72 6f 6d  oid.fnct_cvtFrom
ee100 4c 69 6e 6b 20 28 73 71 6c 69 74 65 33 5f 63 6f  Link (sqlite3_co
ee110 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
ee120 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
ee130 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
ee140 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74 55  ).{.    convertU
ee150 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  nit (context, ar
ee160 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f 4c  gc, argv, GAIA_L
ee170 49 4e 4b 2c 20 47 41 49 41 5f 4d 29 3b 0a 7d 0a  INK, GAIA_M);.}.
ee180 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
ee190 74 5f 63 76 74 46 72 6f 6d 55 73 49 6e 20 28 73  t_cvtFromUsIn (s
ee1a0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ee1b0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
ee1c0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
ee1d0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
ee1e0 20 63 6f 6e 76 65 72 74 55 6e 69 74 20 28 63 6f   convertUnit (co
ee1f0 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
ee200 76 2c 20 47 41 49 41 5f 55 53 5f 49 4e 2c 20 47  v, GAIA_US_IN, G
ee210 41 49 41 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69  AIA_M);.}..stati
ee220 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46  c void.fnct_cvtF
ee230 72 6f 6d 55 73 46 74 20 28 73 71 6c 69 74 65 33  romUsFt (sqlite3
ee240 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
ee250 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
ee260 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
ee270 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65  rgv).{.    conve
ee280 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c  rtUnit (context,
ee290 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49   argc, argv, GAI
ee2a0 41 5f 55 53 5f 46 54 2c 20 47 41 49 41 5f 4d 29  A_US_FT, GAIA_M)
ee2b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ee2c0 0a 66 6e 63 74 5f 63 76 74 46 72 6f 6d 55 73 59  .fnct_cvtFromUsY
ee2d0 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  d (sqlite3_conte
ee2e0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
ee2f0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
ee300 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
ee310 0a 20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74  .    convertUnit
ee320 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
ee330 20 61 72 67 76 2c 20 47 41 49 41 5f 55 53 5f 59   argv, GAIA_US_Y
ee340 44 2c 20 47 41 49 41 5f 4d 29 3b 0a 7d 0a 0a 73  D, GAIA_M);.}..s
ee350 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
ee360 63 76 74 46 72 6f 6d 55 73 43 68 20 28 73 71 6c  cvtFromUsCh (sql
ee370 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
ee380 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
ee390 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
ee3a0 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 63  ** argv).{.    c
ee3b0 6f 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e 74  onvertUnit (cont
ee3c0 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ext, argc, argv,
ee3d0 20 47 41 49 41 5f 55 53 5f 43 48 2c 20 47 41 49   GAIA_US_CH, GAI
ee3e0 41 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  A_M);.}..static 
ee3f0 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46 72 6f  void.fnct_cvtFro
ee400 6d 55 73 4d 69 20 28 73 71 6c 69 74 65 33 5f 63  mUsMi (sqlite3_c
ee410 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
ee420 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
ee430 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
ee440 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76 65 72 74  v).{.    convert
ee450 55 6e 69 74 20 28 63 6f 6e 74 65 78 74 2c 20 61  Unit (context, a
ee460 72 67 63 2c 20 61 72 67 76 2c 20 47 41 49 41 5f  rgc, argv, GAIA_
ee470 55 53 5f 4d 49 2c 20 47 41 49 41 5f 4d 29 3b 0a  US_MI, GAIA_M);.
ee480 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
ee490 6e 63 74 5f 63 76 74 46 72 6f 6d 49 6e 64 46 74  nct_cvtFromIndFt
ee4a0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
ee4b0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
ee4c0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
ee4d0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
ee4e0 20 20 20 20 63 6f 6e 76 65 72 74 55 6e 69 74 20      convertUnit 
ee4f0 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
ee500 61 72 67 76 2c 20 47 41 49 41 5f 49 4e 44 5f 46  argv, GAIA_IND_F
ee510 54 2c 20 47 41 49 41 5f 4d 29 3b 0a 7d 0a 0a 73  T, GAIA_M);.}..s
ee520 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
ee530 63 76 74 46 72 6f 6d 49 6e 64 59 64 20 28 73 71  cvtFromIndYd (sq
ee540 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
ee550 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ee560 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
ee570 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
ee580 63 6f 6e 76 65 72 74 55 6e 69 74 20 28 63 6f 6e  convertUnit (con
ee590 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
ee5a0 2c 20 47 41 49 41 5f 49 4e 44 5f 59 44 2c 20 47  , GAIA_IND_YD, G
ee5b0 41 49 41 5f 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69  AIA_M);.}..stati
ee5c0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 63 76 74 46  c void.fnct_cvtF
ee5d0 72 6f 6d 49 6e 64 43 68 20 28 73 71 6c 69 74 65  romIndCh (sqlite
ee5e0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ee5f0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ee600 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ee610 61 72 67 76 29 0a 7b 0a 20 20 20 20 63 6f 6e 76  argv).{.    conv
ee620 65 72 74 55 6e 69 74 20 28 63 6f 6e 74 65 78 74  ertUnit (context
ee630 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 47 41  , argc, argv, GA
ee640 49 41 5f 49 4e 44 5f 43 48 2c 20 47 41 49 41 5f  IA_IND_CH, GAIA_
ee650 4d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  M);.}..static vo
ee660 69 64 0a 66 6e 63 74 5f 6c 6f 6e 67 46 72 6f 6d  id.fnct_longFrom
ee670 44 4d 53 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  DMS (sqlite3_con
ee680 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
ee690 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
ee6a0 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
ee6b0 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
ee6c0 6f 6e 3a 0a 2f 20 4c 6f 6e 67 69 74 75 64 65 46  on:./ LongitudeF
ee6d0 72 6f 6d 44 4d 53 20 28 20 64 6d 73 5f 73 74 72  romDMS ( dms_str
ee6e0 69 6e 67 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  ing )././ return
ee6f0 20 74 68 65 20 4c 6f 6e 67 69 74 75 64 65 20 28   the Longitude (
ee700 69 6e 20 44 65 63 69 6d 61 6c 20 44 65 67 72 65  in Decimal Degre
ee710 65 73 29 20 66 72 6f 6d 20 61 20 44 4d 53 20 74  es) from a DMS t
ee720 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2f  ext expression./
ee730 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20   or NULL if any 
ee740 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
ee750 65 72 65 64 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73  ered.*/.    cons
ee760 74 20 63 68 61 72 20 2a 64 6d 73 3b 0a 20 20 20  t char *dms;.   
ee770 20 64 6f 75 62 6c 65 20 6c 6f 6e 67 69 74 75 64   double longitud
ee780 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 61  e;.    double la
ee790 74 69 74 75 64 65 3b 0a 20 20 20 20 47 41 49 41  titude;.    GAIA
ee7a0 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
ee7b0 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
ee7c0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
ee7d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
ee7e0 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
ee7f0 5f 54 45 58 54 29 0a 09 64 6d 73 20 3d 20 28 63  _TEXT)..dms = (c
ee800 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
ee810 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
ee820 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65  (argv[0]);.    e
ee830 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
ee840 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ee850 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
ee860 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ee870 0a 20 20 20 20 69 66 20 28 21 67 61 69 61 50 61  .    if (!gaiaPa
ee880 72 73 65 44 4d 53 20 28 64 6d 73 2c 20 26 6c 6f  rseDMS (dms, &lo
ee890 6e 67 69 74 75 64 65 2c 20 26 6c 61 74 69 74 75  ngitude, &latitu
ee8a0 64 65 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  de))..sqlite3_re
ee8b0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
ee8c0 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73  xt);.    else..s
ee8d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
ee8e0 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 6c  uble (context, l
ee8f0 6f 6e 67 69 74 75 64 65 29 3b 0a 7d 0a 0a 73 74  ongitude);.}..st
ee900 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 6c  atic void.fnct_l
ee910 61 74 46 72 6f 6d 44 4d 53 20 28 73 71 6c 69 74  atFromDMS (sqlit
ee920 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
ee930 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
ee940 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
ee950 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
ee960 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 4c 61 74 69  function:./ Lati
ee970 74 75 64 65 46 72 6f 6d 44 4d 53 20 28 20 64 6d  tudeFromDMS ( dm
ee980 73 5f 73 74 72 69 6e 67 20 29 0a 2f 0a 2f 20 72  s_string )././ r
ee990 65 74 75 72 6e 20 74 68 65 20 4c 61 74 69 74 75  eturn the Latitu
ee9a0 64 65 20 28 69 6e 20 44 65 63 69 6d 61 6c 20 44  de (in Decimal D
ee9b0 65 67 72 65 65 73 29 20 66 72 6f 6d 20 61 20 44  egrees) from a D
ee9c0 4d 53 20 74 65 78 74 20 65 78 70 72 65 73 73 69  MS text expressi
ee9d0 6f 6e 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  on./ or NULL if 
ee9e0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
ee9f0 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
eea00 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 6d 73 3b  const char *dms;
eea10 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 6e 67  .    double long
eea20 69 74 75 64 65 3b 0a 20 20 20 20 64 6f 75 62 6c  itude;.    doubl
eea30 65 20 6c 61 74 69 74 75 64 65 3b 0a 20 20 20 20  e latitude;.    
eea40 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
eea50 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
eea60 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
eea70 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
eea80 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
eea90 4c 49 54 45 5f 54 45 58 54 29 0a 09 64 6d 73 20  LITE_TEXT)..dms 
eeaa0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
eeab0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
eeac0 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ext (argv[0]);. 
eead0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
eeae0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
eeaf0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
eeb00 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
eeb10 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 67 61     }.    if (!ga
eeb20 69 61 50 61 72 73 65 44 4d 53 20 28 64 6d 73 2c  iaParseDMS (dms,
eeb30 20 26 6c 6f 6e 67 69 74 75 64 65 2c 20 26 6c 61   &longitude, &la
eeb40 74 69 74 75 64 65 29 29 0a 09 73 71 6c 69 74 65  titude))..sqlite
eeb50 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
eeb60 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
eeb70 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
eeb80 74 5f 64 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78  t_double (contex
eeb90 74 2c 20 6c 61 74 69 74 75 64 65 29 3b 0a 7d 0a  t, latitude);.}.
eeba0 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
eebb0 74 5f 74 6f 44 4d 53 20 28 73 71 6c 69 74 65 33  t_toDMS (sqlite3
eebc0 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
eebd0 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
eebe0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
eebf0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
eec00 6e 63 74 69 6f 6e 3a 0a 2f 20 4c 6f 6e 67 4c 61  nction:./ LongLa
eec10 74 54 6f 44 4d 53 20 28 20 6c 6f 6e 67 69 74 75  tToDMS ( longitu
eec20 64 65 2c 20 6c 61 74 69 74 75 64 65 20 29 0a 2f  de, latitude )./
eec30 0a 2f 20 72 65 74 75 72 6e 20 61 20 44 4d 53 20  ./ return a DMS 
eec40 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  text expression.
eec50 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
eec60 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
eec70 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 64 6f 75  tered.*/.    dou
eec80 62 6c 65 20 6c 6f 6e 67 69 74 75 64 65 3b 0a 20  ble longitude;. 
eec90 20 20 20 64 6f 75 62 6c 65 20 6c 61 74 69 74 75     double latitu
eeca0 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 64 6d  de;.    char *dm
eecb0 73 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  s;.    GAIA_UNUS
eecc0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
eecd0 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
eece0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
eecf0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
eed00 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
eed10 54 29 0a 09 6c 6f 6e 67 69 74 75 64 65 20 3d 20  T)..longitude = 
eed20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
eed30 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a  uble (argv[0]);.
eed40 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
eed50 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
eed60 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
eed70 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
eed80 20 20 20 7b 0a 09 20 20 69 6e 74 20 76 61 6c 75     {..  int valu
eed90 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
eeda0 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
eedb0 0a 09 20 20 6c 6f 6e 67 69 74 75 64 65 20 3d 20  ..  longitude = 
eedc0 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  value;.      }. 
eedd0 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a     else.      {.
eede0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
eedf0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
eee00 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
eee10 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
eee20 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
eee30 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
eee40 49 54 45 5f 46 4c 4f 41 54 29 0a 09 6c 61 74 69  ITE_FLOAT)..lati
eee50 74 75 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  tude = sqlite3_v
eee60 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
eee70 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[1]);.    else 
eee80 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
eee90 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
eeea0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
eeeb0 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ER).      {..  i
eeec0 6e 74 20 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt value = sqlit
eeed0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
eeee0 67 76 5b 31 5d 29 3b 0a 09 20 20 6c 61 74 69 74  gv[1]);..  latit
eeef0 75 64 65 20 3d 20 76 61 6c 75 65 3b 0a 20 20 20  ude = value;.   
eef00 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
eef10 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
eef20 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
eef30 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
eef40 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  n;.      }.    d
eef50 6d 73 20 3d 20 67 61 69 61 43 6f 6e 76 65 72 74  ms = gaiaConvert
eef60 54 6f 44 4d 53 20 28 6c 6f 6e 67 69 74 75 64 65  ToDMS (longitude
eef70 2c 20 6c 61 74 69 74 75 64 65 29 3b 0a 20 20 20  , latitude);.   
eef80 20 69 66 20 28 64 6d 73 20 3d 3d 20 4e 55 4c 4c   if (dms == NULL
eef90 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
eefa0 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
eefb0 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
eefc0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20  te3_result_text 
eefd0 28 63 6f 6e 74 65 78 74 2c 20 64 6d 73 2c 20 73  (context, dms, s
eefe0 74 72 6c 65 6e 20 28 64 6d 73 29 2c 20 66 72 65  trlen (dms), fre
eeff0 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  e);.}..static vo
ef000 69 64 0a 66 6e 63 74 5f 73 65 71 75 65 6e 63 65  id.fnct_sequence
ef010 5f 63 75 72 72 76 61 6c 20 28 73 71 6c 69 74 65  _currval (sqlite
ef020 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ef030 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
ef040 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
ef050 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
ef060 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
ef070 3a 0a 2f 20 73 65 71 75 65 6e 63 65 5f 63 75 72  :./ sequence_cur
ef080 72 76 61 6c 20 28 20 73 65 71 5f 6e 61 6d 65 20  rval ( seq_name 
ef090 54 45 58 54 20 29 0a 2f 0a 2f 20 72 65 74 75 72  TEXT )././ retur
ef0a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
ef0b0 6c 75 65 20 66 72 6f 6d 20 73 6f 6d 65 20 53 65  lue from some Se
ef0c0 71 75 65 6e 63 65 0a 2f 20 6f 72 20 4e 55 4c 4c  quence./ or NULL
ef0d0 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
ef0e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a   encountered.*/.
ef0f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ef100 73 65 71 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  seq_name = NULL;
ef110 0a 20 20 20 20 67 61 69 61 53 65 71 75 65 6e 63  .    gaiaSequenc
ef120 65 50 74 72 20 73 65 71 3b 0a 20 20 20 20 73 74  ePtr seq;.    st
ef130 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
ef140 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
ef150 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
ef160 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
ef170 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
ef180 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
ef190 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
ef1a0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
ef1b0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
ef1c0 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
ef1d0 09 73 65 71 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e  .seq_name = (con
ef1e0 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
ef1f0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
ef200 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 65 71  rgv[0]);.    seq
ef210 20 3d 20 67 61 69 61 46 69 6e 64 53 65 71 75 65   = gaiaFindSeque
ef220 6e 63 65 20 28 63 61 63 68 65 2c 20 73 65 71 5f  nce (cache, seq_
ef230 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 73  name);.    if (s
ef240 65 71 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c  eq == NULL)..sql
ef250 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
ef260 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
ef270 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
ef280 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
ef290 74 2c 20 73 65 71 2d 3e 76 61 6c 75 65 29 3b 0a  t, seq->value);.
ef2a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
ef2b0 6e 63 74 5f 73 65 71 75 65 6e 63 65 5f 6c 61 73  nct_sequence_las
ef2c0 74 76 61 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f  tval (sqlite3_co
ef2d0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
ef2e0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
ef2f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
ef300 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
ef310 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
ef320 73 65 71 75 65 6e 63 65 5f 6c 61 73 74 76 61 6c  sequence_lastval
ef330 20 28 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 74   ()././ return t
ef340 68 65 20 6c 61 73 74 20 76 61 6c 75 65 20 72 65  he last value re
ef350 74 75 72 6e 65 64 20 62 79 20 73 65 71 75 65 6e  turned by sequen
ef360 63 65 5f 6e 65 78 74 76 61 6c 28 29 0a 2f 20 6f  ce_nextval()./ o
ef370 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72  r NULL if any er
ef380 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
ef390 65 64 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 76 61  ed.*/.    int va
ef3a0 6c 75 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  lue;.    struct 
ef3b0 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
ef3c0 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
ef3d0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
ef3e0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
ef3f0 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
ef400 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
ef410 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 67 61  NE */.    if (ga
ef420 69 61 4c 61 73 74 55 73 65 64 53 65 71 75 65 6e  iaLastUsedSequen
ef430 63 65 20 28 63 61 63 68 65 2c 20 26 76 61 6c 75  ce (cache, &valu
ef440 65 29 20 3d 3d 20 30 29 0a 09 73 71 6c 69 74 65  e) == 0)..sqlite
ef450 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
ef460 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
ef470 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
ef480 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
ef490 76 61 6c 75 65 29 3b 0a 7d 0a 0a 73 74 61 74 69  value);.}..stati
ef4a0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73 65 71 75  c void.fnct_sequ
ef4b0 65 6e 63 65 5f 6e 65 78 74 76 61 6c 20 28 73 71  ence_nextval (sq
ef4c0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
ef4d0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
ef4e0 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c 69  c,...       sqli
ef4f0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
ef500 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
ef510 74 69 6f 6e 3a 0a 2f 20 73 65 71 75 65 6e 63 65  tion:./ sequence
ef520 5f 6e 65 78 74 76 61 6c 20 28 20 73 65 71 5f 6e  _nextval ( seq_n
ef530 61 6d 65 20 54 45 58 54 20 29 0a 2f 0a 2f 20 72  ame TEXT )././ r
ef540 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 76  eturn the next v
ef550 61 6c 75 65 20 66 72 6f 6d 20 73 6f 6d 65 20 53  alue from some S
ef560 65 71 75 65 6e 63 65 0a 2f 20 6f 72 20 4e 55 4c  equence./ or NUL
ef570 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  L if any error i
ef580 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
ef590 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ef5a0 2a 73 65 71 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c  *seq_name = NULL
ef5b0 3b 0a 20 20 20 20 67 61 69 61 53 65 71 75 65 6e  ;.    gaiaSequen
ef5c0 63 65 50 74 72 20 73 65 71 3b 0a 20 20 20 20 73  cePtr seq;.    s
ef5d0 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
ef5e0 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
ef5f0 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
ef600 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
ef610 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
ef620 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
ef630 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
ef640 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
ef650 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
ef660 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
ef670 0a 09 73 65 71 5f 6e 61 6d 65 20 3d 20 28 63 6f  ..seq_name = (co
ef680 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
ef690 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
ef6a0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 65  argv[0]);.    se
ef6b0 71 20 3d 20 67 61 69 61 46 69 6e 64 53 65 71 75  q = gaiaFindSequ
ef6c0 65 6e 63 65 20 28 63 61 63 68 65 2c 20 73 65 71  ence (cache, seq
ef6d0 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28  _name);.    if (
ef6e0 73 65 71 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  seq == NULL).   
ef6f0 20 20 20 7b 0a 09 20 20 73 65 71 20 3d 20 67 61     {..  seq = ga
ef700 69 61 43 72 65 61 74 65 53 65 71 75 65 6e 63 65  iaCreateSequence
ef710 20 28 63 61 63 68 65 2c 20 73 65 71 5f 6e 61 6d   (cache, seq_nam
ef720 65 29 3b 0a 09 20 20 69 66 20 28 73 65 71 20 3d  e);..  if (seq =
ef730 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 73  = NULL)..      s
ef740 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
ef750 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
ef760 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 67   else..    {...g
ef770 61 69 61 53 65 71 75 65 6e 63 65 4e 65 78 74 20  aiaSequenceNext 
ef780 28 63 61 63 68 65 2c 20 73 65 71 29 3b 0a 09 09  (cache, seq);...
ef790 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
ef7a0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 73 65 71  nt (context, seq
ef7b0 2d 3e 76 61 6c 75 65 29 3b 0a 09 20 20 20 20 7d  ->value);..    }
ef7c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
ef7d0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69  e.      {..  gai
ef7e0 61 53 65 71 75 65 6e 63 65 4e 65 78 74 20 28 63  aSequenceNext (c
ef7f0 61 63 68 65 2c 20 73 65 71 29 3b 0a 09 20 20 73  ache, seq);..  s
ef800 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
ef810 74 20 28 63 6f 6e 74 65 78 74 2c 20 73 65 71 2d  t (context, seq-
ef820 3e 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  >value);.      }
ef830 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
ef840 66 6e 63 74 5f 73 65 71 75 65 6e 63 65 5f 73 65  fnct_sequence_se
ef850 74 76 61 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f  tval (sqlite3_co
ef860 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
ef870 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
ef880 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
ef890 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
ef8a0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 73  QL function:./ s
ef8b0 65 71 75 65 6e 63 65 5f 73 65 74 76 61 6c 20 28  equence_setval (
ef8c0 20 73 65 71 5f 6e 61 6d 65 20 54 45 58 54 20 2c   seq_name TEXT ,
ef8d0 20 76 61 6c 75 65 20 49 4e 54 20 29 0a 2f 0a 2f   value INT )././
ef8e0 20 72 65 73 65 74 73 20 74 68 65 20 6e 65 78 74   resets the next
ef8f0 20 76 61 6c 75 65 20 66 6f 72 20 73 6f 6d 65 20   value for some 
ef900 53 65 71 75 65 6e 63 65 20 61 6e 64 20 72 65 74  Sequence and ret
ef910 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 69 74  urn the value it
ef920 73 65 6c 66 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69  self./ or NULL i
ef930 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
ef940 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20  ncountered.*/.  
ef950 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
ef960 71 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20  q_name = NULL;. 
ef970 20 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20     int value;.  
ef980 20 20 67 61 69 61 53 65 71 75 65 6e 63 65 50 74    gaiaSequencePt
ef990 72 20 73 65 71 3b 0a 20 20 20 20 73 74 72 75 63  r seq;.    struc
ef9a0 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
ef9b0 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d  l_cache *cache =
ef9c0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
ef9d0 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ta (context);.  
ef9e0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
ef9f0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
efa00 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
efa10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
efa20 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
efa30 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 73 65  SQLITE_TEXT)..se
efa40 71 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  q_name = (const 
efa50 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
efa60 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
efa70 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71  [0]);.    if (sq
efa80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
efa90 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51   (argv[1]) == SQ
efaa0 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 76  LITE_INTEGER)..v
efab0 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
efac0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
efad0 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  ]);.    else.   
efae0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
efaf0 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
efb00 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
efb10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 65  ;.      }.    se
efb20 71 20 3d 20 67 61 69 61 46 69 6e 64 53 65 71 75  q = gaiaFindSequ
efb30 65 6e 63 65 20 28 63 61 63 68 65 2c 20 73 65 71  ence (cache, seq
efb40 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28  _name);.    if (
efb50 73 65 71 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  seq == NULL).   
efb60 20 20 20 7b 0a 09 20 20 73 65 71 20 3d 20 67 61     {..  seq = ga
efb70 69 61 43 72 65 61 74 65 53 65 71 75 65 6e 63 65  iaCreateSequence
efb80 20 28 63 61 63 68 65 2c 20 73 65 71 5f 6e 61 6d   (cache, seq_nam
efb90 65 29 3b 0a 09 20 20 69 66 20 28 73 65 71 20 3d  e);..  if (seq =
efba0 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 73  = NULL)..      s
efbb0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
efbc0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
efbd0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 67   else..    {...g
efbe0 61 69 61 52 65 73 65 74 53 65 71 75 65 6e 63 65  aiaResetSequence
efbf0 20 28 73 65 71 2c 20 76 61 6c 75 65 29 3b 0a 09   (seq, value);..
efc00 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
efc10 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 73 65  int (context, se
efc20 71 2d 3e 76 61 6c 75 65 29 3b 0a 09 20 20 20 20  q->value);..    
efc30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  }.      }.    el
efc40 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61  se.      {..  ga
efc50 69 61 52 65 73 65 74 53 65 71 75 65 6e 63 65 20  iaResetSequence 
efc60 28 73 65 71 2c 20 76 61 6c 75 65 29 3b 0a 09 20  (seq, value);.. 
efc70 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
efc80 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 73 65  int (context, se
efc90 71 2d 3e 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  q->value);.     
efca0 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 45 4e 41   }.}..#ifdef ENA
efcb0 42 4c 45 5f 4c 49 42 58 4d 4c 32 09 09 2f 2a 20  BLE_LIBXML2../* 
efcc0 69 6e 63 6c 75 64 69 6e 67 20 4c 49 42 58 4d 4c  including LIBXML
efcd0 32 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  2 */..static voi
efce0 64 0a 66 6e 63 74 5f 43 72 65 61 74 65 53 74 79  d.fnct_CreateSty
efcf0 6c 69 6e 67 54 61 62 6c 65 73 20 28 73 71 6c 69  lingTables (sqli
efd00 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
efd10 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
efd20 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f 76 61  ....  sqlite3_va
efd30 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
efd40 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
efd50 2f 20 43 72 65 61 74 65 53 74 79 6c 69 6e 67 54  / CreateStylingT
efd60 61 62 6c 65 73 28 29 0a 2f 20 20 6f 72 0a 2f 20  ables()./  or./ 
efd70 43 72 65 61 74 65 53 74 79 6c 69 6e 67 54 61 62  CreateStylingTab
efd80 6c 65 73 28 62 6f 6f 6c 20 72 65 6c 61 78 65 64  les(bool relaxed
efd90 29 0a 2f 20 20 6f 72 0a 2f 20 43 72 65 61 74 65  )./  or./ Create
efda0 53 74 79 6c 69 6e 67 54 61 62 6c 65 73 28 62 6f  StylingTables(bo
efdb0 6f 6c 20 72 65 6c 61 78 65 64 2c 20 62 6f 6f 6c  ol relaxed, bool
efdc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 0a 2f 0a   transaction)./.
efdd0 2f 20 63 72 65 61 74 65 73 20 61 6e 79 20 53 4c  / creates any SL
efde0 44 2f 53 45 20 72 65 6c 61 74 65 64 20 74 61 62  D/SE related tab
efdf0 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  le ./ returns 1 
efe00 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
efe10 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
efe20 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
efe30 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
efe40 6c 61 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 69  laxed = 0;.    i
efe50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d  nt transaction =
efe60 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   0;.    sqlite3 
efe70 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
efe80 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
efe90 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
efea0 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
efeb0 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
efec0 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
efed0 28 61 72 67 63 20 3e 3d 20 31 29 0a 20 20 20 20  (argc >= 1).    
efee0 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
efef0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
eff00 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
eff10 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
eff20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
eff30 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
eff40 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a   -1);...return;.
eff50 09 20 20 20 20 7d 0a 09 20 20 72 65 6c 61 78 65  .    }..  relaxe
eff60 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
eff70 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
eff80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
eff90 28 61 72 67 63 20 3e 3d 20 32 29 0a 20 20 20 20  (argc >= 2).    
effa0 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
effb0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
effc0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
effd0 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
effe0 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
efff0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
f0000 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a   -1);...return;.
f0010 09 20 20 20 20 7d 0a 09 20 20 74 72 61 6e 73 61  .    }..  transa
f0020 63 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ction = sqlite3_
f0030 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
f0040 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  1]);.      }..  
f0050 20 20 69 66 20 28 21 63 72 65 61 74 65 53 74 79    if (!createSty
f0060 6c 69 6e 67 54 61 62 6c 65 73 5f 65 78 20 28 73  lingTables_ex (s
f0070 71 6c 69 74 65 2c 20 72 65 6c 61 78 65 64 2c 20  qlite, relaxed, 
f0080 74 72 61 6e 73 61 63 74 69 6f 6e 29 29 0a 09 67  transaction))..g
f0090 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 75  oto error;.    u
f00a0 70 64 61 74 65 53 70 61 74 69 61 4c 69 74 65 48  pdateSpatiaLiteH
f00b0 69 73 74 6f 72 79 20 28 73 71 6c 69 74 65 2c 20  istory (sqlite, 
f00c0 22 2a 2a 2a 20 53 45 20 53 74 79 6c 69 6e 67 20  "*** SE Styling 
f00d0 2a 2a 2a 22 2c 20 4e 55 4c 4c 2c 0a 09 09 09 20  ***", NULL,.... 
f00e0 20 20 20 20 22 53 74 79 6c 69 6e 67 20 74 61 62      "Styling tab
f00f0 6c 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  les successfully
f0100 20 63 72 65 61 74 65 64 22 29 3b 0a 20 20 20 20   created");.    
f0110 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f0120 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  nt (context, 1);
f0130 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  .    return;..  
f0140 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74  error:.    sqlit
f0150 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f0160 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20  ontext, 0);.    
f0170 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
f0180 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69  c void.fnct_Regi
f0190 73 74 65 72 45 78 74 65 72 6e 61 6c 47 72 61 70  sterExternalGrap
f01a0 68 69 63 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  hic (sqlite3_con
f01b0 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
f01c0 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  int argc,....   
f01d0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
f01e0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
f01f0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52  QL function:./ R
f0200 65 67 69 73 74 65 72 45 78 74 65 72 6e 61 6c 47  egisterExternalG
f0210 72 61 70 68 69 63 28 53 74 72 69 6e 67 20 78 6c  raphic(String xl
f0220 69 6e 6b 5f 68 72 65 66 2c 20 42 4c 4f 42 20 72  ink_href, BLOB r
f0230 65 73 6f 75 72 63 65 29 0a 2f 20 20 6f 72 0a 2f  esource)./  or./
f0240 20 52 65 67 69 73 74 65 72 45 78 74 65 72 6e 61   RegisterExterna
f0250 6c 47 72 61 70 68 69 63 28 53 74 72 69 6e 67 20  lGraphic(String 
f0260 78 6c 69 6e 6b 5f 68 72 65 66 2c 20 42 4c 4f 42  xlink_href, BLOB
f0270 20 72 65 73 6f 75 72 63 65 2c 20 73 74 72 69 6e   resource, strin
f0280 67 20 74 69 74 6c 65 2c 0a 2f 09 09 09 09 09 09  g title,./......
f0290 20 20 53 74 72 69 6e 67 20 61 62 73 74 72 61 63    String abstrac
f02a0 74 2c 20 53 74 72 69 6e 67 20 66 69 6c 65 5f 6e  t, String file_n
f02b0 61 6d 65 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 20  ame)././ insert 
f02c0 6f 72 20 75 70 64 61 74 65 73 20 61 6e 20 45 78  or updates an Ex
f02d0 74 65 72 6e 61 6c 20 47 72 61 70 68 69 63 20 0a  ternal Graphic .
f02e0 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
f02f0 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
f0300 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76  ilure, -1 on inv
f0310 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
f0320 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
f0330 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78     const char *x
f0340 6c 69 6e 6b 5f 68 72 65 66 3b 0a 20 20 20 20 63  link_href;.    c
f0350 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 74 6c 65  onst char *title
f0360 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
f0370 73 74 20 63 68 61 72 20 2a 61 62 73 74 72 61 63  st char *abstrac
f0380 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  t = NULL;.    co
f0390 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 5f 6e  nst char *file_n
f03a0 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ame = NULL;.    
f03b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f03c0 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
f03d0 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
f03e0 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
f03f0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
f0400 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
f0410 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
f0420 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
f0430 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
f0440 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
f0450 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f0460 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
f0470 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
f0480 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
f0490 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
f04a0 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  -1);..  return;.
f04b0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
f04c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f04d0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
f04e0 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
f04f0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
f0500 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f0510 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
f0520 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
f0530 20 69 66 20 28 61 72 67 63 20 3d 3d 20 35 29 0a   if (argc == 5).
f0540 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6f 70        {..  /* op
f0550 74 69 6f 6e 61 6c 20 65 78 74 72 61 20 61 72 67  tional extra arg
f0560 73 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c 69  s */..  if (sqli
f0570 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f0580 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49  argv[2]) != SQLI
f0590 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a  TE_TEXT)..    {.
f05a0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
f05b0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f05c0 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  1);...return;.. 
f05d0 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
f05e0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f05f0 61 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49  argv[3]) != SQLI
f0600 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a  TE_TEXT)..    {.
f0610 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
f0620 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f0630 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  1);...return;.. 
f0640 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
f0650 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f0660 61 72 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49  argv[4]) != SQLI
f0670 54 45 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a  TE_TEXT)..    {.
f0680 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
f0690 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f06a0 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  1);...return;.. 
f06b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f06c0 20 78 6c 69 6e 6b 5f 68 72 65 66 20 3d 20 28 63   xlink_href = (c
f06d0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f06e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f06f0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 70  (argv[0]);.    p
f0700 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  _blob = sqlite3_
f0710 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
f0720 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [1]);.    n_byte
f0730 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
f0740 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d  e_bytes (argv[1]
f0750 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  );.    if (argc 
f0760 3d 3d 20 35 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 5).      {.. 
f0770 20 74 69 74 6c 65 20 3d 20 28 63 6f 6e 73 74 20   title = (const 
f0780 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
f0790 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
f07a0 5b 32 5d 29 3b 0a 09 20 20 61 62 73 74 72 61 63  [2]);..  abstrac
f07b0 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  t = (const char 
f07c0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
f07d0 5f 74 65 78 74 20 28 61 72 67 76 5b 33 5d 29 3b  _text (argv[3]);
f07e0 0a 09 20 20 66 69 6c 65 5f 6e 61 6d 65 20 3d 20  ..  file_name = 
f07f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
f0800 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f0810 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20  t (argv[4]);.   
f0820 20 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 72     }.    ret = r
f0830 65 67 69 73 74 65 72 5f 65 78 74 65 72 6e 61 6c  egister_external
f0840 5f 67 72 61 70 68 69 63 20 28 73 71 6c 69 74 65  _graphic (sqlite
f0850 2c 20 78 6c 69 6e 6b 5f 68 72 65 66 2c 20 70 5f  , xlink_href, p_
f0860 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 0a 09  blob, n_bytes,..
f0870 09 09 09 20 20 20 20 20 74 69 74 6c 65 2c 20 61  ...     title, a
f0880 62 73 74 72 61 63 74 2c 20 66 69 6c 65 5f 6e 61  bstract, file_na
f0890 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
f08a0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
f08b0 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73  text, ret);.}..s
f08c0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
f08d0 55 6e 72 65 67 69 73 74 65 72 45 78 74 65 72 6e  UnregisterExtern
f08e0 61 6c 47 72 61 70 68 69 63 20 28 73 71 6c 69 74  alGraphic (sqlit
f08f0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
f0900 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
f0910 09 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75  ....sqlite3_valu
f0920 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
f0930 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
f0940 55 6e 72 65 67 69 73 74 65 72 45 78 74 65 72 6e  UnregisterExtern
f0950 61 6c 47 72 61 70 68 69 63 28 53 74 72 69 6e 67  alGraphic(String
f0960 20 78 6c 69 6e 6b 5f 68 72 65 66 29 0a 2f 0a 2f   xlink_href)././
f0970 20 72 65 6d 6f 76 65 73 20 61 6e 20 45 78 74 65   removes an Exte
f0980 72 6e 61 6c 20 47 72 61 70 68 69 63 20 0a 2f 20  rnal Graphic ./ 
f0990 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
f09a0 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
f09b0 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c  ure, -1 on inval
f09c0 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
f09d0 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
f09e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 6c 69   const char *xli
f09f0 6e 6b 5f 68 72 65 66 3b 0a 20 20 20 20 73 71 6c  nk_href;.    sql
f0a00 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
f0a10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
f0a20 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
f0a30 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
f0a40 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
f0a50 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
f0a60 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
f0a70 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
f0a80 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
f0a90 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
f0aa0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f0ab0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
f0ac0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
f0ad0 20 7d 0a 20 20 20 20 78 6c 69 6e 6b 5f 68 72 65   }.    xlink_hre
f0ae0 66 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  f = (const char 
f0af0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
f0b00 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
f0b10 0a 20 20 20 20 72 65 74 20 3d 20 75 6e 72 65 67  .    ret = unreg
f0b20 69 73 74 65 72 5f 65 78 74 65 72 6e 61 6c 5f 67  ister_external_g
f0b30 72 61 70 68 69 63 20 28 73 71 6c 69 74 65 2c 20  raphic (sqlite, 
f0b40 78 6c 69 6e 6b 5f 68 72 65 66 29 3b 0a 20 20 20  xlink_href);.   
f0b50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f0b60 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
f0b70 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
f0b80 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74 65 72  id.fnct_Register
f0b90 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 20 28  VectorCoverage (
f0ba0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
f0bb0 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
f0bc0 72 67 63 2c 0a 09 09 09 20 20 20 20 20 73 71 6c  rgc,....     sql
f0bd0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
f0be0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
f0bf0 63 74 69 6f 6e 3a 0a 2f 20 52 65 67 69 73 74 65  ction:./ Registe
f0c00 72 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 28  rVectorCoverage(
f0c10 54 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e 61  Text coverage_na
f0c20 6d 65 2c 20 54 65 78 74 20 66 5f 74 61 62 6c 65  me, Text f_table
f0c30 5f 6e 61 6d 65 2c 0a 2f 20 20 20 20 20 20 20 20  _name,./        
f0c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c50 54 65 78 74 20 66 5f 67 65 6f 6d 65 74 72 79 5f  Text f_geometry_
f0c60 63 6f 6c 75 6d 6e 29 0a 2f 20 20 20 6f 72 0a 2f  column)./   or./
f0c70 20 52 65 67 69 73 74 65 72 56 65 63 74 6f 72 43   RegisterVectorC
f0c80 6f 76 65 72 61 67 65 28 54 65 78 74 20 63 6f 76  overage(Text cov
f0c90 65 72 61 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74  erage_name, Text
f0ca0 20 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 2c 0a 2f   f_table_name,./
f0cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0cc0 20 20 20 20 20 20 20 20 54 65 78 74 20 66 5f 67          Text f_g
f0cd0 65 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 2c 20  eometry_column, 
f0ce0 54 65 78 74 20 74 69 74 6c 65 2c 0a 2f 20 20 20  Text title,./   
f0cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d00 20 20 20 20 20 54 65 78 74 20 61 62 73 74 72 61       Text abstra
f0d10 63 74 29 0a 2f 20 20 20 6f 72 0a 2f 20 52 65 67  ct)./   or./ Reg
f0d20 69 73 74 65 72 56 65 63 74 6f 72 43 6f 76 65 72  isterVectorCover
f0d30 61 67 65 28 54 65 78 74 20 63 6f 76 65 72 61 67  age(Text coverag
f0d40 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 66 5f 74  e_name, Text f_t
f0d50 61 62 6c 65 5f 6e 61 6d 65 2c 0a 2f 20 20 20 20  able_name,./    
f0d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d70 20 20 20 20 54 65 78 74 20 66 5f 67 65 6f 6d 65      Text f_geome
f0d80 74 72 79 5f 63 6f 6c 75 6d 6e 2c 20 54 65 78 74  try_column, Text
f0d90 20 74 69 74 6c 65 2c 0a 2f 20 20 20 20 20 20 20   title,./       
f0da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0db0 20 54 65 78 74 20 61 62 73 74 72 61 63 74 2c 20   Text abstract, 
f0dc0 42 6f 6f 6c 20 69 73 5f 71 75 65 72 79 61 62 6c  Bool is_queryabl
f0dd0 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e,./            
f0de0 20 20 20 20 20 20 20 20 20 20 20 20 42 6f 6f 6c              Bool
f0df0 20 69 73 5f 65 64 69 74 61 62 6c 65 29 0a 2f 0a   is_editable)./.
f0e00 2f 20 69 6e 73 65 72 74 73 20 61 20 56 65 63 74  / inserts a Vect
f0e10 6f 72 20 43 6f 76 65 72 61 67 65 0a 2f 20 72 65  or Coverage./ re
f0e20 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
f0e30 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
f0e40 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
f0e50 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
f0e60 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
f0e70 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 76 65 72  onst char *cover
f0e80 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  age_name;.    co
f0e90 6e 73 74 20 63 68 61 72 20 2a 66 5f 74 61 62 6c  nst char *f_tabl
f0ea0 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  e_name;.    cons
f0eb0 74 20 63 68 61 72 20 2a 66 5f 67 65 6f 6d 65 74  t char *f_geomet
f0ec0 72 79 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63  ry_column;.    c
f0ed0 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 74 6c 65  onst char *title
f0ee0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
f0ef0 73 74 20 63 68 61 72 20 2a 61 62 73 74 72 61 63  st char *abstrac
f0f00 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  t = NULL;.    in
f0f10 74 20 69 73 5f 71 75 65 72 79 61 62 6c 65 20 3d  t is_queryable =
f0f20 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 65   0;.    int is_e
f0f30 64 69 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ditable = 0;.   
f0f40 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
f0f50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
f0f60 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
f0f70 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
f0f80 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
f0f90 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
f0fa0 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
f0fb0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f0fc0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
f0fd0 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
f0fe0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f0ff0 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
f1000 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
f1010 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f1020 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[2]) != SQLITE
f1030 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
f1040 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f1050 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f1060 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
f1070 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 76 65 72       }.    cover
f1080 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  age_name = (cons
f1090 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
f10a0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
f10b0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 66 5f 74 61  gv[0]);.    f_ta
f10c0 62 6c 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  ble_name = (cons
f10d0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
f10e0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
f10f0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 66 5f 67 65  gv[1]);.    f_ge
f1100 6f 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 20 3d 20  ometry_column = 
f1110 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
f1120 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f1130 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  t (argv[2]);.   
f1140 20 69 66 20 28 61 72 67 63 20 3e 3d 20 35 29 0a   if (argc >= 5).
f1150 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
f1160 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f1170 65 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20 53  e (argv[3]) != S
f1180 51 4c 49 54 45 5f 54 45 58 54 0a 09 20 20 20 20  QLITE_TEXT..    
f1190 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c    || sqlite3_val
f11a0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d  ue_type (argv[4]
f11b0 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
f11c0 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
f11d0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f11e0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72  ontext, -1);...r
f11f0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
f1200 20 74 69 74 6c 65 20 3d 20 28 63 6f 6e 73 74 20   title = (const 
f1210 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
f1220 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
f1230 5b 33 5d 29 3b 0a 09 20 20 61 62 73 74 72 61 63  [3]);..  abstrac
f1240 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  t = (const char 
f1250 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
f1260 5f 74 65 78 74 20 28 61 72 67 76 5b 34 5d 29 3b  _text (argv[4]);
f1270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .      }.    if 
f1280 28 61 72 67 63 20 3e 3d 20 37 29 0a 20 20 20 20  (argc >= 7).    
f1290 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
f12a0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f12b0 72 67 76 5b 35 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[5]) != SQLIT
f12c0 45 5f 49 4e 54 45 47 45 52 0a 09 20 20 20 20 20  E_INTEGER..     
f12d0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
f12e0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d 29  e_type (argv[6])
f12f0 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
f1300 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  ER)..    {...sql
f1310 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
f1320 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
f1330 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
f1340 09 20 20 69 73 5f 71 75 65 72 79 61 62 6c 65 20  .  is_queryable 
f1350 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f1360 69 6e 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 09  int (argv[5]);..
f1370 20 20 69 73 5f 65 64 69 74 61 62 6c 65 20 3d 20    is_editable = 
f1380 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
f1390 74 20 28 61 72 67 76 5b 36 5d 29 3b 0a 20 20 20  t (argv[6]);.   
f13a0 20 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09     }.    ret =..
f13b0 72 65 67 69 73 74 65 72 5f 76 65 63 74 6f 72 5f  register_vector_
f13c0 63 6f 76 65 72 61 67 65 20 28 73 71 6c 69 74 65  coverage (sqlite
f13d0 2c 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c  , coverage_name,
f13e0 20 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 2c 0a 09   f_table_name,..
f13f0 09 09 09 20 20 66 5f 67 65 6f 6d 65 74 72 79 5f  ...  f_geometry_
f1400 63 6f 6c 75 6d 6e 2c 20 74 69 74 6c 65 2c 20 61  column, title, a
f1410 62 73 74 72 61 63 74 2c 0a 09 09 09 09 20 20 69  bstract,.....  i
f1420 73 5f 71 75 65 72 79 61 62 6c 65 2c 20 69 73 5f  s_queryable, is_
f1430 65 64 69 74 61 62 6c 65 29 3b 0a 20 20 20 20 73  editable);.    s
f1440 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
f1450 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
f1460 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
f1470 0a 66 6e 63 74 5f 52 65 67 69 73 74 65 72 53 70  .fnct_RegisterSp
f1480 61 74 69 61 6c 56 69 65 77 43 6f 76 65 72 61 67  atialViewCoverag
f1490 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
f14a0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
f14b0 74 20 61 72 67 63 2c 0a 09 09 09 09 20 20 73 71  t argc,.....  sq
f14c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
f14d0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
f14e0 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 67 69 73 74  nction:./ Regist
f14f0 65 72 53 70 61 74 69 61 6c 56 69 65 77 43 6f 76  erSpatialViewCov
f1500 65 72 61 67 65 28 54 65 78 74 20 63 6f 76 65 72  erage(Text cover
f1510 61 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 76  age_name, Text v
f1520 69 65 77 5f 6e 61 6d 65 2c 0a 2f 20 20 20 20 20  iew_name,./     
f1530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1540 20 20 20 20 20 20 20 20 54 65 78 74 20 76 69 65          Text vie
f1550 77 5f 67 65 6f 6d 65 74 72 79 29 0a 2f 20 20 20  w_geometry)./   
f1560 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 53 70 61  or./ RegisterSpa
f1570 74 69 61 6c 56 69 65 77 43 6f 76 65 72 61 67 65  tialViewCoverage
f1580 28 54 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e  (Text coverage_n
f1590 61 6d 65 2c 20 54 65 78 74 20 76 69 65 77 5f 6e  ame, Text view_n
f15a0 61 6d 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  ame,./          
f15b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f15c0 20 20 20 54 65 78 74 20 76 69 65 77 5f 67 65 6f     Text view_geo
f15d0 6d 65 74 72 79 2c 20 54 65 78 74 20 74 69 74 6c  metry, Text titl
f15e0 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e,./            
f15f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1600 20 54 65 78 74 20 61 62 73 74 72 61 63 74 29 0a   Text abstract).
f1610 2f 20 20 20 6f 72 0a 2f 20 52 65 67 69 73 74 65  /   or./ Registe
f1620 72 53 70 61 74 69 61 6c 56 69 65 77 43 6f 76 65  rSpatialViewCove
f1630 72 61 67 65 28 54 65 78 74 20 63 6f 76 65 72 61  rage(Text covera
f1640 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 76 69  ge_name, Text vi
f1650 65 77 5f 6e 61 6d 65 2c 0a 2f 20 20 20 20 20 20  ew_name,./      
f1660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1670 20 20 20 20 20 20 20 54 65 78 74 20 76 69 65 77         Text view
f1680 5f 67 65 6f 6d 65 74 72 79 2c 20 54 65 78 74 20  _geometry, Text 
f1690 74 69 74 6c 65 2c 0a 2f 20 20 20 20 20 20 20 20  title,./        
f16a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f16b0 20 20 20 20 20 54 65 78 74 20 61 62 73 74 72 61       Text abstra
f16c0 63 74 2c 20 42 6f 6f 6c 20 69 73 5f 71 75 65 72  ct, Bool is_quer
f16d0 79 61 62 6c 65 2c 0a 2f 20 20 20 20 20 20 20 20  yable,./        
f16e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f16f0 20 20 20 20 20 42 6f 6f 6c 20 69 73 5f 65 64 69       Bool is_edi
f1700 74 61 62 6c 65 29 0a 2f 0a 2f 20 69 6e 73 65 72  table)././ inser
f1710 74 73 20 61 20 56 65 63 74 6f 72 20 43 6f 76 65  ts a Vector Cove
f1720 72 61 67 65 20 62 61 73 65 64 20 75 70 6f 6e 20  rage based upon 
f1730 61 20 53 70 61 74 69 61 6c 20 56 69 65 77 0a 2f  a Spatial View./
f1740 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75   returns 1 on su
f1750 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69  ccess./ 0 on fai
f1760 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61  lure, -1 on inva
f1770 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
f1780 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
f1790 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
f17a0 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20  verage_name;.   
f17b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 69 65   const char *vie
f17c0 77 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  w_name;.    cons
f17d0 74 20 63 68 61 72 20 2a 76 69 65 77 5f 67 65 6f  t char *view_geo
f17e0 6d 65 74 72 79 3b 0a 20 20 20 20 63 6f 6e 73 74  metry;.    const
f17f0 20 63 68 61 72 20 2a 74 69 74 6c 65 20 3d 20 4e   char *title = N
f1800 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ULL;.    const c
f1810 68 61 72 20 2a 61 62 73 74 72 61 63 74 20 3d 20  har *abstract = 
f1820 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 69 73  NULL;.    int is
f1830 5f 71 75 65 72 79 61 62 6c 65 20 3d 20 30 3b 0a  _queryable = 0;.
f1840 20 20 20 20 69 6e 74 20 69 73 5f 65 64 69 74 61      int is_edita
f1850 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ble = 0;.    sql
f1860 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
f1870 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
f1880 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
f1890 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
f18a0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
f18b0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
f18c0 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
f18d0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
f18e0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
f18f0 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61  T..|| sqlite3_va
f1900 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
f1910 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
f1920 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61  T..|| sqlite3_va
f1930 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32  lue_type (argv[2
f1940 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
f1950 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
f1960 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f1970 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
f1980 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
f1990 20 7d 0a 20 20 20 20 63 6f 76 65 72 61 67 65 5f   }.    coverage_
f19a0 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
f19b0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
f19c0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
f19d0 5d 29 3b 0a 20 20 20 20 76 69 65 77 5f 6e 61 6d  ]);.    view_nam
f19e0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
f19f0 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
f1a00 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
f1a10 0a 20 20 20 20 76 69 65 77 5f 67 65 6f 6d 65 74  .    view_geomet
f1a20 72 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ry = (const char
f1a30 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f1a40 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29  e_text (argv[2])
f1a50 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3e  ;.    if (argc >
f1a60 3d 20 35 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 5).      {..  
f1a70 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
f1a80 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29  e_type (argv[3])
f1a90 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 0a   != SQLITE_TEXT.
f1aa0 09 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  .      || sqlite
f1ab0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f1ac0 67 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[4]) != SQLITE
f1ad0 5f 54 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09  _TEXT)..    {...
f1ae0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f1af0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
f1b00 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
f1b10 20 7d 0a 09 20 20 74 69 74 6c 65 20 3d 20 28 63   }..  title = (c
f1b20 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f1b30 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f1b40 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 61 62  (argv[3]);..  ab
f1b50 73 74 72 61 63 74 20 3d 20 28 63 6f 6e 73 74 20  stract = (const 
f1b60 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
f1b70 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
f1b80 5b 34 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [4]);.      }.  
f1b90 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 37 29    if (argc >= 7)
f1ba0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
f1bb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f1bc0 70 65 20 28 61 72 67 76 5b 35 5d 29 20 21 3d 20  pe (argv[5]) != 
f1bd0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 0a 09  SQLITE_INTEGER..
f1be0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
f1bf0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f1c00 76 5b 36 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[6]) != SQLITE_
f1c10 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
f1c20 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
f1c30 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f1c40 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  1);...return;.. 
f1c50 20 20 20 7d 0a 09 20 20 69 73 5f 71 75 65 72 79     }..  is_query
f1c60 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  able = sqlite3_v
f1c70 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 35  alue_int (argv[5
f1c80 5d 29 3b 0a 09 20 20 69 73 5f 65 64 69 74 61 62  ]);..  is_editab
f1c90 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
f1ca0 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 36 5d 29  ue_int (argv[6])
f1cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65  ;.      }.    re
f1cc0 74 20 3d 0a 09 72 65 67 69 73 74 65 72 5f 73 70  t =..register_sp
f1cd0 61 74 69 61 6c 5f 76 69 65 77 5f 63 6f 76 65 72  atial_view_cover
f1ce0 61 67 65 20 28 73 71 6c 69 74 65 2c 20 63 6f 76  age (sqlite, cov
f1cf0 65 72 61 67 65 5f 6e 61 6d 65 2c 20 76 69 65 77  erage_name, view
f1d00 5f 6e 61 6d 65 2c 0a 09 09 09 09 09 76 69 65 77  _name,......view
f1d10 5f 67 65 6f 6d 65 74 72 79 2c 20 74 69 74 6c 65  _geometry, title
f1d20 2c 20 61 62 73 74 72 61 63 74 2c 0a 09 09 09 09  , abstract,.....
f1d30 09 69 73 5f 71 75 65 72 79 61 62 6c 65 2c 20 69  .is_queryable, i
f1d40 73 5f 65 64 69 74 61 62 6c 65 29 3b 0a 20 20 20  s_editable);.   
f1d50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f1d60 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
f1d70 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
f1d80 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74 65 72  id.fnct_Register
f1d90 56 69 72 74 75 61 6c 53 68 61 70 65 43 6f 76 65  VirtualShapeCove
f1da0 72 61 67 65 20 28 73 71 6c 69 74 65 33 5f 63 6f  rage (sqlite3_co
f1db0 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
f1dc0 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20   int argc,..... 
f1dd0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
f1de0 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
f1df0 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65  L function:./ Re
f1e00 67 69 73 74 65 72 56 69 72 74 75 61 6c 53 68 61  gisterVirtualSha
f1e10 70 65 43 6f 76 65 72 61 67 65 28 54 65 78 74 20  peCoverage(Text 
f1e20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 54  coverage_name, T
f1e30 65 78 74 20 76 69 72 74 5f 6e 61 6d 65 2c 0a 2f  ext virt_name,./
f1e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 65                Te
f1e60 78 74 20 76 69 72 74 5f 67 65 6f 6d 65 74 72 79  xt virt_geometry
f1e70 29 0a 2f 20 20 20 6f 72 0a 2f 20 52 65 67 69 73  )./   or./ Regis
f1e80 74 65 72 56 69 72 74 75 61 6c 53 68 61 70 65 43  terVirtualShapeC
f1e90 6f 76 65 72 61 67 65 28 54 65 78 74 20 63 6f 76  overage(Text cov
f1ea0 65 72 61 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74  erage_name, Text
f1eb0 20 76 69 72 74 5f 6e 61 6d 65 2c 0a 2f 20 20 20   virt_name,./   
f1ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1ed0 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20             Text 
f1ee0 76 69 72 74 5f 67 65 6f 6d 65 74 72 79 2c 20 54  virt_geometry, T
f1ef0 65 78 74 20 74 69 74 6c 65 2c 0a 2f 20 20 20 20  ext title,./    
f1f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f10 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20 61            Text a
f1f20 62 73 74 72 61 63 74 29 0a 2f 20 20 20 6f 72 0a  bstract)./   or.
f1f30 2f 20 52 65 67 69 73 74 65 72 56 69 72 74 75 61  / RegisterVirtua
f1f40 6c 53 68 61 70 65 43 6f 76 65 72 61 67 65 28 54  lShapeCoverage(T
f1f50 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d  ext coverage_nam
f1f60 65 2c 20 54 65 78 74 20 76 69 72 74 5f 6e 61 6d  e, Text virt_nam
f1f70 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e,./            
f1f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f90 20 20 54 65 78 74 20 76 69 72 74 5f 67 65 6f 6d    Text virt_geom
f1fa0 65 74 72 79 2c 20 54 65 78 74 20 74 69 74 6c 65  etry, Text title
f1fb0 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  ,./             
f1fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1fd0 20 54 65 78 74 20 61 62 73 74 72 61 63 74 2c 20   Text abstract, 
f1fe0 42 6f 6f 6c 20 69 73 5f 71 75 65 72 79 61 62 6c  Bool is_queryabl
f1ff0 65 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61  e)././ inserts a
f2000 20 56 65 63 74 6f 72 20 43 6f 76 65 72 61 67 65   Vector Coverage
f2010 20 62 61 73 65 64 20 75 70 6f 6e 20 61 20 56 69   based upon a Vi
f2020 72 74 75 61 6c 53 68 61 70 65 66 69 6c 65 0a 2f  rtualShapefile./
f2030 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75   returns 1 on su
f2040 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69  ccess./ 0 on fai
f2050 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61  lure, -1 on inva
f2060 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
f2070 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
f2080 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
f2090 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20  verage_name;.   
f20a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 69 72   const char *vir
f20b0 74 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  t_name;.    cons
f20c0 74 20 63 68 61 72 20 2a 76 69 72 74 5f 67 65 6f  t char *virt_geo
f20d0 6d 65 74 72 79 3b 0a 20 20 20 20 63 6f 6e 73 74  metry;.    const
f20e0 20 63 68 61 72 20 2a 74 69 74 6c 65 20 3d 20 4e   char *title = N
f20f0 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ULL;.    const c
f2100 68 61 72 20 2a 61 62 73 74 72 61 63 74 20 3d 20  har *abstract = 
f2110 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 69 73  NULL;.    int is
f2120 5f 71 75 65 72 79 61 62 6c 65 20 3d 20 30 3b 0a  _queryable = 0;.
f2130 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
f2140 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
f2150 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
f2160 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
f2170 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
f2180 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
f2190 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
f21a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f21b0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
f21c0 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c  ITE_TEXT..|| sql
f21d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f21e0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
f21f0 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c  ITE_TEXT..|| sql
f2200 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f2210 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c  (argv[2]) != SQL
f2220 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
f2230 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
f2240 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f2250 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
f2260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f  ;.      }.    co
f2270 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63  verage_name = (c
f2280 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f2290 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f22a0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 76  (argv[0]);.    v
f22b0 69 72 74 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  irt_name = (cons
f22c0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
f22d0 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
f22e0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 76 69 72 74  gv[1]);.    virt
f22f0 5f 67 65 6f 6d 65 74 72 79 20 3d 20 28 63 6f 6e  _geometry = (con
f2300 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
f2310 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
f2320 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[2]);.    if 
f2330 28 61 72 67 63 20 3e 3d 20 35 29 0a 20 20 20 20  (argc >= 5).    
f2340 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74    {..  if (sqlit
f2350 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f2360 72 67 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[3]) != SQLIT
f2370 45 5f 54 45 58 54 0a 09 20 20 20 20 20 20 7c 7c  E_TEXT..      ||
f2380 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f2390 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21 3d  ype (argv[4]) !=
f23a0 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20   SQLITE_TEXT).. 
f23b0 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
f23c0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f23d0 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72  xt, -1);...retur
f23e0 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 74 69 74  n;..    }..  tit
f23f0 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
f2400 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f2410 65 5f 74 65 78 74 20 28 61 72 67 76 5b 33 5d 29  e_text (argv[3])
f2420 3b 0a 09 20 20 61 62 73 74 72 61 63 74 20 3d 20  ;..  abstract = 
f2430 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
f2440 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f2450 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20  t (argv[4]);.   
f2460 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67     }.    if (arg
f2470 63 20 3e 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a  c >= 6).      {.
f2480 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
f2490 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
f24a0 35 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e  5]) != SQLITE_IN
f24b0 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
f24c0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f24d0 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
f24e0 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
f24f0 20 7d 0a 09 20 20 69 73 5f 71 75 65 72 79 61 62   }..  is_queryab
f2500 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
f2510 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 35 5d 29  ue_int (argv[5])
f2520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65  ;.      }.    re
f2530 74 20 3d 0a 09 72 65 67 69 73 74 65 72 5f 76 69  t =..register_vi
f2540 72 74 75 61 6c 5f 73 68 70 5f 63 6f 76 65 72 61  rtual_shp_covera
f2550 67 65 20 28 73 71 6c 69 74 65 2c 20 63 6f 76 65  ge (sqlite, cove
f2560 72 61 67 65 5f 6e 61 6d 65 2c 20 76 69 72 74 5f  rage_name, virt_
f2570 6e 61 6d 65 2c 0a 09 09 09 09 20 20 20 20 20 20  name,.....      
f2580 20 76 69 72 74 5f 67 65 6f 6d 65 74 72 79 2c 20   virt_geometry, 
f2590 74 69 74 6c 65 2c 20 61 62 73 74 72 61 63 74 2c  title, abstract,
f25a0 0a 09 09 09 09 20 20 20 20 20 20 20 69 73 5f 71  .....       is_q
f25b0 75 65 72 79 61 62 6c 65 29 3b 0a 20 20 20 20 73  ueryable);.    s
f25c0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
f25d0 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
f25e0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
f25f0 0a 66 6e 63 74 5f 52 65 67 69 73 74 65 72 54 6f  .fnct_RegisterTo
f2600 70 6f 47 65 6f 43 6f 76 65 72 61 67 65 20 28 73  poGeoCoverage (s
f2610 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
f2620 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
f2630 67 63 2c 0a 09 09 09 20 20 20 20 20 20 73 71 6c  gc,....      sql
f2640 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
f2650 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
f2660 63 74 69 6f 6e 3a 0a 2f 20 52 65 67 69 73 74 65  ction:./ Registe
f2670 72 54 6f 70 6f 47 65 6f 43 6f 76 65 72 61 67 65  rTopoGeoCoverage
f2680 28 54 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e  (Text coverage_n
f2690 61 6d 65 2c 20 54 65 78 74 20 74 6f 70 6f 67 65  ame, Text topoge
f26a0 6f 5f 6e 61 6d 65 29 0a 2f 20 20 20 6f 72 0a 2f  o_name)./   or./
f26b0 20 52 65 67 69 73 74 65 72 54 6f 70 6f 47 65 6f   RegisterTopoGeo
f26c0 43 6f 76 65 72 61 67 65 28 54 65 78 74 20 63 6f  Coverage(Text co
f26d0 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 54 65 78  verage_name, Tex
f26e0 74 20 74 6f 70 6f 67 65 6f 5f 6e 61 6d 65 2c 0a  t topogeo_name,.
f26f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
f2700 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20 74            Text t
f2710 69 74 6c 65 2c 20 54 65 78 74 20 61 62 73 74 72  itle, Text abstr
f2720 61 63 74 29 0a 2f 20 20 20 6f 72 0a 2f 20 52 65  act)./   or./ Re
f2730 67 69 73 74 65 72 54 6f 70 6f 47 65 6f 43 6f 76  gisterTopoGeoCov
f2740 65 72 61 67 65 28 54 65 78 74 20 63 6f 76 65 72  erage(Text cover
f2750 61 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 74  age_name, Text t
f2760 6f 70 6f 67 65 6f 5f 6e 61 6d 65 2c 0a 2f 20 20  opogeo_name,./  
f2770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2780 20 20 20 20 20 20 20 54 65 78 74 20 74 69 74 6c         Text titl
f2790 65 2c 20 54 65 78 74 20 61 62 73 74 72 61 63 74  e, Text abstract
f27a0 2c 20 42 6f 6f 6c 20 69 73 5f 71 75 65 72 79 61  , Bool is_querya
f27b0 62 6c 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20  ble,./          
f27c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42                 B
f27d0 6f 6f 6c 20 69 73 5f 65 64 69 74 61 62 6c 65 29  ool is_editable)
f27e0 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61 20 56  ././ inserts a V
f27f0 65 63 74 6f 72 20 43 6f 76 65 72 61 67 65 20 62  ector Coverage b
f2800 61 73 65 64 20 6f 6e 20 73 6f 6d 65 20 54 6f 70  ased on some Top
f2810 6f 6c 6f 67 79 2d 47 65 6f 6d 65 74 72 79 0a 2f  ology-Geometry./
f2820 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75   returns 1 on su
f2830 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69  ccess./ 0 on fai
f2840 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61  lure, -1 on inva
f2850 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  lid arguments.*/
f2860 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
f2870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
f2880 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20  verage_name;.   
f2890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 6f 70   const char *top
f28a0 6f 67 65 6f 5f 6e 61 6d 65 3b 0a 20 20 20 20 63  ogeo_name;.    c
f28b0 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 74 6c 65  onst char *title
f28c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
f28d0 73 74 20 63 68 61 72 20 2a 61 62 73 74 72 61 63  st char *abstrac
f28e0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  t = NULL;.    in
f28f0 74 20 69 73 5f 71 75 65 72 79 61 62 6c 65 20 3d  t is_queryable =
f2900 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 65   0;.    int is_e
f2910 64 69 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ditable = 0;.   
f2920 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
f2930 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
f2940 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
f2950 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
f2960 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
f2970 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
f2980 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
f2990 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f29a0 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
f29b0 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
f29c0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f29d0 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
f29e0 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
f29f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f2a00 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f2a10 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
f2a20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 76 65 72       }.    cover
f2a30 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  age_name = (cons
f2a40 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
f2a50 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
f2a60 67 76 5b 30 5d 29 3b 0a 20 20 20 20 74 6f 70 6f  gv[0]);.    topo
f2a70 67 65 6f 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  geo_name = (cons
f2a80 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
f2a90 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
f2aa0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[1]);.    if (
f2ab0 61 72 67 63 20 3e 3d 20 34 29 0a 20 20 20 20 20  argc >= 4).     
f2ac0 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   {..  if (sqlite
f2ad0 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f2ae0 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[2]) != SQLITE
f2af0 5f 54 45 58 54 0a 09 20 20 20 20 20 20 7c 7c 20  _TEXT..      || 
f2b00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f2b10 70 65 20 28 61 72 67 76 5b 33 5d 29 20 21 3d 20  pe (argv[3]) != 
f2b20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20  SQLITE_TEXT)..  
f2b30 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
f2b40 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f2b50 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e  t, -1);...return
f2b60 3b 0a 09 20 20 20 20 7d 0a 09 20 20 74 69 74 6c  ;..    }..  titl
f2b70 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
f2b80 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
f2b90 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b  _text (argv[2]);
f2ba0 0a 09 20 20 61 62 73 74 72 61 63 74 20 3d 20 28  ..  abstract = (
f2bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
f2bc0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
f2bd0 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20   (argv[3]);.    
f2be0 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63    }.    if (argc
f2bf0 20 3e 3d 20 36 29 0a 20 20 20 20 20 20 7b 0a 09   >= 6).      {..
f2c00 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
f2c10 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34  lue_type (argv[4
f2c20 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) != SQLITE_INT
f2c30 45 47 45 52 0a 09 20 20 20 20 20 20 7c 7c 20 73  EGER..      || s
f2c40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f2c50 65 20 28 61 72 67 76 5b 35 5d 29 20 21 3d 20 53  e (argv[5]) != S
f2c60 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
f2c70 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
f2c80 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f2c90 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75  ext, -1);...retu
f2ca0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 73  rn;..    }..  is
f2cb0 5f 71 75 65 72 79 61 62 6c 65 20 3d 20 73 71 6c  _queryable = sql
f2cc0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
f2cd0 61 72 67 76 5b 34 5d 29 3b 0a 09 20 20 69 73 5f  argv[4]);..  is_
f2ce0 65 64 69 74 61 62 6c 65 20 3d 20 73 71 6c 69 74  editable = sqlit
f2cf0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
f2d00 67 76 5b 35 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[5]);.      }.
f2d10 20 20 20 20 72 65 74 20 3d 0a 09 72 65 67 69 73      ret =..regis
f2d20 74 65 72 5f 74 6f 70 6f 67 65 6f 5f 63 6f 76 65  ter_topogeo_cove
f2d30 72 61 67 65 20 28 73 71 6c 69 74 65 2c 20 63 6f  rage (sqlite, co
f2d40 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 74 6f 70  verage_name, top
f2d50 6f 67 65 6f 5f 6e 61 6d 65 2c 0a 09 09 09 09 20  ogeo_name,..... 
f2d60 20 20 74 69 74 6c 65 2c 20 61 62 73 74 72 61 63    title, abstrac
f2d70 74 2c 20 69 73 5f 71 75 65 72 79 61 62 6c 65 2c  t, is_queryable,
f2d80 20 69 73 5f 65 64 69 74 61 62 6c 65 29 3b 0a 20   is_editable);. 
f2d90 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f2da0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
f2db0 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
f2dc0 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74  void.fnct_Regist
f2dd0 65 72 54 6f 70 6f 4e 65 74 43 6f 76 65 72 61 67  erTopoNetCoverag
f2de0 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
f2df0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
f2e00 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20  t argc,....     
f2e10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
f2e20 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
f2e30 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 67   function:./ Reg
f2e40 69 73 74 65 72 54 6f 70 6f 4e 65 74 43 6f 76 65  isterTopoNetCove
f2e50 72 61 67 65 28 54 65 78 74 20 63 6f 76 65 72 61  rage(Text covera
f2e60 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 74 6f  ge_name, Text to
f2e70 70 6f 6e 65 74 5f 6e 61 6d 65 29 0a 2f 20 20 20  ponet_name)./   
f2e80 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 54 6f 70  or./ RegisterTop
f2e90 6f 4e 65 74 43 6f 76 65 72 61 67 65 28 54 65 78  oNetCoverage(Tex
f2ea0 74 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c  t coverage_name,
f2eb0 20 54 65 78 74 20 74 6f 70 6f 6e 65 74 5f 6e 61   Text toponet_na
f2ec0 6d 65 2c 0a 2f 20 20 20 20 20 20 20 20 20 20 20  me,./           
f2ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 65                Te
f2ee0 78 74 20 74 69 74 6c 65 2c 20 54 65 78 74 20 61  xt title, Text a
f2ef0 62 73 74 72 61 63 74 29 0a 2f 20 20 20 6f 72 0a  bstract)./   or.
f2f00 2f 20 52 65 67 69 73 74 65 72 54 6f 70 6f 4e 65  / RegisterTopoNe
f2f10 74 43 6f 76 65 72 61 67 65 28 54 65 78 74 20 63  tCoverage(Text c
f2f20 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 54 65  overage_name, Te
f2f30 78 74 20 74 6f 70 6f 6e 65 74 5f 6e 61 6d 65 2c  xt toponet_name,
f2f40 0a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ./              
f2f50 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20             Text 
f2f60 74 69 74 6c 65 2c 20 54 65 78 74 20 61 62 73 74  title, Text abst
f2f70 72 61 63 74 2c 20 42 6f 6f 6c 20 69 73 5f 71 75  ract, Bool is_qu
f2f80 65 72 79 61 62 6c 65 2c 0a 2f 20 20 20 20 20 20  eryable,./      
f2f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2fa0 20 20 20 42 6f 6f 6c 20 69 73 5f 65 64 69 74 61     Bool is_edita
f2fb0 62 6c 65 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 73  ble)././ inserts
f2fc0 20 61 20 56 65 63 74 6f 72 20 43 6f 76 65 72 61   a Vector Covera
f2fd0 67 65 20 62 61 73 65 64 20 6f 6e 20 73 6f 6d 65  ge based on some
f2fe0 20 54 6f 70 6f 6c 6f 67 79 2d 4e 65 74 77 6f 72   Topology-Networ
f2ff0 6b 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e  k./ returns 1 on
f3000 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20   success./ 0 on 
f3010 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69  failure, -1 on i
f3020 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
f3030 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  .*/.    int ret;
f3040 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f3050 2a 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a  *coverage_name;.
f3060 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f3070 74 6f 70 6f 6e 65 74 5f 6e 61 6d 65 3b 0a 20 20  toponet_name;.  
f3080 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69    const char *ti
f3090 74 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tle = NULL;.    
f30a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 62 73 74  const char *abst
f30b0 72 61 63 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ract = NULL;.   
f30c0 20 69 6e 74 20 69 73 5f 71 75 65 72 79 61 62 6c   int is_queryabl
f30d0 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  e = 0;.    int i
f30e0 73 5f 65 64 69 74 61 62 6c 65 20 3d 20 30 3b 0a  s_editable = 0;.
f30f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
f3100 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
f3110 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
f3120 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
f3130 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
f3140 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
f3150 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
f3160 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f3170 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
f3180 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c  ITE_TEXT..|| sql
f3190 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f31a0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
f31b0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
f31c0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
f31d0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f31e0 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
f31f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f  ;.      }.    co
f3200 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63  verage_name = (c
f3210 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f3220 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f3230 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 74  (argv[0]);.    t
f3240 6f 70 6f 6e 65 74 5f 6e 61 6d 65 20 3d 20 28 63  oponet_name = (c
f3250 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f3260 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f3270 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
f3280 66 20 28 61 72 67 63 20 3e 3d 20 34 29 0a 20 20  f (argc >= 4).  
f3290 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
f32a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f32b0 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c  (argv[2]) != SQL
f32c0 49 54 45 5f 54 45 58 54 0a 09 20 20 20 20 20 20  ITE_TEXT..      
f32d0 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
f32e0 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20  _type (argv[3]) 
f32f0 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  != SQLITE_TEXT).
f3300 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
f3310 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
f3320 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74  text, -1);...ret
f3330 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 74  urn;..    }..  t
f3340 69 74 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  itle = (const ch
f3350 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
f3360 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 32  lue_text (argv[2
f3370 5d 29 3b 0a 09 20 20 61 62 73 74 72 61 63 74 20  ]);..  abstract 
f3380 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
f3390 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f33a0 65 78 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20  ext (argv[3]);. 
f33b0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61       }.    if (a
f33c0 72 67 63 20 3e 3d 20 36 29 0a 20 20 20 20 20 20  rgc >= 6).      
f33d0 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
f33e0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f33f0 76 5b 34 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[4]) != SQLITE_
f3400 49 4e 54 45 47 45 52 0a 09 20 20 20 20 20 20 7c  INTEGER..      |
f3410 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  | sqlite3_value_
f3420 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20 21  type (argv[5]) !
f3430 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
f3440 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
f3450 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f3460 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72  ontext, -1);...r
f3470 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
f3480 20 69 73 5f 71 75 65 72 79 61 62 6c 65 20 3d 20   is_queryable = 
f3490 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
f34a0 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20 20  t (argv[4]);..  
f34b0 69 73 5f 65 64 69 74 61 62 6c 65 20 3d 20 73 71  is_editable = sq
f34c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
f34d0 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20 20  (argv[5]);.     
f34e0 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 72 65   }.    ret =..re
f34f0 67 69 73 74 65 72 5f 74 6f 70 6f 6e 65 74 5f 63  gister_toponet_c
f3500 6f 76 65 72 61 67 65 20 28 73 71 6c 69 74 65 2c  overage (sqlite,
f3510 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20   coverage_name, 
f3520 74 6f 70 6f 6e 65 74 5f 6e 61 6d 65 2c 0a 09 09  toponet_name,...
f3530 09 09 20 20 20 74 69 74 6c 65 2c 20 61 62 73 74  ..   title, abst
f3540 72 61 63 74 2c 20 69 73 5f 71 75 65 72 79 61 62  ract, is_queryab
f3550 6c 65 2c 20 69 73 5f 65 64 69 74 61 62 6c 65 29  le, is_editable)
f3560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
f3570 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f3580 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74  t, ret);.}..stat
f3590 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e 72  ic void.fnct_Unr
f35a0 65 67 69 73 74 65 72 56 65 63 74 6f 72 43 6f 76  egisterVectorCov
f35b0 65 72 61 67 65 20 28 73 71 6c 69 74 65 33 5f 63  erage (sqlite3_c
f35c0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
f35d0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
f35e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
f35f0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
f3600 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
f3610 2f 20 55 6e 52 65 67 69 73 74 65 72 56 65 63 74  / UnRegisterVect
f3620 6f 72 43 6f 76 65 72 61 67 65 28 54 65 78 74 20  orCoverage(Text 
f3630 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 29 0a 2f  coverage_name)./
f3640 0a 2f 20 64 65 6c 65 74 65 73 20 61 20 56 65 63  ./ deletes a Vec
f3650 74 6f 72 20 43 6f 76 65 72 61 67 65 0a 2f 20 72  tor Coverage./ r
f3660 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63  eturns 1 on succ
f3670 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75  ess./ 0 on failu
f3680 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69  re, -1 on invali
f3690 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
f36a0 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
f36b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 76 65  const char *cove
f36c0 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 73  rage_name;.    s
f36d0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
f36e0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
f36f0 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
f3700 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
f3710 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
f3720 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
f3730 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
f3740 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
f3750 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [0]) != SQLITE_T
f3760 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
f3770 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f3780 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
f3790 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
f37a0 20 20 20 7d 0a 20 20 20 20 63 6f 76 65 72 61 67     }.    coverag
f37b0 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  e_name = (const 
f37c0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
f37d0 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
f37e0 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  [0]);.    ret = 
f37f0 75 6e 72 65 67 69 73 74 65 72 5f 76 65 63 74 6f  unregister_vecto
f3800 72 5f 63 6f 76 65 72 61 67 65 20 28 73 71 6c 69  r_coverage (sqli
f3810 74 65 2c 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d  te, coverage_nam
f3820 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
f3830 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f3840 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74  ext, ret);.}..st
f3850 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53  atic void.fnct_S
f3860 65 74 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65  etVectorCoverage
f3870 49 6e 66 6f 73 20 28 73 71 6c 69 74 65 33 5f 63  Infos (sqlite3_c
f3880 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
f3890 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
f38a0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
f38b0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
f38c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
f38d0 53 65 74 56 65 63 74 6f 72 43 6f 76 65 72 61 67  SetVectorCoverag
f38e0 65 49 6e 66 6f 73 28 54 65 78 74 20 63 6f 76 65  eInfos(Text cove
f38f0 72 61 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20  rage_name, Text 
f3900 74 69 74 6c 65 2c 0a 2f 20 20 20 20 20 20 20 20  title,./        
f3910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3920 54 65 78 74 20 61 62 73 74 72 61 63 74 29 0a 2f  Text abstract)./
f3930 20 20 20 20 6f 72 0a 2f 20 53 65 74 56 65 63 74      or./ SetVect
f3940 6f 72 43 6f 76 65 72 61 67 65 49 6e 66 6f 73 28  orCoverageInfos(
f3950 54 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e 61  Text coverage_na
f3960 6d 65 2c 20 54 65 78 74 20 74 69 74 6c 65 2c 0a  me, Text title,.
f3970 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
f3980 20 20 20 20 20 20 20 20 20 54 65 78 74 20 61 62           Text ab
f3990 73 74 72 61 63 74 2c 20 42 6f 6f 6c 20 69 73 5f  stract, Bool is_
f39a0 71 75 65 72 79 61 62 6c 65 2c 0a 2f 20 20 20 20  queryable,./    
f39b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f39c0 20 20 20 20 42 6f 6f 6c 20 69 73 5f 65 64 69 74      Bool is_edit
f39d0 61 62 6c 65 29 0a 2f 0a 2f 20 75 70 64 61 74 65  able)././ update
f39e0 73 20 74 68 65 20 64 65 73 63 72 69 70 74 69 76  s the descriptiv
f39f0 65 20 69 6e 66 6f 73 20 73 75 70 70 6f 72 74 69  e infos supporti
f3a00 6e 67 20 61 20 56 65 63 74 6f 72 20 43 6f 76 65  ng a Vector Cove
f3a10 72 61 67 65 0a 2f 20 72 65 74 75 72 6e 73 20 31  rage./ returns 1
f3a20 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20   on success./ 0 
f3a30 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f  on failure, -1 o
f3a40 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
f3a50 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72  nts.*/.    int r
f3a60 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  et;.    const ch
f3a70 61 72 20 2a 63 6f 76 65 72 61 67 65 5f 6e 61 6d  ar *coverage_nam
f3a80 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
f3a90 72 20 2a 74 69 74 6c 65 20 3d 20 4e 55 4c 4c 3b  r *title = NULL;
f3aa0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f3ab0 2a 61 62 73 74 72 61 63 74 20 3d 20 4e 55 4c 4c  *abstract = NULL
f3ac0 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 71 75 65  ;.    int is_que
f3ad0 72 79 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 20  ryable = -1;.   
f3ae0 20 69 6e 74 20 69 73 5f 65 64 69 74 61 62 6c 65   int is_editable
f3af0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
f3b00 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
f3b10 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
f3b20 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
f3b30 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
f3b40 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
f3b50 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
f3b60 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
f3b70 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
f3b80 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 0a   != SQLITE_TEXT.
f3b90 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .|| sqlite3_valu
f3ba0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
f3bb0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 0a   != SQLITE_TEXT.
f3bc0 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .|| sqlite3_valu
f3bd0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
f3be0 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   != SQLITE_TEXT)
f3bf0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
f3c00 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
f3c10 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
f3c20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
f3c30 0a 20 20 20 20 63 6f 76 65 72 61 67 65 5f 6e 61  .    coverage_na
f3c40 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f3c50 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f3c60 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
f3c70 3b 0a 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63  ;.    title = (c
f3c80 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f3c90 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f3ca0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 61  (argv[1]);.    a
f3cb0 62 73 74 72 61 63 74 20 3d 20 28 63 6f 6e 73 74  bstract = (const
f3cc0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
f3cd0 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
f3ce0 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 20 28 61  v[2]);.    if (a
f3cf0 72 67 63 20 3e 3d 20 35 29 0a 20 20 20 20 20 20  rgc >= 5).      
f3d00 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  {..  if (sqlite3
f3d10 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f3d20 76 5b 33 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[3]) != SQLITE_
f3d30 49 4e 54 45 47 45 52 0a 09 20 20 20 20 20 20 7c  INTEGER..      |
f3d40 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  | sqlite3_value_
f3d50 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 21  type (argv[4]) !
f3d60 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
f3d70 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
f3d80 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f3d90 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72  ontext, -1);...r
f3da0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
f3db0 20 69 73 5f 71 75 65 72 79 61 62 6c 65 20 3d 20   is_queryable = 
f3dc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
f3dd0 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20  t (argv[3]);..  
f3de0 69 73 5f 65 64 69 74 61 62 6c 65 20 3d 20 73 71  is_editable = sq
f3df0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
f3e00 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 20  (argv[4]);.     
f3e10 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 65   }.    ret =..se
f3e20 74 5f 76 65 63 74 6f 72 5f 63 6f 76 65 72 61 67  t_vector_coverag
f3e30 65 5f 69 6e 66 6f 73 20 28 73 71 6c 69 74 65 2c  e_infos (sqlite,
f3e40 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20   coverage_name, 
f3e50 74 69 74 6c 65 2c 20 61 62 73 74 72 61 63 74 2c  title, abstract,
f3e60 0a 09 09 09 09 20 20 20 69 73 5f 71 75 65 72 79  .....   is_query
f3e70 61 62 6c 65 2c 20 69 73 5f 65 64 69 74 61 62 6c  able, is_editabl
f3e80 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
f3e90 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f3ea0 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74  ext, ret);.}..st
f3eb0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53  atic void.fnct_S
f3ec0 65 74 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65  etVectorCoverage
f3ed0 43 6f 70 79 72 69 67 68 74 20 28 73 71 6c 69 74  Copyright (sqlit
f3ee0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
f3ef0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
f3f00 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c  .... sqlite3_val
f3f10 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
f3f20 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
f3f30 20 53 65 74 56 65 63 74 6f 72 43 6f 76 65 72 61   SetVectorCovera
f3f40 67 65 43 6f 70 79 72 69 67 68 74 28 54 65 78 74  geCopyright(Text
f3f50 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20   coverage_name, 
f3f60 54 65 78 74 20 63 6f 70 79 72 69 67 68 74 29 0a  Text copyright).
f3f70 2f 20 20 20 20 6f 72 0a 2f 20 53 65 74 56 65 63  /    or./ SetVec
f3f80 74 6f 72 43 6f 76 65 72 61 67 65 43 6f 70 79 72  torCoverageCopyr
f3f90 69 67 68 74 28 54 65 78 74 20 63 6f 76 65 72 61  ight(Text covera
f3fa0 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 63 6f  ge_name, Text co
f3fb0 70 79 72 69 67 68 74 2c 0a 2f 20 20 20 20 20 20  pyright,./      
f3fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3fd0 20 20 20 20 20 20 54 65 78 74 20 6c 69 63 65 6e        Text licen
f3fe0 73 65 29 0a 2f 0a 2f 20 75 70 64 61 74 65 73 20  se)././ updates 
f3ff0 63 6f 70 79 72 69 67 68 74 20 69 6e 66 6f 73 20  copyright infos 
f4000 73 75 70 70 6f 72 74 69 6e 67 20 61 20 56 65 63  supporting a Vec
f4010 74 6f 72 20 43 6f 76 65 72 61 67 65 0a 2f 20 72  tor Coverage./ r
f4020 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63  eturns 1 on succ
f4030 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75  ess./ 0 on failu
f4040 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69  re, -1 on invali
f4050 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20  d arguments.*/. 
f4060 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
f4070 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 76 65  const char *cove
f4080 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 63  rage_name;.    c
f4090 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 70 79 72  onst char *copyr
f40a0 69 67 68 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ight = NULL;.   
f40b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 63   const char *lic
f40c0 65 6e 73 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ense = NULL;.   
f40d0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
f40e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
f40f0 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
f4100 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
f4110 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
f4120 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
f4130 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
f4140 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f4150 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
f4160 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
f4170 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f4180 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f4190 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
f41a0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73       }.    if (s
f41b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f41c0 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
f41d0 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20  QLITE_NULL)..;. 
f41e0 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
f41f0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f4200 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
f4210 54 45 5f 54 45 58 54 29 0a 09 63 6f 70 79 72 69  TE_TEXT)..copyri
f4220 67 68 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ght = (const cha
f4230 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
f4240 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
f4250 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
f4260 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
f4270 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f4280 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
f4290 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
f42a0 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20  coverage_name = 
f42b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
f42c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f42d0 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
f42e0 20 69 66 20 28 61 72 67 63 20 3e 3d 20 33 29 0a   if (argc >= 3).
f42f0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
f4300 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f4310 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
f4320 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
f4330 20 20 20 6c 69 63 65 6e 73 65 20 3d 20 28 63 6f     license = (co
f4340 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
f4350 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
f4360 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 65 6c 73  argv[2]);..  els
f4370 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
f4380 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f4390 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72  ontext, -1);...r
f43a0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
f43b0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a      }.    ret =.
f43c0 09 73 65 74 5f 76 65 63 74 6f 72 5f 63 6f 76 65  .set_vector_cove
f43d0 72 61 67 65 5f 63 6f 70 79 72 69 67 68 74 20 28  rage_copyright (
f43e0 73 71 6c 69 74 65 2c 20 63 6f 76 65 72 61 67 65  sqlite, coverage
f43f0 5f 6e 61 6d 65 2c 20 63 6f 70 79 72 69 67 68 74  _name, copyright
f4400 2c 0a 09 09 09 09 20 20 20 20 20 20 20 6c 69 63  ,.....       lic
f4410 65 6e 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  ense);.    sqlit
f4420 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f4430 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a  ontext, ret);.}.
f4440 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
f4450 74 5f 52 65 67 69 73 74 65 72 56 65 63 74 6f 72  t_RegisterVector
f4460 43 6f 76 65 72 61 67 65 53 72 69 64 20 28 73 71  CoverageSrid (sq
f4470 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
f4480 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
f4490 63 2c 0a 09 09 09 09 20 73 71 6c 69 74 65 33 5f  c,..... sqlite3_
f44a0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
f44b0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
f44c0 3a 0a 2f 20 52 65 67 69 73 74 65 72 56 65 63 74  :./ RegisterVect
f44d0 6f 72 43 6f 76 65 72 61 67 65 53 72 69 64 28 54  orCoverageSrid(T
f44e0 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d  ext coverage_nam
f44f0 65 2c 20 49 6e 74 65 67 65 72 20 73 72 69 64 29  e, Integer srid)
f4500 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61 20 56  ././ inserts a V
f4510 65 63 74 6f 72 20 43 6f 76 65 72 61 67 65 20 61  ector Coverage a
f4520 6c 74 65 72 6e 61 74 69 76 65 20 53 52 49 44 0a  lternative SRID.
f4530 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
f4540 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
f4550 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76  ilure, -1 on inv
f4560 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
f4570 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
f4580 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63     const char *c
f4590 6f 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20  overage_name;.  
f45a0 20 20 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20    int srid;.    
f45b0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
f45c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
f45d0 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
f45e0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
f45f0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
f4600 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
f4610 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
f4620 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f4630 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
f4640 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33  TEXT..|| sqlite3
f4650 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f4660 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
f4670 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
f4680 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
f4690 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
f46a0 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
f46b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 76  .      }.    cov
f46c0 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63 6f  erage_name = (co
f46d0 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
f46e0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
f46f0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 72  argv[0]);.    sr
f4700 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
f4710 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
f4720 3b 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67 69  ;.    ret = regi
f4730 73 74 65 72 5f 76 65 63 74 6f 72 5f 63 6f 76 65  ster_vector_cove
f4740 72 61 67 65 5f 73 72 69 64 20 28 73 71 6c 69 74  rage_srid (sqlit
f4750 65 2c 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65  e, coverage_name
f4760 2c 20 73 72 69 64 29 3b 0a 20 20 20 20 73 71 6c  , srid);.    sql
f4770 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
f4780 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a  (context, ret);.
f4790 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
f47a0 6e 63 74 5f 55 6e 72 65 67 69 73 74 65 72 56 65  nct_UnregisterVe
f47b0 63 74 6f 72 43 6f 76 65 72 61 67 65 53 72 69 64  ctorCoverageSrid
f47c0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
f47d0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
f47e0 20 61 72 67 63 2c 0a 09 09 09 09 20 20 20 73 71   argc,.....   sq
f47f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
f4800 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
f4810 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69  nction:./ UnRegi
f4820 73 74 65 72 56 65 63 74 6f 72 43 6f 76 65 72 61  sterVectorCovera
f4830 67 65 53 72 69 64 28 54 65 78 74 20 63 6f 76 65  geSrid(Text cove
f4840 72 61 67 65 5f 6e 61 6d 65 2c 20 49 6e 74 65 67  rage_name, Integ
f4850 65 72 20 73 72 69 64 29 0a 2f 0a 2f 20 64 65 6c  er srid)././ del
f4860 65 74 65 73 20 61 20 56 65 63 74 6f 72 20 43 6f  etes a Vector Co
f4870 76 65 72 61 67 65 20 61 6c 74 65 72 6e 61 74 69  verage alternati
f4880 76 65 20 53 52 49 44 0a 2f 20 72 65 74 75 72 6e  ve SRID./ return
f4890 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f  s 1 on success./
f48a0 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d   0 on failure, -
f48b0 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67  1 on invalid arg
f48c0 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e  uments.*/.    in
f48d0 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  t ret;.    const
f48e0 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65 5f   char *coverage_
f48f0 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 73 72  name;.    int sr
f4900 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  id;.    sqlite3 
f4910 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
f4920 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
f4930 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
f4940 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
f4950 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
f4960 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
f4970 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
f4980 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
f4990 20 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c   SQLITE_TEXT..||
f49a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f49b0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
f49c0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
f49d0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
f49e0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
f49f0 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
f4a00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
f4a10 0a 20 20 20 20 63 6f 76 65 72 61 67 65 5f 6e 61  .    coverage_na
f4a20 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f4a30 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f4a40 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
f4a50 3b 0a 20 20 20 20 73 72 69 64 20 3d 20 73 71 6c  ;.    srid = sql
f4a60 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
f4a70 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65  argv[1]);.    re
f4a80 74 20 3d 20 75 6e 72 65 67 69 73 74 65 72 5f 76  t = unregister_v
f4a90 65 63 74 6f 72 5f 63 6f 76 65 72 61 67 65 5f 73  ector_coverage_s
f4aa0 72 69 64 20 28 73 71 6c 69 74 65 2c 20 63 6f 76  rid (sqlite, cov
f4ab0 65 72 61 67 65 5f 6e 61 6d 65 2c 20 73 72 69 64  erage_name, srid
f4ac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
f4ad0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f4ae0 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
f4af0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65  tic void.fnct_Re
f4b00 67 69 73 74 65 72 56 65 63 74 6f 72 43 6f 76 65  gisterVectorCove
f4b10 72 61 67 65 4b 65 79 77 6f 72 64 20 28 73 71 6c  rageKeyword (sql
f4b20 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
f4b30 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
f4b40 2c 0a 09 09 09 09 20 20 20 20 73 71 6c 69 74 65  ,.....    sqlite
f4b50 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
f4b60 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
f4b70 6f 6e 3a 0a 2f 20 52 65 67 69 73 74 65 72 56 65  on:./ RegisterVe
f4b80 63 74 6f 72 43 6f 76 65 72 61 67 65 4b 65 79 77  ctorCoverageKeyw
f4b90 6f 72 64 28 54 65 78 74 20 63 6f 76 65 72 61 67  ord(Text coverag
f4ba0 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 6b 65 79  e_name, Text key
f4bb0 77 6f 72 64 29 0a 2f 0a 2f 20 69 6e 73 65 72 74  word)././ insert
f4bc0 73 20 61 20 56 65 63 74 6f 72 20 43 6f 76 65 72  s a Vector Cover
f4bd0 61 67 65 20 4b 65 79 77 6f 72 64 0a 2f 20 72 65  age Keyword./ re
f4be0 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
f4bf0 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
f4c00 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
f4c10 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
f4c20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
f4c30 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 76 65 72  onst char *cover
f4c40 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  age_name;.    co
f4c50 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 77 6f 72  nst char *keywor
f4c60 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
f4c70 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
f4c80 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
f4c90 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
f4ca0 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
f4cb0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
f4cc0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
f4cd0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f4ce0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
f4cf0 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20  SQLITE_TEXT..|| 
f4d00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f4d10 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
f4d20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
f4d30 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
f4d40 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f4d50 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
f4d60 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
f4d70 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d   coverage_name =
f4d80 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
f4d90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f4da0 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
f4db0 20 20 6b 65 79 77 6f 72 64 20 3d 20 28 63 6f 6e    keyword = (con
f4dc0 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
f4dd0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
f4de0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[1]);.    ret
f4df0 20 3d 20 72 65 67 69 73 74 65 72 5f 76 65 63 74   = register_vect
f4e00 6f 72 5f 63 6f 76 65 72 61 67 65 5f 6b 65 79 77  or_coverage_keyw
f4e10 6f 72 64 20 28 73 71 6c 69 74 65 2c 20 63 6f 76  ord (sqlite, cov
f4e20 65 72 61 67 65 5f 6e 61 6d 65 2c 20 6b 65 79 77  erage_name, keyw
f4e30 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ord);.    sqlite
f4e40 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
f4e50 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a  ntext, ret);.}..
f4e60 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
f4e70 5f 55 6e 72 65 67 69 73 74 65 72 56 65 63 74 6f  _UnregisterVecto
f4e80 72 43 6f 76 65 72 61 67 65 4b 65 79 77 6f 72 64  rCoverageKeyword
f4e90 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
f4ea0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
f4eb0 20 61 72 67 63 2c 0a 09 09 09 09 20 20 20 20 20   argc,.....     
f4ec0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
f4ed0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
f4ee0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52   function:./ UnR
f4ef0 65 67 69 73 74 65 72 56 65 63 74 6f 72 43 6f 76  egisterVectorCov
f4f00 65 72 61 67 65 53 72 69 64 28 54 65 78 74 20 63  erageSrid(Text c
f4f10 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 54 65  overage_name, Te
f4f20 78 74 20 6b 65 79 77 6f 72 64 29 0a 2f 0a 2f 20  xt keyword)././ 
f4f30 64 65 6c 65 74 65 73 20 61 20 56 65 63 74 6f 72  deletes a Vector
f4f40 20 43 6f 76 65 72 61 67 65 20 4b 65 79 77 6f 72   Coverage Keywor
f4f50 64 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e  d./ returns 1 on
f4f60 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20   success./ 0 on 
f4f70 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69  failure, -1 on i
f4f80 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
f4f90 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  .*/.    int ret;
f4fa0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f4fb0 2a 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a  *coverage_name;.
f4fc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f4fd0 6b 65 79 77 6f 72 64 3b 0a 20 20 20 20 73 71 6c  keyword;.    sql
f4fe0 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
f4ff0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
f5000 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
f5010 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
f5020 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
f5030 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
f5040 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
f5050 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
f5060 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
f5070 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61  T..|| sqlite3_va
f5080 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
f5090 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
f50a0 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
f50b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f50c0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
f50d0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
f50e0 20 7d 0a 20 20 20 20 63 6f 76 65 72 61 67 65 5f   }.    coverage_
f50f0 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
f5100 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
f5110 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
f5120 5d 29 3b 0a 20 20 20 20 6b 65 79 77 6f 72 64 20  ]);.    keyword 
f5130 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
f5140 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f5150 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ext (argv[1]);. 
f5160 20 20 20 72 65 74 20 3d 20 75 6e 72 65 67 69 73     ret = unregis
f5170 74 65 72 5f 76 65 63 74 6f 72 5f 63 6f 76 65 72  ter_vector_cover
f5180 61 67 65 5f 6b 65 79 77 6f 72 64 20 28 73 71 6c  age_keyword (sql
f5190 69 74 65 2c 20 63 6f 76 65 72 61 67 65 5f 6e 61  ite, coverage_na
f51a0 6d 65 2c 20 6b 65 79 77 6f 72 64 29 3b 0a 20 20  me, keyword);.  
f51b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f51c0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
f51d0 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
f51e0 6f 69 64 0a 66 6e 63 74 5f 55 70 64 61 74 65 56  oid.fnct_UpdateV
f51f0 65 63 74 6f 72 43 6f 76 65 72 61 67 65 45 78 74  ectorCoverageExt
f5200 65 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ent (sqlite3_con
f5210 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
f5220 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20 73  int argc,..... s
f5230 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
f5240 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
f5250 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 70 64 61 74  unction:./ Updat
f5260 65 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 45  eVectorCoverageE
f5270 78 74 65 6e 74 28 29 0a 2f 20 20 20 6f 72 0a 2f  xtent()./   or./
f5280 20 55 70 64 61 74 65 56 65 63 74 6f 72 43 6f 76   UpdateVectorCov
f5290 65 72 61 67 65 45 78 74 65 6e 74 28 49 6e 74 65  erageExtent(Inte
f52a0 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ger transaction)
f52b0 0a 2f 20 20 20 6f 72 0a 2f 20 55 70 64 61 74 65  ./   or./ Update
f52c0 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 45 78  VectorCoverageEx
f52d0 74 65 6e 74 28 54 65 78 74 20 63 6f 76 65 72 61  tent(Text covera
f52e0 67 65 5f 6e 61 6d 65 29 0a 2f 20 20 20 6f 72 0a  ge_name)./   or.
f52f0 2f 20 55 70 64 61 74 65 56 65 63 74 6f 72 43 6f  / UpdateVectorCo
f5300 76 65 72 61 67 65 45 78 74 65 6e 74 28 54 65 78  verageExtent(Tex
f5310 74 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c  t coverage_name,
f5320 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e   int transaction
f5330 29 0a 2f 0a 2f 20 75 70 64 61 74 65 73 20 56 65  )././ updates Ve
f5340 63 74 6f 72 20 43 6f 76 65 72 61 67 65 20 45 78  ctor Coverage Ex
f5350 74 65 6e 74 73 0a 2f 20 72 65 74 75 72 6e 73 20  tents./ returns 
f5360 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30  1 on success./ 0
f5370 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20   on failure, -1 
f5380 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
f5390 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ents.*/.    int 
f53a0 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ret;.    const c
f53b0 68 61 72 20 2a 63 6f 76 65 72 61 67 65 5f 6e 61  har *coverage_na
f53c0 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  me = NULL;.    i
f53d0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d  nt transaction =
f53e0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   0;.    sqlite3 
f53f0 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
f5400 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
f5410 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
f5420 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65     struct splite
f5430 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20  _internal_cache 
f5440 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  *cache = sqlite3
f5450 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
f5460 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
f5470 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
f5480 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
f5490 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20      if (argc >= 
f54a0 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  1).      {..  if
f54b0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f54c0 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
f54d0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
f54e0 20 20 20 20 20 20 63 6f 76 65 72 61 67 65 5f 6e        coverage_n
f54f0 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
f5500 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
f5510 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
f5520 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73  );..  else if (s
f5530 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f5540 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
f5550 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
f5560 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f        transactio
f5570 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
f5580 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b  e_int (argv[0]);
f5590 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
f55a0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
f55b0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
f55c0 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  1);...return;.. 
f55d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f55e0 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a   if (argc >= 2).
f55f0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73        {..  if (s
f5600 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f5610 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
f5620 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 20 20 20  QLITE_TEXT)..   
f5630 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
f5640 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f5650 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b  , -1);...return;
f5660 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73  ..    }..  if (s
f5670 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f5680 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53  e (argv[1]) != S
f5690 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
f56a0 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
f56b0 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f56c0 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75  ext, -1);...retu
f56d0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 63 6f  rn;..    }..  co
f56e0 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63  verage_name = (c
f56f0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f5700 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f5710 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 74 72  (argv[0]);..  tr
f5720 61 6e 73 61 63 74 69 6f 6e 20 3d 20 73 71 6c 69  ansaction = sqli
f5730 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
f5740 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[1]);.      }
f5750 0a 20 20 20 20 72 65 74 20 3d 0a 09 75 70 64 61  .    ret =..upda
f5760 74 65 5f 76 65 63 74 6f 72 5f 63 6f 76 65 72 61  te_vector_covera
f5770 67 65 5f 65 78 74 65 6e 74 20 28 73 71 6c 69 74  ge_extent (sqlit
f5780 65 2c 20 63 61 63 68 65 2c 20 63 6f 76 65 72 61  e, cache, covera
f5790 67 65 5f 6e 61 6d 65 2c 0a 09 09 09 09 20 20 20  ge_name,.....   
f57a0 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 29      transaction)
f57b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
f57c0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f57d0 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74  t, ret);.}..stat
f57e0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67  ic void.fnct_Reg
f57f0 69 73 74 65 72 56 65 63 74 6f 72 53 74 79 6c 65  isterVectorStyle
f5800 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
f5810 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
f5820 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c 69   argc,....  sqli
f5830 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
f5840 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
f5850 74 69 6f 6e 3a 0a 2f 20 52 65 67 69 73 74 65 72  tion:./ Register
f5860 56 65 63 74 6f 72 53 74 79 6c 65 28 42 4c 4f 42  VectorStyle(BLOB
f5870 20 73 74 79 6c 65 29 0a 2f 0a 2f 20 69 6e 73 65   style)././ inse
f5880 72 74 73 20 61 20 56 65 63 74 6f 72 20 53 74 79  rts a Vector Sty
f5890 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  le ./ returns 1 
f58a0 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
f58b0 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
f58c0 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
f58d0 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
f58e0 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  t;.    const uns
f58f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
f5900 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
f5910 74 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tes;.    sqlite3
f5920 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74   *sqlite = sqlit
f5930 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
f5940 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a  ndle (context);.
f5950 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
f5960 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
f5970 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
f5980 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f5990 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
f59a0 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
f59b0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
f59c0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
f59d0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
f59e0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
f59f0 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73 71 6c 69     p_blob = sqli
f5a00 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
f5a10 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f  argv[0]);.    n_
f5a20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
f5a30 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67  value_bytes (arg
f5a40 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d  v[0]);.    ret =
f5a50 20 72 65 67 69 73 74 65 72 5f 76 65 63 74 6f 72   register_vector
f5a60 5f 73 74 79 6c 65 20 28 73 71 6c 69 74 65 2c 20  _style (sqlite, 
f5a70 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29  p_blob, n_bytes)
f5a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
f5a90 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f5aa0 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74  t, ret);.}..stat
f5ab0 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e 52  ic void.fnct_UnR
f5ac0 65 67 69 73 74 65 72 56 65 63 74 6f 72 53 74 79  egisterVectorSty
f5ad0 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  le (sqlite3_cont
f5ae0 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
f5af0 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20  nt argc,....    
f5b00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f5b10 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
f5b20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65  function:./ UnRe
f5b30 67 69 73 74 65 72 56 65 63 74 6f 72 53 74 79 6c  gisterVectorStyl
f5b40 65 28 49 6e 74 65 67 65 72 20 73 74 79 6c 65 5f  e(Integer style_
f5b50 69 64 20 5b 20 2c 20 49 6e 74 65 67 65 72 20 72  id [ , Integer r
f5b60 65 6d 6f 76 65 41 6c 6c 5d 20 29 0a 2f 20 20 6f  emoveAll] )./  o
f5b70 72 0a 2f 20 55 6e 52 65 67 69 73 74 65 72 56 65  r./ UnRegisterVe
f5b80 63 74 6f 72 53 74 79 6c 65 28 54 65 78 74 20 73  ctorStyle(Text s
f5b90 74 79 6c 65 5f 6e 61 6d 65 20 5b 20 2c 20 49 6e  tyle_name [ , In
f5ba0 74 65 67 65 72 20 72 65 6d 6f 76 65 41 6c 6c 5d  teger removeAll]
f5bb0 20 29 0a 2f 0a 2f 20 72 65 6d 6f 76 65 73 20 61   )././ removes a
f5bc0 20 56 65 63 74 6f 72 20 53 74 79 6c 65 20 64 65   Vector Style de
f5bd0 66 69 6e 69 74 69 6f 6e 0a 2f 20 72 65 74 75 72  finition./ retur
f5be0 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a  ns 1 on success.
f5bf0 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20  / 0 on failure, 
f5c00 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  -1 on invalid ar
f5c10 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69  guments.*/.    i
f5c20 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20  nt ret;.    int 
f5c30 73 74 79 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20  style_id = -1;. 
f5c40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
f5c50 74 79 6c 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c  tyle_name = NULL
f5c60 3b 0a 20 20 20 20 69 6e 74 20 72 65 6d 6f 76 65  ;.    int remove
f5c70 5f 61 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  _all = 0;.    sq
f5c80 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20  lite3 *sqlite = 
f5c90 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
f5ca0 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65  db_handle (conte
f5cb0 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
f5cc0 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
f5cd0 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
f5ce0 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
f5cf0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
f5d00 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  0]) == SQLITE_IN
f5d10 54 45 47 45 52 29 0a 09 73 74 79 6c 65 5f 69 64  TEGER)..style_id
f5d20 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f5d30 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  _int (argv[0]);.
f5d40 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
f5d50 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f5d60 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
f5d70 49 54 45 5f 54 45 58 54 29 0a 09 73 74 79 6c 65  ITE_TEXT)..style
f5d80 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  _name = (const c
f5d90 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
f5da0 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
f5db0 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  0]);.    else.  
f5dc0 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
f5dd0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
f5de0 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
f5df0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
f5e00 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29    if (argc >= 2)
f5e10 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
f5e20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f5e30 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
f5e40 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
f5e50 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
f5e60 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
f5e70 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74  text, -1);...ret
f5e80 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 72  urn;..    }..  r
f5e90 65 6d 6f 76 65 5f 61 6c 6c 20 3d 20 73 71 6c 69  emove_all = sqli
f5ea0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
f5eb0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[1]);.      }
f5ec0 0a 20 20 20 20 72 65 74 20 3d 20 75 6e 72 65 67  .    ret = unreg
f5ed0 69 73 74 65 72 5f 76 65 63 74 6f 72 5f 73 74 79  ister_vector_sty
f5ee0 6c 65 20 28 73 71 6c 69 74 65 2c 20 73 74 79 6c  le (sqlite, styl
f5ef0 65 5f 69 64 2c 20 73 74 79 6c 65 5f 6e 61 6d 65  e_id, style_name
f5f00 2c 20 72 65 6d 6f 76 65 5f 61 6c 6c 29 3b 0a 20  , remove_all);. 
f5f10 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f5f20 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
f5f30 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
f5f40 76 6f 69 64 0a 66 6e 63 74 5f 52 65 6c 6f 61 64  void.fnct_Reload
f5f50 56 65 63 74 6f 72 53 74 79 6c 65 20 28 73 71 6c  VectorStyle (sql
f5f60 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
f5f70 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
f5f80 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  ,....sqlite3_val
f5f90 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
f5fa0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
f5fb0 20 52 65 6c 6f 61 64 56 65 63 74 6f 72 53 74 79   ReloadVectorSty
f5fc0 6c 65 28 49 6e 74 65 67 65 72 20 73 74 79 6c 65  le(Integer style
f5fd0 5f 69 64 2c 20 42 4c 4f 42 20 73 74 79 6c 65 29  _id, BLOB style)
f5fe0 0a 2f 20 20 20 20 6f 72 0a 2f 20 52 65 6c 6f 61  ./    or./ Reloa
f5ff0 64 56 65 63 74 6f 72 53 74 79 6c 65 28 54 65 78  dVectorStyle(Tex
f6000 74 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 42 4c  t style_name, BL
f6010 4f 42 20 73 74 79 6c 65 29 0a 2f 0a 2f 20 75 70  OB style)././ up
f6020 64 61 74 65 73 20 61 20 56 65 63 74 6f 72 20 53  dates a Vector S
f6030 74 79 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73 20  tyle ./ returns 
f6040 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30  1 on success./ 0
f6050 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20   on failure, -1 
f6060 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
f6070 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20  ents.*/.    int 
f6080 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 73 74 79  ret;.    int sty
f6090 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20  le_id = -1;.    
f60a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c  const char *styl
f60b0 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20  e_name = NULL;. 
f60c0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
f60d0 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
f60e0 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
f60f0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
f6100 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
f6110 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
f6120 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
f6130 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
f6140 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
f6150 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
f6160 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
f6170 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
f6180 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 73  LITE_INTEGER)..s
f6190 74 79 6c 65 5f 69 64 20 3d 20 73 71 6c 69 74 65  tyle_id = sqlite
f61a0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
f61b0 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20  v[0]);.    else 
f61c0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
f61d0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
f61e0 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29   == SQLITE_TEXT)
f61f0 0a 09 73 74 79 6c 65 5f 6e 61 6d 65 20 3d 20 28  ..style_name = (
f6200 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
f6210 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
f6220 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
f6230 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
f6240 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f6250 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
f6260 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
f6270 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
f6280 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f6290 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
f62a0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
f62b0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
f62c0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f62d0 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
f62e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
f62f0 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  blob = sqlite3_v
f6300 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
f6310 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  1]);.    n_bytes
f6320 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f6330 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
f6340 3b 0a 20 20 20 20 72 65 74 20 3d 20 72 65 6c 6f  ;.    ret = relo
f6350 61 64 5f 76 65 63 74 6f 72 5f 73 74 79 6c 65 20  ad_vector_style 
f6360 28 73 71 6c 69 74 65 2c 20 73 74 79 6c 65 5f 69  (sqlite, style_i
f6370 64 2c 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 70  d, style_name, p
f6380 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b  _blob, n_bytes);
f6390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
f63a0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f63b0 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  , ret);.}..stati
f63c0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69  c void.fnct_Regi
f63d0 73 74 65 72 56 65 63 74 6f 72 53 74 79 6c 65 64  sterVectorStyled
f63e0 4c 61 79 65 72 20 28 73 71 6c 69 74 65 33 5f 63  Layer (sqlite3_c
f63f0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
f6400 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09  , int argc,.....
f6410 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f6420 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
f6430 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 67 69  function:./ Regi
f6440 73 74 65 72 56 65 63 74 6f 72 53 74 79 6c 65 64  sterVectorStyled
f6450 4c 61 79 65 72 28 53 74 72 69 6e 67 20 63 6f 76  Layer(String cov
f6460 65 72 61 67 65 5f 6e 61 6d 65 2c 20 49 6e 74 65  erage_name, Inte
f6470 67 65 72 20 73 74 79 6c 65 5f 69 64 29 0a 2f 20  ger style_id)./ 
f6480 20 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 56 65   or./ RegisterVe
f6490 63 74 6f 72 53 74 79 6c 65 64 4c 61 79 65 72 28  ctorStyledLayer(
f64a0 53 74 72 69 6e 67 20 63 6f 76 65 72 61 67 65 5f  String coverage_
f64b0 6e 61 6d 65 2c 20 54 65 78 74 20 73 74 79 6c 65  name, Text style
f64c0 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 69 6e 73 65 72  _name)././ inser
f64d0 74 73 20 61 20 56 65 63 74 6f 72 20 53 74 79 6c  ts a Vector Styl
f64e0 65 64 20 4c 61 79 65 72 20 0a 2f 20 72 65 74 75  ed Layer ./ retu
f64f0 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73  rns 1 on success
f6500 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c  ./ 0 on failure,
f6510 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61   -1 on invalid a
f6520 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20  rguments.*/.    
f6530 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e  int ret;.    con
f6540 73 74 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67  st char *coverag
f6550 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  e_name;.    int 
f6560 73 74 79 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20  style_id = -1;. 
f6570 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
f6580 74 79 6c 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c  tyle_name = NULL
f6590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
f65a0 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
f65b0 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
f65c0 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
f65d0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
f65e0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
f65f0 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
f6600 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
f6610 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
f6620 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20  QLITE_TEXT).    
f6630 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
f6640 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f6650 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
f6660 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
f6670 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20  coverage_name = 
f6680 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
f6690 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f66a0 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
f66b0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
f66c0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
f66d0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
f66e0 47 45 52 29 0a 09 73 74 79 6c 65 5f 69 64 20 3d  GER)..style_id =
f66f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
f6700 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  nt (argv[1]);.  
f6710 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
f6720 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f6730 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
f6740 45 5f 54 45 58 54 29 0a 09 73 74 79 6c 65 5f 6e  E_TEXT)..style_n
f6750 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
f6760 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
f6770 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d  ue_text (argv[1]
f6780 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
f6790 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
f67a0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f67b0 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
f67c0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
f67d0 72 65 74 20 3d 20 72 65 67 69 73 74 65 72 5f 76  ret = register_v
f67e0 65 63 74 6f 72 5f 73 74 79 6c 65 64 5f 6c 61 79  ector_styled_lay
f67f0 65 72 5f 65 78 20 28 73 71 6c 69 74 65 2c 20 63  er_ex (sqlite, c
f6800 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 73 74  overage_name, st
f6810 79 6c 65 5f 69 64 2c 0a 09 09 09 09 09 20 20 20  yle_id,......   
f6820 73 74 79 6c 65 5f 6e 61 6d 65 29 3b 0a 20 20 20  style_name);.   
f6830 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f6840 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
f6850 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
f6860 69 64 0a 66 6e 63 74 5f 55 6e 52 65 67 69 73 74  id.fnct_UnRegist
f6870 65 72 56 65 63 74 6f 72 53 74 79 6c 65 64 4c 61  erVectorStyledLa
f6880 79 65 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  yer (sqlite3_con
f6890 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
f68a0 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20 20  int argc,.....  
f68b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f68c0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
f68d0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65  function:./ UnRe
f68e0 67 69 73 74 65 72 56 65 63 74 6f 72 53 74 79 6c  gisterVectorStyl
f68f0 65 64 4c 61 79 65 72 28 53 74 72 69 6e 67 20 63  edLayer(String c
f6900 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 09 49 6e  overage_name,.In
f6910 74 65 67 65 72 20 73 74 79 6c 65 5f 69 64 29 0a  teger style_id).
f6920 2f 20 20 6f 72 0a 2f 20 55 6e 52 65 67 69 73 74  /  or./ UnRegist
f6930 65 72 56 65 63 74 6f 72 53 74 79 6c 65 64 4c 61  erVectorStyledLa
f6940 79 65 72 28 53 74 72 69 6e 67 20 63 6f 76 65 72  yer(String cover
f6950 61 67 65 5f 6e 61 6d 65 2c 09 54 65 78 74 20 73  age_name,.Text s
f6960 74 79 6c 65 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 72  tyle_name)././ r
f6970 65 6d 6f 76 65 73 20 61 20 56 65 63 74 6f 72 20  emoves a Vector 
f6980 53 74 79 6c 65 64 20 4c 61 79 65 72 20 64 65 66  Styled Layer def
f6990 69 6e 69 74 69 6f 6e 0a 2f 20 72 65 74 75 72 6e  inition./ return
f69a0 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f  s 1 on success./
f69b0 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d   0 on failure, -
f69c0 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67  1 on invalid arg
f69d0 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e  uments.*/.    in
f69e0 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  t ret;.    const
f69f0 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65 5f   char *coverage_
f6a00 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 73 74  name;.    int st
f6a10 79 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20  yle_id = -1;.   
f6a20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79   const char *sty
f6a30 6c 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  le_name = NULL;.
f6a40 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
f6a50 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
f6a60 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
f6a70 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
f6a80 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
f6a90 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
f6aa0 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
f6ab0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
f6ac0 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
f6ad0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
f6ae0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
f6af0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f6b00 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
f6b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f  ;.      }.    co
f6b20 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63  verage_name = (c
f6b30 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
f6b40 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
f6b50 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
f6b60 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
f6b70 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
f6b80 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
f6b90 52 29 0a 09 73 74 79 6c 65 5f 69 64 20 3d 20 73  R)..style_id = s
f6ba0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
f6bb0 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
f6bc0 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
f6bd0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f6be0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
f6bf0 54 45 58 54 29 0a 09 73 74 79 6c 65 5f 6e 61 6d  TEXT)..style_nam
f6c00 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
f6c10 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
f6c20 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
f6c30 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
f6c40 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
f6c50 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f6c60 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
f6c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65  ;.      }.    re
f6c80 74 20 3d 20 75 6e 72 65 67 69 73 74 65 72 5f 76  t = unregister_v
f6c90 65 63 74 6f 72 5f 73 74 79 6c 65 64 5f 6c 61 79  ector_styled_lay
f6ca0 65 72 20 28 73 71 6c 69 74 65 2c 20 63 6f 76 65  er (sqlite, cove
f6cb0 72 61 67 65 5f 6e 61 6d 65 2c 20 73 74 79 6c 65  rage_name, style
f6cc0 5f 69 64 2c 0a 09 09 09 09 09 20 20 73 74 79 6c  _id,......  styl
f6cd0 65 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  e_name);.    sql
f6ce0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
f6cf0 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a  (context, ret);.
f6d00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
f6d10 6e 63 74 5f 52 65 67 69 73 74 65 72 52 61 73 74  nct_RegisterRast
f6d20 65 72 53 74 79 6c 65 20 28 73 71 6c 69 74 65 33  erStyle (sqlite3
f6d30 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
f6d40 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
f6d50 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
f6d60 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
f6d70 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52  QL function:./ R
f6d80 65 67 69 73 74 65 72 52 61 73 74 65 72 53 74 79  egisterRasterSty
f6d90 6c 65 28 42 4c 4f 42 20 73 74 79 6c 65 29 0a 2f  le(BLOB style)./
f6da0 0a 2f 20 69 6e 73 65 72 74 73 20 61 20 52 61 73  ./ inserts a Ras
f6db0 74 65 72 20 53 74 79 6c 65 20 0a 2f 20 72 65 74  ter Style ./ ret
f6dc0 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73  urns 1 on succes
f6dd0 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  s./ 0 on failure
f6de0 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20  , -1 on invalid 
f6df0 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20  arguments.*/.   
f6e00 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f   int ret;.    co
f6e10 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f6e20 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
f6e30 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
f6e40 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
f6e50 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
f6e60 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
f6e70 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
f6e80 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
f6e90 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
f6ea0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
f6eb0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f6ec0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
f6ed0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
f6ee0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f6ef0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
f6f00 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
f6f10 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
f6f20 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f6f30 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
f6f40 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
f6f50 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
f6f60 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
f6f70 20 20 72 65 74 20 3d 20 72 65 67 69 73 74 65 72    ret = register
f6f80 5f 72 61 73 74 65 72 5f 73 74 79 6c 65 20 28 73  _raster_style (s
f6f90 71 6c 69 74 65 2c 20 70 5f 62 6c 6f 62 2c 20 6e  qlite, p_blob, n
f6fa0 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 73 71 6c  _bytes);.    sql
f6fb0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
f6fc0 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a  (context, ret);.
f6fd0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
f6fe0 6e 63 74 5f 55 6e 52 65 67 69 73 74 65 72 52 61  nct_UnRegisterRa
f6ff0 73 74 65 72 53 74 79 6c 65 20 28 73 71 6c 69 74  sterStyle (sqlit
f7000 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
f7010 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
f7020 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ...    sqlite3_v
f7030 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
f7040 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
f7050 0a 2f 20 55 6e 52 65 67 69 73 74 65 72 52 61 73  ./ UnRegisterRas
f7060 74 65 72 53 74 79 6c 65 28 49 6e 74 65 67 65 72  terStyle(Integer
f7070 20 73 74 79 6c 65 5f 69 64 20 5b 20 2c 20 49 6e   style_id [ , In
f7080 74 65 67 65 72 20 72 65 6d 6f 76 65 41 6c 6c 5d  teger removeAll]
f7090 20 29 0a 2f 20 20 20 6f 72 0a 2f 20 55 6e 52 65   )./   or./ UnRe
f70a0 67 69 73 74 65 72 52 61 73 74 65 72 53 74 79 6c  gisterRasterStyl
f70b0 65 64 4c 61 79 65 72 28 54 65 78 74 20 73 74 79  edLayer(Text sty
f70c0 6c 65 5f 6e 61 6d 65 20 5b 20 2c 20 49 6e 74 65  le_name [ , Inte
f70d0 67 65 72 20 72 65 6d 6f 76 65 41 6c 6c 5d 20 29  ger removeAll] )
f70e0 0a 2f 0a 2f 20 72 65 6d 6f 76 65 73 20 61 20 52  ././ removes a R
f70f0 61 73 74 65 72 20 53 74 79 6c 65 20 64 65 66 69  aster Style defi
f7100 6e 69 74 69 6f 6e 0a 2f 20 72 65 74 75 72 6e 73  nition./ returns
f7110 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
f7120 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31  0 on failure, -1
f7130 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
f7140 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74  ments.*/.    int
f7150 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 73 74   ret;.    int st
f7160 79 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20  yle_id = -1;.   
f7170 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79   const char *sty
f7180 6c 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  le_name = NULL;.
f7190 20 20 20 20 69 6e 74 20 72 65 6d 6f 76 65 5f 61      int remove_a
f71a0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ll = 0;.    sqli
f71b0 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71  te3 *sqlite = sq
f71c0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
f71d0 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
f71e0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
f71f0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
f7200 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
f7210 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
f7220 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
f7230 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
f7240 47 45 52 29 0a 09 73 74 79 6c 65 5f 69 64 20 3d  GER)..style_id =
f7250 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
f7260 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  nt (argv[0]);.  
f7270 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
f7280 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f7290 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
f72a0 45 5f 54 45 58 54 29 0a 09 73 74 79 6c 65 5f 6e  E_TEXT)..style_n
f72b0 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
f72c0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
f72d0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
f72e0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
f72f0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
f7300 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f7310 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
f7320 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
f7330 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20  if (argc >= 2). 
f7340 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
f7350 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
f7360 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
f7370 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
f7380 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
f7390 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f73a0 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72  xt, -1);...retur
f73b0 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 72 65 6d  n;..    }..  rem
f73c0 6f 76 65 5f 61 6c 6c 20 3d 20 73 71 6c 69 74 65  ove_all = sqlite
f73d0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
f73e0 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[1]);.      }. 
f73f0 20 20 20 72 65 74 20 3d 20 75 6e 72 65 67 69 73     ret = unregis
f7400 74 65 72 5f 72 61 73 74 65 72 5f 73 74 79 6c 65  ter_raster_style
f7410 20 28 73 71 6c 69 74 65 2c 20 73 74 79 6c 65 5f   (sqlite, style_
f7420 69 64 2c 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20  id, style_name, 
f7430 72 65 6d 6f 76 65 5f 61 6c 6c 29 3b 0a 20 20 20  remove_all);.   
f7440 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f7450 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
f7460 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
f7470 69 64 0a 66 6e 63 74 5f 52 65 6c 6f 61 64 52 61  id.fnct_ReloadRa
f7480 73 74 65 72 53 74 79 6c 65 20 28 73 71 6c 69 74  sterStyle (sqlit
f7490 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
f74a0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
f74b0 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ...sqlite3_value
f74c0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
f74d0 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52  QL function:./ R
f74e0 65 6c 6f 61 64 52 61 73 74 65 72 53 74 79 6c 65  eloadRasterStyle
f74f0 28 49 6e 74 65 67 65 72 20 73 74 79 6c 65 5f 69  (Integer style_i
f7500 64 2c 20 42 4c 4f 42 20 73 74 79 6c 65 29 0a 2f  d, BLOB style)./
f7510 20 20 20 20 6f 72 0a 2f 20 52 65 6c 6f 61 64 52      or./ ReloadR
f7520 61 73 74 65 72 53 74 79 6c 65 28 54 65 78 74 20  asterStyle(Text 
f7530 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 42 4c 4f 42  style_name, BLOB
f7540 20 73 74 79 6c 65 29 0a 2f 0a 2f 20 75 70 64 61   style)././ upda
f7550 74 65 73 20 61 20 52 61 73 74 65 72 20 53 74 79  tes a Raster Sty
f7560 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  le ./ returns 1 
f7570 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
f7580 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
f7590 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
f75a0 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
f75b0 74 3b 0a 20 20 20 20 69 6e 74 20 73 74 79 6c 65  t;.    int style
f75c0 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6f  _id = -1;.    co
f75d0 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c 65 5f  nst char *style_
f75e0 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  name = NULL;.   
f75f0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f7600 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20  char *p_blob;.  
f7610 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20    int n_bytes;. 
f7620 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
f7630 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
f7640 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
f7650 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
f7660 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
f7670 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
f7680 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
f7690 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f76a0 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49  argv[0]) == SQLI
f76b0 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 73 74 79  TE_INTEGER)..sty
f76c0 6c 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  le_id = sqlite3_
f76d0 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
f76e0 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  0]);.    else if
f76f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f7700 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
f7710 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
f7720 73 74 79 6c 65 5f 6e 61 6d 65 20 3d 20 28 63 6f  style_name = (co
f7730 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
f7740 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
f7750 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c  argv[0]);.    el
f7760 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
f7770 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f7780 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
f7790 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
f77a0 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
f77b0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f77c0 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
f77d0 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
f77e0 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
f77f0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
f7800 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  -1);..  return;.
f7810 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
f7820 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
f7830 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31 5d  ue_blob (argv[1]
f7840 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
f7850 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
f7860 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a  ytes (argv[1]);.
f7870 20 20 20 20 72 65 74 20 3d 20 72 65 6c 6f 61 64      ret = reload
f7880 5f 72 61 73 74 65 72 5f 73 74 79 6c 65 20 28 73  _raster_style (s
f7890 71 6c 69 74 65 2c 20 73 74 79 6c 65 5f 69 64 2c  qlite, style_id,
f78a0 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 70 5f 62   style_name, p_b
f78b0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20  lob, n_bytes);. 
f78c0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f78d0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
f78e0 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
f78f0 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74  void.fnct_Regist
f7900 65 72 52 61 73 74 65 72 53 74 79 6c 65 64 4c 61  erRasterStyledLa
f7910 79 65 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  yer (sqlite3_con
f7920 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
f7930 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 73 71  int argc,.....sq
f7940 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
f7950 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
f7960 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 67 69 73 74  nction:./ Regist
f7970 65 72 52 61 73 74 65 72 53 74 79 6c 65 64 4c 61  erRasterStyledLa
f7980 79 65 72 28 53 74 72 69 6e 67 20 63 6f 76 65 72  yer(String cover
f7990 61 67 65 5f 6e 61 6d 65 2c 20 49 6e 74 65 67 65  age_name, Intege
f79a0 72 20 73 74 79 6c 65 5f 69 64 29 0a 2f 20 20 20  r style_id)./   
f79b0 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 52 61 73  or./ RegisterRas
f79c0 74 65 72 53 74 79 6c 65 64 4c 61 79 65 72 28 53  terStyledLayer(S
f79d0 74 72 69 6e 67 20 63 6f 76 65 72 61 67 65 5f 6e  tring coverage_n
f79e0 61 6d 65 2c 20 54 65 78 74 20 73 74 79 6c 65 5f  ame, Text style_
f79f0 6e 61 6d 65 29 0a 2f 0a 2f 20 69 6e 73 65 72 74  name)././ insert
f7a00 73 20 61 20 52 61 73 74 65 72 20 53 74 79 6c 65  s a Raster Style
f7a10 64 20 4c 61 79 65 72 20 0a 2f 20 72 65 74 75 72  d Layer ./ retur
f7a20 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a  ns 1 on success.
f7a30 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20  / 0 on failure, 
f7a40 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  -1 on invalid ar
f7a50 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69  guments.*/.    i
f7a60 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73  nt ret;.    cons
f7a70 74 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65  t char *coverage
f7a80 5f 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 73  _name;.    int s
f7a90 74 79 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20  tyle_id = -1;.  
f7aa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74    const char *st
f7ab0 79 6c 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  yle_name = NULL;
f7ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
f7ad0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
f7ae0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
f7af0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
f7b00 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
f7b10 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
f7b20 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
f7b30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
f7b40 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
f7b50 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
f7b60 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
f7b70 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f7b80 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
f7b90 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  n;.      }.    c
f7ba0 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28  overage_name = (
f7bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
f7bc0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
f7bd0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
f7be0 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
f7bf0 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
f7c00 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   == SQLITE_INTEG
f7c10 45 52 29 0a 09 73 74 79 6c 65 5f 69 64 20 3d 20  ER)..style_id = 
f7c20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
f7c30 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  t (argv[1]);.   
f7c40 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
f7c50 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
f7c60 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
f7c70 5f 54 45 58 54 29 0a 09 73 74 79 6c 65 5f 6e 61  _TEXT)..style_na
f7c80 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f7c90 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f7ca0 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29  e_text (argv[1])
f7cb0 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
f7cc0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
f7cd0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f7ce0 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
f7cf0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  n;.      }.    r
f7d00 65 74 20 3d 0a 09 72 65 67 69 73 74 65 72 5f 72  et =..register_r
f7d10 61 73 74 65 72 5f 73 74 79 6c 65 64 5f 6c 61 79  aster_styled_lay
f7d20 65 72 5f 65 78 20 28 73 71 6c 69 74 65 2c 20 63  er_ex (sqlite, c
f7d30 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 73 74  overage_name, st
f7d40 79 6c 65 5f 69 64 2c 0a 09 09 09 09 09 20 73 74  yle_id,...... st
f7d50 79 6c 65 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 73  yle_name);.    s
f7d60 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
f7d70 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
f7d80 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
f7d90 0a 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65 72  .fnct_UnRegister
f7da0 52 61 73 74 65 72 53 74 79 6c 65 64 4c 61 79 65  RasterStyledLaye
f7db0 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  r (sqlite3_conte
f7dc0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
f7dd0 74 20 61 72 67 63 2c 0a 09 09 09 09 20 20 73 71  t argc,.....  sq
f7de0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
f7df0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
f7e00 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69  nction:./ UnRegi
f7e10 73 74 65 72 52 61 73 74 65 72 53 74 79 6c 65 64  sterRasterStyled
f7e20 4c 61 79 65 72 28 53 74 72 69 6e 67 20 63 6f 76  Layer(String cov
f7e30 65 72 61 67 65 5f 6e 61 6d 65 2c 20 49 6e 74 65  erage_name, Inte
f7e40 67 65 72 20 73 74 79 6c 65 5f 69 64 29 0a 2f 20  ger style_id)./ 
f7e50 20 20 6f 72 0a 2f 20 55 6e 52 65 67 69 73 74 65    or./ UnRegiste
f7e60 72 52 61 73 74 65 72 53 74 79 6c 65 64 4c 61 79  rRasterStyledLay
f7e70 65 72 28 53 74 72 69 6e 67 20 63 6f 76 65 72 61  er(String covera
f7e80 67 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 73 74  ge_name, Text st
f7e90 79 6c 65 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 72 65  yle_name)././ re
f7ea0 6d 6f 76 65 73 20 61 20 52 61 73 74 65 72 20 53  moves a Raster S
f7eb0 74 79 6c 65 64 20 4c 61 79 65 72 20 64 65 66 69  tyled Layer defi
f7ec0 6e 69 74 69 6f 6e 0a 2f 20 72 65 74 75 72 6e 73  nition./ returns
f7ed0 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
f7ee0 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31  0 on failure, -1
f7ef0 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
f7f00 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74  ments.*/.    int
f7f10 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20   ret;.    const 
f7f20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65 5f 6e  char *coverage_n
f7f30 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 73 74 79  ame;.    int sty
f7f40 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20  le_id = -1;.    
f7f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c  const char *styl
f7f60 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20  e_name = NULL;. 
f7f70 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
f7f80 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
f7f90 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
f7fa0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
f7fb0 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
f7fc0 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
f7fd0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
f7fe0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f7ff0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
f8000 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
f8010 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
f8020 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
f8030 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
f8040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 76  .      }.    cov
f8050 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63 6f  erage_name = (co
f8060 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
f8070 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
f8080 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
f8090 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f80a0 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
f80b0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
f80c0 29 0a 09 73 74 79 6c 65 5f 69 64 20 3d 20 73 71  )..style_id = sq
f80d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
f80e0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65  (argv[1]);.    e
f80f0 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
f8100 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
f8110 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [1]) == SQLITE_T
f8120 45 58 54 29 0a 09 73 74 79 6c 65 5f 6e 61 6d 65  EXT)..style_name
f8130 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
f8140 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
f8150 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
f8160 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
f8170 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
f8180 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
f8190 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
f81a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .      }.    ret
f81b0 20 3d 0a 09 75 6e 72 65 67 69 73 74 65 72 5f 72   =..unregister_r
f81c0 61 73 74 65 72 5f 73 74 79 6c 65 64 5f 6c 61 79  aster_styled_lay
f81d0 65 72 20 28 73 71 6c 69 74 65 2c 20 63 6f 76 65  er (sqlite, cove
f81e0 72 61 67 65 5f 6e 61 6d 65 2c 20 73 74 79 6c 65  rage_name, style
f81f0 5f 69 64 2c 0a 09 09 09 09 09 73 74 79 6c 65 5f  _id,......style_
f8200 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
f8210 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f8220 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a  ontext, ret);.}.
f8230 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
f8240 74 5f 52 65 67 69 73 74 65 72 52 61 73 74 65 72  t_RegisterRaster
f8250 43 6f 76 65 72 61 67 65 53 72 69 64 20 28 73 71  CoverageSrid (sq
f8260 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
f8270 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
f8280 63 2c 0a 09 09 09 09 20 73 71 6c 69 74 65 33 5f  c,..... sqlite3_
f8290 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
f82a0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
f82b0 3a 0a 2f 20 52 65 67 69 73 74 65 72 52 61 73 74  :./ RegisterRast
f82c0 65 72 43 6f 76 65 72 61 67 65 53 72 69 64 28 54  erCoverageSrid(T
f82d0 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d  ext coverage_nam
f82e0 65 2c 20 49 6e 74 65 67 65 72 20 73 72 69 64 29  e, Integer srid)
f82f0 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61 20 52  ././ inserts a R
f8300 61 73 74 65 72 20 43 6f 76 65 72 61 67 65 20 61  aster Coverage a
f8310 6c 74 65 72 6e 61 74 69 76 65 20 53 52 49 44 0a  lternative SRID.
f8320 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
f8330 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
f8340 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76  ilure, -1 on inv
f8350 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
f8360 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
f8370 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63     const char *c
f8380 6f 76 65 72 61 67 65 5f 6e 61 6d 65 3b 0a 20 20  overage_name;.  
f8390 20 20 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20    int srid;.    
f83a0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
f83b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
f83c0 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
f83d0 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
f83e0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
f83f0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
f8400 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
f8410 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f8420 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
f8430 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33  TEXT..|| sqlite3
f8440 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f8450 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
f8460 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
f8470 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
f8480 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
f8490 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
f84a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 76  .      }.    cov
f84b0 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28 63 6f  erage_name = (co
f84c0 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
f84d0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
f84e0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 72  argv[0]);.    sr
f84f0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
f8500 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
f8510 3b 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67 69  ;.    ret = regi
f8520 73 74 65 72 5f 72 61 73 74 65 72 5f 63 6f 76 65  ster_raster_cove
f8530 72 61 67 65 5f 73 72 69 64 20 28 73 71 6c 69 74  rage_srid (sqlit
f8540 65 2c 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65  e, coverage_name
f8550 2c 20 73 72 69 64 29 3b 0a 20 20 20 20 73 71 6c  , srid);.    sql
f8560 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
f8570 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a  (context, ret);.
f8580 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
f8590 6e 63 74 5f 55 6e 72 65 67 69 73 74 65 72 52 61  nct_UnregisterRa
f85a0 73 74 65 72 43 6f 76 65 72 61 67 65 53 72 69 64  sterCoverageSrid
f85b0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
f85c0 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
f85d0 20 61 72 67 63 2c 0a 09 09 09 09 20 20 20 73 71   argc,.....   sq
f85e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
f85f0 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
f8600 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69  nction:./ UnRegi
f8610 73 74 65 72 52 61 73 74 65 72 43 6f 76 65 72 61  sterRasterCovera
f8620 67 65 53 72 69 64 28 54 65 78 74 20 63 6f 76 65  geSrid(Text cove
f8630 72 61 67 65 5f 6e 61 6d 65 2c 20 49 6e 74 65 67  rage_name, Integ
f8640 65 72 20 73 72 69 64 29 0a 2f 0a 2f 20 64 65 6c  er srid)././ del
f8650 65 74 65 73 20 61 20 52 61 73 74 65 72 20 43 6f  etes a Raster Co
f8660 76 65 72 61 67 65 20 61 6c 74 65 72 6e 61 74 69  verage alternati
f8670 76 65 20 53 52 49 44 0a 2f 20 72 65 74 75 72 6e  ve SRID./ return
f8680 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f  s 1 on success./
f8690 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d   0 on failure, -
f86a0 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67  1 on invalid arg
f86b0 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e  uments.*/.    in
f86c0 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  t ret;.    const
f86d0 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65 5f   char *coverage_
f86e0 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 73 72  name;.    int sr
f86f0 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  id;.    sqlite3 
f8700 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65  *sqlite = sqlite
f8710 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
f8720 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  dle (context);. 
f8730 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
f8740 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
f8750 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
f8760 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
f8770 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
f8780 20 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c   SQLITE_TEXT..||
f8790 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f87a0 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
f87b0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
f87c0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
f87d0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
f87e0 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20  context, -1);.. 
f87f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
f8800 0a 20 20 20 20 63 6f 76 65 72 61 67 65 5f 6e 61  .    coverage_na
f8810 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f8820 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f8830 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
f8840 3b 0a 20 20 20 20 73 72 69 64 20 3d 20 73 71 6c  ;.    srid = sql
f8850 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
f8860 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65  argv[1]);.    re
f8870 74 20 3d 20 75 6e 72 65 67 69 73 74 65 72 5f 72  t = unregister_r
f8880 61 73 74 65 72 5f 63 6f 76 65 72 61 67 65 5f 73  aster_coverage_s
f8890 72 69 64 20 28 73 71 6c 69 74 65 2c 20 63 6f 76  rid (sqlite, cov
f88a0 65 72 61 67 65 5f 6e 61 6d 65 2c 20 73 72 69 64  erage_name, srid
f88b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
f88c0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
f88d0 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
f88e0 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65  tic void.fnct_Re
f88f0 67 69 73 74 65 72 52 61 73 74 65 72 43 6f 76 65  gisterRasterCove
f8900 72 61 67 65 4b 65 79 77 6f 72 64 20 28 73 71 6c  rageKeyword (sql
f8910 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
f8920 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
f8930 2c 0a 09 09 09 09 20 20 20 20 73 71 6c 69 74 65  ,.....    sqlite
f8940 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
f8950 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
f8960 6f 6e 3a 0a 2f 20 52 65 67 69 73 74 65 72 52 61  on:./ RegisterRa
f8970 73 74 65 72 43 6f 76 65 72 61 67 65 4b 65 79 77  sterCoverageKeyw
f8980 6f 72 64 28 54 65 78 74 20 63 6f 76 65 72 61 67  ord(Text coverag
f8990 65 5f 6e 61 6d 65 2c 20 54 65 78 74 20 6b 65 79  e_name, Text key
f89a0 77 6f 72 64 29 0a 2f 0a 2f 20 69 6e 73 65 72 74  word)././ insert
f89b0 73 20 61 20 52 61 73 74 65 72 20 43 6f 76 65 72  s a Raster Cover
f89c0 61 67 65 20 4b 65 79 77 6f 72 64 0a 2f 20 72 65  age Keyword./ re
f89d0 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
f89e0 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
f89f0 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
f8a00 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
f8a10 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
f8a20 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 76 65 72  onst char *cover
f8a30 61 67 65 5f 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  age_name;.    co
f8a40 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 77 6f 72  nst char *keywor
f8a50 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
f8a60 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
f8a70 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
f8a80 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
f8a90 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
f8aa0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
f8ab0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
f8ac0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f8ad0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
f8ae0 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20  SQLITE_TEXT..|| 
f8af0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f8b00 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
f8b10 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
f8b20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
f8b30 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f8b40 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
f8b50 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
f8b60 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d   coverage_name =
f8b70 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
f8b80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f8b90 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt (argv[0]);.  
f8ba0 20 20 6b 65 79 77 6f 72 64 20 3d 20 28 63 6f 6e    keyword = (con
f8bb0 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
f8bc0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
f8bd0 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[1]);.    ret
f8be0 20 3d 20 72 65 67 69 73 74 65 72 5f 72 61 73 74   = register_rast
f8bf0 65 72 5f 63 6f 76 65 72 61 67 65 5f 6b 65 79 77  er_coverage_keyw
f8c00 6f 72 64 20 28 73 71 6c 69 74 65 2c 20 63 6f 76  ord (sqlite, cov
f8c10 65 72 61 67 65 5f 6e 61 6d 65 2c 20 6b 65 79 77  erage_name, keyw
f8c20 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ord);.    sqlite
f8c30 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
f8c40 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a  ntext, ret);.}..
f8c50 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
f8c60 5f 55 6e 72 65 67 69 73 74 65 72 52 61 73 74 65  _UnregisterRaste
f8c70 72 43 6f 76 65 72 61 67 65 4b 65 79 77 6f 72 64  rCoverageKeyword
f8c80 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
f8c90 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
f8ca0 20 61 72 67 63 2c 0a 09 09 09 09 20 20 20 20 20   argc,.....     
f8cb0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
f8cc0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
f8cd0 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52   function:./ UnR
f8ce0 65 67 69 73 74 65 72 52 61 73 74 65 72 43 6f 76  egisterRasterCov
f8cf0 65 72 61 67 65 4b 65 79 77 6f 72 64 28 54 65 78  erageKeyword(Tex
f8d00 74 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c  t coverage_name,
f8d10 20 54 65 78 74 20 6b 65 79 77 6f 72 64 29 0a 2f   Text keyword)./
f8d20 0a 2f 20 64 65 6c 65 74 65 73 20 61 20 52 61 73  ./ deletes a Ras
f8d30 74 65 72 20 43 6f 76 65 72 61 67 65 20 4b 65 79  ter Coverage Key
f8d40 77 6f 72 64 0a 2f 20 72 65 74 75 72 6e 73 20 31  word./ returns 1
f8d50 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20   on success./ 0 
f8d60 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f  on failure, -1 o
f8d70 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
f8d80 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72  nts.*/.    int r
f8d90 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  et;.    const ch
f8da0 61 72 20 2a 63 6f 76 65 72 61 67 65 5f 6e 61 6d  ar *coverage_nam
f8db0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
f8dc0 72 20 2a 6b 65 79 77 6f 72 64 3b 0a 20 20 20 20  r *keyword;.    
f8dd0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
f8de0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
f8df0 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
f8e00 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
f8e10 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
f8e20 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
f8e30 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
f8e40 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f8e50 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
f8e60 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33  TEXT..|| sqlite3
f8e70 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
f8e80 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[1]) != SQLITE_
f8e90 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
f8ea0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f8eb0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
f8ec0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
f8ed0 20 20 20 20 7d 0a 20 20 20 20 63 6f 76 65 72 61      }.    covera
f8ee0 67 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  ge_name = (const
f8ef0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
f8f00 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
f8f10 76 5b 30 5d 29 3b 0a 20 20 20 20 6b 65 79 77 6f  v[0]);.    keywo
f8f20 72 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rd = (const char
f8f30 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f8f40 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29  e_text (argv[1])
f8f50 3b 0a 20 20 20 20 72 65 74 20 3d 20 75 6e 72 65  ;.    ret = unre
f8f60 67 69 73 74 65 72 5f 72 61 73 74 65 72 5f 63 6f  gister_raster_co
f8f70 76 65 72 61 67 65 5f 6b 65 79 77 6f 72 64 20 28  verage_keyword (
f8f80 73 71 6c 69 74 65 2c 20 63 6f 76 65 72 61 67 65  sqlite, coverage
f8f90 5f 6e 61 6d 65 2c 20 6b 65 79 77 6f 72 64 29 3b  _name, keyword);
f8fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
f8fb0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f8fc0 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  , ret);.}..stati
f8fd0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 70 64 61  c void.fnct_Upda
f8fe0 74 65 52 61 73 74 65 72 43 6f 76 65 72 61 67 65  teRasterCoverage
f8ff0 45 78 74 65 6e 74 20 28 73 71 6c 69 74 65 33 5f  Extent (sqlite3_
f9000 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
f9010 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09  t, int argc,....
f9020 09 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  . sqlite3_value 
f9030 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
f9040 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 55 70  L function:./ Up
f9050 64 61 74 65 52 61 73 74 65 72 43 6f 76 65 72 61  dateRasterCovera
f9060 67 65 45 78 74 65 6e 74 28 29 0a 2f 20 20 20 6f  geExtent()./   o
f9070 72 0a 2f 20 55 70 64 61 74 65 52 61 73 74 65 72  r./ UpdateRaster
f9080 43 6f 76 65 72 61 67 65 45 78 74 65 6e 74 28 49  CoverageExtent(I
f9090 6e 74 65 67 65 72 20 74 72 61 6e 73 61 63 74 69  nteger transacti
f90a0 6f 6e 29 0a 2f 20 20 20 6f 72 0a 2f 20 55 70 64  on)./   or./ Upd
f90b0 61 74 65 52 61 73 74 65 72 43 6f 76 65 72 61 67  ateRasterCoverag
f90c0 65 45 78 74 65 6e 74 28 54 65 78 74 20 63 6f 76  eExtent(Text cov
f90d0 65 72 61 67 65 5f 6e 61 6d 65 29 0a 2f 20 20 20  erage_name)./   
f90e0 6f 72 0a 2f 20 55 70 64 61 74 65 52 61 73 74 65  or./ UpdateRaste
f90f0 72 43 6f 76 65 72 61 67 65 45 78 74 65 6e 74 28  rCoverageExtent(
f9100 54 65 78 74 20 63 6f 76 65 72 61 67 65 5f 6e 61  Text coverage_na
f9110 6d 65 2c 20 69 6e 74 20 74 72 61 6e 73 61 63 74  me, int transact
f9120 69 6f 6e 29 0a 2f 0a 2f 20 75 70 64 61 74 65 73  ion)././ updates
f9130 20 52 61 73 74 65 72 20 43 6f 76 65 72 61 67 65   Raster Coverage
f9140 20 45 78 74 65 6e 74 73 0a 2f 20 72 65 74 75 72   Extents./ retur
f9150 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a  ns 1 on success.
f9160 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20  / 0 on failure, 
f9170 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72  -1 on invalid ar
f9180 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69  guments.*/.    i
f9190 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73  nt ret;.    cons
f91a0 74 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65  t char *coverage
f91b0 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _name = NULL;.  
f91c0 20 20 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f    int transactio
f91d0 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  n = 0;.    sqlit
f91e0 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c  e3 *sqlite = sql
f91f0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
f9200 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29  handle (context)
f9210 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c  ;.    struct spl
f9220 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
f9230 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69  he *cache = sqli
f9240 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
f9250 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
f9260 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
f9270 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
f9280 2a 2f 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  */.    if (argc 
f9290 3e 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09 20  >= 1).      {.. 
f92a0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
f92b0 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
f92c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
f92d0 29 0a 09 20 20 20 20 20 20 63 6f 76 65 72 61 67  )..      coverag
f92e0 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  e_name = (const 
f92f0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
f9300 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
f9310 5b 30 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  [0]);..  else if
f9320 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f9330 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
f9340 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
f9350 29 0a 09 20 20 20 20 20 20 74 72 61 6e 73 61 63  )..      transac
f9360 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  tion = sqlite3_v
f9370 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30  alue_int (argv[0
f9380 5d 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  ]);..  else..   
f9390 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
f93a0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f93b0 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e 3b  , -1);...return;
f93c0 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
f93d0 20 20 20 20 69 66 20 28 61 72 67 63 20 3e 3d 20      if (argc >= 
f93e0 32 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  2).      {..  if
f93f0 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f9400 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
f9410 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
f9420 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
f9430 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
f9440 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75  ext, -1);...retu
f9450 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
f9460 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
f9470 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21  type (argv[1]) !
f9480 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
f9490 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  )..    {...sqlit
f94a0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
f94b0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72  ontext, -1);...r
f94c0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
f94d0 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d   coverage_name =
f94e0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
f94f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f9500 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  xt (argv[0]);.. 
f9510 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 73   transaction = s
f9520 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
f9530 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
f9540 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 75    }.    ret =..u
f9550 70 64 61 74 65 5f 72 61 73 74 65 72 5f 63 6f 76  pdate_raster_cov
f9560 65 72 61 67 65 5f 65 78 74 65 6e 74 20 28 73 71  erage_extent (sq
f9570 6c 69 74 65 2c 20 63 61 63 68 65 2c 20 63 6f 76  lite, cache, cov
f9580 65 72 61 67 65 5f 6e 61 6d 65 2c 0a 09 09 09 09  erage_name,.....
f9590 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
f95a0 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  on);.    sqlite3
f95b0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
f95c0 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73  text, ret);.}..s
f95d0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
f95e0 52 65 67 69 73 74 65 72 53 74 79 6c 65 64 47 72  RegisterStyledGr
f95f0 6f 75 70 52 61 73 74 65 72 20 28 73 71 6c 69 74  oupRaster (sqlit
f9600 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
f9610 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
f9620 09 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75  ....sqlite3_valu
f9630 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
f9640 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
f9650 52 65 67 69 73 74 65 72 53 74 79 6c 65 64 47 72  RegisterStyledGr
f9660 6f 75 70 52 61 73 74 65 72 28 53 74 72 69 6e 67  oupRaster(String
f9670 20 67 72 6f 75 70 5f 6e 61 6d 65 2c 20 53 74 72   group_name, Str
f9680 69 6e 67 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d  ing coverage_nam
f9690 65 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61  e)././ inserts a
f96a0 20 53 74 79 6c 65 64 20 47 72 6f 75 70 20 52 61   Styled Group Ra
f96b0 73 74 65 72 20 69 74 65 6d 20 0a 2f 20 72 65 74  ster item ./ ret
f96c0 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65 73  urns 1 on succes
f96d0 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  s./ 0 on failure
f96e0 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20  , -1 on invalid 
f96f0 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20  arguments.*/.   
f9700 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f   int ret;.    co
f9710 6e 73 74 20 63 68 61 72 20 2a 67 72 6f 75 70 5f  nst char *group_
f9720 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  name = NULL;.   
f9730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 76   const char *cov
f9740 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c  erage_name = NUL
f9750 4c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  L;.    sqlite3 *
f9760 73 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33  sqlite = sqlite3
f9770 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
f9780 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  le (context);.  
f9790 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
f97a0 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
f97b0 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
f97c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f97d0 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
f97e0 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 26 26 20  SQLITE_TEXT..&& 
f97f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
f9800 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
f9810 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
f9820 20 20 20 7b 0a 09 20 20 67 72 6f 75 70 5f 6e 61     {..  group_na
f9830 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f9840 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f9850 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29  e_text (argv[0])
f9860 3b 0a 09 20 20 63 6f 76 65 72 61 67 65 5f 6e 61  ;..  coverage_na
f9870 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f9880 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
f9890 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29  e_text (argv[1])
f98a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
f98b0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
f98c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f98d0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
f98e0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
f98f0 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67   }.    ret = reg
f9900 69 73 74 65 72 5f 73 74 79 6c 65 64 5f 67 72 6f  ister_styled_gro
f9910 75 70 5f 65 78 20 28 73 71 6c 69 74 65 2c 20 67  up_ex (sqlite, g
f9920 72 6f 75 70 5f 6e 61 6d 65 2c 20 4e 55 4c 4c 2c  roup_name, NULL,
f9930 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 29 3b   coverage_name);
f9940 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
f9950 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
f9960 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  , ret);.}..stati
f9970 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69  c void.fnct_Regi
f9980 73 74 65 72 53 74 79 6c 65 64 47 72 6f 75 70 56  sterStyledGroupV
f9990 65 63 74 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  ector (sqlite3_c
f99a0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
f99b0 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09  , int argc,.....
f99c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f99d0 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
f99e0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 67 69  function:./ Regi
f99f0 73 74 65 72 53 74 79 6c 65 64 47 72 6f 75 70 56  sterStyledGroupV
f9a00 65 63 74 6f 72 28 53 74 72 69 6e 67 20 67 72 6f  ector(String gro
f9a10 75 70 5f 6e 61 6d 65 2c 20 53 74 72 69 6e 67 20  up_name, String 
f9a20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 29 0a 2f  coverage_name)./
f9a30 0a 2f 20 69 6e 73 65 72 74 73 20 61 20 53 74 79  ./ inserts a Sty
f9a40 6c 65 64 20 47 72 6f 75 70 20 56 65 63 74 6f 72  led Group Vector
f9a50 20 69 74 65 6d 20 0a 2f 20 72 65 74 75 72 6e 73   item ./ returns
f9a60 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
f9a70 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31  0 on failure, -1
f9a80 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
f9a90 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74  ments.*/.    int
f9aa0 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20   ret;.    const 
f9ab0 63 68 61 72 20 2a 67 72 6f 75 70 5f 6e 61 6d 65  char *group_name
f9ac0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
f9ad0 73 74 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67  st char *coverag
f9ae0 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20  e_name = NULL;. 
f9af0 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
f9b00 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
f9b10 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
f9b20 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
f9b30 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
f9b40 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
f9b50 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
f9b60 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f9b70 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49  argv[0]) == SQLI
f9b80 54 45 5f 54 45 58 54 0a 09 26 26 20 73 71 6c 69  TE_TEXT..&& sqli
f9b90 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
f9ba0 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
f9bb0 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
f9bc0 0a 09 20 20 67 72 6f 75 70 5f 6e 61 6d 65 20 3d  ..  group_name =
f9bd0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
f9be0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f9bf0 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  xt (argv[0]);.. 
f9c00 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d   coverage_name =
f9c10 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
f9c20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f9c30 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  xt (argv[1]);.  
f9c40 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
f9c50 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
f9c60 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
f9c70 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
f9c80 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
f9c90 20 20 20 72 65 74 20 3d 20 72 65 67 69 73 74 65     ret = registe
f9ca0 72 5f 73 74 79 6c 65 64 5f 67 72 6f 75 70 5f 65  r_styled_group_e
f9cb0 78 20 28 73 71 6c 69 74 65 2c 20 67 72 6f 75 70  x (sqlite, group
f9cc0 5f 6e 61 6d 65 2c 20 63 6f 76 65 72 61 67 65 5f  _name, coverage_
f9cd0 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  name, NULL);.   
f9ce0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f9cf0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
f9d00 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
f9d10 69 64 0a 66 6e 63 74 5f 53 65 74 53 74 79 6c 65  id.fnct_SetStyle
f9d20 64 47 72 6f 75 70 4c 61 79 65 72 50 61 69 6e 74  dGroupLayerPaint
f9d30 4f 72 64 65 72 20 28 73 71 6c 69 74 65 33 5f 63  Order (sqlite3_c
f9d40 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
f9d50 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09  , int argc,.....
f9d60 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
f9d70 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
f9d80 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
f9d90 53 65 74 53 74 79 6c 65 64 47 72 6f 75 70 4c 61  SetStyledGroupLa
f9da0 79 65 72 50 61 69 6e 74 4f 72 64 65 72 28 49 6e  yerPaintOrder(In
f9db0 74 65 67 65 72 20 69 74 65 6d 5f 69 64 2c 20 49  teger item_id, I
f9dc0 6e 74 65 67 65 72 20 70 61 69 6e 74 5f 6f 72 64  nteger paint_ord
f9dd0 65 72 29 0a 2f 0a 2f 20 73 65 74 73 20 74 68 65  er)././ sets the
f9de0 20 70 61 69 6e 74 20 6f 72 64 65 72 20 66 6f 72   paint order for
f9df0 20 61 20 53 74 79 6c 65 64 20 4c 61 79 65 72 20   a Styled Layer 
f9e00 77 69 74 68 69 6e 20 61 20 53 74 79 6c 65 64 20  within a Styled 
f9e10 47 72 6f 75 70 20 0a 2f 20 72 65 74 75 72 6e 73  Group ./ returns
f9e20 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
f9e30 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31  0 on failure, -1
f9e40 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
f9e50 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74  ments.*/.    int
f9e60 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 74   ret;.    int it
f9e70 65 6d 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20  em_id = -1;.    
f9e80 69 6e 74 20 70 61 69 6e 74 5f 6f 72 64 65 72 20  int paint_order 
f9e90 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f9ea0 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71 6c 69  3 *sqlite = sqli
f9eb0 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
f9ec0 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74 29 3b  andle (context);
f9ed0 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
f9ee0 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
f9ef0 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
f9f00 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
f9f10 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
f9f20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  != SQLITE_INTEGE
f9f30 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  R).      {..  sq
f9f40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f9f50 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
f9f60 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
f9f70 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74   }.    if (sqlit
f9f80 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
f9f90 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[1]) != SQLIT
f9fa0 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
f9fb0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
f9fc0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
f9fd0 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
f9fe0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
f9ff0 74 65 6d 5f 69 64 20 3d 20 73 71 6c 69 74 65 33  tem_id = sqlite3
fa000 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
fa010 5b 30 5d 29 3b 0a 20 20 20 20 70 61 69 6e 74 5f  [0]);.    paint_
fa020 6f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  order = sqlite3_
fa030 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
fa040 31 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 0a 09  1]);.    ret =..
fa050 73 65 74 5f 73 74 79 6c 65 64 5f 67 72 6f 75 70  set_styled_group
fa060 5f 6c 61 79 65 72 5f 70 61 69 6e 74 5f 6f 72 64  _layer_paint_ord
fa070 65 72 20 28 73 71 6c 69 74 65 2c 20 69 74 65 6d  er (sqlite, item
fa080 5f 69 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  _id, NULL, NULL,
fa090 20 4e 55 4c 4c 2c 0a 09 09 09 09 09 20 20 20 20   NULL,......    
fa0a0 70 61 69 6e 74 5f 6f 72 64 65 72 29 3b 0a 20 20  paint_order);.  
fa0b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
fa0c0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
fa0d0 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
fa0e0 6f 69 64 0a 66 6e 63 74 5f 53 65 74 53 74 79 6c  oid.fnct_SetStyl
fa0f0 65 64 47 72 6f 75 70 56 65 63 74 6f 72 50 61 69  edGroupVectorPai
fa100 6e 74 4f 72 64 65 72 20 28 73 71 6c 69 74 65 33  ntOrder (sqlite3
fa110 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
fa120 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
fa130 09 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ..     sqlite3_v
fa140 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
fa150 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
fa160 0a 2f 20 53 65 74 53 74 79 6c 65 64 47 72 6f 75  ./ SetStyledGrou
fa170 70 56 65 63 74 6f 72 50 61 69 6e 74 4f 72 64 65  pVectorPaintOrde
fa180 72 28 53 74 72 69 6e 67 20 67 72 6f 75 70 5f 6e  r(String group_n
fa190 61 6d 65 2c 20 53 74 72 69 6e 67 20 63 6f 76 65  ame, String cove
fa1a0 72 61 67 65 5f 6e 61 6d 65 2c 20 0a 2f 20 20 20  rage_name, ./   
fa1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa1c0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
fa1d0 67 65 72 20 70 61 69 6e 74 5f 6f 72 64 65 72 29  ger paint_order)
fa1e0 29 0a 2f 0a 2f 20 73 65 74 73 20 74 68 65 20 70  )././ sets the p
fa1f0 61 69 6e 74 20 6f 72 64 65 72 20 66 6f 72 20 61  aint order for a
fa200 20 56 65 63 74 6f 72 20 53 74 79 6c 65 64 20 4c   Vector Styled L
fa210 61 79 65 72 20 77 69 74 68 69 6e 20 61 20 53 74  ayer within a St
fa220 79 6c 65 64 20 47 72 6f 75 70 20 0a 2f 20 72 65  yled Group ./ re
fa230 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
fa240 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
fa250 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
fa260 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
fa270 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63    int ret;.    c
fa280 6f 6e 73 74 20 63 68 61 72 20 2a 67 72 6f 75 70  onst char *group
fa290 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _name = NULL;.  
fa2a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
fa2b0 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 4e 55  verage_name = NU
fa2c0 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 70 61 69 6e  LL;.    int pain
fa2d0 74 5f 6f 72 64 65 72 20 3d 20 2d 31 3b 0a 20 20  t_order = -1;.  
fa2e0 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
fa2f0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
fa300 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
fa310 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
fa320 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
fa330 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
fa340 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
fa350 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
fa360 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
fa370 45 5f 54 45 58 54 0a 09 26 26 20 73 71 6c 69 74  E_TEXT..&& sqlit
fa380 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
fa390 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
fa3a0 45 5f 54 45 58 54 0a 09 26 26 20 73 71 6c 69 74  E_TEXT..&& sqlit
fa3b0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
fa3c0 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
fa3d0 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20  E_INTEGER).     
fa3e0 20 7b 0a 09 20 20 67 72 6f 75 70 5f 6e 61 6d 65   {..  group_name
fa3f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
fa400 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
fa410 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
fa420 09 20 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65  .  coverage_name
fa430 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
fa440 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
fa450 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  text (argv[1]);.
fa460 09 20 20 70 61 69 6e 74 5f 6f 72 64 65 72 20 3d  .  paint_order =
fa470 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
fa480 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  nt (argv[2]);.  
fa490 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
fa4a0 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
fa4b0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
fa4c0 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
fa4d0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
fa4e0 20 20 20 72 65 74 20 3d 0a 09 73 65 74 5f 73 74     ret =..set_st
fa4f0 79 6c 65 64 5f 67 72 6f 75 70 5f 6c 61 79 65 72  yled_group_layer
fa500 5f 70 61 69 6e 74 5f 6f 72 64 65 72 20 28 73 71  _paint_order (sq
fa510 6c 69 74 65 2c 20 2d 31 2c 20 67 72 6f 75 70 5f  lite, -1, group_
fa520 6e 61 6d 65 2c 0a 09 09 09 09 09 20 20 20 20 63  name,......    c
fa530 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 4e 55  overage_name, NU
fa540 4c 4c 2c 20 70 61 69 6e 74 5f 6f 72 64 65 72 29  LL, paint_order)
fa550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
fa560 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
fa570 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74  t, ret);.}..stat
fa580 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 65 74  ic void.fnct_Set
fa590 53 74 79 6c 65 64 47 72 6f 75 70 52 61 73 74 65  StyledGroupRaste
fa5a0 72 50 61 69 6e 74 4f 72 64 65 72 20 28 73 71 6c  rPaintOrder (sql
fa5b0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
fa5c0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
fa5d0 2c 0a 09 09 09 09 20 20 20 20 20 73 71 6c 69 74  ,.....     sqlit
fa5e0 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
fa5f0 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
fa600 69 6f 6e 3a 0a 2f 20 53 65 74 53 74 79 6c 65 64  ion:./ SetStyled
fa610 47 72 6f 75 70 52 61 73 74 65 72 50 61 69 6e 74  GroupRasterPaint
fa620 4f 72 64 65 72 28 53 74 72 69 6e 67 20 67 72 6f  Order(String gro
fa630 75 70 5f 6e 61 6d 65 2c 20 53 74 72 69 6e 67 20  up_name, String 
fa640 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c 20 0a  coverage_name, .
fa650 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
fa660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa670 49 6e 74 65 67 65 72 20 70 61 69 6e 74 5f 6f 72  Integer paint_or
fa680 64 65 72 29 29 0a 2f 0a 2f 20 73 65 74 73 20 74  der))././ sets t
fa690 68 65 20 70 61 69 6e 74 20 6f 72 64 65 72 20 66  he paint order f
fa6a0 6f 72 20 61 20 52 61 73 74 65 72 20 53 74 79 6c  or a Raster Styl
fa6b0 65 64 20 4c 61 79 65 72 20 77 69 74 68 69 6e 20  ed Layer within 
fa6c0 61 20 53 74 79 6c 65 64 20 47 72 6f 75 70 20 0a  a Styled Group .
fa6d0 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73  / returns 1 on s
fa6e0 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61  uccess./ 0 on fa
fa6f0 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76  ilure, -1 on inv
fa700 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  alid arguments.*
fa710 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20  /.    int ret;. 
fa720 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 67     const char *g
fa730 72 6f 75 70 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c  roup_name = NULL
fa740 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fa750 20 2a 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20   *coverage_name 
fa760 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
fa770 70 61 69 6e 74 5f 6f 72 64 65 72 20 3d 20 2d 31  paint_order = -1
fa780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73  ;.    sqlite3 *s
fa790 71 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  qlite = sqlite3_
fa7a0 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
fa7b0 65 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e (context);.   
fa7c0 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
fa7d0 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
fa7e0 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
fa7f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
fa800 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53  e (argv[0]) == S
fa810 51 4c 49 54 45 5f 54 45 58 54 0a 09 26 26 20 73  QLITE_TEXT..&& s
fa820 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
fa830 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
fa840 51 4c 49 54 45 5f 54 45 58 54 0a 09 26 26 20 73  QLITE_TEXT..&& s
fa850 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
fa860 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
fa870 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20  QLITE_INTEGER). 
fa880 20 20 20 20 20 7b 0a 09 20 20 67 72 6f 75 70 5f       {..  group_
fa890 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
fa8a0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
fa8b0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
fa8c0 5d 29 3b 0a 09 20 20 63 6f 76 65 72 61 67 65 5f  ]);..  coverage_
fa8d0 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
fa8e0 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
fa8f0 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
fa900 5d 29 3b 0a 09 20 20 70 61 69 6e 74 5f 6f 72 64  ]);..  paint_ord
fa910 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  er = sqlite3_val
fa920 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
fa930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
fa940 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
fa950 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
fa960 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
fa970 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
fa980 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 65   }.    ret =..se
fa990 74 5f 73 74 79 6c 65 64 5f 67 72 6f 75 70 5f 6c  t_styled_group_l
fa9a0 61 79 65 72 5f 70 61 69 6e 74 5f 6f 72 64 65 72  ayer_paint_order
fa9b0 20 28 73 71 6c 69 74 65 2c 20 2d 31 2c 20 67 72   (sqlite, -1, gr
fa9c0 6f 75 70 5f 6e 61 6d 65 2c 0a 09 09 09 09 09 20  oup_name,...... 
fa9d0 20 20 20 4e 55 4c 4c 2c 20 63 6f 76 65 72 61 67     NULL, coverag
fa9e0 65 5f 6e 61 6d 65 2c 20 70 61 69 6e 74 5f 6f 72  e_name, paint_or
fa9f0 64 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  der);.    sqlite
faa00 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
faa10 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a  ntext, ret);.}..
faa20 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
faa30 5f 53 65 74 53 74 79 6c 65 64 47 72 6f 75 70 49  _SetStyledGroupI
faa40 6e 66 6f 73 20 28 73 71 6c 69 74 65 33 5f 63 6f  nfos (sqlite3_co
faa50 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
faa60 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20   int argc,....  
faa70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
faa80 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
faa90 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 53 65 74 53  function:./ SetS
faaa0 74 79 6c 65 64 47 72 6f 75 70 49 6e 66 6f 73 28  tyledGroupInfos(
faab0 53 74 72 69 6e 67 20 67 72 6f 75 70 5f 6e 61 6d  String group_nam
faac0 65 2c 20 53 74 72 69 6e 67 20 74 69 74 6c 65 2c  e, String title,
faad0 20 0a 2f 09 09 20 20 20 20 20 20 53 74 72 69 6e   ./..      Strin
faae0 67 20 61 62 73 74 72 61 63 74 29 0a 2f 0a 2f 20  g abstract)././ 
faaf0 69 6e 73 65 72 74 73 20 6f 72 20 75 70 64 61 74  inserts or updat
fab00 65 73 20 74 68 65 20 64 65 73 63 72 69 70 74 69  es the descripti
fab10 76 65 20 69 6e 66 6f 73 20 73 75 70 70 6f 72 74  ve infos support
fab20 69 6e 67 20 61 20 53 74 79 6c 65 64 20 47 72 6f  ing a Styled Gro
fab30 75 70 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  up ./ returns 1 
fab40 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
fab50 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
fab60 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
fab70 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
fab80 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
fab90 72 20 2a 67 72 6f 75 70 5f 6e 61 6d 65 3b 0a 20  r *group_name;. 
faba0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74     const char *t
fabb0 69 74 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  itle = NULL;.   
fabc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 62 73   const char *abs
fabd0 74 72 61 63 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  tract = NULL;.  
fabe0 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74    sqlite3 *sqlit
fabf0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  e = sqlite3_cont
fac00 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63  ext_db_handle (c
fac10 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49  ontext);.    GAI
fac20 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
fac30 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
fac40 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
fac50 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
fac60 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
fac70 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a  E_TEXT).      {.
fac80 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
fac90 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
faca0 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  -1);..  return;.
facb0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
facc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
facd0 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
face0 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20  SQLITE_TEXT).   
facf0 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
fad00 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
fad10 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
fad20 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
fad30 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
fad40 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
fad50 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) != SQLITE_TEXT
fad60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
fad70 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
fad80 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
fad90 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
fada0 7d 0a 20 20 20 20 67 72 6f 75 70 5f 6e 61 6d 65  }.    group_name
fadb0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
fadc0 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
fadd0 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  text (argv[0]);.
fade0 20 20 20 20 74 69 74 6c 65 20 3d 20 28 63 6f 6e      title = (con
fadf0 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
fae00 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
fae10 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 61 62 73  rgv[1]);.    abs
fae20 74 72 61 63 74 20 3d 20 28 63 6f 6e 73 74 20 63  tract = (const c
fae30 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
fae40 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
fae50 32 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  2]);.    ret = s
fae60 74 79 6c 65 64 5f 67 72 6f 75 70 5f 73 65 74 5f  tyled_group_set_
fae70 69 6e 66 6f 73 20 28 73 71 6c 69 74 65 2c 20 67  infos (sqlite, g
fae80 72 6f 75 70 5f 6e 61 6d 65 2c 20 74 69 74 6c 65  roup_name, title
fae90 2c 20 61 62 73 74 72 61 63 74 29 3b 0a 20 20 20  , abstract);.   
faea0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
faeb0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
faec0 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
faed0 69 64 0a 66 6e 63 74 5f 55 6e 52 65 67 69 73 74  id.fnct_UnRegist
faee0 65 72 53 74 79 6c 65 64 47 72 6f 75 70 20 28 73  erStyledGroup (s
faef0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
faf00 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
faf10 67 63 2c 0a 09 09 09 20 20 20 20 73 71 6c 69 74  gc,....    sqlit
faf20 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
faf30 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
faf40 69 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69 73 74 65  ion:./ UnRegiste
faf50 72 53 74 79 6c 65 64 47 72 6f 75 70 28 53 74 72  rStyledGroup(Str
faf60 69 6e 67 20 67 72 6f 75 70 5f 6e 61 6d 65 29 0a  ing group_name).
faf70 2f 0a 2f 20 72 65 6d 6f 76 65 73 20 61 20 53 74  /./ removes a St
faf80 79 6c 65 64 20 47 72 6f 75 70 20 61 6e 64 20 61  yled Group and a
faf90 6e 79 20 72 65 6c 61 74 65 64 20 69 74 65 6d 20  ny related item 
fafa0 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20  ./ returns 1 on 
fafb0 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66  success./ 0 on f
fafc0 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e  ailure, -1 on in
fafd0 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
fafe0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
faff0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fb000 67 72 6f 75 70 5f 6e 61 6d 65 3b 0a 20 20 20 20  group_name;.    
fb010 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20  sqlite3 *sqlite 
fb020 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
fb030 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e  t_db_handle (con
fb040 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
fb050 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
fb060 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
fb070 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
fb080 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
fb090 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
fb0a0 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20  TEXT).      {.. 
fb0b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
fb0c0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
fb0d0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
fb0e0 20 20 20 20 7d 0a 20 20 20 20 67 72 6f 75 70 5f      }.    group_
fb0f0 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  name = (const ch
fb100 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
fb110 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30  lue_text (argv[0
fb120 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 75 6e  ]);.    ret = un
fb130 72 65 67 69 73 74 65 72 5f 73 74 79 6c 65 64 5f  register_styled_
fb140 67 72 6f 75 70 20 28 73 71 6c 69 74 65 2c 20 67  group (sqlite, g
fb150 72 6f 75 70 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  roup_name);.    
fb160 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
fb170 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
fb180 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
fb190 64 0a 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65  d.fnct_UnRegiste
fb1a0 72 53 74 79 6c 65 64 47 72 6f 75 70 4c 61 79 65  rStyledGroupLaye
fb1b0 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  r (sqlite3_conte
fb1c0 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
fb1d0 74 20 61 72 67 63 2c 0a 09 09 09 09 20 73 71 6c  t argc,..... sql
fb1e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
fb1f0 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
fb200 63 74 69 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69 73  ction:./ UnRegis
fb210 74 65 72 53 74 79 6c 65 64 47 72 6f 75 70 4c 61  terStyledGroupLa
fb220 79 65 72 28 49 6e 74 65 67 65 72 20 69 74 65 6d  yer(Integer item
fb230 5f 69 64 29 0a 2f 0a 2f 20 72 65 6d 6f 76 65 73  _id)././ removes
fb240 20 61 20 53 74 79 6c 65 64 20 4c 61 79 65 72 20   a Styled Layer 
fb250 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 53 74  from within a St
fb260 79 6c 65 64 20 47 72 6f 75 70 20 0a 2f 20 72 65  yled Group ./ re
fb270 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
fb280 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c 75 72  ss./ 0 on failur
fb290 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  e, -1 on invalid
fb2a0 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
fb2b0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69    int ret;.    i
fb2c0 6e 74 20 69 74 65 6d 5f 69 64 20 3d 20 2d 31 3b  nt item_id = -1;
fb2d0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71  .    sqlite3 *sq
fb2e0 6c 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lite = sqlite3_c
fb2f0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
fb300 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
fb310 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
fb320 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
fb330 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
fb340 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
fb350 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
fb360 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
fb370 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
fb380 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
fb390 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65  text, -1);..  re
fb3a0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
fb3b0 20 20 69 74 65 6d 5f 69 64 20 3d 20 73 71 6c 69    item_id = sqli
fb3c0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
fb3d0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[0]);.    ret
fb3e0 20 3d 20 75 6e 72 65 67 69 73 74 65 72 5f 73 74   = unregister_st
fb3f0 79 6c 65 64 5f 67 72 6f 75 70 5f 6c 61 79 65 72  yled_group_layer
fb400 20 28 73 71 6c 69 74 65 2c 20 69 74 65 6d 5f 69   (sqlite, item_i
fb410 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  d, NULL, NULL, N
fb420 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ULL);.    sqlite
fb430 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
fb440 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a  ntext, ret);.}..
fb450 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
fb460 5f 55 6e 52 65 67 69 73 74 65 72 53 74 79 6c 65  _UnRegisterStyle
fb470 64 47 72 6f 75 70 56 65 63 74 6f 72 20 28 73 71  dGroupVector (sq
fb480 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
fb490 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
fb4a0 63 2c 0a 09 09 09 09 20 20 73 71 6c 69 74 65 33  c,.....  sqlite3
fb4b0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
fb4c0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
fb4d0 6e 3a 0a 2f 20 55 6e 52 65 67 69 73 74 65 72 53  n:./ UnRegisterS
fb4e0 74 79 6c 65 64 47 72 6f 75 70 56 65 63 74 6f 72  tyledGroupVector
fb4f0 28 53 74 72 69 6e 67 20 67 72 6f 75 70 5f 6e 61  (String group_na
fb500 6d 65 2c 20 53 74 72 69 6e 67 20 63 6f 76 65 72  me, String cover
fb510 61 67 65 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 72 65  age_name)././ re
fb520 6d 6f 76 65 73 20 61 20 56 65 63 74 6f 72 20 53  moves a Vector S
fb530 74 79 6c 65 64 20 4c 61 79 65 72 20 66 72 6f 6d  tyled Layer from
fb540 20 77 69 74 68 69 6e 20 61 20 53 74 79 6c 65 64   within a Styled
fb550 20 47 72 6f 75 70 20 0a 2f 20 72 65 74 75 72 6e   Group ./ return
fb560 73 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f  s 1 on success./
fb570 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d   0 on failure, -
fb580 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67  1 on invalid arg
fb590 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e  uments.*/.    in
fb5a0 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  t ret;.    const
fb5b0 20 63 68 61 72 20 2a 67 72 6f 75 70 5f 6e 61 6d   char *group_nam
fb5c0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  e = NULL;.    co
fb5d0 6e 73 74 20 63 68 61 72 20 2a 63 6f 76 65 72 61  nst char *covera
fb5e0 67 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  ge_name = NULL;.
fb5f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
fb600 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
fb610 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
fb620 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
fb630 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
fb640 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
fb650 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
fb660 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
fb670 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
fb680 49 54 45 5f 54 45 58 54 0a 09 26 26 20 73 71 6c  ITE_TEXT..&& sql
fb690 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
fb6a0 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
fb6b0 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20  ITE_TEXT).      
fb6c0 7b 0a 09 20 20 67 72 6f 75 70 5f 6e 61 6d 65 20  {..  group_name 
fb6d0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
fb6e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
fb6f0 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  ext (argv[0]);..
fb700 20 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20    coverage_name 
fb710 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
fb720 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
fb730 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ext (argv[1]);. 
fb740 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
fb750 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
fb760 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
fb770 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
fb780 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
fb790 20 20 20 20 72 65 74 20 3d 0a 09 75 6e 72 65 67      ret =..unreg
fb7a0 69 73 74 65 72 5f 73 74 79 6c 65 64 5f 67 72 6f  ister_styled_gro
fb7b0 75 70 5f 6c 61 79 65 72 20 28 73 71 6c 69 74 65  up_layer (sqlite
fb7c0 2c 20 2d 31 2c 20 67 72 6f 75 70 5f 6e 61 6d 65  , -1, group_name
fb7d0 2c 20 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 2c  , coverage_name,
fb7e0 0a 09 09 09 09 20 20 20 20 20 20 20 4e 55 4c 4c  .....       NULL
fb7f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
fb800 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
fb810 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
fb820 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e  tic void.fnct_Un
fb830 52 65 67 69 73 74 65 72 53 74 79 6c 65 64 47 72  RegisterStyledGr
fb840 6f 75 70 52 61 73 74 65 72 20 28 73 71 6c 69 74  oupRaster (sqlit
fb850 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
fb860 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
fb870 09 09 09 09 20 20 73 71 6c 69 74 65 33 5f 76 61  ....  sqlite3_va
fb880 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
fb890 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
fb8a0 2f 20 55 6e 52 65 67 69 73 74 65 72 53 74 79 6c  / UnRegisterStyl
fb8b0 65 64 47 72 6f 75 70 52 61 73 74 65 72 28 53 74  edGroupRaster(St
fb8c0 72 69 6e 67 20 67 72 6f 75 70 5f 6e 61 6d 65 2c  ring group_name,
fb8d0 20 53 74 72 69 6e 67 20 63 6f 76 65 72 61 67 65   String coverage
fb8e0 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 72 65 6d 6f 76  _name)././ remov
fb8f0 65 73 20 61 20 52 61 73 74 65 72 20 53 74 79 6c  es a Raster Styl
fb900 65 64 20 4c 61 79 65 72 20 66 72 6f 6d 20 77 69  ed Layer from wi
fb910 74 68 69 6e 20 61 20 53 74 79 6c 65 64 20 47 72  thin a Styled Gr
fb920 6f 75 70 20 0a 2f 20 72 65 74 75 72 6e 73 20 31  oup ./ returns 1
fb930 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20   on success./ 0 
fb940 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f  on failure, -1 o
fb950 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
fb960 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72  nts.*/.    int r
fb970 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  et;.    const ch
fb980 61 72 20 2a 67 72 6f 75 70 5f 6e 61 6d 65 20 3d  ar *group_name =
fb990 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
fb9a0 20 63 68 61 72 20 2a 63 6f 76 65 72 61 67 65 5f   char *coverage_
fb9b0 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  name = NULL;.   
fb9c0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
fb9d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
fb9e0 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
fb9f0 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
fba00 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
fba10 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
fba20 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
fba30 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
fba40 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
fba50 5f 54 45 58 54 0a 09 26 26 20 73 71 6c 69 74 65  _TEXT..&& sqlite
fba60 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
fba70 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
fba80 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
fba90 20 20 67 72 6f 75 70 5f 6e 61 6d 65 20 3d 20 28    group_name = (
fbaa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
fbab0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
fbac0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 63   (argv[0]);..  c
fbad0 6f 76 65 72 61 67 65 5f 6e 61 6d 65 20 3d 20 28  overage_name = (
fbae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
fbaf0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
fbb00 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
fbb10 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
fbb20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
fbb30 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
fbb40 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74  ext, -1);..  ret
fbb50 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
fbb60 20 72 65 74 20 3d 0a 09 75 6e 72 65 67 69 73 74   ret =..unregist
fbb70 65 72 5f 73 74 79 6c 65 64 5f 67 72 6f 75 70 5f  er_styled_group_
fbb80 6c 61 79 65 72 20 28 73 71 6c 69 74 65 2c 20 2d  layer (sqlite, -
fbb90 31 2c 20 67 72 6f 75 70 5f 6e 61 6d 65 2c 20 4e  1, group_name, N
fbba0 55 4c 4c 2c 0a 09 09 09 09 20 20 20 20 20 20 20  ULL,.....       
fbbb0 63 6f 76 65 72 61 67 65 5f 6e 61 6d 65 29 3b 0a  coverage_name);.
fbbc0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
fbbd0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
fbbe0 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63   ret);.}..static
fbbf0 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73   void.fnct_Regis
fbc00 74 65 72 47 72 6f 75 70 53 74 79 6c 65 20 28 73  terGroupStyle (s
fbc10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
fbc20 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
fbc30 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65 33 5f  gc,.... sqlite3_
fbc40 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
fbc50 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
fbc60 3a 0a 2f 20 52 65 67 69 73 74 65 72 47 72 6f 75  :./ RegisterGrou
fbc70 70 53 74 79 6c 65 28 42 4c 4f 42 20 73 74 79 6c  pStyle(BLOB styl
fbc80 65 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61  e)././ inserts a
fbc90 20 47 72 6f 75 70 20 53 74 79 6c 65 20 0a 2f 20   Group Style ./ 
fbca0 72 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63  returns 1 on suc
fbcb0 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66 61 69 6c  cess./ 0 on fail
fbcc0 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c  ure, -1 on inval
fbcd0 69 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  id arguments.*/.
fbce0 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
fbcf0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
fbd00 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20  char *p_blob;.  
fbd10 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20    int n_bytes;. 
fbd20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
fbd30 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
fbd40 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
fbd50 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
fbd60 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
fbd70 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
fbd80 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
fbd90 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
fbda0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
fbdb0 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
fbdc0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
fbdd0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
fbde0 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
fbdf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
fbe00 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
fbe10 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
fbe20 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
fbe30 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
fbe40 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
fbe50 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67 69 73  .    ret = regis
fbe60 74 65 72 5f 67 72 6f 75 70 5f 73 74 79 6c 65 5f  ter_group_style_
fbe70 65 78 20 28 73 71 6c 69 74 65 2c 20 70 5f 62 6c  ex (sqlite, p_bl
fbe80 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20  ob, n_bytes);.  
fbe90 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
fbea0 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
fbeb0 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
fbec0 6f 69 64 0a 66 6e 63 74 5f 55 6e 52 65 67 69 73  oid.fnct_UnRegis
fbed0 74 65 72 47 72 6f 75 70 53 74 79 6c 65 20 28 73  terGroupStyle (s
fbee0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
fbef0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
fbf00 67 63 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65  gc,....   sqlite
fbf10 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
fbf20 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
fbf30 6f 6e 3a 0a 2f 20 55 6e 52 65 67 69 73 74 65 72  on:./ UnRegister
fbf40 47 72 6f 75 70 53 74 79 6c 65 28 49 6e 74 65 67  GroupStyle(Integ
fbf50 65 72 20 73 74 79 6c 65 5f 69 64 20 5b 20 2c 20  er style_id [ , 
fbf60 49 6e 74 65 67 65 72 20 72 65 6d 6f 76 65 41 6c  Integer removeAl
fbf70 6c 5d 20 29 0a 2f 20 20 20 6f 72 0a 2f 20 55 6e  l] )./   or./ Un
fbf80 52 65 67 69 73 74 65 72 47 72 6f 75 70 53 74 79  RegisterGroupSty
fbf90 6c 65 64 4c 61 79 65 72 28 54 65 78 74 20 73 74  ledLayer(Text st
fbfa0 79 6c 65 5f 6e 61 6d 65 20 5b 20 2c 20 49 6e 74  yle_name [ , Int
fbfb0 65 67 65 72 20 72 65 6d 6f 76 65 41 6c 6c 5d 20  eger removeAll] 
fbfc0 29 0a 2f 0a 2f 20 72 65 6d 6f 76 65 73 20 61 20  )././ removes a 
fbfd0 47 72 6f 75 70 20 53 74 79 6c 65 20 64 65 66 69  Group Style defi
fbfe0 6e 69 74 69 6f 6e 0a 2f 20 72 65 74 75 72 6e 73  nition./ returns
fbff0 20 31 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20   1 on success./ 
fc000 30 20 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31  0 on failure, -1
fc010 20 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75   on invalid argu
fc020 6d 65 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74  ments.*/.    int
fc030 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 73 74   ret;.    int st
fc040 79 6c 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20  yle_id = -1;.   
fc050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79   const char *sty
fc060 6c 65 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  le_name = NULL;.
fc070 20 20 20 20 69 6e 74 20 72 65 6d 6f 76 65 5f 61      int remove_a
fc080 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ll = 0;.    sqli
fc090 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71  te3 *sqlite = sq
fc0a0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
fc0b0 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
fc0c0 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
fc0d0 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
fc0e0 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
fc0f0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
fc100 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
fc110 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
fc120 47 45 52 29 0a 09 73 74 79 6c 65 5f 69 64 20 3d  GER)..style_id =
fc130 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
fc140 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  nt (argv[0]);.  
fc150 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
fc160 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
fc170 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
fc180 45 5f 54 45 58 54 29 0a 09 73 74 79 6c 65 5f 6e  E_TEXT)..style_n
fc190 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
fc1a0 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c  r *) sqlite3_val
fc1b0 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d  ue_text (argv[0]
fc1c0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  );.    else.    
fc1d0 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
fc1e0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
fc1f0 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
fc200 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
fc210 69 66 20 28 61 72 67 63 20 3e 3d 20 32 29 0a 20  if (argc >= 2). 
fc220 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71       {..  if (sq
fc230 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
fc240 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
fc250 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
fc260 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
fc270 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
fc280 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72  xt, -1);...retur
fc290 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 72 65 6d  n;..    }..  rem
fc2a0 6f 76 65 5f 61 6c 6c 20 3d 20 73 71 6c 69 74 65  ove_all = sqlite
fc2b0 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
fc2c0 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[1]);.      }. 
fc2d0 20 20 20 72 65 74 20 3d 20 75 6e 72 65 67 69 73     ret = unregis
fc2e0 74 65 72 5f 67 72 6f 75 70 5f 73 74 79 6c 65 20  ter_group_style 
fc2f0 28 73 71 6c 69 74 65 2c 20 73 74 79 6c 65 5f 69  (sqlite, style_i
fc300 64 2c 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 72  d, style_name, r
fc310 65 6d 6f 76 65 5f 61 6c 6c 29 3b 0a 20 20 20 20  emove_all);.    
fc320 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
fc330 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  nt (context, ret
fc340 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
fc350 64 0a 66 6e 63 74 5f 52 65 6c 6f 61 64 47 72 6f  d.fnct_ReloadGro
fc360 75 70 53 74 79 6c 65 20 28 73 71 6c 69 74 65 33  upStyle (sqlite3
fc370 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
fc380 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
fc390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
fc3a0 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
fc3b0 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
fc3c0 0a 2f 20 52 65 6c 6f 61 64 47 72 6f 75 70 53 74  ./ ReloadGroupSt
fc3d0 79 6c 65 28 49 6e 74 65 67 65 72 20 73 74 79 6c  yle(Integer styl
fc3e0 65 5f 69 64 2c 20 42 4c 4f 42 20 73 74 79 6c 65  e_id, BLOB style
fc3f0 29 0a 2f 20 20 20 20 6f 72 0a 2f 20 52 65 6c 6f  )./    or./ Relo
fc400 61 64 47 72 6f 75 70 53 74 79 6c 65 28 54 65 78  adGroupStyle(Tex
fc410 74 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 42 4c  t style_name, BL
fc420 4f 42 20 73 74 79 6c 65 29 0a 2f 0a 2f 20 75 70  OB style)././ up
fc430 64 61 74 65 73 20 61 20 47 72 6f 75 70 20 53 74  dates a Group St
fc440 79 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73 20 31  yle ./ returns 1
fc450 20 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20   on success./ 0 
fc460 6f 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f  on failure, -1 o
fc470 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  n invalid argume
fc480 6e 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72  nts.*/.    int r
fc490 65 74 3b 0a 20 20 20 20 69 6e 74 20 73 74 79 6c  et;.    int styl
fc4a0 65 5f 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63  e_id = -1;.    c
fc4b0 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c 65  onst char *style
fc4c0 5f 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _name = NULL;.  
fc4d0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
fc4e0 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
fc4f0 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
fc500 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c      sqlite3 *sql
fc510 69 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ite = sqlite3_co
fc520 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20  ntext_db_handle 
fc530 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
fc540 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
fc550 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
fc560 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
fc570 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
fc580 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
fc590 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 73 74  ITE_INTEGER)..st
fc5a0 79 6c 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 33  yle_id = sqlite3
fc5b0 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
fc5c0 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69  [0]);.    else i
fc5d0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
fc5e0 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
fc5f0 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
fc600 09 73 74 79 6c 65 5f 6e 61 6d 65 20 3d 20 28 63  .style_name = (c
fc610 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
fc620 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
fc630 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65  (argv[0]);.    e
fc640 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
fc650 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
fc660 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
fc670 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
fc680 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
fc690 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
fc6a0 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
fc6b0 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
fc6c0 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
fc6d0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
fc6e0 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
fc6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
fc700 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
fc710 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31  lue_blob (argv[1
fc720 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
fc730 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
fc740 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29 3b  bytes (argv[1]);
fc750 0a 20 20 20 20 72 65 74 20 3d 20 72 65 6c 6f 61  .    ret = reloa
fc760 64 5f 67 72 6f 75 70 5f 73 74 79 6c 65 20 28 73  d_group_style (s
fc770 71 6c 69 74 65 2c 20 73 74 79 6c 65 5f 69 64 2c  qlite, style_id,
fc780 20 73 74 79 6c 65 5f 6e 61 6d 65 2c 20 70 5f 62   style_name, p_b
fc790 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20  lob, n_bytes);. 
fc7a0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
fc7b0 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
fc7c0 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
fc7d0 76 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74  void.fnct_Regist
fc7e0 65 72 53 74 79 6c 65 64 47 72 6f 75 70 53 74 79  erStyledGroupSty
fc7f0 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  le (sqlite3_cont
fc800 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
fc810 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20  nt argc,....    
fc820 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
fc830 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
fc840 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52  QL function:./ R
fc850 65 67 69 73 74 65 72 53 74 79 6c 65 47 72 6f 75  egisterStyleGrou
fc860 70 53 74 79 6c 65 28 53 74 72 69 6e 67 20 67 72  pStyle(String gr
fc870 6f 75 70 5f 6e 61 6d 65 2c 20 49 6e 74 65 67 65  oup_name, Intege
fc880 72 20 73 74 79 6c 65 5f 69 64 29 0a 2f 20 20 20  r style_id)./   
fc890 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 53 74 79  or./ RegisterSty
fc8a0 6c 65 64 47 72 6f 75 70 53 74 79 6c 65 28 53 74  ledGroupStyle(St
fc8b0 72 69 6e 67 20 67 72 6f 75 70 5f 6e 61 6d 65 2c  ring group_name,
fc8c0 20 54 65 78 74 20 73 74 79 6c 65 5f 6e 61 6d 65   Text style_name
fc8d0 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 73 20 61 20  )././ inserts a 
fc8e0 53 74 79 6c 65 64 20 47 72 6f 75 70 20 53 74 79  Styled Group Sty
fc8f0 6c 65 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  le ./ returns 1 
fc900 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
fc910 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
fc920 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
fc930 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
fc940 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
fc950 72 20 2a 67 72 6f 75 70 5f 6e 61 6d 65 3b 0a 20  r *group_name;. 
fc960 20 20 20 69 6e 74 20 73 74 79 6c 65 5f 69 64 20     int style_id 
fc970 3d 20 2d 31 3b 0a 20 20 20 20 63 6f 6e 73 74 20  = -1;.    const 
fc980 63 68 61 72 20 2a 73 74 79 6c 65 5f 6e 61 6d 65  char *style_name
fc990 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c   = NULL;.    sql
fc9a0 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
fc9b0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
fc9c0 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
fc9d0 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
fc9e0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
fc9f0 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
fca00 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
fca10 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
fca20 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
fca30 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
fca40 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
fca50 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
fca60 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
fca70 20 7d 0a 20 20 20 20 67 72 6f 75 70 5f 6e 61 6d   }.    group_nam
fca80 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
fca90 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
fcaa0 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
fcab0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
fcac0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
fcad0 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
fcae0 49 4e 54 45 47 45 52 29 0a 09 73 74 79 6c 65 5f  INTEGER)..style_
fcaf0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
fcb00 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
fcb10 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
fcb20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
fcb30 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
fcb40 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 73 74 79  QLITE_TEXT)..sty
fcb50 6c 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  le_name = (const
fcb60 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
fcb70 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
fcb80 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a  v[1]);.    else.
fcb90 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
fcba0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
fcbb0 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
fcbc0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
fcbd0 20 20 20 20 72 65 74 20 3d 0a 09 72 65 67 69 73      ret =..regis
fcbe0 74 65 72 5f 73 74 79 6c 65 64 5f 67 72 6f 75 70  ter_styled_group
fcbf0 5f 73 74 79 6c 65 20 28 73 71 6c 69 74 65 2c 20  _style (sqlite, 
fcc00 67 72 6f 75 70 5f 6e 61 6d 65 2c 20 73 74 79 6c  group_name, styl
fcc10 65 5f 69 64 2c 20 73 74 79 6c 65 5f 6e 61 6d 65  e_id, style_name
fcc20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
fcc30 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
fcc40 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
fcc50 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 55 6e  tic void.fnct_Un
fcc60 52 65 67 69 73 74 65 72 53 74 79 6c 65 64 47 72  RegisterStyledGr
fcc70 6f 75 70 53 74 79 6c 65 20 28 73 71 6c 69 74 65  oupStyle (sqlite
fcc80 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
fcc90 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
fcca0 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ... sqlite3_valu
fccb0 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
fccc0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
fccd0 55 6e 52 65 67 69 73 74 65 72 53 74 79 6c 65 64  UnRegisterStyled
fcce0 47 72 6f 75 70 53 74 79 6c 65 28 53 74 72 69 6e  GroupStyle(Strin
fccf0 67 20 67 72 6f 75 70 5f 6e 61 6d 65 2c 20 49 6e  g group_name, In
fcd00 74 65 67 65 72 20 73 74 79 6c 65 5f 69 64 29 0a  teger style_id).
fcd10 2f 20 20 20 6f 72 0a 2f 20 55 6e 52 65 67 69 73  /   or./ UnRegis
fcd20 74 65 72 53 74 79 6c 65 64 47 72 6f 75 70 53 74  terStyledGroupSt
fcd30 79 6c 65 28 53 74 72 69 6e 67 20 67 72 6f 75 70  yle(String group
fcd40 5f 6e 61 6d 65 2c 20 54 65 78 74 20 73 74 79 6c  _name, Text styl
fcd50 65 5f 6e 61 6d 65 29 0a 2f 0a 2f 20 72 65 6d 6f  e_name)././ remo
fcd60 76 65 73 20 61 20 53 74 79 6c 65 64 20 47 72 6f  ves a Styled Gro
fcd70 75 70 20 53 74 79 6c 65 20 64 65 66 69 6e 69 74  up Style definit
fcd80 69 6f 6e 0a 2f 20 72 65 74 75 72 6e 73 20 31 20  ion./ returns 1 
fcd90 6f 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f  on success./ 0 o
fcda0 6e 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e  n failure, -1 on
fcdb0 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
fcdc0 74 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ts.*/.    int re
fcdd0 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
fcde0 72 20 2a 67 72 6f 75 70 5f 6e 61 6d 65 3b 0a 20  r *group_name;. 
fcdf0 20 20 20 69 6e 74 20 73 74 79 6c 65 5f 69 64 20     int style_id 
fce00 3d 20 2d 31 3b 0a 20 20 20 20 63 6f 6e 73 74 20  = -1;.    const 
fce10 63 68 61 72 20 2a 73 74 79 6c 65 5f 6e 61 6d 65  char *style_name
fce20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c   = NULL;.    sql
fce30 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73  ite3 *sqlite = s
fce40 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
fce50 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
fce60 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
fce70 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
fce80 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
fce90 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
fcea0 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
fceb0 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54 45 58  ]) != SQLITE_TEX
fcec0 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  T).      {..  sq
fced0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
fcee0 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a   (context, -1);.
fcef0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
fcf00 20 7d 0a 20 20 20 20 67 72 6f 75 70 5f 6e 61 6d   }.    group_nam
fcf10 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
fcf20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
fcf30 5f 74 65 78 74 20 28 61 72 67 76 5b 30 5d 29 3b  _text (argv[0]);
fcf40 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
fcf50 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
fcf60 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
fcf70 49 4e 54 45 47 45 52 29 0a 09 73 74 79 6c 65 5f  INTEGER)..style_
fcf80 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
fcf90 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29  ue_int (argv[1])
fcfa0 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73  ;.    else if (s
fcfb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
fcfc0 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53  e (argv[1]) == S
fcfd0 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 73 74 79  QLITE_TEXT)..sty
fcfe0 6c 65 5f 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  le_name = (const
fcff0 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
fd000 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
fd010 76 5b 31 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a  v[1]);.    else.
fd020 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
fd030 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
fd040 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
fd050 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
fd060 20 20 20 20 72 65 74 20 3d 0a 09 75 6e 72 65 67      ret =..unreg
fd070 69 73 74 65 72 5f 73 74 79 6c 65 64 5f 67 72 6f  ister_styled_gro
fd080 75 70 5f 73 74 79 6c 65 20 28 73 71 6c 69 74 65  up_style (sqlite
fd090 2c 20 67 72 6f 75 70 5f 6e 61 6d 65 2c 20 73 74  , group_name, st
fd0a0 79 6c 65 5f 69 64 2c 0a 09 09 09 09 20 20 20 20  yle_id,.....    
fd0b0 20 20 20 73 74 79 6c 65 5f 6e 61 6d 65 29 3b 0a     style_name);.
fd0c0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
fd0d0 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
fd0e0 20 72 65 74 29 3b 0a 7d 0a 0a 0a 73 74 61 74 69   ret);.}...stati
fd0f0 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 72 65 61  c void.fnct_Crea
fd100 74 65 49 73 6f 4d 65 74 61 64 61 74 61 54 61 62  teIsoMetadataTab
fd110 6c 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  les (sqlite3_con
fd120 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
fd130 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  int argc,....   
fd140 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
fd150 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
fd160 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 43  QL function:./ C
fd170 72 65 61 74 65 49 73 6f 4d 65 74 61 64 61 74 61  reateIsoMetadata
fd180 54 61 62 6c 65 73 28 29 0a 2f 20 20 6f 72 0a 2f  Tables()./  or./
fd190 20 43 72 65 61 74 65 49 73 6f 4d 65 74 61 64 61   CreateIsoMetada
fd1a0 74 61 54 61 62 6c 65 73 28 62 6f 6f 6c 20 72 65  taTables(bool re
fd1b0 6c 61 78 65 64 29 0a 2f 0a 2f 20 63 72 65 61 74  laxed)././ creat
fd1c0 65 73 20 61 6e 79 20 49 53 4f 20 4d 65 74 61 64  es any ISO Metad
fd1d0 61 74 61 20 72 65 6c 61 74 65 64 20 74 61 62 6c  ata related tabl
fd1e0 65 20 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f  e ./ returns 1 o
fd1f0 6e 20 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e  n success./ 0 on
fd200 20 66 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20   failure, -1 on 
fd210 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  invalid argument
fd220 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 6c  s.*/.    int rel
fd230 61 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 73 71  axed = 0;.    sq
fd240 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20  lite3 *sqlite = 
fd250 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
fd260 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65  db_handle (conte
fd270 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  xt);.    GAIA_UN
fd280 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
fd290 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
fd2a0 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 31     if (argc == 1
fd2b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
fd2c0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
fd2d0 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d  ype (argv[0]) !=
fd2e0 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
fd2f0 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
fd300 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
fd310 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65  ntext, -1);...re
fd320 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
fd330 72 65 6c 61 78 65 64 20 3d 20 73 71 6c 69 74 65  relaxed = sqlite
fd340 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
fd350 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  v[0]);.      }..
fd360 20 20 20 20 69 66 20 28 21 63 72 65 61 74 65 49      if (!createI
fd370 73 6f 4d 65 74 61 64 61 74 61 54 61 62 6c 65 73  soMetadataTables
fd380 20 28 73 71 6c 69 74 65 2c 20 72 65 6c 61 78 65   (sqlite, relaxe
fd390 64 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  d))..goto error;
fd3a0 0a 20 20 20 20 75 70 64 61 74 65 53 70 61 74 69  .    updateSpati
fd3b0 61 4c 69 74 65 48 69 73 74 6f 72 79 20 28 73 71  aLiteHistory (sq
fd3c0 6c 69 74 65 2c 20 22 2a 2a 2a 20 49 53 4f 20 4d  lite, "*** ISO M
fd3d0 65 74 61 64 61 74 61 20 2a 2a 2a 22 2c 20 4e 55  etadata ***", NU
fd3e0 4c 4c 2c 0a 09 09 09 20 20 20 20 20 22 49 53 4f  LL,....     "ISO
fd3f0 20 4d 65 74 61 64 61 74 61 20 74 61 62 6c 65 73   Metadata tables
fd400 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72   successfully cr
fd410 65 61 74 65 64 22 29 3b 0a 20 20 20 20 73 71 6c  eated");.    sql
fd420 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
fd430 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
fd440 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 65 72 72    return;..  err
fd450 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  or:.    sqlite3_
fd460 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
fd470 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ext, 0);.    ret
fd480 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  urn;.}..static v
fd490 6f 69 64 0a 66 6e 63 74 5f 47 65 74 49 73 6f 4d  oid.fnct_GetIsoM
fd4a0 65 74 61 64 61 74 61 49 64 20 28 73 71 6c 69 74  etadataId (sqlit
fd4b0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
fd4c0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
fd4d0 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  ..       sqlite3
fd4e0 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
fd4f0 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
fd500 6e 3a 0a 2f 20 47 65 74 49 73 6f 4d 65 74 61 64  n:./ GetIsoMetad
fd510 61 74 61 49 64 28 53 74 72 69 6e 67 20 66 69 6c  ataId(String fil
fd520 65 49 64 65 6e 74 69 66 69 65 72 29 0a 2f 0a 2f  eIdentifier)././
fd530 20 72 65 74 75 72 6e 20 74 68 65 20 49 44 20 6f   return the ID o
fd540 66 20 74 68 65 20 72 6f 77 20 63 6f 72 72 65 73  f the row corres
fd550 70 6f 6e 64 69 6e 67 20 74 6f 20 22 66 69 6c 65  ponding to "file
fd560 49 64 65 6e 74 69 66 69 65 72 22 0a 2f 20 30 20  Identifier"./ 0 
fd570 6f 6e 20 66 61 69 6c 75 72 65 20 2f 20 2d 31 20  on failure / -1 
fd580 6f 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  on invalid argum
fd590 65 6e 74 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ent.*/.    const
fd5a0 20 63 68 61 72 20 2a 66 69 6c 65 49 64 65 6e 74   char *fileIdent
fd5b0 69 66 69 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  ifier;.    sqlit
fd5c0 65 33 5f 69 6e 74 36 34 20 69 64 3b 0a 20 20 20  e3_int64 id;.   
fd5d0 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65   sqlite3 *sqlite
fd5e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
fd5f0 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f  xt_db_handle (co
fd600 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
fd610 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
fd620 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
fd630 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
fd640 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
fd650 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
fd660 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
fd670 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
fd680 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
fd690 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
fd6a0 20 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 49       }.    fileI
fd6b0 64 65 6e 74 69 66 69 65 72 20 3d 20 28 63 6f 6e  dentifier = (con
fd6c0 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
fd6d0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61  e3_value_text (a
fd6e0 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 20  rgv[0]);.    if 
fd6f0 28 21 67 65 74 5f 69 73 6f 5f 6d 65 74 61 64 61  (!get_iso_metada
fd700 74 61 5f 69 64 20 28 73 71 6c 69 74 65 2c 20 66  ta_id (sqlite, f
fd710 69 6c 65 49 64 65 6e 74 69 66 69 65 72 2c 20 26  ileIdentifier, &
fd720 69 64 29 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  id))..sqlite3_re
fd730 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
fd740 74 2c 20 30 29 3b 0a 20 20 20 20 65 6c 73 65 0a  t, 0);.    else.
fd750 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
fd760 69 6e 74 36 34 20 28 63 6f 6e 74 65 78 74 2c 20  int64 (context, 
fd770 69 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  id);.}..static v
fd780 6f 69 64 0a 66 6e 63 74 5f 52 65 67 69 73 74 65  oid.fnct_Registe
fd790 72 49 73 6f 4d 65 74 61 64 61 74 61 20 28 73 71  rIsoMetadata (sq
fd7a0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
fd7b0 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
fd7c0 63 2c 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f  c,....  sqlite3_
fd7d0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
fd7e0 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
fd7f0 3a 0a 2f 20 52 65 67 69 73 74 65 72 49 73 6f 4d  :./ RegisterIsoM
fd800 65 74 61 64 61 74 61 28 53 74 72 69 6e 67 20 73  etadata(String s
fd810 63 6f 70 65 2c 20 42 4c 4f 42 20 6d 65 74 61 64  cope, BLOB metad
fd820 61 74 61 29 0a 2f 20 20 6f 72 0a 2f 20 52 65 67  ata)./  or./ Reg
fd830 69 73 74 65 72 49 73 6f 4d 65 74 61 64 61 74 61  isterIsoMetadata
fd840 28 53 74 72 69 6e 67 20 73 63 6f 70 65 2c 20 42  (String scope, B
fd850 4c 4f 42 20 6d 65 74 61 64 61 74 61 2c 20 0a 2f  LOB metadata, ./
fd860 09 09 09 49 6e 74 65 67 65 72 20 69 64 29 0a 2f  ...Integer id)./
fd870 20 20 6f 72 0a 2f 20 52 65 67 69 73 74 65 72 49    or./ RegisterI
fd880 73 6f 4d 65 74 61 64 61 74 61 28 53 74 72 69 6e  soMetadata(Strin
fd890 67 20 73 63 6f 70 65 2c 20 42 4c 4f 42 20 6d 65  g scope, BLOB me
fd8a0 74 61 64 61 74 61 2c 20 0a 2f 09 09 09 53 74 72  tadata, ./...Str
fd8b0 69 6e 67 20 66 69 6c 65 49 64 65 6e 74 69 66 69  ing fileIdentifi
fd8c0 65 72 29 0a 2f 0a 2f 20 69 6e 73 65 72 74 20 6f  er)././ insert o
fd8d0 72 20 75 70 64 61 74 65 73 20 61 20 52 61 73 74  r updates a Rast
fd8e0 65 72 20 53 74 79 6c 65 64 20 4c 61 79 65 72 20  er Styled Layer 
fd8f0 0a 2f 20 72 65 74 75 72 6e 73 20 31 20 6f 6e 20  ./ returns 1 on 
fd900 73 75 63 63 65 73 73 0a 2f 20 30 20 6f 6e 20 66  success./ 0 on f
fd910 61 69 6c 75 72 65 2c 20 2d 31 20 6f 6e 20 69 6e  ailure, -1 on in
fd920 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 0a  valid arguments.
fd930 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  */.    int ret;.
fd940 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fd950 73 63 6f 70 65 3b 0a 20 20 20 20 63 6f 6e 73 74  scope;.    const
fd960 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
fd970 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
fd980 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 73 71 6c  n_bytes;.    sql
fd990 69 74 65 33 5f 69 6e 74 36 34 20 69 64 20 3d 20  ite3_int64 id = 
fd9a0 2d 31 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  -1;.    const ch
fd9b0 61 72 20 2a 66 69 6c 65 49 64 65 6e 74 69 66 69  ar *fileIdentifi
fd9c0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73  er = NULL;.    s
fd9d0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 20 3d  qlite3 *sqlite =
fd9e0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
fd9f0 5f 64 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74  _db_handle (cont
fda00 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55  ext);.    GAIA_U
fda10 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
fda20 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
fda30 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
fda40 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
fda50 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [0]) != SQLITE_T
fda60 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
fda70 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
fda80 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
fda90 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
fdaa0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
fdab0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
fdac0 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c  (argv[1]) != SQL
fdad0 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
fdae0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
fdaf0 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
fdb00 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e  , -1);..  return
fdb10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
fdb20 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20 20   (argc == 3).   
fdb30 20 20 20 7b 0a 09 20 20 2f 2a 20 6f 70 74 69 6f     {..  /* optio
fdb40 6e 61 6c 20 65 78 74 72 61 20 61 72 67 73 20 2a  nal extra args *
fdb50 2f 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  /..  if (sqlite3
fdb60 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
fdb70 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
fdb80 49 4e 54 45 47 45 52 20 7c 7c 0a 09 20 20 20 20  INTEGER ||..    
fdb90 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
fdba0 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
fdbb0 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
fdbc0 20 20 20 20 20 20 3b 0a 09 20 20 65 6c 73 65 0a        ;..  else.
fdbd0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
fdbe0 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
fdbf0 74 65 78 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74  text, -1);...ret
fdc00 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  urn;..    }.    
fdc10 20 20 7d 0a 20 20 20 20 73 63 6f 70 65 20 3d 20    }.    scope = 
fdc20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
fdc30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
fdc40 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
fdc50 20 70 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65   p_blob = sqlite
fdc60 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72  3_value_blob (ar
fdc70 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e 5f 62 79  gv[1]);.    n_by
fdc80 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
fdc90 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
fdca0 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67  1]);.    if (arg
fdcb0 63 20 3d 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a  c == 3).      {.
fdcc0 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
fdcd0 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
fdce0 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  2]) == SQLITE_IN
fdcf0 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 69 64  TEGER)..      id
fdd00 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
fdd10 5f 69 6e 74 36 34 20 28 61 72 67 76 5b 32 5d 29  _int64 (argv[2])
fdd20 3b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  ;..  if (sqlite3
fdd30 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
fdd40 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
fdd50 54 45 58 54 29 0a 09 20 20 20 20 20 20 66 69 6c  TEXT)..      fil
fdd60 65 49 64 65 6e 74 69 66 69 65 72 20 3d 20 28 63  eIdentifier = (c
fdd70 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
fdd80 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
fdd90 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (argv[2]);.     
fdda0 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 72 65 67   }.    ret = reg
fddb0 69 73 74 65 72 5f 69 73 6f 5f 6d 65 74 61 64 61  ister_iso_metada
fddc0 74 61 20 28 73 71 6c 69 74 65 2c 20 73 63 6f 70  ta (sqlite, scop
fddd0 65 2c 20 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  e, p_blob, n_byt
fdde0 65 73 2c 20 26 69 64 2c 0a 09 09 09 09 20 66 69  es, &id,..... fi
fddf0 6c 65 49 64 65 6e 74 69 66 69 65 72 29 3b 0a 20  leIdentifier);. 
fde00 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
fde10 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
fde20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
fde30 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 43 72 65  void.fnct_XB_Cre
fde40 61 74 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ate (sqlite3_con
fde50 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
fde60 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
fde70 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
fde80 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
fde90 6f 6e 3a 0a 2f 20 58 42 5f 43 72 65 61 74 65 28  on:./ XB_Create(
fdea0 42 4c 4f 42 20 58 4d 4c 64 6f 63 75 6d 65 6e 74  BLOB XMLdocument
fdeb0 29 0a 2f 20 58 42 5f 43 72 65 61 74 65 28 42 4c  )./ XB_Create(BL
fdec0 4f 42 20 58 4d 4c 64 6f 63 75 6d 65 6e 74 2c 20  OB XMLdocument, 
fded0 62 6f 6f 6c 20 63 6f 6d 70 72 65 73 73 65 64 29  bool compressed)
fdee0 0a 2f 20 58 42 5f 43 72 65 61 74 65 28 42 4c 4f  ./ XB_Create(BLO
fdef0 42 20 58 4d 4c 64 6f 63 75 6d 65 6e 74 2c 20 62  B XMLdocument, b
fdf00 6f 6f 6c 20 63 6f 6d 70 72 65 73 73 65 64 2c 20  ool compressed, 
fdf10 74 65 78 74 20 53 63 68 65 6d 61 55 52 49 29 0a  text SchemaURI).
fdf20 2f 20 58 42 5f 43 72 65 61 74 65 28 42 4c 4f 42  / XB_Create(BLOB
fdf30 20 58 4d 4c 64 6f 63 75 6d 65 6e 74 2c 20 62 6f   XMLdocument, bo
fdf40 6f 6c 20 63 6f 6d 70 72 65 73 73 65 64 2c 20 69  ol compressed, i
fdf50 6e 74 20 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  nt InternalSchem
fdf60 61 55 52 49 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  aURI)././ return
fdf70 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 58 6d  s the current Xm
fdf80 6c 42 6c 6f 62 20 62 79 20 70 61 72 73 69 6e 67  lBlob by parsing
fdf90 20 61 6e 20 58 4d 4c 64 6f 63 75 6d 65 6e 74 20   an XMLdocument 
fdfa0 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
fdfb0 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
fdfc0 6e 74 65 72 65 64 0a 2f 0a 2f 20 2d 20 74 68 65  ntered././ - the
fdfd0 20 58 4d 4c 64 6f 63 75 6d 65 6e 74 20 73 68 6f   XMLdocument sho
fdfe0 75 6c 64 20 62 65 20 22 77 65 6c 6c 20 66 6f 72  uld be "well for
fdff0 6d 65 64 22 0a 2f 20 2d 20 69 66 20 2a 63 6f 6d  med"./ - if *com
fe000 70 72 65 73 73 65 64 2a 20 69 73 20 54 52 55 45  pressed* is TRUE
fe010 20 28 64 65 66 61 75 6c 74 29 20 74 68 65 20 58   (default) the X
fe020 6d 6c 42 6c 6f 62 20 77 6f 75 6c 64 20 62 65 20  mlBlob would be 
fe030 7a 69 70 70 65 64 0a 2f 20 2d 20 69 66 20 2a 53  zipped./ - if *S
fe040 63 68 65 6d 61 55 52 49 2a 20 69 6e 20 6e 6f 74  chemaURI* in not
fe050 20 4e 55 4c 4c 20 74 68 65 6e 20 6f 6e 6c 79 20   NULL then only 
fe060 58 4d 4c 64 6f 63 75 6d 65 6e 74 73 20 73 75 63  XMLdocuments suc
fe070 63 65 73 73 66 75 6c 6c 79 0a 2f 20 20 20 70 61  cessfully./   pa
fe080 73 73 69 6e 67 20 61 20 66 6f 72 6d 61 6c 20 53  ssing a formal S
fe090 63 68 65 6d 61 20 56 61 6c 69 64 61 74 69 6f 6e  chema Validation
fe0a0 20 77 69 6c 6c 20 62 65 20 61 63 63 65 70 74 65   will be accepte
fe0b0 64 20 61 73 20 76 61 6c 69 64 0a 2f 20 2d 20 69  d as valid./ - i
fe0c0 66 20 2a 49 6e 74 65 72 6e 61 6c 53 63 68 61 6d  f *InternalScham
fe0d0 61 55 52 49 2a 20 69 73 20 64 65 66 69 6e 65 64  aURI* is defined
fe0e0 20 28 61 6e 79 20 6e 75 6d 65 72 69 63 20 76 61   (any numeric va
fe0f0 6c 75 65 29 20 74 68 65 6e 20 61 6e 0a 2f 20 20  lue) then an./  
fe100 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
fe110 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
fe120 6f 20 69 64 65 6e 74 69 66 79 20 61 20 53 63 68  o identify a Sch
fe130 65 6d 61 55 52 49 20 64 65 66 69 6e 65 64 0a 2f  emaURI defined./
fe140 20 20 20 69 6e 74 65 72 6e 61 6c 6c 79 20 77 69     internally wi
fe150 74 68 69 6e 20 74 68 65 20 58 4d 4c 44 6f 63 75  thin the XMLDocu
fe160 6d 65 6e 74 20 69 74 73 65 6c 66 2e 0a 2f 20 20  ment itself../  
fe170 20 69 66 20 73 75 63 68 20 69 6e 74 65 72 6e 61   if such interna
fe180 6c 20 53 63 68 65 6d 61 55 52 49 20 64 6f 65 73  l SchemaURI does
fe190 6e 27 74 20 65 78 69 73 74 73 2c 20 6f 72 20 69  n't exists, or i
fe1a0 66 20 74 68 65 20 66 6f 72 6d 61 6c 0a 2f 20 20  f the formal./  
fe1b0 20 53 63 68 65 6d 61 20 56 61 6c 69 64 61 74 69   Schema Validati
fe1c0 6f 6e 20 66 61 69 6c 73 2c 20 4e 55 4c 4c 20 77  on fails, NULL w
fe1d0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
fe1e0 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20  .*/.    int len 
fe1f0 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
fe200 64 20 63 68 61 72 20 2a 70 5f 72 65 73 75 6c 74  d char *p_result
fe210 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
fe220 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
fe230 20 2a 78 6d 6c 3b 0a 20 20 20 20 69 6e 74 20 78   *xml;.    int x
fe240 6d 6c 5f 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  ml_len;.    int 
fe250 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 31 3b 0a  compressed = 1;.
fe260 20 20 20 20 69 6e 74 20 75 73 65 5f 69 6e 74 65      int use_inte
fe270 72 6e 61 6c 5f 73 63 68 65 6d 61 5f 75 72 69 20  rnal_schema_uri 
fe280 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
fe290 68 61 72 20 2a 73 63 68 65 6d 61 55 52 49 20 3d  har *schemaURI =
fe2a0 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49 41 5f   NULL;.    GAIA_
fe2b0 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
fe2c0 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
fe2d0 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
fe2e0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
fe2f0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
fe300 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
fe310 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
fe320 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
fe330 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
fe340 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
fe350 3e 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  >= 2).      {.. 
fe360 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
fe370 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
fe380 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) != SQLITE_INTE
fe390 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  GER)..    {...sq
fe3a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
fe3b0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
fe3c0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
fe3d0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72      }.    if (ar
fe3e0 67 63 20 3d 3d 20 33 29 0a 20 20 20 20 20 20 7b  gc == 3).      {
fe3f0 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
fe400 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
fe410 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
fe420 4e 54 45 47 45 52 29 0a 09 20 20 20 20 20 20 75  NTEGER)..      u
fe430 73 65 5f 69 6e 74 65 72 6e 61 6c 5f 73 63 68 65  se_internal_sche
fe440 6d 61 5f 75 72 69 20 3d 20 31 3b 0a 09 20 20 65  ma_uri = 1;..  e
fe450 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
fe460 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
fe470 5b 32 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [2]) != SQLITE_T
fe480 45 58 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  EXT)..    {...sq
fe490 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
fe4a0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
fe4b0 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
fe4c0 20 20 20 20 7d 0a 20 20 20 20 78 6d 6c 20 3d 20      }.    xml = 
fe4d0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
fe4e0 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
fe4f0 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
fe500 5b 30 5d 29 3b 0a 20 20 20 20 78 6d 6c 5f 6c 65  [0]);.    xml_le
fe510 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
fe520 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
fe530 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 63 20  );.    if (argc 
fe540 3e 3d 20 32 29 0a 09 63 6f 6d 70 72 65 73 73 65  >= 2)..compresse
fe550 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
fe560 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b  e_int (argv[1]);
fe570 0a 20 20 20 20 69 66 20 28 75 73 65 5f 69 6e 74  .    if (use_int
fe580 65 72 6e 61 6c 5f 73 63 68 65 6d 61 5f 75 72 69  ernal_schema_uri
fe590 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
fe5a0 75 73 69 6e 67 20 74 68 65 20 53 63 68 65 6d 61  using the Schema
fe5b0 55 52 49 20 69 6e 74 65 72 6e 61 6c 6c 79 20 64  URI internally d
fe5c0 65 66 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  efined within th
fe5d0 65 20 58 4d 4c 44 6f 63 75 6d 65 6e 74 20 2a 2f  e XMLDocument */
fe5e0 0a 09 20 20 63 68 61 72 20 2a 69 6e 74 65 72 6e  ..  char *intern
fe5f0 61 6c 53 63 68 65 6d 61 55 52 49 20 3d 0a 09 20  alSchemaURI =.. 
fe600 20 20 20 20 20 67 61 69 61 58 6d 6c 47 65 74 49       gaiaXmlGetI
fe610 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 55 52 49  nternalSchemaURI
fe620 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64   (sqlite3_user_d
fe630 61 74 61 20 28 63 6f 6e 74 65 78 74 29 2c 20 78  ata (context), x
fe640 6d 6c 2c 0a 09 09 09 09 09 20 20 20 78 6d 6c 5f  ml,......   xml_
fe650 6c 65 6e 29 3b 0a 09 20 20 69 66 20 28 69 6e 74  len);..  if (int
fe660 65 72 6e 61 6c 53 63 68 65 6d 61 55 52 49 20 3d  ernalSchemaURI =
fe670 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09  = NULL)..    {..
fe680 09 2f 2a 20 75 6e 61 62 6c 65 20 74 6f 20 69 64  ./* unable to id
fe690 65 6e 74 69 66 79 20 74 68 65 20 53 63 68 65 6d  entify the Schem
fe6a0 61 55 52 49 20 2a 2f 0a 09 09 70 5f 72 65 73 75  aURI */...p_resu
fe6b0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  lt = NULL;..    
fe6c0 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
fe6d0 0a 09 09 2f 2a 20 6f 6b 2c 20 61 74 74 65 6d 70  .../* ok, attemp
fe6e0 74 69 6e 67 20 74 6f 20 76 61 6c 69 64 61 74 65  ting to validate
fe6f0 20 75 73 69 6e 67 20 74 68 65 20 69 6e 74 65 72   using the inter
fe700 6e 61 6c 20 53 63 68 65 6d 61 55 52 49 20 2a 2f  nal SchemaURI */
fe710 0a 09 09 67 61 69 61 58 6d 6c 54 6f 42 6c 6f 62  ...gaiaXmlToBlob
fe720 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64   (sqlite3_user_d
fe730 61 74 61 20 28 63 6f 6e 74 65 78 74 29 2c 20 78  ata (context), x
fe740 6d 6c 2c 20 78 6d 6c 5f 6c 65 6e 2c 0a 09 09 09  ml, xml_len,....
fe750 20 20 20 20 20 20 20 63 6f 6d 70 72 65 73 73 65         compresse
fe760 64 2c 20 69 6e 74 65 72 6e 61 6c 53 63 68 65 6d  d, internalSchem
fe770 61 55 52 49 2c 20 26 70 5f 72 65 73 75 6c 74 2c  aURI, &p_result,
fe780 0a 09 09 09 20 20 20 20 20 20 20 26 6c 65 6e 2c  ....       &len,
fe790 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09   NULL, NULL);...
fe7a0 66 72 65 65 20 28 69 6e 74 65 72 6e 61 6c 53 63  free (internalSc
fe7b0 68 65 6d 61 55 52 49 29 3b 0a 09 20 20 20 20 7d  hemaURI);..    }
fe7c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
fe7d0 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  e.      {..  if 
fe7e0 28 61 72 67 63 20 3d 3d 20 33 29 0a 09 20 20 20  (argc == 3)..   
fe7f0 20 20 20 73 63 68 65 6d 61 55 52 49 20 3d 20 28     schemaURI = (
fe800 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
fe810 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
fe820 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 67   (argv[2]);..  g
fe830 61 69 61 58 6d 6c 54 6f 42 6c 6f 62 20 28 73 71  aiaXmlToBlob (sq
fe840 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
fe850 28 63 6f 6e 74 65 78 74 29 2c 20 78 6d 6c 2c 20  (context), xml, 
fe860 78 6d 6c 5f 6c 65 6e 2c 0a 09 09 09 20 63 6f 6d  xml_len,.... com
fe870 70 72 65 73 73 65 64 2c 20 73 63 68 65 6d 61 55  pressed, schemaU
fe880 52 49 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26  RI, &p_result, &
fe890 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  len, NULL, NULL)
fe8a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
fe8b0 20 28 70 5f 72 65 73 75 6c 74 20 3d 3d 20 4e 55   (p_result == NU
fe8c0 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  LL).      {..  s
fe8d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
fe8e0 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
fe8f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
fe900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
fe910 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
fe920 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65 6e  t, p_result, len
fe930 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74  , free);.}..stat
fe940 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f  ic void.fnct_XB_
fe950 4c 6f 61 64 58 4d 4c 20 28 73 71 6c 69 74 65 33  LoadXML (sqlite3
fe960 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
fe970 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
fe980 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
fe990 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
fe9a0 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 4c 6f 61  nction:./ XB_Loa
fe9b0 64 58 4d 4c 28 74 65 78 74 20 70 61 74 68 2d 6f  dXML(text path-o
fe9c0 72 2d 55 52 4c 29 0a 2f 0a 2f 20 72 65 74 75 72  r-URL)././ retur
fe9d0 6e 73 20 61 20 67 65 6e 65 72 69 63 20 54 65 78  ns a generic Tex
fe9e0 74 20 62 79 20 70 61 72 73 69 6e 67 20 61 6e 20  t by parsing an 
fe9f0 58 4d 4c 20 44 6f 63 75 6d 65 6e 74 20 0a 2f 20  XML Document ./ 
fea00 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65  or NULL if any e
fea10 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
fea20 72 65 64 0a 2f 0a 2a 2f 0a 20 20 20 20 63 6f 6e  red./.*/.    con
fea30 73 74 20 63 68 61 72 20 2a 70 61 74 68 5f 6f 72  st char *path_or
fea40 5f 75 72 6c 3b 0a 20 20 20 20 75 6e 73 69 67 6e  _url;.    unsign
fea50 65 64 20 63 68 61 72 20 2a 78 6d 6c 3b 0a 20 20  ed char *xml;.  
fea60 20 20 69 6e 74 20 78 6d 6c 5f 6c 65 6e 3b 0a 20    int xml_len;. 
fea70 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20     int ret;.    
fea80 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
fea90 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
feaa0 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
feab0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
feac0 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
fead0 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
feae0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
feaf0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
feb00 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
feb10 20 20 20 20 20 20 7d 0a 20 20 20 20 70 61 74 68        }.    path
feb20 5f 6f 72 5f 75 72 6c 20 3d 20 28 63 6f 6e 73 74  _or_url = (const
feb30 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
feb40 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67  _value_text (arg
feb50 76 5b 30 5d 29 3b 0a 0a 2f 2a 20 61 63 71 75 69  v[0]);../* acqui
feb60 72 69 6e 67 20 74 68 65 20 58 4d 4c 20 44 6f 63  ring the XML Doc
feb70 75 6d 65 6e 74 20 61 73 20 61 20 42 6c 6f 62 20  ument as a Blob 
feb80 2a 2f 0a 20 20 20 20 72 65 74 20 3d 20 67 61 69  */.    ret = gai
feb90 61 58 6d 6c 4c 6f 61 64 0a 09 28 73 71 6c 69 74  aXmlLoad..(sqlit
feba0 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
febb0 6e 74 65 78 74 29 2c 20 70 61 74 68 5f 6f 72 5f  ntext), path_or_
febc0 75 72 6c 2c 20 26 78 6d 6c 2c 20 26 78 6d 6c 5f  url, &xml, &xml_
febd0 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  len, NULL);.    
febe0 69 66 20 28 21 72 65 74 20 7c 7c 20 78 6d 6c 20  if (!ret || xml 
febf0 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
fec00 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
fec10 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
fec20 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
fec30 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
fec40 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
fec50 63 6f 6e 74 65 78 74 2c 20 78 6d 6c 2c 20 78 6d  context, xml, xm
fec60 6c 5f 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a  l_len, free);.}.
fec70 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
fec80 74 5f 58 42 5f 47 65 74 50 61 79 6c 6f 61 64 20  t_XB_GetPayload 
fec90 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
feca0 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
fecb0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
fecc0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
fecd0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
fece0 2f 20 58 42 5f 47 65 74 50 61 79 6c 6f 61 64 28  / XB_GetPayload(
fecf0 58 6d 6c 42 4c 4f 42 29 0a 2f 20 58 42 5f 47 65  XmlBLOB)./ XB_Ge
fed00 74 50 61 79 6c 6f 61 64 28 58 6d 6c 42 4c 4f 42  tPayload(XmlBLOB
fed10 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 0a 2f 0a  , int format)./.
fed20 2f 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 75  / returns the cu
fed30 72 72 65 6e 74 20 58 4d 4c 44 6f 63 75 6d 65 6e  rrent XMLDocumen
fed40 74 20 28 61 73 20 42 4c 4f 42 29 20 62 79 20 70  t (as BLOB) by p
fed50 61 72 73 69 6e 67 20 61 6e 20 58 6d 6c 42 4c 4f  arsing an XmlBLO
fed60 42 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20  B ./ or NULL if 
fed70 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
fed80 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 74 68 65  ountered././ the
fed90 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65 72   returned buffer
feda0 20 77 69 6c 6c 20 62 65 20 61 6c 77 61 79 73 20   will be always 
fedb0 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a  null-terminated.
fedc0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
fedd0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
fede0 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79  ob;.    int n_by
fedf0 74 65 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  tes;.    unsigne
fee00 64 20 63 68 61 72 20 2a 6f 75 74 3b 0a 20 20 20  d char *out;.   
fee10 20 69 6e 74 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20   int out_len;.  
fee20 20 20 69 6e 74 20 69 6e 64 65 6e 74 20 3d 20 2d    int indent = -
fee30 31 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  1;.    GAIA_UNUS
fee40 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
fee50 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
fee60 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
fee70 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
fee80 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
fee90 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
feea0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
feeb0 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
feec0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
feed0 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32     if (argc == 2
feee0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
feef0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
fef00 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d  ype (argv[1]) !=
fef10 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
fef20 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
fef30 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
fef40 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
fef50 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
fef60 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73  }.    p_blob = s
fef70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
fef80 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
fef90 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
fefa0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
fefb0 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
fefc0 20 28 61 72 67 63 20 3d 3d 20 32 29 0a 09 69 6e   (argc == 2)..in
fefd0 64 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  dent = sqlite3_v
fefe0 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
feff0 5d 29 3b 0a 20 20 20 20 67 61 69 61 58 6d 6c 46  ]);.    gaiaXmlF
ff000 72 6f 6d 42 6c 6f 62 20 28 70 5f 62 6c 6f 62 2c  romBlob (p_blob,
ff010 20 6e 5f 62 79 74 65 73 2c 20 69 6e 64 65 6e 74   n_bytes, indent
ff020 2c 20 26 6f 75 74 2c 20 26 6f 75 74 5f 6c 65 6e  , &out, &out_len
ff030 29 3b 0a 20 20 20 20 69 66 20 28 6f 75 74 20 3d  );.    if (out =
ff040 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
ff050 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
ff060 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
ff070 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
ff080 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ff090 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
ff0a0 6e 74 65 78 74 2c 20 6f 75 74 2c 20 6f 75 74 5f  ntext, out, out_
ff0b0 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73  len, free);.}..s
ff0c0 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
ff0d0 58 42 5f 53 74 6f 72 65 58 4d 4c 20 28 73 71 6c  XB_StoreXML (sql
ff0e0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
ff0f0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
ff100 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
ff110 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
ff120 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42  L function:./ XB
ff130 5f 53 74 6f 72 65 58 4d 4c 28 58 6d 6c 42 4c 4f  _StoreXML(XmlBLO
ff140 42 2c 20 74 65 78 74 20 70 61 74 68 29 0a 2f 20  B, text path)./ 
ff150 58 42 5f 53 74 6f 72 65 58 4d 4c 28 58 6d 6c 42  XB_StoreXML(XmlB
ff160 4c 4f 42 2c 20 74 61 78 74 20 70 61 74 68 2c 20  LOB, taxt path, 
ff170 69 6e 74 20 66 6f 72 6d 61 74 29 0a 2f 0a 2f 20  int format)././ 
ff180 65 78 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  exports the curr
ff190 65 6e 74 20 58 4d 4c 44 6f 63 75 6d 65 6e 74 20  ent XMLDocument 
ff1a0 69 6e 74 6f 20 61 6e 20 65 78 74 65 72 6e 61 6c  into an external
ff1b0 20 66 69 6c 65 20 62 79 20 70 61 72 73 69 6e 67   file by parsing
ff1c0 20 61 6e 20 58 6d 6c 42 4c 4f 42 20 0a 2f 20 72   an XmlBLOB ./ r
ff1d0 65 74 75 72 6e 20 31 20 6f 6e 20 73 75 63 63 65  eturn 1 on succe
ff1e0 73 73 2c 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  ss, 0 on failure
ff1f0 2c 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64 20  , -1 on invalid 
ff200 61 72 67 73 0a 2f 0a 2a 2f 0a 20 20 20 20 63 6f  args./.*/.    co
ff210 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
ff220 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69  r *p_blob;.    i
ff230 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20  nt n_bytes;.    
ff240 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
ff250 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 6e 74  ;.    int indent
ff260 20 3d 20 2d 31 3b 0a 20 20 20 20 47 41 49 41 5f   = -1;.    GAIA_
ff270 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
ff280 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
ff290 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
ff2a0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
ff2b0 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
ff2c0 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
ff2d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ff2e0 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
ff2f0 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
ff300 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
ff310 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
ff320 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
ff330 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
ff340 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
ff350 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
ff360 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72  t, -1);..  retur
ff370 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
ff380 66 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20  f (argc == 3).  
ff390 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c      {..  if (sql
ff3a0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
ff3b0 28 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c  (argv[2]) != SQL
ff3c0 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20  ITE_INTEGER)..  
ff3d0 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
ff3e0 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
ff3f0 74 2c 20 2d 31 29 3b 0a 09 09 72 65 74 75 72 6e  t, -1);...return
ff400 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
ff410 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73 71  .    p_blob = sq
ff420 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
ff430 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
ff440 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
ff450 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
ff460 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 70 61 74  rgv[0]);.    pat
ff470 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  h = (const char 
ff480 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
ff490 5f 74 65 78 74 20 28 61 72 67 76 5b 31 5d 29 3b  _text (argv[1]);
ff4a0 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
ff4b0 20 33 29 0a 09 69 6e 64 65 6e 74 20 3d 20 73 71   3)..indent = sq
ff4c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
ff4d0 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (argv[2]);.    i
ff4e0 66 20 28 21 67 61 69 61 58 6d 6c 53 74 6f 72 65  f (!gaiaXmlStore
ff4f0 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
ff500 73 2c 20 70 61 74 68 2c 20 69 6e 64 65 6e 74 29  s, path, indent)
ff510 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
ff520 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
ff530 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20  (context, 0);.. 
ff540 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
ff550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
ff560 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
ff570 2c 20 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  , 1);.}..static 
ff580 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 47 65 74  void.fnct_XB_Get
ff590 44 6f 63 75 6d 65 6e 74 20 28 73 71 6c 69 74 65  Document (sqlite
ff5a0 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
ff5b0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
ff5c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
ff5d0 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
ff5e0 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 47 65  unction:./ XB_Ge
ff5f0 74 44 6f 63 75 6d 65 6e 74 28 58 6d 6c 42 4c 4f  tDocument(XmlBLO
ff600 42 29 0a 2f 20 58 42 5f 47 65 74 44 6f 63 75 6d  B)./ XB_GetDocum
ff610 65 6e 74 28 58 6d 6c 42 4c 4f 42 2c 20 69 6e 74  ent(XmlBLOB, int
ff620 20 69 6e 64 65 6e 74 29 0a 2f 0a 2f 20 72 65 74   indent)././ ret
ff630 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  urns the current
ff640 20 58 4d 4c 44 6f 63 75 6d 65 6e 74 20 28 61 73   XMLDocument (as
ff650 20 55 54 46 2d 38 20 54 45 58 54 29 20 62 79 20   UTF-8 TEXT) by 
ff660 70 61 72 73 69 6e 67 20 61 6e 20 58 6d 6c 42 4c  parsing an XmlBL
ff670 4f 42 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66  OB ./ or NULL if
ff680 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
ff690 63 6f 75 6e 74 65 72 65 64 0a 2f 0a 2f 20 74 68  countered././ th
ff6a0 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65  e returned buffe
ff6b0 72 20 77 69 6c 6c 20 62 65 20 61 6c 77 61 79 73  r will be always
ff6c0 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
ff6d0 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  .*/.    const un
ff6e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
ff6f0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
ff700 79 74 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  ytes;.    char *
ff710 78 6d 6c 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  xml;.    int len
ff720 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 6e 74  ;.    int indent
ff730 20 3d 20 2d 31 3b 0a 20 20 20 20 47 41 49 41 5f   = -1;.    GAIA_
ff740 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
ff750 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
ff760 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
ff770 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
ff780 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f  v[0]) != SQLITE_
ff790 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
ff7a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ff7b0 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
ff7c0 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
ff7d0 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20   }.    if (argc 
ff7e0 3d 3d 20 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 2).      {.. 
ff7f0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
ff800 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
ff810 29 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) != SQLITE_INTE
ff820 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71  GER)..    {...sq
ff830 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
ff840 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
ff850 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
ff860 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62      }.    p_blob
ff870 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
ff880 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
ff890 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
ff8a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
ff8b0 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
ff8c0 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29    if (argc == 2)
ff8d0 0a 09 69 6e 64 65 6e 74 20 3d 20 73 71 6c 69 74  ..indent = sqlit
ff8e0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
ff8f0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 78 6d 6c 20  gv[1]);.    xml 
ff900 3d 20 67 61 69 61 58 6d 6c 54 65 78 74 46 72 6f  = gaiaXmlTextFro
ff910 6d 42 6c 6f 62 20 28 70 5f 62 6c 6f 62 2c 20 6e  mBlob (p_blob, n
ff920 5f 62 79 74 65 73 2c 20 69 6e 64 65 6e 74 29 3b  _bytes, indent);
ff930 0a 20 20 20 20 69 66 20 28 78 6d 6c 20 3d 3d 20  .    if (xml == 
ff940 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
ff950 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ff960 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
ff970 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
ff980 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
ff990 6c 65 6e 20 28 28 63 6f 6e 73 74 20 63 68 61 72  len ((const char
ff9a0 20 2a 29 20 78 6d 6c 29 3b 0a 20 20 20 20 73 71   *) xml);.    sq
ff9b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
ff9c0 74 20 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  t (context, (cha
ff9d0 72 20 2a 29 20 78 6d 6c 2c 20 6c 65 6e 2c 20 66  r *) xml, len, f
ff9e0 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ree);.}..static 
ff9f0 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 53 63 68  void.fnct_XB_Sch
ffa00 65 6d 61 56 61 6c 69 64 61 74 65 20 28 73 71 6c  emaValidate (sql
ffa10 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
ffa20 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
ffa30 2c 0a 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  ,....sqlite3_val
ffa40 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
ffa50 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
ffa60 20 58 42 5f 53 63 68 65 6d 61 56 61 6c 69 64 61   XB_SchemaValida
ffa70 74 65 28 58 6d 6c 42 4c 4f 42 2c 20 74 65 78 74  te(XmlBLOB, text
ffa80 20 53 63 68 65 6d 61 55 52 49 29 0a 2f 20 58 42   SchemaURI)./ XB
ffa90 5f 53 63 68 65 6d 61 56 61 6c 69 64 61 74 65 28  _SchemaValidate(
ffaa0 58 6d 6c 42 4c 4f 42 2c 20 74 65 78 74 20 53 63  XmlBLOB, text Sc
ffab0 68 65 6d 61 55 52 49 2c 20 62 6f 6f 6c 20 63 6f  hemaURI, bool co
ffac0 6d 70 72 65 73 73 65 64 29 0a 2f 20 58 42 5f 53  mpressed)./ XB_S
ffad0 63 68 65 6d 61 56 61 6c 69 64 61 74 65 28 58 6d  chemaValidate(Xm
ffae0 6c 42 4c 4f 42 2c 20 69 6e 74 20 49 6e 74 65 72  lBLOB, int Inter
ffaf0 6e 61 6c 53 63 68 65 6d 61 55 52 49 29 0a 2f 20  nalSchemaURI)./ 
ffb00 58 42 5f 53 63 68 65 6d 61 56 61 6c 69 64 61 74  XB_SchemaValidat
ffb10 65 28 58 6d 6c 42 4c 4f 42 2c 20 69 6e 74 20 49  e(XmlBLOB, int I
ffb20 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 55 52 49  nternalSchemaURI
ffb30 2c 20 62 6f 6f 6c 20 63 6f 6d 70 72 65 73 73 65  , bool compresse
ffb40 64 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61  d)././ returns a
ffb50 20 76 61 6c 69 64 61 74 65 64 20 58 6d 6c 42 4c   validated XmlBL
ffb60 4f 42 20 6f 62 6a 65 63 74 20 69 66 20 74 68 65  OB object if the
ffb70 20 53 63 68 65 6d 61 56 61 6c 69 64 61 74 69 6f   SchemaValidatio
ffb80 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
ffb90 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e  ./ or NULL if an
ffba0 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
ffbb0 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69 6e  ntered.*/.    in
ffbc0 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 75  t len = 0;.    u
ffbd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
ffbe0 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
ffbf0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
ffc00 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
ffc10 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
ffc20 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
ffc30 61 72 20 2a 78 6d 6c 3b 0a 20 20 20 20 69 6e 74  ar *xml;.    int
ffc40 20 78 6d 6c 5f 6c 65 6e 3b 0a 20 20 20 20 69 6e   xml_len;.    in
ffc50 74 20 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 31  t compressed = 1
ffc60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ffc70 20 2a 73 63 68 65 6d 61 55 52 49 20 3d 20 4e 55   *schemaURI = NU
ffc80 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 5f  LL;.    int use_
ffc90 69 6e 74 65 72 6e 61 6c 5f 73 63 68 65 6d 61 5f  internal_schema_
ffca0 75 72 69 20 3d 20 30 3b 0a 20 20 20 20 47 41 49  uri = 0;.    GAI
ffcb0 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
ffcc0 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
ffcd0 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
ffce0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
ffcf0 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54  rgv[0]) != SQLIT
ffd00 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
ffd10 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
ffd20 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
ffd30 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
ffd40 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
ffd50 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
ffd60 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
ffd70 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 75 73  ITE_INTEGER)..us
ffd80 65 5f 69 6e 74 65 72 6e 61 6c 5f 73 63 68 65 6d  e_internal_schem
ffd90 61 5f 75 72 69 20 3d 20 31 3b 0a 20 20 20 20 65  a_uri = 1;.    e
ffda0 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
ffdb0 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
ffdc0 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [1]) != SQLITE_T
ffdd0 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
ffde0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
ffdf0 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
ffe00 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ffe10 7d 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d  }.    if (argc =
ffe20 3d 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  = 3).      {..  
ffe30 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
ffe40 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
ffe50 20 21 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47   != SQLITE_INTEG
ffe60 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  ER)..    {...sql
ffe70 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
ffe80 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
ffe90 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20  turn;..    }.   
ffea0 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
ffeb0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
ffec0 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
ffed0 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71      n_bytes = sq
ffee0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
ffef0 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
fff00 20 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29 0a   if (argc == 3).
fff10 09 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 73 71  .compressed = sq
fff20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
fff30 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 67  (argv[2]);.    g
fff40 61 69 61 58 6d 6c 46 72 6f 6d 42 6c 6f 62 20 28  aiaXmlFromBlob (
fff50 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c  p_blob, n_bytes,
fff60 20 2d 31 2c 20 26 78 6d 6c 2c 20 26 78 6d 6c 5f   -1, &xml, &xml_
fff70 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 78 6d  len);.    if (xm
fff80 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  l == NULL).     
fff90 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
fffa0 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
fffb0 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
fffc0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
fffd0 75 73 65 5f 69 6e 74 65 72 6e 61 6c 5f 73 63 68  use_internal_sch
fffe0 65 6d 61 5f 75 72 69 29 0a 20 20 20 20 20 20 7b  ema_uri).      {
ffff0 0a 09 20 20 2f 2a 20 75 73 69 6e 67 20 74 68 65  ..  /* using the
10000 20 53 63 68 65 6d 61 55 52 49 20 69 6e 74 65 72   SchemaURI inter
10001 6e 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 77 69  nally defined wi
10002 74 68 69 6e 20 74 68 65 20 58 4d 4c 44 6f 63 75  thin the XMLDocu
10003 6d 65 6e 74 20 2a 2f 0a 09 20 20 63 68 61 72 20  ment */..  char 
10004 2a 69 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 55  *internalSchemaU
10005 52 49 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61  RI =..      gaia
10006 58 6d 6c 47 65 74 49 6e 74 65 72 6e 61 6c 53 63  XmlGetInternalSc
10007 68 65 6d 61 55 52 49 20 28 73 71 6c 69 74 65 33  hemaURI (sqlite3
10008 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
10009 65 78 74 29 2c 20 78 6d 6c 2c 0a 09 09 09 09 09  ext), xml,......
1000a 20 20 20 78 6d 6c 5f 6c 65 6e 29 3b 0a 09 20 20     xml_len);..  
1000b 69 66 20 28 69 6e 74 65 72 6e 61 6c 53 63 68 65  if (internalSche
1000c 6d 61 55 52 49 20 3d 3d 20 4e 55 4c 4c 29 0a 09  maURI == NULL)..
1000d 20 20 20 20 7b 0a 09 09 2f 2a 20 75 6e 61 62 6c      {.../* unabl
1000e 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
1000f 65 20 53 63 68 65 6d 61 55 52 49 20 2a 2f 0a 09  e SchemaURI */..
10010 09 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c  .p_result = NULL
10011 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
10012 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c  ..    {.../* ok,
10013 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
10014 61 6c 69 64 61 74 65 20 75 73 69 6e 67 20 74 68  alidate using th
10015 65 20 69 6e 74 65 72 6e 61 6c 20 53 63 68 65 6d  e internal Schem
10016 61 55 52 49 20 2a 2f 0a 09 09 67 61 69 61 58 6d  aURI */...gaiaXm
10017 6c 54 6f 42 6c 6f 62 20 28 73 71 6c 69 74 65 33  lToBlob (sqlite3
10018 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74  _user_data (cont
10019 65 78 74 29 2c 20 78 6d 6c 2c 20 78 6d 6c 5f 6c  ext), xml, xml_l
1001a 65 6e 2c 0a 09 09 09 20 20 20 20 20 20 20 63 6f  en,....       co
1001b 6d 70 72 65 73 73 65 64 2c 20 69 6e 74 65 72 6e  mpressed, intern
1001c 61 6c 53 63 68 65 6d 61 55 52 49 2c 20 26 70 5f  alSchemaURI, &p_
1001d 72 65 73 75 6c 74 2c 0a 09 09 09 20 20 20 20 20  result,....     
1001e 20 20 26 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 4e 55    &len, NULL, NU
1001f 4c 4c 29 3b 0a 09 09 66 72 65 65 20 28 69 6e 74  LL);...free (int
10020 65 72 6e 61 6c 53 63 68 65 6d 61 55 52 49 29 3b  ernalSchemaURI);
10021 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
10022 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
10023 0a 09 20 20 73 63 68 65 6d 61 55 52 49 20 3d 20  ..  schemaURI = 
10024 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
10025 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
10026 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  t (argv[1]);..  
10027 67 61 69 61 58 6d 6c 54 6f 42 6c 6f 62 20 28 73  gaiaXmlToBlob (s
10028 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
10029 20 28 63 6f 6e 74 65 78 74 29 2c 20 78 6d 6c 2c   (context), xml,
1002a 20 78 6d 6c 5f 6c 65 6e 2c 0a 09 09 09 20 63 6f   xml_len,.... co
1002b 6d 70 72 65 73 73 65 64 2c 20 73 63 68 65 6d 61  mpressed, schema
1002c 55 52 49 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20  URI, &p_result, 
1002d 26 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  &len, NULL, NULL
1002e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66  );.      }.    f
1002f 72 65 65 20 28 78 6d 6c 29 3b 0a 20 20 20 20 69  ree (xml);.    i
10030 66 20 28 70 5f 72 65 73 75 6c 74 20 3d 3d 20 4e  f (p_result == N
10031 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
10032 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10033 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10034 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10035 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
10036 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
10037 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c 65  xt, p_result, le
10038 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61  n, free);.}..sta
10039 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42  tic void.fnct_XB
1003a 5f 43 6f 6d 70 72 65 73 73 20 28 73 71 6c 69 74  _Compress (sqlit
1003b 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
1003c 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
1003d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1003e 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
1003f 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 43  function:./ XB_C
10040 6f 6d 70 72 65 73 73 28 58 6d 6c 42 4c 4f 42 29  ompress(XmlBLOB)
10041 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61 20 63  ././ returns a c
10042 6f 6d 70 72 65 73 73 65 64 20 58 6d 6c 42 4c 4f  ompressed XmlBLO
10043 42 20 6f 62 6a 65 63 74 20 0a 2f 20 6f 72 20 4e  B object ./ or N
10044 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ULL if any error
10045 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
10046 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  */.    int len;.
10047 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
10048 72 20 2a 70 5f 72 65 73 75 6c 74 20 3d 20 4e 55  r *p_result = NU
10049 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  LL;.    const un
1004a 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
1004b 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
1004c 79 74 65 73 3b 0a 20 20 20 20 47 41 49 41 5f 55  ytes;.    GAIA_U
1004d 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
1004e 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
1004f 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
10050 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10051 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
10052 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
10053 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10054 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10055 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10056 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73  }.    p_blob = s
10057 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
10058 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
10059 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
1005a 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
1005b 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 67 61  argv[0]);.    ga
1005c 69 61 58 6d 6c 42 6c 6f 62 43 6f 6d 70 72 65 73  iaXmlBlobCompres
1005d 73 69 6f 6e 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f  sion (p_blob, n_
1005e 62 79 74 65 73 2c 20 31 2c 20 26 70 5f 72 65 73  bytes, 1, &p_res
1005f 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  ult, &len);.    
10060 69 66 20 28 70 5f 72 65 73 75 6c 74 20 3d 3d 20  if (p_result == 
10061 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
10062 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10063 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
10064 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
10065 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
10066 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74  esult_blob (cont
10067 65 78 74 2c 20 70 5f 72 65 73 75 6c 74 2c 20 6c  ext, p_result, l
10068 65 6e 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74  en, free);.}..st
10069 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58  atic void.fnct_X
1006a 42 5f 55 6e 63 6f 6d 70 72 65 73 73 20 28 73 71  B_Uncompress (sq
1006b 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
1006c 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1006d 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1006e 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
1006f 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58  QL function:./ X
10070 42 5f 55 6e 63 6f 6d 70 72 65 73 73 28 58 6d 6c  B_Uncompress(Xml
10071 42 4c 4f 42 29 0a 2f 0a 2f 20 72 65 74 75 72 6e  BLOB)././ return
10072 73 20 61 6e 20 75 6e 63 6f 6d 70 72 65 73 73 65  s an uncompresse
10073 64 20 58 6d 6c 42 4c 4f 42 20 6f 62 6a 65 63 74  d XmlBLOB object
10074 20 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61   ./ or NULL if a
10075 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
10076 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 69  untered.*/.    i
10077 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69  nt len;.    unsi
10078 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 72 65 73  gned char *p_res
10079 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ult = NULL;.    
1007a 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1007b 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20  har *p_blob;.   
1007c 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20   int n_bytes;.  
1007d 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
1007e 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
1007f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
10080 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10081 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
10082 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
10083 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
10084 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10085 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
10086 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
10087 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  blob = sqlite3_v
10088 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
10089 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73  0]);.    n_bytes
1008a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1008b 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
1008c 3b 0a 20 20 20 20 67 61 69 61 58 6d 6c 42 6c 6f  ;.    gaiaXmlBlo
1008d 62 43 6f 6d 70 72 65 73 73 69 6f 6e 20 28 70 5f  bCompression (p_
1008e 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 30  blob, n_bytes, 0
1008f 2c 20 26 70 5f 72 65 73 75 6c 74 2c 20 26 6c 65  , &p_result, &le
10090 6e 29 3b 0a 20 20 20 20 69 66 20 28 70 5f 72 65  n);.    if (p_re
10091 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  sult == NULL).  
10092 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
10093 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
10094 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
10095 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  n;.      }.    s
10096 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
10097 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f 72  ob (context, p_r
10098 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65 65  esult, len, free
10099 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1009a 64 0a 66 6e 63 74 5f 58 42 5f 49 73 56 61 6c 69  d.fnct_XB_IsVali
1009b 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  d (sqlite3_conte
1009c 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
1009d 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1009e 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
1009f 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
100a0 3a 0a 2f 20 58 42 5f 49 73 56 61 6c 69 64 28 58  :./ XB_IsValid(X
100a1 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f 20 72 65 74 75  mlBLOB)././ retu
100a2 72 6e 73 20 54 52 55 45 20 69 66 20 74 68 65 20  rns TRUE if the 
100a3 63 75 72 72 65 6e 74 20 42 4c 4f 42 20 69 73 20  current BLOB is 
100a4 61 6e 20 58 6d 6c 42 4c 4f 42 2c 20 46 41 4c 53  an XmlBLOB, FALS
100a5 45 20 69 66 20 6e 6f 74 20 0a 2f 20 6f 72 20 2d  E if not ./ or -
100a6 31 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  1 if any error i
100a7 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
100a8 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
100a9 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
100aa 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
100ab 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 47 41   int ret;.    GA
100ac 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
100ad 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
100ae 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
100af 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
100b0 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
100b1 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
100b2 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
100b3 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
100b4 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
100b5 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
100b6 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
100b7 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
100b8 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
100b9 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
100ba 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
100bb 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
100bc 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 67 61 69  );.    ret = gai
100bd 61 49 73 56 61 6c 69 64 58 6d 6c 42 6c 6f 62 20  aIsValidXmlBlob 
100be 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
100bf 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
100c0 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
100c1 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
100c2 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42  tic void.fnct_XB
100c3 5f 49 73 43 6f 6d 70 72 65 73 73 65 64 20 28 73  _IsCompressed (s
100c4 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
100c5 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
100c6 67 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69  gc,...      sqli
100c7 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
100c8 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
100c9 74 69 6f 6e 3a 0a 2f 20 58 42 5f 49 73 43 6f 6d  tion:./ XB_IsCom
100ca 70 72 65 73 73 65 64 28 58 6d 6c 42 4c 4f 42 29  pressed(XmlBLOB)
100cb 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 54 52 55  ././ returns TRU
100cc 45 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  E if the current
100cd 20 42 4c 4f 42 20 69 73 20 61 20 63 6f 6d 70 72   BLOB is a compr
100ce 65 73 73 65 64 20 58 6d 6c 42 4c 4f 42 2c 0a 2f  essed XmlBLOB,./
100cf 20 46 41 4c 53 45 20 69 66 20 69 74 27 73 20 61   FALSE if it's a
100d0 20 76 61 6c 69 64 20 75 6e 63 6f 6d 70 72 65 73   valid uncompres
100d1 73 65 64 20 58 6d 6c 42 4c 4f 42 20 0a 2f 20 6f  sed XmlBLOB ./ o
100d2 72 20 2d 31 20 69 66 20 61 6e 79 20 65 72 72 6f  r -1 if any erro
100d3 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
100d4 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
100d5 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
100d6 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
100d7 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
100d8 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
100d9 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
100da 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
100db 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
100dc 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
100dd 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
100de 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
100df 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
100e0 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
100e1 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
100e2 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
100e3 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
100e4 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
100e5 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
100e6 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
100e7 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
100e8 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  [0]);.    ret = 
100e9 67 61 69 61 49 73 43 6f 6d 70 72 65 73 73 65 64  gaiaIsCompressed
100ea 58 6d 6c 42 6c 6f 62 20 28 70 5f 62 6c 6f 62 2c  XmlBlob (p_blob,
100eb 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 73   n_bytes);.    s
100ec 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
100ed 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
100ee 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
100ef 0a 66 6e 63 74 5f 58 42 5f 49 73 53 63 68 65 6d  .fnct_XB_IsSchem
100f0 61 56 61 6c 69 64 61 74 65 64 20 28 73 71 6c 69  aValidated (sqli
100f1 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
100f2 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
100f3 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76  ....   sqlite3_v
100f4 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
100f5 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
100f6 0a 2f 20 58 42 5f 49 73 53 63 68 65 6d 61 56 61  ./ XB_IsSchemaVa
100f7 6c 69 64 61 74 65 64 28 58 6d 6c 42 4c 4f 42 29  lidated(XmlBLOB)
100f8 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 54 52 55  ././ returns TRU
100f9 45 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  E if the current
100fa 20 42 4c 4f 42 20 69 73 20 61 20 53 63 68 65 6d   BLOB is a Schem
100fb 61 20 76 61 6c 69 64 61 74 65 64 20 58 6d 6c 42  a validated XmlB
100fc 4c 4f 42 2c 0a 2f 20 46 41 4c 53 45 20 69 66 20  LOB,./ FALSE if 
100fd 69 74 27 73 20 61 20 76 61 6c 69 64 20 62 75 74  it's a valid but
100fe 20 6e 6f 74 20 76 61 6c 69 64 61 74 65 64 20 58   not validated X
100ff 6d 6c 42 4c 4f 42 20 0a 2f 20 6f 72 20 2d 31 20  mlBLOB ./ or -1 
10100 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
10101 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20  encountered.*/. 
10102 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
10103 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e   *p_blob;.    in
10104 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69  t n_bytes;.    i
10105 6e 74 20 72 65 74 3b 0a 20 20 20 20 47 41 49 41  nt ret;.    GAIA
10106 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
10107 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
10108 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
10109 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
1010a 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
1010b 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
1010c 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1010d 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d  _int (context, -
1010e 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  1);..  return;. 
1010f 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
10110 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
10111 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
10112 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
10113 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
10114 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
10115 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
10116 0a 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 49  .    ret = gaiaI
10117 73 53 63 68 65 6d 61 56 61 6c 69 64 61 74 65 64  sSchemaValidated
10118 58 6d 6c 42 6c 6f 62 20 28 70 5f 62 6c 6f 62 2c  XmlBlob (p_blob,
10119 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 73   n_bytes);.    s
1011a 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
1011b 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 74 29  t (context, ret)
1011c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1011d 0a 66 6e 63 74 5f 58 42 5f 49 73 49 73 6f 4d 65  .fnct_XB_IsIsoMe
1011e 74 61 64 61 74 61 20 28 73 71 6c 69 74 65 33 5f  tadata (sqlite3_
1011f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
10120 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20  t, int argc,... 
10121 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
10122 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
10123 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
10124 2f 20 58 42 5f 49 73 49 73 6f 4d 65 74 61 64 61  / XB_IsIsoMetada
10125 74 61 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f 20  ta(XmlBLOB)././ 
10126 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
10127 74 68 65 20 63 75 72 72 65 6e 74 20 42 4c 4f 42  the current BLOB
10128 20 69 73 20 61 6e 20 49 53 4f 20 4d 65 74 61 64   is an ISO Metad
10129 61 74 61 20 58 6d 6c 42 4c 4f 42 2c 0a 2f 20 46  ata XmlBLOB,./ F
1012a 41 4c 53 45 20 69 66 20 69 74 27 73 20 61 20 76  ALSE if it's a v
1012b 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20 62 75 74  alid XmlBLOB but
1012c 20 6e 6f 74 20 61 6e 20 49 53 4f 20 4d 65 74 61   not an ISO Meta
1012d 64 61 74 61 0a 2f 20 6f 72 20 2d 31 20 69 66 20  data./ or -1 if 
1012e 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
1012f 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
10130 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10131 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
10132 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20  _bytes;.    int 
10133 72 65 74 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e  ret;.    GAIA_UN
10134 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f  USED ();../* LCO
10135 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20  V_EXCL_LINE */. 
10136 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
10137 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10138 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) != SQLITE_BL
10139 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  OB).      {..  s
1013a 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
1013b 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b  t (context, -1);
1013c 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
1013d 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
1013e 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1013f 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
10140 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
10141 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73  .    n_bytes = s
10142 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
10143 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
10144 20 20 72 65 74 20 3d 20 67 61 69 61 49 73 49 73    ret = gaiaIsIs
10145 6f 4d 65 74 61 64 61 74 61 58 6d 6c 42 6c 6f 62  oMetadataXmlBlob
10146 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65   (p_blob, n_byte
10147 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
10148 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
10149 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74  ext, ret);.}..st
1014a 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58  atic void.fnct_X
1014b 42 5f 49 73 53 6c 64 53 65 56 65 63 74 6f 72 53  B_IsSldSeVectorS
1014c 74 79 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f  tyle (sqlite3_co
1014d 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
1014e 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20   int argc,....  
1014f 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10150 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
10151 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42  L function:./ XB
10152 5f 49 73 53 6c 64 53 65 56 65 63 74 6f 72 53 74  _IsSldSeVectorSt
10153 79 6c 65 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f  yle(XmlBLOB)././
10154 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66   returns TRUE if
10155 20 74 68 65 20 63 75 72 72 65 6e 74 20 42 4c 4f   the current BLO
10156 42 20 69 73 20 61 6e 20 53 4c 44 2f 53 45 20 56  B is an SLD/SE V
10157 65 63 74 6f 72 20 53 74 79 6c 65 20 58 6d 6c 42  ector Style XmlB
10158 4c 4f 42 2c 0a 2f 20 46 41 4c 53 45 20 69 66 20  LOB,./ FALSE if 
10159 69 74 27 73 20 61 20 76 61 6c 69 64 20 58 6d 6c  it's a valid Xml
1015a 42 4c 4f 42 20 62 75 74 20 6e 6f 74 20 61 6e 20  BLOB but not an 
1015b 53 4c 44 2f 53 45 20 53 74 79 6c 65 0a 2f 20 6f  SLD/SE Style./ o
1015c 72 20 2d 31 20 69 66 20 61 6e 79 20 65 72 72 6f  r -1 if any erro
1015d 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1015e 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  .*/.    unsigned
1015f 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
10160 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
10161 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20      int ret;.   
10162 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
10163 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
10164 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
10165 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
10166 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
10167 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
10168 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
10169 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
1016a 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
1016b 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1016c 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e  p_blob = (unsign
1016d 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
1016e 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
1016f 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
10170 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
10171 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
10172 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  [0]);.    ret = 
10173 67 61 69 61 49 73 53 6c 64 53 65 56 65 63 74 6f  gaiaIsSldSeVecto
10174 72 53 74 79 6c 65 58 6d 6c 42 6c 6f 62 20 28 70  rStyleXmlBlob (p
10175 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b  _blob, n_bytes);
10176 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
10177 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ult_int (context
10178 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  , ret);.}..stati
10179 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 49  c void.fnct_XB_I
1017a 73 53 6c 64 53 65 52 61 73 74 65 72 53 74 79 6c  sSldSeRasterStyl
1017b 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
1017c 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
1017d 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 73  t argc,....    s
1017e 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
1017f 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
10180 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 49 73  unction:./ XB_Is
10181 53 6c 64 53 65 52 61 73 74 65 72 53 74 79 6c 65  SldSeRasterStyle
10182 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f 20 72 65  (XmlBLOB)././ re
10183 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 74 68  turns TRUE if th
10184 65 20 63 75 72 72 65 6e 74 20 42 4c 4f 42 20 69  e current BLOB i
10185 73 20 61 6e 20 53 4c 44 2f 53 45 20 52 61 73 74  s an SLD/SE Rast
10186 65 72 20 53 74 79 6c 65 20 58 6d 6c 42 4c 4f 42  er Style XmlBLOB
10187 2c 0a 2f 20 46 41 4c 53 45 20 69 66 20 69 74 27  ,./ FALSE if it'
10188 73 20 61 20 76 61 6c 69 64 20 58 6d 6c 42 4c 4f  s a valid XmlBLO
10189 42 20 62 75 74 20 6e 6f 74 20 61 6e 20 53 4c 44  B but not an SLD
1018a 2f 53 45 20 53 74 79 6c 65 0a 2f 20 6f 72 20 2d  /SE Style./ or -
1018b 31 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  1 if any error i
1018c 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2f  s encountered.*/
1018d 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
1018e 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
1018f 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
10190 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 47 41   int ret;.    GA
10191 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
10192 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
10193 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
10194 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10195 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
10196 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
10197 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
10198 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
10199 20 2d 31 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b   -1);..  return;
1019a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
1019b 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  lob = (unsigned 
1019c 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
1019d 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76  value_blob (argv
1019e 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65  [0]);.    n_byte
1019f 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
101a0 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d  e_bytes (argv[0]
101a1 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 67 61 69  );.    ret = gai
101a2 61 49 73 53 6c 64 53 65 52 61 73 74 65 72 53 74  aIsSldSeRasterSt
101a3 79 6c 65 58 6d 6c 42 6c 6f 62 20 28 70 5f 62 6c  yleXmlBlob (p_bl
101a4 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20  ob, n_bytes);.  
101a5 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
101a6 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72  _int (context, r
101a7 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  et);.}..static v
101a8 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 49 73 53 6c  oid.fnct_XB_IsSl
101a9 64 53 74 79 6c 65 20 28 73 71 6c 69 74 65 33 5f  dStyle (sqlite3_
101aa 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
101ab 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
101ac 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
101ad 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
101ae 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 49 73 53 6c  ction:./ XB_IsSl
101af 64 53 74 79 6c 65 28 58 6d 6c 42 4c 4f 42 29 0a  dStyle(XmlBLOB).
101b0 2f 0a 2f 20 72 65 74 75 72 6e 73 20 54 52 55 45  /./ returns TRUE
101b1 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
101b2 42 4c 4f 42 20 69 73 20 61 6e 20 53 4c 44 20 53  BLOB is an SLD S
101b3 74 79 6c 65 20 58 6d 6c 42 4c 4f 42 2c 0a 2f 20  tyle XmlBLOB,./ 
101b4 46 41 4c 53 45 20 69 66 20 69 74 27 73 20 61 20  FALSE if it's a 
101b5 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20 62 75  valid XmlBLOB bu
101b6 74 20 6e 6f 74 20 61 6e 20 53 4c 44 20 53 74 79  t not an SLD Sty
101b7 6c 65 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e  le./ or -1 if an
101b8 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
101b9 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e  ntered.*/.    un
101ba 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
101bb 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
101bc 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65  ytes;.    int re
101bd 74 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  t;.    GAIA_UNUS
101be 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
101bf 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
101c0 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
101c1 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
101c2 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) != SQLITE_BLOB
101c3 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
101c4 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20  ite3_result_int 
101c5 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09  (context, -1);..
101c6 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
101c7 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28  }.    p_blob = (
101c8 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
101c9 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
101ca 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
101cb 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
101cc 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
101cd 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
101ce 72 65 74 20 3d 20 67 61 69 61 49 73 53 6c 64 53  ret = gaiaIsSldS
101cf 74 79 6c 65 58 6d 6c 42 6c 6f 62 20 28 70 5f 62  tyleXmlBlob (p_b
101d0 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20  lob, n_bytes);. 
101d1 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
101d2 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20  t_int (context, 
101d3 72 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ret);.}..static 
101d4 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 49 73 53  void.fnct_XB_IsS
101d5 76 67 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  vg (sqlite3_cont
101d6 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
101d7 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
101d8 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
101d9 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
101da 6e 3a 0a 2f 20 58 42 5f 49 73 53 76 67 28 58 6d  n:./ XB_IsSvg(Xm
101db 6c 42 4c 4f 42 29 0a 2f 0a 2f 20 72 65 74 75 72  lBLOB)././ retur
101dc 6e 73 20 54 52 55 45 20 69 66 20 74 68 65 20 63  ns TRUE if the c
101dd 75 72 72 65 6e 74 20 42 4c 4f 42 20 69 73 20 61  urrent BLOB is a
101de 6e 20 53 4c 44 2f 53 45 20 53 74 79 6c 65 20 58  n SLD/SE Style X
101df 6d 6c 42 4c 4f 42 2c 0a 2f 20 46 41 4c 53 45 20  mlBLOB,./ FALSE 
101e0 69 66 20 69 74 27 73 20 61 20 76 61 6c 69 64 20  if it's a valid 
101e1 58 6d 6c 42 4c 4f 42 20 62 75 74 20 6e 6f 74 20  XmlBLOB but not 
101e2 61 6e 20 53 4c 44 2f 53 45 20 53 74 79 6c 65 0a  an SLD/SE Style.
101e3 2f 20 6f 72 20 2d 31 20 69 66 20 61 6e 79 20 65  / or -1 if any e
101e4 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
101e5 72 65 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  red.*/.    unsig
101e6 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
101e7 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
101e8 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  s;.    int ret;.
101e9 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
101ea 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
101eb 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
101ec 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
101ed 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
101ee 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
101ef 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
101f0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
101f1 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
101f2 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
101f3 20 20 20 70 5f 62 6c 6f 62 20 3d 20 28 75 6e 73     p_blob = (uns
101f4 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71  igned char *) sq
101f5 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
101f6 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
101f7 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  n_bytes = sqlite
101f8 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
101f9 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74  rgv[0]);.    ret
101fa 20 3d 20 67 61 69 61 49 73 53 76 67 58 6d 6c 42   = gaiaIsSvgXmlB
101fb 6c 6f 62 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62  lob (p_blob, n_b
101fc 79 74 65 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  ytes);.    sqlit
101fd 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
101fe 6f 6e 74 65 78 74 2c 20 72 65 74 29 3b 0a 7d 0a  ontext, ret);.}.
101ff 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
10200 74 5f 58 42 5f 49 73 47 70 78 20 28 73 71 6c 69  t_XB_IsGpx (sqli
10201 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
10202 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
10203 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10204 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
10205 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f   function:./ XB_
10206 49 73 47 70 78 28 58 6d 6c 42 4c 4f 42 29 0a 2f  IsGpx(XmlBLOB)./
10207 0a 2f 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ./ returns TRUE 
10208 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 42  if the current B
10209 4c 4f 42 20 69 73 20 61 20 47 50 58 20 64 6f 63  LOB is a GPX doc
1020a 75 6d 65 6e 74 20 58 6d 6c 42 4c 4f 42 2c 0a 2f  ument XmlBLOB,./
1020b 20 46 41 4c 53 45 20 69 66 20 69 74 27 73 20 61   FALSE if it's a
1020c 20 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20 62   valid XmlBLOB b
1020d 75 74 20 6e 6f 74 20 61 20 47 50 58 20 64 6f 63  ut not a GPX doc
1020e 75 6d 65 6e 74 0a 2f 20 6f 72 20 2d 31 20 69 66  ument./ or -1 if
1020f 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
10210 63 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20  countered.*/.   
10211 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10212 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
10213 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e 74  n_bytes;.    int
10214 20 72 65 74 3b 0a 20 20 20 20 47 41 49 41 5f 55   ret;.    GAIA_U
10215 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
10216 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
10217 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
10218 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10219 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
1021a 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
1021b 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1021c 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31 29  nt (context, -1)
1021d 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
1021e 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20     }.    p_blob 
1021f 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
10220 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   *) sqlite3_valu
10221 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
10222 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
10223 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
10224 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
10225 20 20 20 72 65 74 20 3d 20 67 61 69 61 49 73 47     ret = gaiaIsG
10226 70 78 58 6d 6c 42 6c 6f 62 20 28 70 5f 62 6c 6f  pxXmlBlob (p_blo
10227 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20  b, n_bytes);.   
10228 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10229 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65  int (context, re
1022a 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
1022b 69 64 0a 66 6e 63 74 5f 58 42 5f 47 65 74 44 6f  id.fnct_XB_GetDo
1022c 63 75 6d 65 6e 74 53 69 7a 65 20 28 73 71 6c 69  cumentSize (sqli
1022d 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
1022e 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1022f 0a 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c  .... sqlite3_val
10230 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
10231 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
10232 20 58 42 5f 47 65 74 44 6f 63 75 6d 65 6e 74 53   XB_GetDocumentS
10233 69 7a 65 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f  ize(XmlBLOB)././
10234 20 69 66 20 74 68 65 20 42 4c 4f 42 20 69 73 20   if the BLOB is 
10235 61 20 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20  a valid XmlBLOB 
10236 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20  will return the 
10237 58 4d 4c 44 6f 63 75 6d 65 6e 74 20 73 69 7a 65  XMLDocument size
10238 20 28 69 6e 20 62 79 74 65 73 29 0a 2f 20 6f 72   (in bytes)./ or
10239 20 4e 55 4c 4c 20 69 66 20 61 6e 79 20 65 72 72   NULL if any err
1023a 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1023b 64 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  d.*/.    unsigne
1023c 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a  d char *p_blob;.
1023d 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b      int n_bytes;
1023e 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .    int ret;.  
1023f 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
10240 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
10241 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
10242 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10243 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20  pe (argv[0]) != 
10244 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
10245 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
10246 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10247 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
10248 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f  ;.      }.    p_
10249 62 6c 6f 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  blob = (unsigned
1024a 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33   char *) sqlite3
1024b 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
1024c 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
1024d 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
1024e 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
1024f 5d 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 67 61  ]);.    ret = ga
10250 69 61 58 6d 6c 42 6c 6f 62 47 65 74 44 6f 63 75  iaXmlBlobGetDocu
10251 6d 65 6e 74 53 69 7a 65 20 28 70 5f 62 6c 6f 62  mentSize (p_blob
10252 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20  , n_bytes);.    
10253 69 66 20 28 72 65 74 20 3c 20 30 29 0a 09 73 71  if (ret < 0)..sq
10254 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10255 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
10256 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
10257 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
10258 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
10259 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42  tic void.fnct_XB
1025a 5f 47 65 74 53 63 68 65 6d 61 55 52 49 20 28 73  _GetSchemaURI (s
1025b 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1025c 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
1025d 67 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69  gc,...      sqli
1025e 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
1025f 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
10260 74 69 6f 6e 3a 0a 2f 20 58 42 5f 47 65 74 53 63  tion:./ XB_GetSc
10261 68 65 6d 61 55 52 49 28 58 6d 6c 42 4c 4f 42 29  hemaURI(XmlBLOB)
10262 0a 2f 0a 2f 20 69 66 20 74 68 65 20 42 4c 4f 42  ././ if the BLOB
10263 20 69 73 20 61 20 76 61 6c 69 64 20 58 6d 6c 42   is a valid XmlB
10264 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  LOB containing a
10265 20 53 63 68 65 6d 61 55 52 49 20 74 68 65 6e 0a   SchemaURI then.
10266 2f 20 74 68 65 20 53 63 68 65 6d 61 55 52 49 20  / the SchemaURI 
10267 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
10268 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 6f  ./ return NULL o
10269 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65  n any other case
1026a 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  .*/.    const un
1026b 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62  signed char *p_b
1026c 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  lob;.    int n_b
1026d 79 74 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  ytes;.    char *
1026e 73 63 68 65 6d 61 5f 75 72 69 3b 0a 20 20 20 20  schema_uri;.    
1026f 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
10270 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
10271 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
10272 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10273 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
10274 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
10275 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
10276 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
10277 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
10278 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
10279 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
1027a 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
1027b 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
1027c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1027d 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
1027e 20 20 20 20 73 63 68 65 6d 61 5f 75 72 69 20 3d      schema_uri =
1027f 20 67 61 69 61 58 6d 6c 42 6c 6f 62 47 65 74 53   gaiaXmlBlobGetS
10280 63 68 65 6d 61 55 52 49 20 28 70 5f 62 6c 6f 62  chemaURI (p_blob
10281 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20  , n_bytes);.    
10282 69 66 20 28 73 63 68 65 6d 61 5f 75 72 69 20 3d  if (schema_uri =
10283 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
10284 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
10285 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
10286 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
10287 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
10288 73 63 68 65 6d 61 5f 75 72 69 2c 20 73 74 72 6c  schema_uri, strl
10289 65 6e 20 28 73 63 68 65 6d 61 5f 75 72 69 29 2c  en (schema_uri),
1028a 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69   free);.}..stati
1028b 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 47  c void.fnct_XB_G
1028c 65 74 46 69 6c 65 49 64 20 28 73 71 6c 69 74 65  etFileId (sqlite
1028d 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
1028e 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
1028f 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
10290 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
10291 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 47 65  unction:./ XB_Ge
10292 74 46 69 6c 65 49 64 28 58 6d 6c 42 4c 4f 42 29  tFileId(XmlBLOB)
10293 0a 2f 0a 2f 20 69 66 20 74 68 65 20 42 4c 4f 42  ././ if the BLOB
10294 20 69 73 20 61 20 76 61 6c 69 64 20 58 6d 6c 42   is a valid XmlB
10295 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  LOB containing a
10296 20 46 69 6c 65 49 64 65 6e 74 69 66 69 65 72 20   FileIdentifier 
10297 74 68 65 6e 0a 2f 20 74 68 65 20 46 69 6c 65 49  then./ the FileI
10298 64 65 6e 74 69 66 69 65 72 20 77 69 6c 6c 20 62  dentifier will b
10299 65 20 72 65 74 75 72 6e 65 64 0a 2f 20 72 65 74  e returned./ ret
1029a 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20  urn NULL on any 
1029b 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
1029c 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1029d 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
1029e 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
1029f 20 20 20 20 63 68 61 72 20 2a 66 69 6c 65 5f 69      char *file_i
102a0 64 65 6e 74 69 66 69 65 72 3b 0a 20 20 20 20 47  dentifier;.    G
102a1 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
102a2 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
102a3 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
102a4 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
102a5 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
102a6 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
102a7 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
102a8 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
102a9 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
102aa 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
102ab 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
102ac 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
102ad 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
102ae 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
102af 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
102b0 20 20 20 66 69 6c 65 5f 69 64 65 6e 74 69 66 69     file_identifi
102b1 65 72 20 3d 20 67 61 69 61 58 6d 6c 42 6c 6f 62  er = gaiaXmlBlob
102b2 47 65 74 46 69 6c 65 49 64 20 28 70 5f 62 6c 6f  GetFileId (p_blo
102b3 62 2c 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20  b, n_bytes);.   
102b4 20 69 66 20 28 66 69 6c 65 5f 69 64 65 6e 74 69   if (file_identi
102b5 66 69 65 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73  fier == NULL)..s
102b6 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
102b7 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
102b8 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
102b9 72 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e  result_text (con
102ba 74 65 78 74 2c 20 66 69 6c 65 5f 69 64 65 6e 74  text, file_ident
102bb 69 66 69 65 72 2c 0a 09 09 09 20 20 20 20 20 73  ifier,....     s
102bc 74 72 6c 65 6e 20 28 66 69 6c 65 5f 69 64 65 6e  trlen (file_iden
102bd 74 69 66 69 65 72 29 2c 20 66 72 65 65 29 3b 0a  tifier), free);.
102be 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
102bf 6e 63 74 5f 58 42 5f 47 65 74 50 61 72 65 6e 74  nct_XB_GetParent
102c0 49 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Id (sqlite3_cont
102c1 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
102c2 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
102c3 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
102c4 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
102c5 6e 3a 0a 2f 20 58 42 5f 47 65 74 50 61 72 65 6e  n:./ XB_GetParen
102c6 74 49 64 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f  tId(XmlBLOB)././
102c7 20 69 66 20 74 68 65 20 42 4c 4f 42 20 69 73 20   if the BLOB is 
102c8 61 20 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20  a valid XmlBLOB 
102c9 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 50 61 72  containing a Par
102ca 65 6e 74 49 64 65 6e 74 69 66 69 65 72 20 74 68  entIdentifier th
102cb 65 6e 0a 2f 20 74 68 65 20 50 61 72 65 6e 74 49  en./ the ParentI
102cc 64 65 6e 74 69 66 69 65 72 20 77 69 6c 6c 20 62  dentifier will b
102cd 65 20 72 65 74 75 72 6e 65 64 0a 2f 20 72 65 74  e returned./ ret
102ce 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20  urn NULL on any 
102cf 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
102d0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
102d1 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
102d2 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
102d3 20 20 20 20 63 68 61 72 20 2a 70 61 72 65 6e 74      char *parent
102d4 5f 69 64 65 6e 74 69 66 69 65 72 3b 0a 20 20 20  _identifier;.   
102d5 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
102d6 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
102d7 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
102d8 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
102d9 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
102da 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
102db 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
102dc 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
102dd 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
102de 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
102df 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
102e0 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
102e1 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
102e2 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
102e3 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
102e4 0a 20 20 20 20 70 61 72 65 6e 74 5f 69 64 65 6e  .    parent_iden
102e5 74 69 66 69 65 72 20 3d 20 67 61 69 61 58 6d 6c  tifier = gaiaXml
102e6 42 6c 6f 62 47 65 74 50 61 72 65 6e 74 49 64 20  BlobGetParentId 
102e7 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73  (p_blob, n_bytes
102e8 29 3b 0a 20 20 20 20 69 66 20 28 70 61 72 65 6e  );.    if (paren
102e9 74 5f 69 64 65 6e 74 69 66 69 65 72 20 3d 3d 20  t_identifier == 
102ea 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72  NULL)..sqlite3_r
102eb 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
102ec 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  ext);.    else..
102ed 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
102ee 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 70 61  ext (context, pa
102ef 72 65 6e 74 5f 69 64 65 6e 74 69 66 69 65 72 2c  rent_identifier,
102f0 0a 09 09 09 20 20 20 20 20 73 74 72 6c 65 6e 20  ....     strlen 
102f1 28 70 61 72 65 6e 74 5f 69 64 65 6e 74 69 66 69  (parent_identifi
102f2 65 72 29 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73  er), free);.}..s
102f3 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
102f4 58 42 5f 53 65 74 46 69 6c 65 49 64 20 28 73 71  XB_SetFileId (sq
102f5 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
102f6 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
102f7 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
102f8 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
102f9 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58  QL function:./ X
102fa 42 5f 53 65 74 46 69 6c 65 49 64 28 58 6d 6c 42  B_SetFileId(XmlB
102fb 4c 4f 42 2c 20 54 65 78 74 20 76 61 6c 75 65 29  LOB, Text value)
102fc 0a 2f 0a 2f 20 69 66 20 74 68 65 20 42 4c 4f 42  ././ if the BLOB
102fd 20 69 73 20 61 20 76 61 6c 69 64 20 58 6d 6c 42   is a valid XmlB
102fe 4c 4f 42 20 6f 66 20 74 68 65 20 49 53 4f 2d 4d  LOB of the ISO-M
102ff 65 74 61 64 61 74 61 20 74 79 70 65 0a 2f 20 61  etadata type./ a
10300 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 69 6e  lready containin
10301 67 20 61 20 46 69 6c 65 49 44 20 74 68 65 6e 20  g a FileID then 
10302 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
10303 6c 6c 20 0a 2f 20 72 65 74 75 72 6e 20 61 20 6e  ll ./ return a n
10304 65 77 20 58 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61  ew XmlBLOB conta
10305 69 6e 69 6e 67 20 74 68 65 20 6e 65 77 20 46 69  ining the new Fi
10306 6c 65 49 44 0a 2f 20 72 65 74 75 72 6e 20 4e 55  leID./ return NU
10307 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20  LL on any other 
10308 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73  case.*/.    cons
10309 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1030a 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
1030b 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 75 6e   n_bytes;.    un
1030c 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
1030d 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
1030e 65 77 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f  ew_bytes;.    co
1030f 6e 73 74 20 63 68 61 72 20 2a 69 64 65 6e 74 69  nst char *identi
10310 66 69 65 72 3b 0a 20 20 20 20 47 41 49 41 5f 55  fier;.    GAIA_U
10311 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
10312 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
10313 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
10314 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10315 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42  [0]) != SQLITE_B
10316 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  LOB).      {..  
10317 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10318 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10319 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1031a 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
1031b 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
1031c 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[1]) != SQLITE
1031d 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09  _TEXT).      {..
1031e 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1031f 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
10320 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
10321 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d    }.    p_blob =
10322 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10323 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
10324 20 20 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c     n_bytes = sql
10325 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
10326 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
10327 69 64 65 6e 74 69 66 69 65 72 20 3d 20 28 63 6f  identifier = (co
10328 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
10329 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
1032a 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
1032b 20 28 21 67 61 69 61 58 6d 6c 42 6c 6f 62 53 65   (!gaiaXmlBlobSe
1032c 74 46 69 6c 65 49 64 0a 09 28 73 71 6c 69 74 65  tFileId..(sqlite
1032d 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
1032e 74 65 78 74 29 2c 20 70 5f 62 6c 6f 62 2c 20 6e  text), p_blob, n
1032f 5f 62 79 74 65 73 2c 20 69 64 65 6e 74 69 66 69  _bytes, identifi
10330 65 72 2c 20 26 6e 65 77 5f 62 6c 6f 62 2c 0a 09  er, &new_blob,..
10331 20 26 6e 65 77 5f 62 79 74 65 73 29 29 0a 09 73   &new_bytes))..s
10332 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
10333 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
10334 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
10335 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
10336 74 65 78 74 2c 20 6e 65 77 5f 62 6c 6f 62 2c 20  text, new_blob, 
10337 6e 65 77 5f 62 79 74 65 73 2c 20 66 72 65 65 29  new_bytes, free)
10338 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
10339 0a 66 6e 63 74 5f 58 42 5f 53 65 74 50 61 72 65  .fnct_XB_SetPare
1033a 6e 74 49 64 20 28 73 71 6c 69 74 65 33 5f 63 6f  ntId (sqlite3_co
1033b 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
1033c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1033d 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
1033e 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
1033f 69 6f 6e 3a 0a 2f 20 58 42 5f 53 65 74 50 61 72  ion:./ XB_SetPar
10340 65 6e 74 49 64 28 58 6d 6c 42 4c 4f 42 2c 20 54  entId(XmlBLOB, T
10341 65 78 74 20 76 61 6c 75 65 29 0a 2f 0a 2f 20 69  ext value)././ i
10342 66 20 74 68 65 20 42 4c 4f 42 20 69 73 20 61 20  f the BLOB is a 
10343 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20 6f 66  valid XmlBLOB of
10344 20 74 68 65 20 49 53 4f 2d 4d 65 74 61 64 61 74   the ISO-Metadat
10345 61 20 74 79 70 65 0a 2f 20 61 6c 72 65 61 64 79  a type./ already
10346 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 50 61   containing a Pa
10347 72 65 6e 74 49 44 20 74 68 65 6e 20 74 68 69 73  rentID then this
10348 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 0a   function will .
10349 2f 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 58  / return a new X
1034a 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e  mlBLOB containin
1034b 67 20 74 68 65 20 6e 65 77 20 50 61 72 65 6e 74  g the new Parent
1034c 49 44 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ID./ return NULL
1034d 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61   on any other ca
1034e 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  se.*/.    const 
1034f 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10350 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
10351 5f 62 79 74 65 73 3b 0a 20 20 20 20 75 6e 73 69  _bytes;.    unsi
10352 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 5f 62  gned char *new_b
10353 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77  lob;.    int new
10354 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f 6e 73  _bytes;.    cons
10355 74 20 63 68 61 72 20 2a 69 64 65 6e 74 69 66 69  t char *identifi
10356 65 72 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  er;.    GAIA_UNU
10357 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
10358 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
10359 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
1035a 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
1035b 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
1035c 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
1035d 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
1035e 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
1035f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
10360 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
10361 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10362 5b 31 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 54  [1]) != SQLITE_T
10363 45 58 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  EXT).      {..  
10364 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10365 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10366 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10367 7d 0a 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73  }.    p_blob = s
10368 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
10369 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  b (argv[0]);.   
1036a 20 6e 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74   n_bytes = sqlit
1036b 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
1036c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 64  argv[0]);.    id
1036d 65 6e 74 69 66 69 65 72 20 3d 20 28 63 6f 6e 73  entifier = (cons
1036e 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
1036f 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
10370 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28  gv[1]);.    if (
10371 21 67 61 69 61 58 6d 6c 42 6c 6f 62 53 65 74 50  !gaiaXmlBlobSetP
10372 61 72 65 6e 74 49 64 0a 09 28 73 71 6c 69 74 65  arentId..(sqlite
10373 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
10374 74 65 78 74 29 2c 20 70 5f 62 6c 6f 62 2c 20 6e  text), p_blob, n
10375 5f 62 79 74 65 73 2c 20 69 64 65 6e 74 69 66 69  _bytes, identifi
10376 65 72 2c 20 26 6e 65 77 5f 62 6c 6f 62 2c 0a 09  er, &new_blob,..
10377 20 26 6e 65 77 5f 62 79 74 65 73 29 29 0a 09 73   &new_bytes))..s
10378 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
10379 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ll (context);.  
1037a 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f    else..sqlite3_
1037b 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
1037c 74 65 78 74 2c 20 6e 65 77 5f 62 6c 6f 62 2c 20  text, new_blob, 
1037d 6e 65 77 5f 62 79 74 65 73 2c 20 66 72 65 65 29  new_bytes, free)
1037e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1037f 0a 66 6e 63 74 5f 58 42 5f 41 64 64 46 69 6c 65  .fnct_XB_AddFile
10380 49 64 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  Id (sqlite3_cont
10381 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
10382 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
10383 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
10384 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
10385 6e 3a 0a 2f 20 58 42 5f 41 64 64 46 69 6c 65 49  n:./ XB_AddFileI
10386 64 28 58 6d 6c 42 4c 4f 42 2c 20 54 65 78 74 20  d(XmlBLOB, Text 
10387 76 61 6c 75 65 2c 20 54 65 78 74 20 6e 73 5f 69  value, Text ns_i
10388 64 2c 20 54 65 78 74 20 75 72 69 5f 69 64 2c 20  d, Text uri_id, 
10389 54 65 78 74 20 6e 73 5f 63 68 61 72 73 74 72 2c  Text ns_charstr,
1038a 20 54 65 78 74 20 75 72 69 5f 63 68 61 72 73 74   Text uri_charst
1038b 72 29 0a 2f 0a 2f 20 69 66 20 74 68 65 20 42 4c  r)././ if the BL
1038c 4f 42 20 69 73 20 61 20 76 61 6c 69 64 20 58 6d  OB is a valid Xm
1038d 6c 42 4c 4f 42 20 6f 66 20 74 68 65 20 49 53 4f  lBLOB of the ISO
1038e 2d 4d 65 74 61 64 61 74 61 20 74 79 70 65 0a 2f  -Metadata type./
1038f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20   not containing 
10390 61 20 46 69 6c 65 49 44 20 74 68 65 6e 20 74 68  a FileID then th
10391 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
10392 20 0a 2f 20 72 65 74 75 72 6e 20 61 20 6e 65 77   ./ return a new
10393 20 58 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61 69 6e   XmlBLOB contain
10394 69 6e 67 20 74 68 65 20 6e 65 77 20 46 69 6c 65  ing the new File
10395 49 44 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ID./ return NULL
10396 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61   on any other ca
10397 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  se.*/.    const 
10398 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10399 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
1039a 5f 62 79 74 65 73 3b 0a 20 20 20 20 75 6e 73 69  _bytes;.    unsi
1039b 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 5f 62  gned char *new_b
1039c 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77  lob;.    int new
1039d 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f 6e 73  _bytes;.    cons
1039e 74 20 63 68 61 72 20 2a 69 64 65 6e 74 69 66 69  t char *identifi
1039f 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  er;.    const ch
103a0 61 72 20 2a 6e 73 5f 69 64 20 3d 20 4e 55 4c 4c  ar *ns_id = NULL
103a1 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
103a2 20 2a 75 72 69 5f 69 64 20 3d 20 4e 55 4c 4c 3b   *uri_id = NULL;
103a3 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
103a4 2a 6e 73 5f 63 68 61 72 73 74 72 20 3d 20 4e 55  *ns_charstr = NU
103a5 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  LL;.    const ch
103a6 61 72 20 2a 75 72 69 5f 63 68 61 72 73 74 72 20  ar *uri_charstr 
103a7 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41 49 41  = NULL;.    GAIA
103a8 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
103a9 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
103aa 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
103ab 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
103ac 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49 54 45  gv[0]) != SQLITE
103ad 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
103ae 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
103af 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
103b0 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
103b1 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
103b2 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
103b3 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51 4c 49  argv[1]) != SQLI
103b4 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20 20 7b  TE_TEXT).      {
103b5 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
103b6 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
103b7 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
103b8 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
103b9 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
103ba 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
103bb 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
103bc 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
103bd 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
103be 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20  LITE_NULL)..;.  
103bf 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
103c0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
103c1 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
103c2 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
103c3 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
103c4 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
103c5 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49  argv[3]) == SQLI
103c6 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69  TE_TEXT..|| sqli
103c7 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
103c8 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49  argv[3]) == SQLI
103c9 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20  TE_NULL)..;.    
103ca 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
103cb 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
103cc 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
103cd 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
103ce 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
103cf 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
103d0 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[4]) == SQLITE
103d1 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
103d2 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
103d3 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[4]) == SQLITE
103d4 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c  _NULL)..;.    el
103d5 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
103d6 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
103d7 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
103d8 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
103d9 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
103da 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
103db 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54  [5]) == SQLITE_T
103dc 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65 33 5f  EXT..|| sqlite3_
103dd 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
103de 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e  [5]) == SQLITE_N
103df 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65  ULL)..;.    else
103e0 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
103e1 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
103e2 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
103e3 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
103e4 20 20 70 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74    p_blob = sqlit
103e5 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
103e6 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62  rgv[0]);.    n_b
103e7 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
103e8 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
103e9 5b 30 5d 29 3b 0a 20 20 20 20 69 64 65 6e 74 69  [0]);.    identi
103ea 66 69 65 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  fier = (const ch
103eb 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76 61  ar *) sqlite3_va
103ec 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b 31  lue_text (argv[1
103ed 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71 6c 69  ]);.    if (sqli
103ee 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
103ef 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
103f0 54 45 5f 54 45 58 54 29 0a 09 6e 73 5f 69 64 20  TE_TEXT)..ns_id 
103f1 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
103f2 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
103f3 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 20  ext (argv[2]);. 
103f4 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
103f5 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
103f6 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45  3]) == SQLITE_TE
103f7 58 54 29 0a 09 75 72 69 5f 69 64 20 3d 20 28 63  XT)..uri_id = (c
103f8 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
103f9 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
103fa 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 69  (argv[3]);.    i
103fb 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
103fc 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20  _type (argv[4]) 
103fd 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
103fe 09 6e 73 5f 63 68 61 72 73 74 72 20 3d 20 28 63  .ns_charstr = (c
103ff 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
10400 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20  ite3_value_text 
10401 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 69  (argv[4]);.    i
10402 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10403 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20  _type (argv[5]) 
10404 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
10405 09 75 72 69 5f 63 68 61 72 73 74 72 20 3d 20 28  .uri_charstr = (
10406 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71  const char *) sq
10407 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
10408 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20   (argv[5]);.    
10409 69 66 20 28 21 67 61 69 61 58 6d 6c 42 6c 6f 62  if (!gaiaXmlBlob
1040a 41 64 64 46 69 6c 65 49 64 0a 09 28 73 71 6c 69  AddFileId..(sqli
1040b 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63  te3_user_data (c
1040c 6f 6e 74 65 78 74 29 2c 20 70 5f 62 6c 6f 62 2c  ontext), p_blob,
1040d 20 6e 5f 62 79 74 65 73 2c 20 69 64 65 6e 74 69   n_bytes, identi
1040e 66 69 65 72 2c 20 6e 73 5f 69 64 2c 0a 09 20 75  fier, ns_id,.. u
1040f 72 69 5f 69 64 2c 20 6e 73 5f 63 68 61 72 73 74  ri_id, ns_charst
10410 72 2c 20 75 72 69 5f 63 68 61 72 73 74 72 2c 20  r, uri_charstr, 
10411 26 6e 65 77 5f 62 6c 6f 62 2c 20 26 6e 65 77 5f  &new_blob, &new_
10412 62 79 74 65 73 29 29 0a 09 73 71 6c 69 74 65 33  bytes))..sqlite3
10413 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
10414 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
10415 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
10416 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
10417 6e 65 77 5f 62 6c 6f 62 2c 20 6e 65 77 5f 62 79  new_blob, new_by
10418 74 65 73 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73  tes, free);.}..s
10419 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
1041a 58 42 5f 41 64 64 50 61 72 65 6e 74 49 64 20 28  XB_AddParentId (
1041b 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1041c 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
1041d 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1041e 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
1041f 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
10420 20 58 42 5f 41 64 64 50 61 72 65 6e 74 49 64 28   XB_AddParentId(
10421 58 6d 6c 42 4c 4f 42 2c 20 54 65 78 74 20 76 61  XmlBLOB, Text va
10422 6c 75 65 2c 20 54 65 78 74 20 6e 73 5f 69 64 2c  lue, Text ns_id,
10423 20 54 65 78 74 20 75 72 69 5f 69 64 2c 20 54 65   Text uri_id, Te
10424 78 74 20 6e 73 5f 63 68 61 72 73 74 72 2c 20 54  xt ns_charstr, T
10425 65 78 74 20 75 72 6c 5f 63 68 61 72 73 74 72 29  ext url_charstr)
10426 0a 2f 0a 2f 20 69 66 20 74 68 65 20 42 4c 4f 42  ././ if the BLOB
10427 20 69 73 20 61 20 76 61 6c 69 64 20 58 6d 6c 42   is a valid XmlB
10428 4c 4f 42 20 6f 66 20 74 68 65 20 49 53 4f 2d 4d  LOB of the ISO-M
10429 65 74 61 64 61 74 61 20 74 79 70 65 0a 2f 20 6e  etadata type./ n
1042a 6f 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ot containing a 
1042b 50 61 72 65 6e 74 49 44 20 74 68 65 6e 20 74 68  ParentID then th
1042c 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
1042d 20 0a 2f 20 72 65 74 75 72 6e 20 61 20 6e 65 77   ./ return a new
1042e 20 58 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61 69 6e   XmlBLOB contain
1042f 69 6e 67 20 74 68 65 20 6e 65 77 20 50 61 72 65  ing the new Pare
10430 6e 74 49 44 0a 2f 20 72 65 74 75 72 6e 20 4e 55  ntID./ return NU
10431 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20  LL on any other 
10432 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73  case.*/.    cons
10433 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10434 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74  *p_blob;.    int
10435 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 75 6e   n_bytes;.    un
10436 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
10437 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
10438 65 77 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 6f  ew_bytes;.    co
10439 6e 73 74 20 63 68 61 72 20 2a 69 64 65 6e 74 69  nst char *identi
1043a 66 69 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  fier;.    const 
1043b 63 68 61 72 20 2a 6e 73 5f 69 64 20 3d 20 4e 55  char *ns_id = NU
1043c 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  LL;.    const ch
1043d 61 72 20 2a 75 72 69 5f 69 64 20 3d 20 4e 55 4c  ar *uri_id = NUL
1043e 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  L;.    const cha
1043f 72 20 2a 6e 73 5f 63 68 61 72 73 74 72 20 3d 20  r *ns_charstr = 
10440 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  NULL;.    const 
10441 63 68 61 72 20 2a 75 72 69 5f 63 68 61 72 73 74  char *uri_charst
10442 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 41  r = NULL;.    GA
10443 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
10444 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
10445 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
10446 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10447 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
10448 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
10449 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
1044a 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
1044b 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
1044c 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
1044d 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1044e 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20 53 51   (argv[1]) != SQ
1044f 4c 49 54 45 5f 54 45 58 54 29 0a 20 20 20 20 20  LITE_TEXT).     
10450 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
10451 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
10452 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
10453 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
10454 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10455 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
10456 53 51 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20  SQLITE_TEXT..|| 
10457 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10458 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
10459 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a  SQLITE_NULL)..;.
1045a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
1045b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
1045c 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
1045d 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
1045e 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
1045f 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10460 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51   (argv[3]) == SQ
10461 4c 49 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71  LITE_TEXT..|| sq
10462 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10463 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51   (argv[3]) == SQ
10464 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20  LITE_NULL)..;.  
10465 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
10466 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
10467 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
10468 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
10469 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69    }.    if (sqli
1046a 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
1046b 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
1046c 54 45 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69  TE_TEXT..|| sqli
1046d 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
1046e 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
1046f 54 45 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20  TE_NULL)..;.    
10470 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
10471 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10472 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10473 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10474 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
10475 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10476 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[5]) == SQLITE
10477 5f 54 45 58 54 0a 09 7c 7c 20 73 71 6c 69 74 65  _TEXT..|| sqlite
10478 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10479 67 76 5b 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[5]) == SQLITE
1047a 5f 4e 55 4c 4c 29 0a 09 3b 0a 20 20 20 20 65 6c  _NULL)..;.    el
1047b 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
1047c 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
1047d 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
1047e 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1047f 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73 71 6c      p_blob = sql
10480 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
10481 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
10482 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
10483 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
10484 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 64 65 6e  gv[0]);.    iden
10485 74 69 66 69 65 72 20 3d 20 28 63 6f 6e 73 74 20  tifier = (const 
10486 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
10487 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
10488 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 73 71  [1]);.    if (sq
10489 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1048a 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
1048b 4c 49 54 45 5f 54 45 58 54 29 0a 09 6e 73 5f 69  LITE_TEXT)..ns_i
1048c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  d = (const char 
1048d 2a 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  *) sqlite3_value
1048e 5f 74 65 78 74 20 28 61 72 67 76 5b 32 5d 29 3b  _text (argv[2]);
1048f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
10490 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
10491 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[3]) == SQLITE_
10492 54 45 58 54 29 0a 09 75 72 69 5f 69 64 20 3d 20  TEXT)..uri_id = 
10493 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
10494 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
10495 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  t (argv[3]);.   
10496 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
10497 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 34 5d  ue_type (argv[4]
10498 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
10499 29 0a 09 6e 73 5f 63 68 61 72 73 74 72 20 3d 20  )..ns_charstr = 
1049a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73  (const char *) s
1049b 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1049c 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20  t (argv[4]);.   
1049d 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
1049e 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d  ue_type (argv[5]
1049f 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  ) == SQLITE_TEXT
104a0 29 0a 09 75 72 69 5f 63 68 61 72 73 74 72 20 3d  )..uri_charstr =
104a1 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
104a2 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
104a3 78 74 20 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20  xt (argv[5]);.  
104a4 20 20 69 66 20 28 21 67 61 69 61 58 6d 6c 42 6c    if (!gaiaXmlBl
104a5 6f 62 41 64 64 50 61 72 65 6e 74 49 64 0a 09 28  obAddParentId..(
104a6 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
104a7 61 20 28 63 6f 6e 74 65 78 74 29 2c 20 70 5f 62  a (context), p_b
104a8 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 69 64  lob, n_bytes, id
104a9 65 6e 74 69 66 69 65 72 2c 20 6e 73 5f 69 64 2c  entifier, ns_id,
104aa 0a 09 20 75 72 69 5f 69 64 2c 20 6e 73 5f 63 68  .. uri_id, ns_ch
104ab 61 72 73 74 72 2c 20 75 72 69 5f 63 68 61 72 73  arstr, uri_chars
104ac 74 72 2c 20 26 6e 65 77 5f 62 6c 6f 62 2c 20 26  tr, &new_blob, &
104ad 6e 65 77 5f 62 79 74 65 73 29 29 0a 09 73 71 6c  new_bytes))..sql
104ae 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
104af 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
104b0 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
104b1 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
104b2 78 74 2c 20 6e 65 77 5f 62 6c 6f 62 2c 20 6e 65  xt, new_blob, ne
104b3 77 5f 62 79 74 65 73 2c 20 66 72 65 65 29 3b 0a  w_bytes, free);.
104b4 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
104b5 6e 63 74 5f 58 42 5f 47 65 74 4e 61 6d 65 20 28  nct_XB_GetName (
104b6 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
104b7 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
104b8 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
104b9 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
104ba 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
104bb 20 58 42 5f 47 65 74 4e 61 6d 65 28 58 6d 6c 42   XB_GetName(XmlB
104bc 4c 4f 42 29 0a 2f 0a 2f 20 69 66 20 74 68 65 20  LOB)././ if the 
104bd 42 4c 4f 42 20 69 73 20 61 20 76 61 6c 69 64 20  BLOB is a valid 
104be 58 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69  XmlBLOB containi
104bf 6e 67 20 61 20 4e 61 6d 65 20 74 68 65 6e 0a 2f  ng a Name then./
104c0 20 74 68 65 20 4e 61 6d 65 20 77 69 6c 6c 20 62   the Name will b
104c1 65 20 72 65 74 75 72 6e 65 64 0a 2f 20 72 65 74  e returned./ ret
104c2 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20  urn NULL on any 
104c3 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
104c4 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
104c5 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
104c6 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
104c7 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a      char *name;.
104c8 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
104c9 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
104ca 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
104cb 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
104cc 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
104cd 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
104ce 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
104cf 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
104d0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
104d1 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
104d2 70 5f 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  p_blob = sqlite3
104d3 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
104d4 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74  v[0]);.    n_byt
104d5 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
104d6 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
104d7 5d 29 3b 0a 20 20 20 20 6e 61 6d 65 20 3d 20 67  ]);.    name = g
104d8 61 69 61 58 6d 6c 42 6c 6f 62 47 65 74 4e 61 6d  aiaXmlBlobGetNam
104d9 65 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  e (p_blob, n_byt
104da 65 73 29 3b 0a 20 20 20 20 69 66 20 28 6e 61 6d  es);.    if (nam
104db 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69  e == NULL)..sqli
104dc 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
104dd 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
104de 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  lse..sqlite3_res
104df 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65 78  ult_text (contex
104e0 74 2c 20 6e 61 6d 65 2c 20 73 74 72 6c 65 6e 20  t, name, strlen 
104e1 28 6e 61 6d 65 29 2c 20 66 72 65 65 29 3b 0a 7d  (name), free);.}
104e2 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
104e3 63 74 5f 58 42 5f 47 65 74 54 69 74 6c 65 20 28  ct_XB_GetTitle (
104e4 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
104e5 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
104e6 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
104e7 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
104e8 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
104e9 20 58 42 5f 47 65 74 54 69 74 6c 65 28 58 6d 6c   XB_GetTitle(Xml
104ea 42 4c 4f 42 29 0a 2f 0a 2f 20 69 66 20 74 68 65  BLOB)././ if the
104eb 20 42 4c 4f 42 20 69 73 20 61 20 76 61 6c 69 64   BLOB is a valid
104ec 20 58 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61 69 6e   XmlBLOB contain
104ed 69 6e 67 20 61 20 54 69 74 6c 65 20 74 68 65 6e  ing a Title then
104ee 0a 2f 20 74 68 65 20 54 69 74 6c 65 20 77 69 6c  ./ the Title wil
104ef 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2f 20  l be returned./ 
104f0 72 65 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61  return NULL on a
104f1 6e 79 20 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f  ny other case.*/
104f2 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
104f3 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
104f4 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65  ;.    int n_byte
104f5 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 69 74  s;.    char *tit
104f6 6c 65 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  le;.    GAIA_UNU
104f7 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
104f8 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
104f9 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
104fa 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
104fb 5d 29 20 21 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) != SQLITE_BLO
104fc 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  B).      {..  sq
104fd 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
104fe 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
104ff 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
10500 20 20 20 20 70 5f 62 6c 6f 62 20 3d 20 73 71 6c      p_blob = sql
10501 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
10502 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
10503 5f 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33  _bytes = sqlite3
10504 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72  _value_bytes (ar
10505 67 76 5b 30 5d 29 3b 0a 20 20 20 20 74 69 74 6c  gv[0]);.    titl
10506 65 20 3d 20 67 61 69 61 58 6d 6c 42 6c 6f 62 47  e = gaiaXmlBlobG
10507 65 74 54 69 74 6c 65 20 28 70 5f 62 6c 6f 62 2c  etTitle (p_blob,
10508 20 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 69   n_bytes);.    i
10509 66 20 28 74 69 74 6c 65 20 3d 3d 20 4e 55 4c 4c  f (title == NULL
1050a 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
1050b 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
1050c 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
1050d 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20  te3_result_text 
1050e 28 63 6f 6e 74 65 78 74 2c 20 74 69 74 6c 65 2c  (context, title,
1050f 20 73 74 72 6c 65 6e 20 28 74 69 74 6c 65 29 2c   strlen (title),
10510 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69   free);.}..stati
10511 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 47  c void.fnct_XB_G
10512 65 74 41 62 73 74 72 61 63 74 20 28 73 71 6c 69  etAbstract (sqli
10513 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
10514 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
10515 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10516 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
10517 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f   function:./ XB_
10518 47 65 74 41 62 73 74 72 61 63 74 28 58 6d 6c 42  GetAbstract(XmlB
10519 4c 4f 42 29 0a 2f 0a 2f 20 69 66 20 74 68 65 20  LOB)././ if the 
1051a 42 4c 4f 42 20 69 73 20 61 20 76 61 6c 69 64 20  BLOB is a valid 
1051b 58 6d 6c 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69  XmlBLOB containi
1051c 6e 67 20 61 6e 20 41 62 73 74 72 61 63 74 20 74  ng an Abstract t
1051d 68 65 6e 0a 2f 20 74 68 65 20 41 62 73 74 72 61  hen./ the Abstra
1051e 63 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ct will be retur
1051f 6e 65 64 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c  ned./ return NUL
10520 4c 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63  L on any other c
10521 61 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ase.*/.    const
10522 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10523 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20  p_blob;.    int 
10524 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 68 61  n_bytes;.    cha
10525 72 20 2a 61 62 73 74 72 61 63 74 3b 0a 20 20 20  r *abstract;.   
10526 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
10527 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
10528 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  INE */.    if (s
10529 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1052a 65 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53  e (argv[0]) != S
1052b 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20  QLITE_BLOB).    
1052c 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
1052d 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
1052e 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
1052f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62  .      }.    p_b
10530 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
10531 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
10532 5d 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20  ]);.    n_bytes 
10533 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
10534 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
10535 0a 20 20 20 20 61 62 73 74 72 61 63 74 20 3d 20  .    abstract = 
10536 67 61 69 61 58 6d 6c 42 6c 6f 62 47 65 74 41 62  gaiaXmlBlobGetAb
10537 73 74 72 61 63 74 20 28 70 5f 62 6c 6f 62 2c 20  stract (p_blob, 
10538 6e 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 69 66  n_bytes);.    if
10539 20 28 61 62 73 74 72 61 63 74 20 3d 3d 20 4e 55   (abstract == NU
1053a 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
1053b 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
1053c 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
1053d 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1053e 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 62 73 74  t (context, abst
1053f 72 61 63 74 2c 20 73 74 72 6c 65 6e 20 28 61 62  ract, strlen (ab
10540 73 74 72 61 63 74 29 2c 20 66 72 65 65 29 3b 0a  stract), free);.
10541 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
10542 6e 63 74 5f 58 42 5f 47 65 74 47 65 6f 6d 65 74  nct_XB_GetGeomet
10543 72 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ry (sqlite3_cont
10544 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
10545 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
10546 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
10547 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
10548 6e 3a 0a 2f 20 58 42 5f 47 65 74 47 65 6f 6d 65  n:./ XB_GetGeome
10549 74 72 79 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f  try(XmlBLOB)././
1054a 20 69 66 20 74 68 65 20 42 4c 4f 42 20 69 73 20   if the BLOB is 
1054b 61 20 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20  a valid XmlBLOB 
1054c 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 47 65 6f  containing a Geo
1054d 6d 65 74 72 79 20 74 68 65 6e 0a 2f 20 74 68 65  metry then./ the
1054e 20 47 65 6f 6d 65 74 72 79 20 77 69 6c 6c 20 62   Geometry will b
1054f 65 20 72 65 74 75 72 6e 65 64 0a 2f 20 72 65 74  e returned./ ret
10550 75 72 6e 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20  urn NULL on any 
10551 6f 74 68 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20  other case.*/.  
10552 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10553 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20   char *p_blob;. 
10554 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a     int n_bytes;.
10555 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 6c 65 6e      int blob_len
10556 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
10557 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 47  har *blob;.    G
10558 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
10559 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
1055a 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  E */.    if (sql
1055b 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
1055c 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
1055d 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
1055e 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
1055f 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
10560 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
10561 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
10562 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
10563 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
10564 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
10565 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
10566 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
10567 20 20 20 67 61 69 61 58 6d 6c 42 6c 6f 62 47 65     gaiaXmlBlobGe
10568 74 47 65 6f 6d 65 74 72 79 20 28 70 5f 62 6c 6f  tGeometry (p_blo
10569 62 2c 20 6e 5f 62 79 74 65 73 2c 20 26 62 6c 6f  b, n_bytes, &blo
1056a 62 2c 20 26 62 6c 6f 62 5f 6c 65 6e 29 3b 0a 20  b, &blob_len);. 
1056b 20 20 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20 4e     if (blob == N
1056c 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65  ULL)..sqlite3_re
1056d 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
1056e 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73  xt);.    else..s
1056f 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
10570 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f  ob (context, blo
10571 62 2c 20 62 6c 6f 62 5f 6c 65 6e 2c 20 66 72 65  b, blob_len, fre
10572 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  e);.}..static vo
10573 69 64 0a 66 6e 63 74 5f 58 42 5f 4d 4c 69 6e 65  id.fnct_XB_MLine
10574 46 72 6f 6d 47 50 58 20 28 73 71 6c 69 74 65 33  FromGPX (sqlite3
10575 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
10576 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
10577 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
10578 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
10579 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
1057a 2f 20 58 42 5f 4d 4c 69 6e 65 46 72 6f 6d 47 50  / XB_MLineFromGP
1057b 58 28 58 6d 6c 42 4c 4f 42 29 0a 2f 0a 2f 20 69  X(XmlBLOB)././ i
1057c 66 20 74 68 65 20 42 4c 4f 42 20 69 73 20 61 20  f the BLOB is a 
1057d 76 61 6c 69 64 20 58 6d 6c 42 4c 4f 42 20 6f 66  valid XmlBLOB of
1057e 20 74 68 65 20 47 50 58 20 74 79 70 65 20 74 68   the GPX type th
1057f 65 6e 0a 2f 20 61 20 4d 75 6c 74 69 4c 69 6e 65  en./ a MultiLine
10580 73 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 72  string will be r
10581 65 74 75 72 6e 65 64 0a 2f 20 72 65 74 75 72 6e  eturned./ return
10582 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68   NULL on any oth
10583 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63  er case.*/.    c
10584 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10585 61 72 20 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20  ar *p_blob;.    
10586 69 6e 74 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20  int n_bytes;.   
10587 20 69 6e 74 20 62 6c 6f 62 5f 6c 65 6e 3b 0a 20   int blob_len;. 
10588 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
10589 20 2a 62 6c 6f 62 20 3d 20 4e 55 4c 4c 3b 0a 20   *blob = NULL;. 
1058a 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50     gaiaGeomCollP
1058b 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20 69 6e 74  tr geom;.    int
1058c 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a   gpkg_mode = 0;.
1058d 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69      int tiny_poi
1058e 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nt = 0;.    sqli
1058f 74 65 33 20 2a 73 71 6c 69 74 65 20 3d 20 73 71  te3 *sqlite = sq
10590 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
10591 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78 74  _handle (context
10592 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  );.    struct sp
10593 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
10594 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
10595 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
10596 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
10597 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
10598 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
10599 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
1059a 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e != NULL).     
1059b 20 7b 0a 09 20 20 67 70 6b 67 5f 6d 6f 64 65 20   {..  gpkg_mode 
1059c 3d 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f  = cache->gpkg_mo
1059d 64 65 3b 0a 09 20 20 74 69 6e 79 5f 70 6f 69 6e  de;..  tiny_poin
1059e 74 20 3d 20 63 61 63 68 65 2d 3e 74 69 6e 79 50  t = cache->tinyP
1059f 6f 69 6e 74 45 6e 61 62 6c 65 64 3b 0a 20 20 20  ointEnabled;.   
105a0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71 6c     }.    if (sql
105a1 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
105a2 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c  (argv[0]) != SQL
105a3 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
105a4 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73  {..  sqlite3_res
105a5 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
105a6 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  t);..  return;. 
105a7 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c 6f       }.    p_blo
105a8 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
105a9 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
105aa 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d 20  ;.    n_bytes = 
105ab 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
105ac 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
105ad 20 20 20 67 65 6f 6d 20 3d 20 67 61 69 61 58 6d     geom = gaiaXm
105ae 6c 42 6c 6f 62 4d 4c 69 6e 65 46 72 6f 6d 47 50  lBlobMLineFromGP
105af 58 20 28 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74  X (p_blob, n_byt
105b0 65 73 2c 20 73 71 6c 69 74 65 29 3b 0a 20 20 20  es, sqlite);.   
105b1 20 69 66 20 28 67 65 6f 6d 20 21 3d 20 4e 55 4c   if (geom != NUL
105b2 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  L).      {..  /*
105b3 20 62 75 69 6c 64 73 20 74 68 65 20 42 4c 4f 42   builds the BLOB
105b4 20 67 65 6f 6d 65 74 72 79 20 74 6f 20 62 65 20   geometry to be 
105b5 72 65 74 75 72 6e 65 64 20 2a 2f 0a 09 20 20 67  returned */..  g
105b6 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
105b7 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 2c  lobWkbEx2 (geom,
105b8 20 26 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 6c 65   &blob, &blob_le
105b9 6e 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09  n, gpkg_mode,...
105ba 09 09 20 20 20 20 20 20 74 69 6e 79 5f 70 6f 69  ..      tiny_poi
105bb 6e 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f  nt);..  sqlite3_
105bc 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e  result_blob (con
105bd 74 65 78 74 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62  text, blob, blob
105be 5f 6c 65 6e 2c 20 66 72 65 65 29 3b 0a 09 20 20  _len, free);..  
105bf 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
105c0 20 28 67 65 6f 6d 29 3b 0a 20 20 20 20 20 20 7d   (geom);.      }
105c1 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
105c2 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
105c3 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 73 74 61  context);.}..sta
105c4 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42  tic void.fnct_XB
105c5 5f 47 65 74 45 6e 63 6f 64 69 6e 67 20 28 73 71  _GetEncoding (sq
105c6 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
105c7 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
105c8 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
105c9 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
105ca 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58  QL function:./ X
105cb 42 5f 47 65 74 45 6e 63 6f 64 69 6e 67 28 58 6d  B_GetEncoding(Xm
105cc 6c 42 4c 4f 42 29 0a 2f 0a 2f 20 69 66 20 74 68  lBLOB)././ if th
105cd 65 20 42 4c 4f 42 20 69 73 20 61 20 76 61 6c 69  e BLOB is a vali
105ce 64 20 58 6d 6c 42 4c 4f 42 20 65 78 70 6c 69 63  d XmlBLOB explic
105cf 69 74 6c 79 20 64 65 66 69 6e 69 6e 67 20 61 6e  itly defining an
105d0 20 65 6e 63 6f 64 69 6e 67 20 74 68 65 6e 0a 2f   encoding then./
105d1 20 74 68 65 20 63 68 61 72 73 65 74 20 6e 61 6d   the charset nam
105d2 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  e will be return
105d3 65 64 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ed./ return NULL
105d4 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61   on any other ca
105d5 73 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  se.*/.    const 
105d6 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
105d7 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e  _blob;.    int n
105d8 5f 62 79 74 65 73 3b 0a 20 20 20 20 63 68 61 72  _bytes;.    char
105d9 20 2a 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20   *encoding;.    
105da 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
105db 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
105dc 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  NE */.    if (sq
105dd 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
105de 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
105df 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
105e0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
105e1 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
105e2 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
105e3 20 20 20 20 20 20 7d 0a 20 20 20 20 70 5f 62 6c        }.    p_bl
105e4 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
105e5 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
105e6 29 3b 0a 20 20 20 20 6e 5f 62 79 74 65 73 20 3d  );.    n_bytes =
105e7 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
105e8 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
105e9 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 3d 20 67      encoding = g
105ea 61 69 61 58 6d 6c 42 6c 6f 62 47 65 74 45 6e 63  aiaXmlBlobGetEnc
105eb 6f 64 69 6e 67 20 28 70 5f 62 6c 6f 62 2c 20 6e  oding (p_blob, n
105ec 5f 62 79 74 65 73 29 3b 0a 20 20 20 20 69 66 20  _bytes);.    if 
105ed 28 65 6e 63 6f 64 69 6e 67 20 3d 3d 20 4e 55 4c  (encoding == NUL
105ee 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  L)..sqlite3_resu
105ef 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
105f0 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
105f1 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
105f2 20 28 63 6f 6e 74 65 78 74 2c 20 65 6e 63 6f 64   (context, encod
105f3 69 6e 67 2c 20 73 74 72 6c 65 6e 20 28 65 6e 63  ing, strlen (enc
105f4 6f 64 69 6e 67 29 2c 20 66 72 65 65 29 3b 0a 7d  oding), free);.}
105f5 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
105f6 63 74 5f 58 42 5f 47 65 74 49 6e 74 65 72 6e 61  ct_XB_GetInterna
105f7 6c 53 63 68 65 6d 61 55 52 49 20 28 73 71 6c 69  lSchemaURI (sqli
105f8 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
105f9 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
105fa 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  ....      sqlite
105fb 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
105fc 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
105fd 6f 6e 3a 0a 2f 20 58 42 5f 47 65 74 49 6e 74 65  on:./ XB_GetInte
105fe 72 6e 61 6c 53 63 68 65 6d 61 55 52 49 28 58 6d  rnalSchemaURI(Xm
105ff 6c 44 6f 63 75 6d 65 6e 74 29 0a 2f 0a 2f 20 69  lDocument)././ i
10600 66 20 74 68 65 20 58 4d 4c 44 6f 63 75 6d 65 6e  f the XMLDocumen
10601 74 20 69 73 20 76 61 6c 69 64 20 61 6e 64 20 69  t is valid and i
10602 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  t contains an in
10603 74 65 72 6e 61 6c 6c 79 0a 2f 20 64 65 66 69 6e  ternally./ defin
10604 65 64 20 53 63 68 65 6d 61 55 52 49 20 74 68 65  ed SchemaURI the
10605 6e 20 74 68 69 73 20 53 63 68 65 6d 61 55 52 49  n this SchemaURI
10606 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
10607 64 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  d./ return NULL 
10608 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73  on any other cas
10609 65 0a 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  e.*/.    const u
1060a 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 6d  nsigned char *xm
1060b 6c 3b 0a 20 20 20 20 69 6e 74 20 78 6d 6c 5f 6c  l;.    int xml_l
1060c 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 63  en;.    char *sc
1060d 68 65 6d 61 5f 75 72 69 3b 0a 20 20 20 20 47 41  hema_uri;.    GA
1060e 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
1060f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
10610 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69   */.    if (sqli
10611 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10612 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51 4c 49  argv[0]) != SQLI
10613 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b  TE_BLOB).      {
10614 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
10615 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10616 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
10617 20 20 20 20 7d 0a 20 20 20 20 78 6d 6c 20 3d 20      }.    xml = 
10618 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
10619 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ob (argv[0]);.  
1061a 20 20 78 6d 6c 5f 6c 65 6e 20 3d 20 73 71 6c 69    xml_len = sqli
1061b 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
1061c 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73  (argv[0]);.    s
1061d 63 68 65 6d 61 5f 75 72 69 20 3d 0a 09 67 61 69  chema_uri =..gai
1061e 61 58 6d 6c 47 65 74 49 6e 74 65 72 6e 61 6c 53  aXmlGetInternalS
1061f 63 68 65 6d 61 55 52 49 20 28 73 71 6c 69 74 65  chemaURI (sqlite
10620 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
10621 74 65 78 74 29 2c 20 78 6d 6c 2c 20 78 6d 6c 5f  text), xml, xml_
10622 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 63  len);.    if (sc
10623 68 65 6d 61 5f 75 72 69 20 3d 3d 20 4e 55 4c 4c  hema_uri == NULL
10624 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
10625 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10626 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
10627 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20  te3_result_text 
10628 28 63 6f 6e 74 65 78 74 2c 20 73 63 68 65 6d 61  (context, schema
10629 5f 75 72 69 2c 20 73 74 72 6c 65 6e 20 28 73 63  _uri, strlen (sc
1062a 68 65 6d 61 5f 75 72 69 29 2c 20 66 72 65 65 29  hema_uri), free)
1062b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1062c 0a 66 6e 63 74 5f 58 42 5f 47 65 74 4c 61 73 74  .fnct_XB_GetLast
1062d 50 61 72 73 65 45 72 72 6f 72 20 28 73 71 6c 69  ParseError (sqli
1062e 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
1062f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
10630 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76  ....   sqlite3_v
10631 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
10632 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
10633 0a 2f 20 58 42 5f 47 65 74 4c 61 73 74 50 61 72  ./ XB_GetLastPar
10634 73 65 45 72 72 6f 72 28 29 0a 2f 0a 2f 20 72 65  seError()././ re
10635 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
10636 63 65 6e 74 20 58 4d 4c 20 50 61 72 73 65 20 65  cent XML Parse e
10637 72 72 6f 72 2f 77 61 72 6e 69 6e 67 20 28 69 66  rror/warning (if
10638 20 61 6e 79 29 0a 2f 20 72 65 74 75 72 6e 20 4e   any)./ return N
10639 55 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72  ULL on any other
1063a 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63 68 61   case.*/.    cha
1063b 72 20 2a 6d 73 67 3b 0a 20 20 20 20 47 41 49 41  r *msg;.    GAIA
1063c 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
1063d 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
1063e 2f 0a 20 20 20 20 6d 73 67 20 3d 20 67 61 69 61  /.    msg = gaia
1063f 58 6d 6c 42 6c 6f 62 47 65 74 4c 61 73 74 50 61  XmlBlobGetLastPa
10640 72 73 65 45 72 72 6f 72 20 28 73 71 6c 69 74 65  rseError (sqlite
10641 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
10642 74 65 78 74 29 29 3b 0a 20 20 20 20 69 66 20 28  text));.    if (
10643 6d 73 67 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71  msg == NULL)..sq
10644 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10645 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  l (context);.   
10646 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72   else..sqlite3_r
10647 65 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74  esult_text (cont
10648 65 78 74 2c 20 6d 73 67 2c 20 73 74 72 6c 65 6e  ext, msg, strlen
10649 20 28 6d 73 67 29 2c 20 53 51 4c 49 54 45 5f 53   (msg), SQLITE_S
1064a 54 41 54 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69  TATIC);.}..stati
1064b 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42 5f 47  c void.fnct_XB_G
1064c 65 74 4c 61 73 74 56 61 6c 69 64 61 74 65 45 72  etLastValidateEr
1064d 72 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ror (sqlite3_con
1064e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
1064f 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  int argc,....   
10650 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
10651 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
10652 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58  QL function:./ X
10653 42 5f 47 65 74 4c 61 73 74 56 61 6c 69 64 61 74  B_GetLastValidat
10654 65 45 72 72 6f 72 28 29 0a 2f 0a 2f 20 72 65 74  eError()././ ret
10655 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
10656 65 6e 74 20 58 4d 4c 20 56 61 6c 69 64 61 74 65  ent XML Validate
10657 20 65 72 72 6f 72 2f 77 61 72 6e 69 6e 67 20 28   error/warning (
10658 69 66 20 61 6e 79 29 0a 2f 20 72 65 74 75 72 6e  if any)./ return
10659 20 4e 55 4c 4c 20 6f 6e 20 61 6e 79 20 6f 74 68   NULL on any oth
1065a 65 72 20 63 61 73 65 0a 2a 2f 0a 20 20 20 20 63  er case.*/.    c
1065b 68 61 72 20 2a 6d 73 67 3b 0a 20 20 20 20 47 41  har *msg;.    GA
1065c 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
1065d 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
1065e 20 2a 2f 0a 20 20 20 20 6d 73 67 20 3d 20 67 61   */.    msg = ga
1065f 69 61 58 6d 6c 42 6c 6f 62 47 65 74 4c 61 73 74  iaXmlBlobGetLast
10660 56 61 6c 69 64 61 74 65 45 72 72 6f 72 20 28 73  ValidateError (s
10661 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
10662 20 28 63 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20   (context));.   
10663 20 69 66 20 28 6d 73 67 20 3d 3d 20 4e 55 4c 4c   if (msg == NULL
10664 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
10665 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10666 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
10667 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20  te3_result_text 
10668 28 63 6f 6e 74 65 78 74 2c 20 6d 73 67 2c 20 73  (context, msg, s
10669 74 72 6c 65 6e 20 28 6d 73 67 29 2c 20 53 51 4c  trlen (msg), SQL
1066a 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
1066b 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
1066c 5f 58 42 5f 49 73 56 61 6c 69 64 58 50 61 74 68  _XB_IsValidXPath
1066d 45 78 70 72 65 73 73 69 6f 6e 20 28 73 71 6c 69  Expression (sqli
1066e 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
1066f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
10670 0a 09 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  .....sqlite3_val
10671 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
10672 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
10673 20 58 42 5f 49 73 56 61 6c 69 64 58 50 61 74 68   XB_IsValidXPath
10674 45 78 70 72 65 73 73 69 6f 6e 28 74 65 78 74 20  Expression(text 
10675 58 50 61 74 68 45 78 70 72 65 73 73 69 6f 6e 29  XPathExpression)
10676 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 54 52 55  ././ returns TRU
10677 45 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  E if the current
10678 20 61 72 67 20 69 73 20 61 20 76 61 6c 69 64 20   arg is a valid 
10679 58 50 61 74 68 45 78 70 72 65 73 73 69 6f 6e 2c  XPathExpression,
1067a 0a 2f 20 46 41 4c 53 45 20 69 66 20 69 74 27 73  ./ FALSE if it's
1067b 20 6e 6f 74 0a 2f 20 6f 72 20 2d 31 20 69 66 20   not./ or -1 if 
1067c 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
1067d 6f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20  ountered.*/.    
1067e 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 6f 6e  int ret;.    con
1067f 73 74 20 63 68 61 72 20 2a 78 70 61 74 68 3b 0a  st char *xpath;.
10680 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
10681 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
10682 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66  L_LINE */.    if
10683 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10684 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 21  type (argv[0]) !
10685 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 20  = SQLITE_TEXT). 
10686 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
10687 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
10688 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
10689 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
1068a 20 20 20 78 70 61 74 68 20 3d 20 28 63 6f 6e 73     xpath = (cons
1068b 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
1068c 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72  3_value_text (ar
1068d 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 20  gv[0]);.    ret 
1068e 3d 20 67 61 69 61 49 73 56 61 6c 69 64 58 50 61  = gaiaIsValidXPa
1068f 74 68 45 78 70 72 65 73 73 69 6f 6e 20 28 73 71  thExpression (sq
10690 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
10691 28 63 6f 6e 74 65 78 74 29 2c 20 78 70 61 74 68  (context), xpath
10692 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
10693 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
10694 78 74 2c 20 72 65 74 29 3b 0a 7d 0a 0a 73 74 61  xt, ret);.}..sta
10695 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 58 42  tic void.fnct_XB
10696 5f 47 65 74 4c 61 73 74 58 50 61 74 68 45 72 72  _GetLastXPathErr
10697 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  or (sqlite3_cont
10698 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
10699 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 73  nt argc,....   s
1069a 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
1069b 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66  argv).{./* SQL f
1069c 75 6e 63 74 69 6f 6e 3a 0a 2f 20 58 42 5f 47 65  unction:./ XB_Ge
1069d 74 4c 61 73 74 58 50 61 74 68 45 72 72 6f 72 28  tLastXPathError(
1069e 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 20 74 68 65  )././ return the
1069f 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 58 4d 4c   most recent XML
106a0 20 56 61 6c 69 64 61 74 65 20 65 72 72 6f 72 2f   Validate error/
106a1 77 61 72 6e 69 6e 67 20 28 69 66 20 61 6e 79 29  warning (if any)
106a2 0a 2f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 6f  ./ return NULL o
106a3 6e 20 61 6e 79 20 6f 74 68 65 72 20 63 61 73 65  n any other case
106a4 0a 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6d 73  .*/.    char *ms
106a5 67 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  g;.    GAIA_UNUS
106a6 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
106a7 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
106a8 20 6d 73 67 20 3d 20 67 61 69 61 58 6d 6c 42 6c   msg = gaiaXmlBl
106a9 6f 62 47 65 74 4c 61 73 74 58 50 61 74 68 45 72  obGetLastXPathEr
106aa 72 6f 72 20 28 73 71 6c 69 74 65 33 5f 75 73 65  ror (sqlite3_use
106ab 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
106ac 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 3d  );.    if (msg =
106ad 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
106ae 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
106af 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
106b0 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
106b1 5f 74 65 78 74 20 28 63 6f 6e 74 65 78 74 2c 20  _text (context, 
106b2 6d 73 67 2c 20 73 74 72 6c 65 6e 20 28 6d 73 67  msg, strlen (msg
106b3 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ), SQLITE_STATIC
106b4 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
106b5 64 0a 66 6e 63 74 5f 58 42 5f 43 61 63 68 65 46  d.fnct_XB_CacheF
106b6 6c 75 73 68 20 28 73 71 6c 69 74 65 33 5f 63 6f  lush (sqlite3_co
106b7 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
106b8 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
106b9 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
106ba 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
106bb 69 6f 6e 3a 0a 2f 20 58 42 5f 43 61 63 68 65 46  ion:./ XB_CacheF
106bc 6c 75 73 68 28 29 0a 2f 0a 2f 20 72 65 73 65 74  lush()././ reset
106bd 73 20 74 68 65 20 49 6e 74 65 72 6e 61 6c 20 58  s the Internal X
106be 4d 4c 20 53 63 68 65 6d 61 20 43 61 63 68 65 20  ML Schema Cache 
106bf 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 65  to its initial e
106c0 6d 70 74 79 20 73 74 61 74 65 0a 2f 20 0a 2f 20  mpty state./ ./ 
106c1 72 65 74 75 72 6e 73 20 54 52 55 45 20 6f 6e 20  returns TRUE on 
106c2 73 75 63 63 65 73 73 0a 2a 2f 0a 20 20 20 20 69  success.*/.    i
106c3 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
106c4 20 73 70 6c 69 74 65 5f 78 6d 6c 53 63 68 65 6d   splite_xmlSchem
106c5 61 5f 63 61 63 68 65 5f 69 74 65 6d 20 2a 70 5f  a_cache_item *p_
106c6 78 6d 6c 53 63 68 65 6d 61 3b 0a 20 20 20 20 73  xmlSchema;.    s
106c7 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
106c8 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
106c9 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
106ca 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
106cb 3b 0a 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  ;..    GAIA_UNUS
106cc 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
106cd 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 20 20  EXCL_LINE */..  
106ce 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
106cf 3c 20 4d 41 58 5f 58 4d 4c 53 43 48 45 4d 41 5f  < MAX_XMLSCHEMA_
106d0 43 41 43 48 45 3b 20 69 2b 2b 29 0a 20 20 20 20  CACHE; i++).    
106d1 20 20 7b 0a 09 20 20 2f 2a 20 66 72 65 65 69 6e    {..  /* freein
106d2 67 20 74 68 65 20 58 6d 6c 53 63 68 65 6d 61 20  g the XmlSchema 
106d3 63 61 63 68 65 20 2a 2f 0a 09 20 20 70 5f 78 6d  cache */..  p_xm
106d4 6c 53 63 68 65 6d 61 20 3d 20 26 28 63 61 63 68  lSchema = &(cach
106d5 65 2d 3e 78 6d 6c 53 63 68 65 6d 61 43 61 63 68  e->xmlSchemaCach
106d6 65 5b 69 5d 29 3b 0a 09 20 20 73 70 6c 69 74 65  e[i]);..  splite
106d7 5f 66 72 65 65 5f 78 6d 6c 5f 73 63 68 65 6d 61  _free_xml_schema
106d8 5f 63 61 63 68 65 5f 69 74 65 6d 20 28 70 5f 78  _cache_item (p_x
106d9 6d 6c 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  mlSchema);.     
106da 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
106db 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
106dc 78 74 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  xt, 1);.}..#endi
106dd 66 20 2f 2a 20 65 6e 64 20 69 6e 63 6c 75 64 69  f /* end includi
106de 6e 67 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a 0a 73  ng LIBXML2 */..s
106df 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
106e0 41 66 66 69 6e 65 54 72 61 6e 73 66 6f 72 6d 4d  AffineTransformM
106e1 61 74 72 69 78 5f 43 72 65 61 74 65 20 28 73 71  atrix_Create (sq
106e2 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
106e3 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
106e4 63 2c 0a 09 09 09 09 20 20 20 73 71 6c 69 74 65  c,.....   sqlite
106e5 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
106e6 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
106e7 6f 6e 3a 0a 2f 20 41 54 4d 5f 43 72 65 61 74 65  on:./ ATM_Create
106e8 28 29 20 2d 20 69 64 65 6e 74 69 74 79 20 74 72  () - identity tr
106e9 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 0a 2f 20 20  ansformation./  
106ea 20 20 6f 72 0a 2f 20 41 54 4d 5f 43 72 65 61 74    or./ ATM_Creat
106eb 65 28 64 6f 75 62 6c 65 20 61 2c 20 64 6f 75 62  e(double a, doub
106ec 6c 65 20 62 2c 20 64 6f 75 62 6c 65 20 64 2c 20  le b, double d, 
106ed 64 6f 75 62 6c 65 20 65 2c 0a 2f 20 20 20 20 20  double e,./     
106ee 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 78 6f         double xo
106ef 66 66 2c 20 64 6f 75 62 6c 65 20 79 6f 66 66 29  ff, double yoff)
106f0 20 2d 20 32 44 0a 2f 20 20 20 20 6f 72 0a 2f 20   - 2D./    or./ 
106f1 41 54 4d 5f 43 72 65 61 74 65 28 64 6f 75 62 6c  ATM_Create(doubl
106f2 65 20 61 2c 20 64 6f 75 62 6c 65 20 62 2c 20 64  e a, double b, d
106f3 6f 75 62 6c 65 20 63 2c 20 64 6f 75 62 6c 65 20  ouble c, double 
106f4 64 2c 20 0a 2f 20 20 20 20 20 20 20 20 20 20 20  d, ./           
106f5 20 64 6f 75 62 6c 65 20 65 2c 20 64 6f 75 62 6c   double e, doubl
106f6 65 20 66 2c 20 64 6f 75 62 6c 65 20 67 2c 20 64  e f, double g, d
106f7 6f 75 62 6c 65 20 68 2c 0a 2f 20 20 20 20 20 20  ouble h,./      
106f8 20 20 20 20 20 20 64 6f 75 62 6c 65 20 69 2c 20        double i, 
106f9 64 6f 75 62 6c 65 20 78 6f 66 66 2c 20 64 6f 75  double xoff, dou
106fa 62 6c 65 20 79 6f 66 66 2c 0a 2f 20 20 20 20 20  ble yoff,./     
106fb 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 7a 6f         double zo
106fc 66 66 29 20 2d 20 33 44 0a 2f 0a 2f 20 72 65 74  ff) - 3D././ ret
106fd 75 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54 4d 20  urns a BLOB-ATM 
106fe 6f 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c 20 6f  object or NULL o
106ff 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20  n failure.*/.   
10700 20 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e 30 3b   double a = 1.0;
10701 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 20 3d 20  .    double b = 
10702 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
10703 63 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  c = 0.0;.    dou
10704 62 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20 20 20  ble d = 0.0;.   
10705 20 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e 30 3b   double e = 1.0;
10706 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 20 3d 20  .    double f = 
10707 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
10708 67 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  g = 0.0;.    dou
10709 62 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20 20 20  ble h = 0.0;.   
1070a 20 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e 30 3b   double i = 1.0;
1070b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6f 66 66  .    double xoff
1070c 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
1070d 6c 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b 0a 20  le yoff = 0.0;. 
1070e 20 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66 20 3d     double zoff =
1070f 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69 6e   0.0;.    int in
10710 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73  t_value;.    uns
10711 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
10712 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73  ;.    int blob_s
10713 7a 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  z;.    GAIA_UNUS
10714 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
10715 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a  EXCL_LINE */../*
10716 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20   validating the 
10717 69 6e 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20  input args */.  
10718 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 36 29    if (argc == 6)
10719 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 32  .      {..  /* 2
1071a 44 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 09  D transform */..
1071b 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
1071c 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
1071d 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
1071e 41 54 29 0a 09 20 20 20 20 20 20 61 20 3d 20 73  AT)..      a = s
1071f 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
10720 62 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  ble (argv[0]);..
10721 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
10722 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10723 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
10724 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
10725 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20  {...int_value = 
10726 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
10727 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 09 61  t (argv[0]);...a
10728 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20   = int_value;.. 
10729 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
1072a 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65    {...sqlite3_re
1072b 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
1072c 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  xt);...return;..
1072d 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c      }..  if (sql
1072e 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
1072f 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c  (argv[1]) == SQL
10730 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20  ITE_FLOAT)..    
10731 20 20 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    b = sqlite3_va
10732 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
10733 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  [1]);..  else if
10734 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10735 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
10736 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
10737 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
10738 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
10739 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
1073a 5d 29 3b 0a 09 09 62 20 3d 20 69 6e 74 5f 76 61  ]);...b = int_va
1073b 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  lue;..    }..  e
1073c 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
1073d 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
1073e 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
1073f 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
10740 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
10741 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29  e_type (argv[2])
10742 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
10743 29 0a 09 20 20 20 20 20 20 64 20 3d 20 73 71 6c  )..      d = sql
10744 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
10745 65 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20  e (argv[2]);..  
10746 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
10747 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
10748 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
10749 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
1074a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71  ..int_value = sq
1074b 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
1074c 28 61 72 67 76 5b 32 5d 29 3b 0a 09 09 64 20 3d  (argv[2]);...d =
1074d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
1074e 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
1074f 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
10750 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10751 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
10752 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74    }..  if (sqlit
10753 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10754 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[3]) == SQLIT
10755 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
10756 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
10757 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 33  e_double (argv[3
10758 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  ]);..  else if (
10759 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1075a 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
1075b 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
1075c 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c  .    {...int_val
1075d 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
1075e 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d 29  ue_int (argv[3])
1075f 3b 0a 09 09 65 20 3d 20 69 6e 74 5f 76 61 6c 75  ;...e = int_valu
10760 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  e;..    }..  els
10761 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
10762 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
10763 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
10764 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
10765 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10766 74 79 70 65 20 28 61 72 67 76 5b 34 5d 29 20 3d  type (argv[4]) =
10767 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
10768 09 20 20 20 20 20 20 78 6f 66 66 20 3d 20 73 71  .      xoff = sq
10769 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
1076a 6c 65 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 20  le (argv[4]);.. 
1076b 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
1076c 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
1076d 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[4]) == SQLITE
1076e 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
1076f 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  ...int_value = s
10770 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10771 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 09 78 6f   (argv[4]);...xo
10772 66 66 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a  ff = int_value;.
10773 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
10774 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f      {...sqlite3_
10775 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10776 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b  text);...return;
10777 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73  ..    }..  if (s
10778 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
10779 65 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53  e (argv[5]) == S
1077a 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20  QLITE_FLOAT)..  
1077b 20 20 20 20 79 6f 66 66 20 3d 20 73 71 6c 69 74      yoff = sqlit
1077c 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
1077d 28 61 72 67 76 5b 35 5d 29 3b 0a 09 20 20 65 6c  (argv[5]);..  el
1077e 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
1077f 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10780 35 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  5]) == SQLITE_IN
10781 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
10782 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
10783 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
10784 72 67 76 5b 35 5d 29 3b 0a 09 09 79 6f 66 66 20  rgv[5]);...yoff 
10785 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
10786 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
10787 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
10788 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
10789 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
1078a 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1078b 20 65 6c 73 65 20 69 66 20 28 61 72 67 63 20 3d   else if (argc =
1078c 3d 20 31 32 29 0a 20 20 20 20 20 20 7b 0a 09 20  = 12).      {.. 
1078d 20 2f 2a 20 33 44 20 74 72 61 6e 73 66 6f 72 6d   /* 3D transform
1078e 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c 69 74   */..  if (sqlit
1078f 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10790 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
10791 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
10792 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  a = sqlite3_valu
10793 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30  e_double (argv[0
10794 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  ]);..  else if (
10795 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10796 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
10797 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
10798 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c  .    {...int_val
10799 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
1079a 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29  ue_int (argv[0])
1079b 3b 0a 09 09 61 20 3d 20 69 6e 74 5f 76 61 6c 75  ;...a = int_valu
1079c 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  e;..    }..  els
1079d 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
1079e 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
1079f 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
107a0 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
107a1 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
107a2 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
107a3 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
107a4 09 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74  .      b = sqlit
107a5 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
107a6 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 65 6c  (argv[1]);..  el
107a7 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
107a8 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
107a9 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  1]) == SQLITE_IN
107aa 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
107ab 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
107ac 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
107ad 72 67 76 5b 31 5d 29 3b 0a 09 09 62 20 3d 20 69  rgv[1]);...b = i
107ae 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d  nt_value;..    }
107af 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
107b0 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
107b1 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
107b2 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
107b3 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33  }..  if (sqlite3
107b4 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
107b5 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[2]) == SQLITE_
107b6 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 63 20  FLOAT)..      c 
107b7 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
107b8 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d 29  double (argv[2])
107b9 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71  ;..  else if (sq
107ba 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
107bb 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51   (argv[2]) == SQ
107bc 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
107bd 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65     {...int_value
107be 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
107bf 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a  _int (argv[2]);.
107c0 09 09 63 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b  ..c = int_value;
107c1 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
107c2 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
107c3 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
107c4 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
107c5 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28  ;..    }..  if (
107c6 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
107c7 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20  pe (argv[3]) == 
107c8 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20  SQLITE_FLOAT).. 
107c9 20 20 20 20 20 64 20 3d 20 73 71 6c 69 74 65 33       d = sqlite3
107ca 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61  _value_double (a
107cb 72 67 76 5b 33 5d 29 3b 0a 09 20 20 65 6c 73 65  rgv[3]);..  else
107cc 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
107cd 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d  ue_type (argv[3]
107ce 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
107cf 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e  GER)..    {...in
107d0 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  t_value = sqlite
107d1 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
107d2 76 5b 33 5d 29 3b 0a 09 09 64 20 3d 20 69 6e 74  v[3]);...d = int
107d3 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09  _value;..    }..
107d4 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
107d5 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
107d6 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
107d7 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
107d8 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
107d9 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
107da 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  4]) == SQLITE_FL
107db 4f 41 54 29 0a 09 20 20 20 20 20 20 65 20 3d 20  OAT)..      e = 
107dc 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
107dd 75 62 6c 65 20 28 61 72 67 76 5b 34 5d 29 3b 0a  uble (argv[4]);.
107de 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69  .  else if (sqli
107df 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
107e0 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49  argv[4]) == SQLI
107e1 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
107e2 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d   {...int_value =
107e3 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
107e4 6e 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09 09  nt (argv[4]);...
107e5 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09  e = int_value;..
107e6 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20      }..  else.. 
107e7 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72     {...sqlite3_r
107e8 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
107e9 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a  ext);...return;.
107ea 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71  .    }..  if (sq
107eb 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
107ec 20 28 61 72 67 76 5b 35 5d 29 20 3d 3d 20 53 51   (argv[5]) == SQ
107ed 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20  LITE_FLOAT)..   
107ee 20 20 20 66 20 3d 20 73 71 6c 69 74 65 33 5f 76     f = sqlite3_v
107ef 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
107f0 76 5b 35 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69  v[5]);..  else i
107f1 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
107f2 5f 74 79 70 65 20 28 61 72 67 76 5b 35 5d 29 20  _type (argv[5]) 
107f3 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
107f4 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f  R)..    {...int_
107f5 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
107f6 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
107f7 35 5d 29 3b 0a 09 09 66 20 3d 20 69 6e 74 5f 76  5]);...f = int_v
107f8 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20  alue;..    }..  
107f9 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
107fa 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
107fb 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
107fc 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
107fd 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
107fe 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 36 5d  ue_type (argv[6]
107ff 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
10800 54 29 0a 09 20 20 20 20 20 20 67 20 3d 20 73 71  T)..      g = sq
10801 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
10802 6c 65 20 28 61 72 67 76 5b 36 5d 29 3b 0a 09 20  le (argv[6]);.. 
10803 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
10804 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10805 67 76 5b 36 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[6]) == SQLITE
10806 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
10807 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  ...int_value = s
10808 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10809 20 28 61 72 67 76 5b 36 5d 29 3b 0a 09 09 67 20   (argv[6]);...g 
1080a 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
1080b 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
1080c 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
1080d 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
1080e 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
1080f 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
10810 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10811 61 72 67 76 5b 37 5d 29 20 3d 3d 20 53 51 4c 49  argv[7]) == SQLI
10812 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20  TE_FLOAT)..     
10813 20 68 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   h = sqlite3_val
10814 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
10815 37 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  7]);..  else if 
10816 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
10817 79 70 65 20 28 61 72 67 76 5b 37 5d 29 20 3d 3d  ype (argv[7]) ==
10818 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
10819 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61  ..    {...int_va
1081a 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
1081b 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 37 5d  lue_int (argv[7]
1081c 29 3b 0a 09 09 68 20 3d 20 69 6e 74 5f 76 61 6c  );...h = int_val
1081d 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  ue;..    }..  el
1081e 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  se..    {...sqli
1081f 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
10820 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
10821 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  urn;..    }..  i
10822 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10823 5f 74 79 70 65 20 28 61 72 67 76 5b 38 5d 29 20  _type (argv[8]) 
10824 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
10825 0a 09 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ..      i = sqli
10826 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
10827 20 28 61 72 67 76 5b 38 5d 29 3b 0a 09 20 20 65   (argv[8]);..  e
10828 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
10829 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
1082a 5b 38 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [8]) == SQLITE_I
1082b 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
1082c 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c  .int_value = sql
1082d 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
1082e 61 72 67 76 5b 38 5d 29 3b 0a 09 09 69 20 3d 20  argv[8]);...i = 
1082f 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20  int_value;..    
10830 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
10831 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
10832 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10833 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
10834 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   }..  if (sqlite
10835 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10836 67 76 5b 39 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[9]) == SQLITE
10837 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 78  _FLOAT)..      x
10838 6f 66 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  off = sqlite3_va
10839 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
1083a 5b 36 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  [6]);..  else if
1083b 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
1083c 74 79 70 65 20 28 61 72 67 76 5b 39 5d 29 20 3d  type (argv[9]) =
1083d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
1083e 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
1083f 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
10840 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 39  alue_int (argv[9
10841 5d 29 3b 0a 09 09 78 6f 66 66 20 3d 20 69 6e 74  ]);...xoff = int
10842 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09  _value;..    }..
10843 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
10844 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10845 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10846 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
10847 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
10848 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10849 31 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  10]) == SQLITE_F
1084a 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 79 6f 66  LOAT)..      yof
1084b 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  f = sqlite3_valu
1084c 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 31  e_double (argv[1
1084d 30 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  0]);..  else if 
1084e 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
1084f 79 70 65 20 28 61 72 67 76 5b 31 30 5d 29 20 3d  ype (argv[10]) =
10850 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
10851 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
10852 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
10853 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
10854 30 5d 29 3b 0a 09 09 79 6f 66 66 20 3d 20 69 6e  0]);...yoff = in
10855 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a  t_value;..    }.
10856 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
10857 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
10858 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
10859 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
1085a 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
1085b 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
1085c 5b 31 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  [11]) == SQLITE_
1085d 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 7a 6f  FLOAT)..      zo
1085e 66 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ff = sqlite3_val
1085f 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
10860 31 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  11]);..  else if
10861 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10862 74 79 70 65 20 28 61 72 67 76 5b 31 31 5d 29 20  type (argv[11]) 
10863 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
10864 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f  R)..    {...int_
10865 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
10866 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
10867 31 31 5d 29 3b 0a 09 09 7a 6f 66 66 20 3d 20 69  11]);...zoff = i
10868 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d  nt_value;..    }
10869 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
1086a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
1086b 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
1086c 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
1086d 7d 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 72  }.      }../* cr
1086e 65 61 74 69 6e 67 20 74 68 65 20 42 4c 4f 42 2d  eating the BLOB-
1086f 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65 20 54  encoded Affine T
10870 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69 78 20  ransform Matrix 
10871 2a 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74 72  */.    gaia_matr
10872 69 78 5f 63 72 65 61 74 65 20 28 61 2c 20 62 2c  ix_create (a, b,
10873 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 67 2c 20   c, d, e, f, g, 
10874 68 2c 20 69 2c 20 78 6f 66 66 2c 20 79 6f 66 66  h, i, xoff, yoff
10875 2c 20 7a 6f 66 66 2c 20 26 62 6c 6f 62 2c 0a 09  , zoff, &blob,..
10876 09 09 26 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20  ..&blob_sz);.   
10877 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20 4e 55 4c   if (blob == NUL
10878 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  L)..sqlite3_resu
10879 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
1087a 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
1087b 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
1087c 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62 2c   (context, blob,
1087d 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29 3b   blob_sz, free);
1087e 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
1087f 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73  fnct_AffineTrans
10880 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72 65 61 74  formMatrix_Creat
10881 65 54 72 61 6e 73 6c 61 74 65 20 28 73 71 6c 69  eTranslate (sqli
10882 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
10883 6e 74 65 78 74 2c 0a 09 09 09 09 09 20 20 20 20  ntext,......    
10884 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
10885 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
10886 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
10887 6f 6e 3a 0a 2f 20 41 54 4d 5f 43 72 65 61 74 65  on:./ ATM_Create
10888 54 72 61 6e 73 6c 61 74 65 28 64 6f 75 62 6c 65  Translate(double
10889 20 74 78 2c 20 64 6f 75 62 6c 65 20 74 79 29 20   tx, double ty) 
1088a 2d 20 32 44 0a 2f 20 20 20 20 6f 72 0a 2f 20 41  - 2D./    or./ A
1088b 54 4d 5f 43 72 65 61 74 65 54 72 61 6e 73 6c 61  TM_CreateTransla
1088c 74 65 28 64 6f 75 62 6c 65 20 74 78 2c 20 64 6f  te(double tx, do
1088d 75 62 6c 65 20 74 79 2c 20 64 6f 75 62 6c 65 20  uble ty, double 
1088e 74 7a 29 20 2d 20 33 44 0a 2f 0a 2f 20 72 65 74  tz) - 3D././ ret
1088f 75 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54 4d 20  urns a BLOB-ATM 
10890 6f 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c 20 6f  object or NULL o
10891 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20  n failure.*/.   
10892 20 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e 30 3b   double a = 1.0;
10893 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 20 3d 20  .    double b = 
10894 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
10895 63 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  c = 0.0;.    dou
10896 62 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20 20 20  ble d = 0.0;.   
10897 20 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e 30 3b   double e = 1.0;
10898 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 20 3d 20  .    double f = 
10899 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
1089a 67 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  g = 0.0;.    dou
1089b 62 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20 20 20  ble h = 0.0;.   
1089c 20 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e 30 3b   double i = 1.0;
1089d 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6f 66 66  .    double xoff
1089e 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
1089f 6c 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b 0a 20  le yoff = 0.0;. 
108a0 20 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66 20 3d     double zoff =
108a1 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69 6e   0.0;.    int in
108a2 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73  t_value;.    uns
108a3 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
108a4 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73  ;.    int blob_s
108a5 7a 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  z;.    GAIA_UNUS
108a6 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
108a7 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a  EXCL_LINE */../*
108a8 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20   validating the 
108a9 69 6e 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20  input args */.  
108aa 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20 32 29    if (argc == 2)
108ab 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 32  .      {..  /* 2
108ac 44 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 09  D translate */..
108ad 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
108ae 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
108af 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
108b0 41 54 29 0a 09 20 20 20 20 20 20 78 6f 66 66 20  AT)..      xoff 
108b1 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
108b2 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 30 5d 29  double (argv[0])
108b3 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73 71  ;..  else if (sq
108b4 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
108b5 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
108b6 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20  LITE_INTEGER).. 
108b7 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65     {...int_value
108b8 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
108b9 5f 69 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a  _int (argv[0]);.
108ba 09 09 78 6f 66 66 20 3d 20 69 6e 74 5f 76 61 6c  ..xoff = int_val
108bb 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  ue;..    }..  el
108bc 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  se..    {...sqli
108bd 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
108be 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
108bf 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  urn;..    }..  i
108c0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
108c1 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
108c2 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
108c3 0a 09 20 20 20 20 20 20 79 6f 66 66 20 3d 20 73  ..      yoff = s
108c4 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
108c5 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  ble (argv[1]);..
108c6 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74    else if (sqlit
108c7 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
108c8 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
108c9 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20  E_INTEGER)..    
108ca 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20  {...int_value = 
108cb 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
108cc 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 79  t (argv[1]);...y
108cd 6f 66 66 20 3d 20 69 6e 74 5f 76 61 6c 75 65 3b  off = int_value;
108ce 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
108cf 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
108d0 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
108d1 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
108d2 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
108d3 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 61 72  .    else if (ar
108d4 67 63 20 3d 3d 20 33 29 0a 20 20 20 20 20 20 7b  gc == 3).      {
108d5 0a 09 20 20 2f 2a 20 33 44 20 74 72 61 6e 73 6c  ..  /* 3D transl
108d6 61 74 65 20 2a 2f 0a 09 20 20 69 66 20 28 73 71  ate */..  if (sq
108d7 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
108d8 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
108d9 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20  LITE_FLOAT)..   
108da 20 20 20 78 6f 66 66 20 3d 20 73 71 6c 69 74 65     xoff = sqlite
108db 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28  3_value_double (
108dc 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 65 6c 73  argv[0]);..  els
108dd 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61  e if (sqlite3_va
108de 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
108df 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
108e0 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 69  EGER)..    {...i
108e1 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74  nt_value = sqlit
108e2 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
108e3 67 76 5b 30 5d 29 3b 0a 09 09 78 6f 66 66 20 3d  gv[0]);...xoff =
108e4 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
108e5 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
108e6 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
108e7 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
108e8 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
108e9 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74    }..  if (sqlit
108ea 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
108eb 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
108ec 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
108ed 79 6f 66 66 20 3d 20 73 71 6c 69 74 65 33 5f 76  yoff = sqlite3_v
108ee 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
108ef 76 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69  v[1]);..  else i
108f0 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
108f1 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
108f2 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
108f3 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f  R)..    {...int_
108f4 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
108f5 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
108f6 31 5d 29 3b 0a 09 09 79 6f 66 66 20 3d 20 69 6e  1]);...yoff = in
108f7 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a  t_value;..    }.
108f8 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
108f9 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
108fa 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
108fb 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
108fc 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
108fd 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
108fe 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [2]) == SQLITE_F
108ff 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 7a 6f 66  LOAT)..      zof
10900 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  f = sqlite3_valu
10901 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
10902 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  ]);..  else if (
10903 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10904 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
10905 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
10906 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c  .    {...int_val
10907 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
10908 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
10909 3b 0a 09 09 7a 6f 66 66 20 3d 20 69 6e 74 5f 76  ;...zoff = int_v
1090a 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20  alue;..    }..  
1090b 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
1090c 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
1090d 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
1090e 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
1090f 20 20 20 20 7d 0a 0a 2f 2a 20 63 72 65 61 74 69      }../* creati
10910 6e 67 20 74 68 65 20 42 4c 4f 42 2d 65 6e 63 6f  ng the BLOB-enco
10911 64 65 64 20 41 66 66 69 6e 65 20 54 72 61 6e 73  ded Affine Trans
10912 66 6f 72 6d 20 4d 61 74 72 69 78 20 2a 2f 0a 20  form Matrix */. 
10913 20 20 20 67 61 69 61 5f 6d 61 74 72 69 78 5f 63     gaia_matrix_c
10914 72 65 61 74 65 20 28 61 2c 20 62 2c 20 63 2c 20  reate (a, b, c, 
10915 64 2c 20 65 2c 20 66 2c 20 67 2c 20 68 2c 20 69  d, e, f, g, h, i
10916 2c 20 78 6f 66 66 2c 20 79 6f 66 66 2c 20 7a 6f  , xoff, yoff, zo
10917 66 66 2c 20 26 62 6c 6f 62 2c 0a 09 09 09 26 62  ff, &blob,....&b
10918 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20 69 66 20  lob_sz);.    if 
10919 28 62 6c 6f 62 20 3d 3d 20 4e 55 4c 4c 29 0a 09  (blob == NULL)..
1091a 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
1091b 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
1091c 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
1091d 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
1091e 6e 74 65 78 74 2c 20 62 6c 6f 62 2c 20 62 6c 6f  ntext, blob, blo
1091f 62 5f 73 7a 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a  b_sz, free);.}..
10920 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
10921 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f 72 6d  _AffineTransform
10922 4d 61 74 72 69 78 5f 43 72 65 61 74 65 53 63 61  Matrix_CreateSca
10923 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  le (sqlite3_cont
10924 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
10925 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 09 73 71  nt argc,......sq
10926 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
10927 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
10928 6e 63 74 69 6f 6e 3a 0a 2f 20 41 54 4d 5f 43 72  nction:./ ATM_Cr
10929 65 61 74 65 53 63 61 6c 65 28 64 6f 75 62 6c 65  eateScale(double
1092a 20 73 78 2c 20 64 6f 75 62 6c 65 20 73 79 29 20   sx, double sy) 
1092b 2d 20 32 44 0a 2f 20 20 20 20 6f 72 0a 2f 20 41  - 2D./    or./ A
1092c 54 4d 5f 43 72 65 61 74 65 53 63 61 6c 65 28 64  TM_CreateScale(d
1092d 6f 75 62 6c 65 20 73 78 2c 20 64 6f 75 62 6c 65  ouble sx, double
1092e 20 73 79 2c 20 64 6f 75 62 6c 65 20 73 7a 20 2d   sy, double sz -
1092f 20 33 44 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20   3D././ returns 
10930 61 20 42 4c 4f 42 2d 41 54 4d 20 6f 62 6a 65 63  a BLOB-ATM objec
10931 74 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66 61 69  t or NULL on fai
10932 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 64 6f 75 62  lure.*/.    doub
10933 6c 65 20 61 20 3d 20 31 2e 30 3b 0a 20 20 20 20  le a = 1.0;.    
10934 64 6f 75 62 6c 65 20 62 20 3d 20 30 2e 30 3b 0a  double b = 0.0;.
10935 20 20 20 20 64 6f 75 62 6c 65 20 63 20 3d 20 30      double c = 0
10936 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64  .0;.    double d
10937 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
10938 6c 65 20 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20  le e = 1.0;.    
10939 64 6f 75 62 6c 65 20 66 20 3d 20 30 2e 30 3b 0a  double f = 0.0;.
1093a 20 20 20 20 64 6f 75 62 6c 65 20 67 20 3d 20 30      double g = 0
1093b 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 68  .0;.    double h
1093c 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
1093d 6c 65 20 69 20 3d 20 31 2e 30 3b 0a 20 20 20 20  le i = 1.0;.    
1093e 64 6f 75 62 6c 65 20 78 6f 66 66 20 3d 20 30 2e  double xoff = 0.
1093f 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 6f  0;.    double yo
10940 66 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f  ff = 0.0;.    do
10941 75 62 6c 65 20 7a 6f 66 66 20 3d 20 30 2e 30 3b  uble zoff = 0.0;
10942 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c  .    int int_val
10943 75 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ue;.    unsigned
10944 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20   char *blob;.   
10945 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20   int blob_sz;.  
10946 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
10947 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
10948 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20 76 61 6c 69  LINE */../* vali
10949 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75 74  dating the input
1094a 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20   args */.    if 
1094b 28 61 72 67 63 20 3d 3d 20 32 29 0a 20 20 20 20  (argc == 2).    
1094c 20 20 7b 0a 09 20 20 2f 2a 20 32 44 20 73 63 61    {..  /* 2D sca
1094d 6c 65 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c  le */..  if (sql
1094e 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
1094f 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
10950 49 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20  ITE_FLOAT)..    
10951 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    a = sqlite3_va
10952 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
10953 5b 30 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  [0]);..  else if
10954 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10955 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
10956 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
10957 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
10958 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
10959 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 30  alue_int (argv[0
1095a 5d 29 3b 0a 09 09 61 20 3d 20 69 6e 74 5f 76 61  ]);...a = int_va
1095b 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  lue;..    }..  e
1095c 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
1095d 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
1095e 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
1095f 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
10960 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
10961 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
10962 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
10963 29 0a 09 20 20 20 20 20 20 65 20 3d 20 73 71 6c  )..      e = sql
10964 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
10965 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  e (argv[1]);..  
10966 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
10967 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
10968 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
10969 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
1096a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71  ..int_value = sq
1096b 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
1096c 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 65 20 3d  (argv[1]);...e =
1096d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
1096e 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
1096f 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
10970 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10971 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
10972 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10973 65 6c 73 65 20 69 66 20 28 61 72 67 63 20 3d 3d  else if (argc ==
10974 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f   3).      {..  /
10975 2a 20 33 44 20 73 63 61 6c 65 20 2a 2f 0a 09 20  * 3D scale */.. 
10976 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
10977 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
10978 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
10979 54 29 0a 09 20 20 20 20 20 20 61 20 3d 20 73 71  T)..      a = sq
1097a 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
1097b 6c 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  le (argv[0]);.. 
1097c 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
1097d 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
1097e 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
1097f 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
10980 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  ...int_value = s
10981 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10982 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 09 61 20   (argv[0]);...a 
10983 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
10984 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
10985 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
10986 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
10987 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
10988 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
10989 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
1098a 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
1098b 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20  TE_FLOAT)..     
1098c 20 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   e = sqlite3_val
1098d 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
1098e 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  1]);..  else if 
1098f 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
10990 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d  ype (argv[1]) ==
10991 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
10992 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61  ..    {...int_va
10993 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
10994 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d  lue_int (argv[1]
10995 29 3b 0a 09 09 65 20 3d 20 69 6e 74 5f 76 61 6c  );...e = int_val
10996 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  ue;..    }..  el
10997 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  se..    {...sqli
10998 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
10999 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
1099a 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  urn;..    }..  i
1099b 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
1099c 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
1099d 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29  == SQLITE_FLOAT)
1099e 0a 09 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ..      i = sqli
1099f 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
109a0 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20 65   (argv[2]);..  e
109a1 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
109a2 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
109a3 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [2]) == SQLITE_I
109a4 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09  NTEGER)..    {..
109a5 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c  .int_value = sql
109a6 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28  ite3_value_int (
109a7 61 72 67 76 5b 32 5d 29 3b 0a 09 09 69 20 3d 20  argv[2]);...i = 
109a8 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20  int_value;..    
109a9 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
109aa 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
109ab 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
109ac 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
109ad 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63   }.      }../* c
109ae 72 65 61 74 69 6e 67 20 74 68 65 20 42 4c 4f 42  reating the BLOB
109af 2d 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65 20  -encoded Affine 
109b0 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69 78  Transform Matrix
109b1 20 2a 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74   */.    gaia_mat
109b2 72 69 78 5f 63 72 65 61 74 65 20 28 61 2c 20 62  rix_create (a, b
109b3 2c 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 67 2c  , c, d, e, f, g,
109b4 20 68 2c 20 69 2c 20 78 6f 66 66 2c 20 79 6f 66   h, i, xoff, yof
109b5 66 2c 20 7a 6f 66 66 2c 20 26 62 6c 6f 62 2c 0a  f, zoff, &blob,.
109b6 09 09 09 26 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20  ...&blob_sz);.  
109b7 20 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20 4e 55    if (blob == NU
109b8 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
109b9 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
109ba 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
109bb 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
109bc 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62  b (context, blob
109bd 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29  , blob_sz, free)
109be 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
109bf 0a 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e  .fnct_AffineTran
109c0 73 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72 65 61  sformMatrix_Crea
109c1 74 65 52 6f 74 61 74 65 20 28 73 71 6c 69 74 65  teRotate (sqlite
109c2 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
109c3 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
109c4 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c  .... sqlite3_val
109c5 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
109c6 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
109c7 20 41 54 4d 5f 43 72 65 61 74 65 52 6f 74 61 74   ATM_CreateRotat
109c8 65 28 64 6f 75 62 6c 65 20 61 6e 67 6c 65 49 6e  e(double angleIn
109c9 44 65 67 72 65 65 73 29 20 2d 20 32 44 0a 2f 20  Degrees) - 2D./ 
109ca 20 20 20 6f 72 0a 2f 20 41 54 4d 5f 43 72 65 61     or./ ATM_Crea
109cb 74 65 5a 52 6f 6c 6c 28 64 6f 75 62 6c 65 20 61  teZRoll(double a
109cc 6e 67 65 49 6e 44 65 67 72 65 65 73 29 20 2d 20  ngeInDegrees) - 
109cd 33 44 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61  3D././ returns a
109ce 20 42 4c 4f 42 2d 41 54 4d 20 6f 62 6a 65 63 74   BLOB-ATM object
109cf 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66 61 69 6c   or NULL on fail
109d0 75 72 65 0a 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  ure.*/.    doubl
109d1 65 20 61 20 3d 20 31 2e 30 3b 0a 20 20 20 20 64  e a = 1.0;.    d
109d2 6f 75 62 6c 65 20 62 20 3d 20 30 2e 30 3b 0a 20  ouble b = 0.0;. 
109d3 20 20 20 64 6f 75 62 6c 65 20 63 20 3d 20 30 2e     double c = 0.
109d4 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 20  0;.    double d 
109d5 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
109d6 65 20 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 64  e e = 1.0;.    d
109d7 6f 75 62 6c 65 20 66 20 3d 20 30 2e 30 3b 0a 20  ouble f = 0.0;. 
109d8 20 20 20 64 6f 75 62 6c 65 20 67 20 3d 20 30 2e     double g = 0.
109d9 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 68 20  0;.    double h 
109da 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
109db 65 20 69 20 3d 20 31 2e 30 3b 0a 20 20 20 20 64  e i = 1.0;.    d
109dc 6f 75 62 6c 65 20 78 6f 66 66 20 3d 20 30 2e 30  ouble xoff = 0.0
109dd 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 6f 66  ;.    double yof
109de 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  f = 0.0;.    dou
109df 62 6c 65 20 7a 6f 66 66 20 3d 20 30 2e 30 3b 0a  ble zoff = 0.0;.
109e0 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75      int int_valu
109e1 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
109e2 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20  char *blob;.    
109e3 69 6e 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20  int blob_sz;.   
109e4 20 64 6f 75 62 6c 65 20 61 6e 67 6c 65 3b 0a 20   double angle;. 
109e5 20 20 20 64 6f 75 62 6c 65 20 63 6f 65 66 66 20     double coeff 
109e6 3d 20 2e 30 31 37 34 35 33 32 39 32 35 31 39 39  = .0174532925199
109e7 34 33 32 39 35 38 3b 0a 20 20 20 20 64 6f 75 62  432958;.    doub
109e8 6c 65 20 72 61 64 73 3b 0a 20 20 20 20 64 6f 75  le rads;.    dou
109e9 62 6c 65 20 76 73 69 6e 3b 0a 20 20 20 20 64 6f  ble vsin;.    do
109ea 75 62 6c 65 20 76 63 6f 73 3b 0a 20 20 20 20 47  uble vcos;.    G
109eb 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
109ec 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
109ed 45 20 2a 2f 0a 0a 2f 2a 20 76 61 6c 69 64 61 74  E */../* validat
109ee 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20 61 72  ing the input ar
109ef 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  gs */.    if (sq
109f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
109f1 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
109f2 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 61 6e 67  LITE_FLOAT)..ang
109f3 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
109f4 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
109f5 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  0]);.    else if
109f6 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
109f7 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
109f8 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
109f9 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
109fa 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
109fb 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
109fc 5b 30 5d 29 3b 0a 09 20 20 61 6e 67 6c 65 20 3d  [0]);..  angle =
109fd 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
109fe 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
109ff 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
10a00 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10a01 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
10a02 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 61  ;.      }.    ra
10a03 64 73 20 3d 20 61 6e 67 6c 65 20 2a 20 63 6f 65  ds = angle * coe
10a04 66 66 3b 0a 20 20 20 20 76 73 69 6e 20 3d 20 73  ff;.    vsin = s
10a05 69 6e 20 28 72 61 64 73 29 3b 0a 20 20 20 20 76  in (rads);.    v
10a06 63 6f 73 20 3d 20 63 6f 73 20 28 72 61 64 73 29  cos = cos (rads)
10a07 3b 0a 20 20 20 20 61 20 3d 20 76 63 6f 73 3b 0a  ;.    a = vcos;.
10a08 20 20 20 20 62 20 3d 20 2d 76 73 69 6e 3b 0a 20      b = -vsin;. 
10a09 20 20 20 64 20 3d 20 76 73 69 6e 3b 0a 20 20 20     d = vsin;.   
10a0a 20 65 20 3d 20 76 63 6f 73 3b 0a 0a 2f 2a 20 63   e = vcos;../* c
10a0b 72 65 61 74 69 6e 67 20 74 68 65 20 42 4c 4f 42  reating the BLOB
10a0c 2d 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65 20  -encoded Affine 
10a0d 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69 78  Transform Matrix
10a0e 20 2a 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74   */.    gaia_mat
10a0f 72 69 78 5f 63 72 65 61 74 65 20 28 61 2c 20 62  rix_create (a, b
10a10 2c 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 67 2c  , c, d, e, f, g,
10a11 20 68 2c 20 69 2c 20 78 6f 66 66 2c 20 79 6f 66   h, i, xoff, yof
10a12 66 2c 20 7a 6f 66 66 2c 20 26 62 6c 6f 62 2c 0a  f, zoff, &blob,.
10a13 09 09 09 26 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20  ...&blob_sz);.  
10a14 20 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20 4e 55    if (blob == NU
10a15 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
10a16 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
10a17 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
10a18 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
10a19 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62  b (context, blob
10a1a 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29  , blob_sz, free)
10a1b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
10a1c 0a 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e  .fnct_AffineTran
10a1d 73 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72 65 61  sformMatrix_Crea
10a1e 74 65 58 52 6f 6c 6c 20 28 73 71 6c 69 74 65 33  teXRoll (sqlite3
10a1f 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
10a20 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
10a21 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ...sqlite3_value
10a22 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
10a23 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41  QL function:./ A
10a24 54 4d 5f 43 72 65 61 74 65 58 52 6f 6c 6c 28 64  TM_CreateXRoll(d
10a25 6f 75 62 6c 65 20 61 6e 67 6c 65 49 6e 44 65 67  ouble angleInDeg
10a26 72 65 65 73 29 20 2d 20 33 44 0a 2f 0a 2f 20 72  rees) - 3D././ r
10a27 65 74 75 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54  eturns a BLOB-AT
10a28 4d 20 6f 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c  M object or NULL
10a29 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20   on failure.*/. 
10a2a 20 20 20 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e     double a = 1.
10a2b 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 20  0;.    double b 
10a2c 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
10a2d 65 20 63 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64  e c = 0.0;.    d
10a2e 6f 75 62 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20  ouble d = 0.0;. 
10a2f 20 20 20 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e     double e = 1.
10a30 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 20  0;.    double f 
10a31 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
10a32 65 20 67 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64  e g = 0.0;.    d
10a33 6f 75 62 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20  ouble h = 0.0;. 
10a34 20 20 20 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e     double i = 1.
10a35 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6f  0;.    double xo
10a36 66 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f  ff = 0.0;.    do
10a37 75 62 6c 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b  uble yoff = 0.0;
10a38 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66  .    double zoff
10a39 20 3d 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20   = 0.0;.    int 
10a3a 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 75  int_value;.    u
10a3b 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c  nsigned char *bl
10a3c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62  ob;.    int blob
10a3d 5f 73 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  _sz;.    double 
10a3e 61 6e 67 6c 65 3b 0a 20 20 20 20 64 6f 75 62 6c  angle;.    doubl
10a3f 65 20 63 6f 65 66 66 20 3d 20 2e 30 31 37 34 35  e coeff = .01745
10a40 33 32 39 32 35 31 39 39 34 33 32 39 35 38 3b 0a  32925199432958;.
10a41 20 20 20 20 64 6f 75 62 6c 65 20 72 61 64 73 3b      double rads;
10a42 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 73 69 6e  .    double vsin
10a43 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 63 6f  ;.    double vco
10a44 73 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  s;.    GAIA_UNUS
10a45 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
10a46 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a  EXCL_LINE */../*
10a47 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20   validating the 
10a48 69 6e 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20  input args */.  
10a49 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
10a4a 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
10a4b 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
10a4c 41 54 29 0a 09 61 6e 67 6c 65 20 3d 20 73 71 6c  AT)..angle = sql
10a4d 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
10a4e 65 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  e (argv[0]);.   
10a4f 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
10a50 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10a51 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
10a52 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
10a53 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
10a54 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
10a55 6e 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  nt (argv[0]);.. 
10a56 20 61 6e 67 6c 65 20 3d 20 69 6e 74 5f 76 61 6c   angle = int_val
10a57 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
10a58 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
10a59 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10a5a 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10a5b 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10a5c 7d 0a 20 20 20 20 72 61 64 73 20 3d 20 61 6e 67  }.    rads = ang
10a5d 6c 65 20 2a 20 63 6f 65 66 66 3b 0a 20 20 20 20  le * coeff;.    
10a5e 76 73 69 6e 20 3d 20 73 69 6e 20 28 72 61 64 73  vsin = sin (rads
10a5f 29 3b 0a 20 20 20 20 76 63 6f 73 20 3d 20 63 6f  );.    vcos = co
10a60 73 20 28 72 61 64 73 29 3b 0a 20 20 20 20 65 20  s (rads);.    e 
10a61 3d 20 76 63 6f 73 3b 0a 20 20 20 20 66 20 3d 20  = vcos;.    f = 
10a62 2d 76 73 69 6e 3b 0a 20 20 20 20 68 20 3d 20 76  -vsin;.    h = v
10a63 73 69 6e 3b 0a 20 20 20 20 69 20 3d 20 76 63 6f  sin;.    i = vco
10a64 73 3b 0a 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20  s;../* creating 
10a65 74 68 65 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64  the BLOB-encoded
10a66 20 41 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72   Affine Transfor
10a67 6d 20 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20  m Matrix */.    
10a68 67 61 69 61 5f 6d 61 74 72 69 78 5f 63 72 65 61  gaia_matrix_crea
10a69 74 65 20 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20  te (a, b, c, d, 
10a6a 65 2c 20 66 2c 20 67 2c 20 68 2c 20 69 2c 20 78  e, f, g, h, i, x
10a6b 6f 66 66 2c 20 79 6f 66 66 2c 20 7a 6f 66 66 2c  off, yoff, zoff,
10a6c 20 26 62 6c 6f 62 2c 0a 09 09 09 26 62 6c 6f 62   &blob,....&blob
10a6d 5f 73 7a 29 3b 0a 20 20 20 20 69 66 20 28 62 6c  _sz);.    if (bl
10a6e 6f 62 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c  ob == NULL)..sql
10a6f 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
10a70 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
10a71 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
10a72 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65  sult_blob (conte
10a73 78 74 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73  xt, blob, blob_s
10a74 7a 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61  z, free);.}..sta
10a75 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 41 66  tic void.fnct_Af
10a76 66 69 6e 65 54 72 61 6e 73 66 6f 72 6d 4d 61 74  fineTransformMat
10a77 72 69 78 5f 43 72 65 61 74 65 59 52 6f 6c 6c 20  rix_CreateYRoll 
10a78 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
10a79 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
10a7a 61 72 67 63 2c 0a 09 09 09 09 09 73 71 6c 69 74  argc,......sqlit
10a7b 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
10a7c 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
10a7d 69 6f 6e 3a 0a 2f 20 41 54 4d 5f 43 72 65 61 74  ion:./ ATM_Creat
10a7e 65 59 52 6f 6c 6c 28 64 6f 75 62 6c 65 20 61 6e  eYRoll(double an
10a7f 67 6c 65 49 6e 44 65 67 72 65 65 73 29 20 2d 20  gleInDegrees) - 
10a80 33 44 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 20 61  3D././ returns a
10a81 20 42 4c 4f 42 2d 41 54 4d 20 6f 62 6a 65 63 74   BLOB-ATM object
10a82 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66 61 69 6c   or NULL on fail
10a83 75 72 65 0a 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  ure.*/.    doubl
10a84 65 20 61 20 3d 20 31 2e 30 3b 0a 20 20 20 20 64  e a = 1.0;.    d
10a85 6f 75 62 6c 65 20 62 20 3d 20 30 2e 30 3b 0a 20  ouble b = 0.0;. 
10a86 20 20 20 64 6f 75 62 6c 65 20 63 20 3d 20 30 2e     double c = 0.
10a87 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 20  0;.    double d 
10a88 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
10a89 65 20 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 64  e e = 1.0;.    d
10a8a 6f 75 62 6c 65 20 66 20 3d 20 30 2e 30 3b 0a 20  ouble f = 0.0;. 
10a8b 20 20 20 64 6f 75 62 6c 65 20 67 20 3d 20 30 2e     double g = 0.
10a8c 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 68 20  0;.    double h 
10a8d 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
10a8e 65 20 69 20 3d 20 31 2e 30 3b 0a 20 20 20 20 64  e i = 1.0;.    d
10a8f 6f 75 62 6c 65 20 78 6f 66 66 20 3d 20 30 2e 30  ouble xoff = 0.0
10a90 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 6f 66  ;.    double yof
10a91 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  f = 0.0;.    dou
10a92 62 6c 65 20 7a 6f 66 66 20 3d 20 30 2e 30 3b 0a  ble zoff = 0.0;.
10a93 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 61 6c 75      int int_valu
10a94 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
10a95 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20  char *blob;.    
10a96 69 6e 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20  int blob_sz;.   
10a97 20 64 6f 75 62 6c 65 20 61 6e 67 6c 65 3b 0a 20   double angle;. 
10a98 20 20 20 64 6f 75 62 6c 65 20 63 6f 65 66 66 20     double coeff 
10a99 3d 20 2e 30 31 37 34 35 33 32 39 32 35 31 39 39  = .0174532925199
10a9a 34 33 32 39 35 38 3b 0a 20 20 20 20 64 6f 75 62  432958;.    doub
10a9b 6c 65 20 72 61 64 73 3b 0a 20 20 20 20 64 6f 75  le rads;.    dou
10a9c 62 6c 65 20 76 73 69 6e 3b 0a 20 20 20 20 64 6f  ble vsin;.    do
10a9d 75 62 6c 65 20 76 63 6f 73 3b 0a 20 20 20 20 47  uble vcos;.    G
10a9e 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
10a9f 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
10aa0 45 20 2a 2f 0a 0a 2f 2a 20 76 61 6c 69 64 61 74  E */../* validat
10aa1 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20 61 72  ing the input ar
10aa2 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71  gs */.    if (sq
10aa3 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10aa4 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
10aa5 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 61 6e 67  LITE_FLOAT)..ang
10aa6 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
10aa7 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
10aa8 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66  0]);.    else if
10aa9 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10aaa 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
10aab 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
10aac 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74  ).      {..  int
10aad 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  _value = sqlite3
10aae 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76  _value_int (argv
10aaf 5b 30 5d 29 3b 0a 09 20 20 61 6e 67 6c 65 20 3d  [0]);..  angle =
10ab0 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20   int_value;.    
10ab1 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
10ab2 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
10ab3 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10ab4 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
10ab5 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 61  ;.      }.    ra
10ab6 64 73 20 3d 20 61 6e 67 6c 65 20 2a 20 63 6f 65  ds = angle * coe
10ab7 66 66 3b 0a 20 20 20 20 76 73 69 6e 20 3d 20 73  ff;.    vsin = s
10ab8 69 6e 20 28 72 61 64 73 29 3b 0a 20 20 20 20 76  in (rads);.    v
10ab9 63 6f 73 20 3d 20 63 6f 73 20 28 72 61 64 73 29  cos = cos (rads)
10aba 3b 0a 20 20 20 20 61 20 3d 20 76 63 6f 73 3b 0a  ;.    a = vcos;.
10abb 20 20 20 20 63 20 3d 20 76 73 69 6e 3b 0a 20 20      c = vsin;.  
10abc 20 20 67 20 3d 20 2d 76 73 69 6e 3b 0a 20 20 20    g = -vsin;.   
10abd 20 69 20 3d 20 76 63 6f 73 3b 0a 0a 2f 2a 20 63   i = vcos;../* c
10abe 72 65 61 74 69 6e 67 20 74 68 65 20 42 4c 4f 42  reating the BLOB
10abf 2d 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65 20  -encoded Affine 
10ac0 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69 78  Transform Matrix
10ac1 20 2a 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74   */.    gaia_mat
10ac2 72 69 78 5f 63 72 65 61 74 65 20 28 61 2c 20 62  rix_create (a, b
10ac3 2c 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 67 2c  , c, d, e, f, g,
10ac4 20 68 2c 20 69 2c 20 78 6f 66 66 2c 20 79 6f 66   h, i, xoff, yof
10ac5 66 2c 20 7a 6f 66 66 2c 20 26 62 6c 6f 62 2c 0a  f, zoff, &blob,.
10ac6 09 09 09 26 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20  ...&blob_sz);.  
10ac7 20 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20 4e 55    if (blob == NU
10ac8 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  LL)..sqlite3_res
10ac9 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
10aca 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
10acb 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
10acc 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62  b (context, blob
10acd 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29  , blob_sz, free)
10ace 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
10acf 0a 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e  .fnct_AffineTran
10ad0 73 66 6f 72 6d 4d 61 74 72 69 78 5f 4d 75 6c 74  sformMatrix_Mult
10ad1 69 70 6c 79 20 28 73 71 6c 69 74 65 33 5f 63 6f  iply (sqlite3_co
10ad2 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
10ad3 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20   int argc,..... 
10ad4 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
10ad5 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
10ad6 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
10ad7 41 54 4d 5f 4d 75 6c 74 69 70 6c 79 28 62 6c 6f  ATM_Multiply(blo
10ad8 62 20 61 74 6d 41 2c 20 62 6c 6f 62 20 61 74 6d  b atmA, blob atm
10ad9 42 29 0a 2f 20 0a 2f 20 72 65 74 75 72 6e 73 20  B)./ ./ returns 
10ada 61 20 42 4c 4f 42 2d 41 54 4d 20 6f 62 6a 65 63  a BLOB-ATM objec
10adb 74 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66 61 69  t or NULL on fai
10adc 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 75 6e 73 69  lure.*/.    unsi
10add 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
10ade 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a  .    int blob_sz
10adf 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
10ae0 67 6e 65 64 20 63 68 61 72 20 2a 69 62 6c 6f 62  gned char *iblob
10ae1 31 3b 0a 20 20 20 20 69 6e 74 20 69 62 6c 6f 62  1;.    int iblob
10ae2 31 5f 73 7a 3b 0a 20 20 20 20 63 6f 6e 73 74 20  1_sz;.    const 
10ae3 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
10ae4 62 6c 6f 62 32 3b 0a 20 20 20 20 69 6e 74 20 69  blob2;.    int i
10ae5 62 6c 6f 62 32 5f 73 7a 3b 0a 20 20 20 20 47 41  blob2_sz;.    GA
10ae6 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
10ae7 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
10ae8 20 2a 2f 0a 0a 2f 2a 20 76 61 6c 69 64 61 74 69   */../* validati
10ae9 6e 67 20 74 68 65 20 69 6e 70 75 74 20 61 72 67  ng the input arg
10aea 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c  s */.    if (sql
10aeb 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
10aec 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
10aed 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20  ITE_BLOB).      
10aee 7b 0a 09 20 20 69 62 6c 6f 62 31 20 3d 20 73 71  {..  iblob1 = sq
10aef 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
10af0 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 69   (argv[0]);..  i
10af1 62 6c 6f 62 31 5f 73 7a 20 3d 20 73 71 6c 69 74  blob1_sz = sqlit
10af2 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
10af3 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
10af4 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
10af5 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
10af6 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
10af7 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
10af8 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
10af9 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10afa 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d 3d 20  pe (argv[1]) == 
10afb 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
10afc 20 20 20 7b 0a 09 20 20 69 62 6c 6f 62 32 20 3d     {..  iblob2 =
10afd 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10afe 6c 6f 62 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09  lob (argv[1]);..
10aff 20 20 69 62 6c 6f 62 32 5f 73 7a 20 3d 20 73 71    iblob2_sz = sq
10b00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
10b01 73 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  s (argv[1]);.   
10b02 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20     }.    else.  
10b03 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
10b04 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
10b05 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72  ntext);..  retur
10b06 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63  n;.      }../* c
10b07 72 65 61 74 69 6e 67 20 74 68 65 20 42 4c 4f 42  reating the BLOB
10b08 2d 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65 20  -encoded Affine 
10b09 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69 78  Transform Matrix
10b0a 20 2a 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74   */.    gaia_mat
10b0b 72 69 78 5f 6d 75 6c 74 69 70 6c 79 20 28 69 62  rix_multiply (ib
10b0c 6c 6f 62 31 2c 20 69 62 6c 6f 62 31 5f 73 7a 2c  lob1, iblob1_sz,
10b0d 20 69 62 6c 6f 62 32 2c 20 69 62 6c 6f 62 32 5f   iblob2, iblob2_
10b0e 73 7a 2c 20 26 62 6c 6f 62 2c 0a 09 09 09 20 20  sz, &blob,....  
10b0f 26 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20 69  &blob_sz);.    i
10b10 66 20 28 62 6c 6f 62 20 3d 3d 20 4e 55 4c 4c 29  f (blob == NULL)
10b11 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
10b12 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
10b13 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
10b14 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28  e3_result_blob (
10b15 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62 2c 20 62  context, blob, b
10b16 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29 3b 0a 7d  lob_sz, free);.}
10b17 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
10b18 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f  ct_AffineTransfo
10b19 72 6d 4d 61 74 72 69 78 5f 54 72 61 6e 73 6c 61  rmMatrix_Transla
10b1a 74 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  te (sqlite3_cont
10b1b 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
10b1c 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20 20 20  nt argc,.....   
10b1d 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
10b1e 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
10b1f 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41  QL function:./ A
10b20 54 4d 5f 54 72 61 6e 73 6c 61 74 65 28 62 6c 6f  TM_Translate(blo
10b21 62 20 61 74 6d 2c 20 64 6f 75 62 6c 65 20 74 78  b atm, double tx
10b22 2c 20 64 6f 75 62 6c 65 20 74 79 29 20 2d 20 32  , double ty) - 2
10b23 44 0a 2f 20 20 20 20 6f 72 0a 2f 20 41 54 4d 5f  D./    or./ ATM_
10b24 54 72 61 6e 73 6c 61 74 65 28 62 6c 6f 62 20 61  Translate(blob a
10b25 74 6d 2c 20 64 6f 75 62 6c 65 20 74 78 2c 20 64  tm, double tx, d
10b26 6f 75 62 6c 65 20 74 79 2c 20 64 6f 75 62 6c 65  ouble ty, double
10b27 20 74 7a 29 20 2d 20 33 44 0a 2f 0a 2f 20 72 65   tz) - 3D././ re
10b28 74 75 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54 4d  turns a BLOB-ATM
10b29 20 6f 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c 20   object or NULL 
10b2a 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20  on failure.*/.  
10b2b 20 20 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e 30    double a = 1.0
10b2c 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 20 3d  ;.    double b =
10b2d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
10b2e 20 63 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f   c = 0.0;.    do
10b2f 75 62 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20 20  uble d = 0.0;.  
10b30 20 20 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e 30    double e = 1.0
10b31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 20 3d  ;.    double f =
10b32 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
10b33 20 67 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f   g = 0.0;.    do
10b34 75 62 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20 20  uble h = 0.0;.  
10b35 20 20 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e 30    double i = 1.0
10b36 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6f 66  ;.    double xof
10b37 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  f = 0.0;.    dou
10b38 62 6c 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b 0a  ble yoff = 0.0;.
10b39 20 20 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66 20      double zoff 
10b3a 3d 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69  = 0.0;.    int i
10b3b 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e  nt_value;.    un
10b3c 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f  signed char *blo
10b3d 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f  b;.    int blob_
10b3e 73 7a 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  sz;.    const un
10b3f 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 62 6c  signed char *ibl
10b40 6f 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  ob = NULL;.    i
10b41 6e 74 20 69 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b  nt iblob_sz = 0;
10b42 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
10b43 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
10b44 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20 76  CL_LINE */../* v
10b45 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e  alidating the in
10b46 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  put args */.    
10b47 69 66 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20  if (argc == 3). 
10b48 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 32 44 20       {..  /* 2D 
10b49 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 09 20 20  translate */..  
10b4a 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
10b4b 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
10b4c 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   == SQLITE_BLOB)
10b4d 0a 09 20 20 20 20 7b 0a 09 09 69 62 6c 6f 62 20  ..    {...iblob 
10b4e 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
10b4f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
10b50 09 09 69 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c  ..iblob_sz = sql
10b51 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
10b52 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 20   (argv[0]);..   
10b53 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
10b54 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
10b55 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10b56 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
10b57 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74    }..  if (sqlit
10b58 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10b59 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[1]) == SQLIT
10b5a 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
10b5b 78 6f 66 66 20 3d 20 73 71 6c 69 74 65 33 5f 76  xoff = sqlite3_v
10b5c 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67  alue_double (arg
10b5d 76 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69  v[1]);..  else i
10b5e 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10b5f 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20  _type (argv[1]) 
10b60 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
10b61 52 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f  R)..    {...int_
10b62 76 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  value = sqlite3_
10b63 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b  value_int (argv[
10b64 31 5d 29 3b 0a 09 09 78 6f 66 66 20 3d 20 69 6e  1]);...xoff = in
10b65 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a  t_value;..    }.
10b66 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
10b67 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
10b68 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
10b69 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d  ..return;..    }
10b6a 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f  ..  if (sqlite3_
10b6b 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10b6c 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [2]) == SQLITE_F
10b6d 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 79 6f 66  LOAT)..      yof
10b6e 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  f = sqlite3_valu
10b6f 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
10b70 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  ]);..  else if (
10b71 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10b72 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
10b73 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
10b74 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c  .    {...int_val
10b75 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
10b76 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
10b77 3b 0a 09 09 79 6f 66 66 20 3d 20 69 6e 74 5f 76  ;...yoff = int_v
10b78 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20  alue;..    }..  
10b79 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
10b7a 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10b7b 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
10b7c 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
10b7d 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
10b7e 66 20 28 61 72 67 63 20 3d 3d 20 34 29 0a 20 20  f (argc == 4).  
10b7f 20 20 20 20 7b 0a 09 20 20 2f 2a 20 33 44 20 74      {..  /* 3D t
10b80 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 09 20 20 69  ranslate */..  i
10b81 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10b82 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
10b83 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  == SQLITE_BLOB).
10b84 09 20 20 20 20 7b 0a 09 09 69 62 6c 6f 62 20 3d  .    {...iblob =
10b85 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10b86 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  lob (argv[0]);..
10b87 09 69 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69  .iblob_sz = sqli
10b88 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
10b89 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20 20 20 20  (argv[0]);..    
10b8a 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
10b8b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ...sqlite3_resul
10b8c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10b8d 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  ;...return;..   
10b8e 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65   }..  if (sqlite
10b8f 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10b90 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
10b91 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20 78  _FLOAT)..      x
10b92 6f 66 66 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  off = sqlite3_va
10b93 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76  lue_double (argv
10b94 5b 31 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66  [1]);..  else if
10b95 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10b96 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29 20 3d  type (argv[1]) =
10b97 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
10b98 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76  )..    {...int_v
10b99 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
10b9a 61 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 31  alue_int (argv[1
10b9b 5d 29 3b 0a 09 09 78 6f 66 66 20 3d 20 69 6e 74  ]);...xoff = int
10b9c 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09  _value;..    }..
10b9d 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
10b9e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10b9f 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10ba0 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a  .return;..    }.
10ba1 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  .  if (sqlite3_v
10ba2 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10ba3 32 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c  2]) == SQLITE_FL
10ba4 4f 41 54 29 0a 09 20 20 20 20 20 20 79 6f 66 66  OAT)..      yoff
10ba5 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10ba6 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32 5d  _double (argv[2]
10ba7 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 73  );..  else if (s
10ba8 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
10ba9 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53  e (argv[2]) == S
10baa 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09  QLITE_INTEGER)..
10bab 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75      {...int_valu
10bac 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
10bad 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b  e_int (argv[2]);
10bae 0a 09 09 79 6f 66 66 20 3d 20 69 6e 74 5f 76 61  ...yoff = int_va
10baf 6c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  lue;..    }..  e
10bb0 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
10bb1 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
10bb2 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
10bb3 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
10bb4 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
10bb5 65 5f 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29  e_type (argv[3])
10bb6 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
10bb7 29 0a 09 20 20 20 20 20 20 7a 6f 66 66 20 3d 20  )..      zoff = 
10bb8 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
10bb9 75 62 6c 65 20 28 61 72 67 76 5b 33 5d 29 3b 0a  uble (argv[3]);.
10bba 09 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69  .  else if (sqli
10bbb 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10bbc 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51 4c 49  argv[3]) == SQLI
10bbd 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
10bbe 20 7b 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d   {...int_value =
10bbf 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
10bc0 6e 74 20 28 61 72 67 76 5b 33 5d 29 3b 0a 09 09  nt (argv[3]);...
10bc1 7a 6f 66 66 20 3d 20 69 6e 74 5f 76 61 6c 75 65  zoff = int_value
10bc2 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
10bc3 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65  ..    {...sqlite
10bc4 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
10bc5 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72  ontext);...retur
10bc6 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  n;..    }.      
10bc7 7d 0a 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20 74  }../* creating t
10bc8 68 65 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20  he BLOB-encoded 
10bc9 41 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d  Affine Transform
10bca 20 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 67   Matrix */.    g
10bcb 61 69 61 5f 6d 61 74 72 69 78 5f 63 72 65 61 74  aia_matrix_creat
10bcc 65 5f 6d 75 6c 74 69 70 6c 79 20 28 69 62 6c 6f  e_multiply (iblo
10bcd 62 2c 20 69 62 6c 6f 62 5f 73 7a 2c 20 61 2c 20  b, iblob_sz, a, 
10bce 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 67  b, c, d, e, f, g
10bcf 2c 20 68 2c 20 69 2c 0a 09 09 09 09 20 78 6f 66  , h, i,..... xof
10bd0 66 2c 20 79 6f 66 66 2c 20 7a 6f 66 66 2c 20 26  f, yoff, zoff, &
10bd1 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73 7a 29 3b  blob, &blob_sz);
10bd2 0a 20 20 20 20 69 66 20 28 62 6c 6f 62 20 3d 3d  .    if (blob ==
10bd3 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f   NULL)..sqlite3_
10bd4 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10bd5 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a  text);.    else.
10bd6 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
10bd7 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 62  blob (context, b
10bd8 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72  lob, blob_sz, fr
10bd9 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ee);.}..static v
10bda 6f 69 64 0a 66 6e 63 74 5f 41 66 66 69 6e 65 54  oid.fnct_AffineT
10bdb 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 53  ransformMatrix_S
10bdc 63 61 6c 65 20 28 73 71 6c 69 74 65 33 5f 63 6f  cale (sqlite3_co
10bdd 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
10bde 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20   int argc,..... 
10bdf 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10be0 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
10be1 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41 54 4d   function:./ ATM
10be2 5f 53 63 61 6c 65 28 62 6c 6f 62 20 61 74 6d 2c  _Scale(blob atm,
10be3 20 64 6f 75 62 6c 65 20 73 78 2c 20 64 6f 75 62   double sx, doub
10be4 6c 65 20 73 79 29 20 2d 20 32 44 0a 2f 20 20 20  le sy) - 2D./   
10be5 20 6f 72 0a 2f 20 41 54 4d 5f 53 63 61 6c 65 28   or./ ATM_Scale(
10be6 62 6c 6f 62 20 61 74 6d 2c 20 64 6f 75 62 6c 65  blob atm, double
10be7 20 73 78 2c 20 64 6f 75 62 6c 65 20 73 79 2c 20   sx, double sy, 
10be8 64 6f 75 62 6c 65 20 73 7a 29 20 2d 20 33 44 0a  double sz) - 3D.
10be9 2f 0a 2f 20 77 69 6c 6c 20 63 72 65 61 74 65 20  /./ will create 
10bea 61 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20 41  a BLOB-encoded A
10beb 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20  ffine Transform 
10bec 4d 61 74 72 69 78 0a 2f 20 0a 2f 20 72 65 74 75  Matrix./ ./ retu
10bed 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54 4d 20 6f  rns a BLOB-ATM o
10bee 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c 20 6f 6e  bject or NULL on
10bef 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20   failure.*/.    
10bf0 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e 30 3b 0a  double a = 1.0;.
10bf1 20 20 20 20 64 6f 75 62 6c 65 20 62 20 3d 20 30      double b = 0
10bf2 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63  .0;.    double c
10bf3 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
10bf4 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20 20 20 20  le d = 0.0;.    
10bf5 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e 30 3b 0a  double e = 1.0;.
10bf6 20 20 20 20 64 6f 75 62 6c 65 20 66 20 3d 20 30      double f = 0
10bf7 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 67  .0;.    double g
10bf8 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
10bf9 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20 20 20 20  le h = 0.0;.    
10bfa 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e 30 3b 0a  double i = 1.0;.
10bfb 20 20 20 20 64 6f 75 62 6c 65 20 78 6f 66 66 20      double xoff 
10bfc 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
10bfd 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b 0a 20 20  e yoff = 0.0;.  
10bfe 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66 20 3d 20    double zoff = 
10bff 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74  0.0;.    int int
10c00 5f 76 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69  _value;.    unsi
10c01 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
10c02 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a  .    int blob_sz
10c03 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
10c04 67 6e 65 64 20 63 68 61 72 20 2a 69 62 6c 6f 62  gned char *iblob
10c05 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
10c06 20 69 62 6c 6f 62 5f 73 7a 20 3d 20 30 3b 0a 20   iblob_sz = 0;. 
10c07 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
10c08 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
10c09 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20 76 61 6c  _LINE */../* val
10c0a 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75  idating the inpu
10c0b 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66  t args */.    if
10c0c 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20 20   (argc == 3).   
10c0d 20 20 20 7b 0a 09 20 20 2f 2a 20 32 44 20 73 63     {..  /* 2D sc
10c0e 61 6c 65 20 2a 2f 0a 09 20 20 69 66 20 28 73 71  ale */..  if (sq
10c0f 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
10c10 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
10c11 4c 49 54 45 5f 42 4c 4f 42 29 0a 09 20 20 20 20  LITE_BLOB)..    
10c12 7b 0a 09 09 69 62 6c 6f 62 20 3d 20 73 71 6c 69  {...iblob = sqli
10c13 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28  te3_value_blob (
10c14 61 72 67 76 5b 30 5d 29 3b 0a 09 09 69 62 6c 6f  argv[0]);...iblo
10c15 62 5f 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  b_sz = sqlite3_v
10c16 61 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76  alue_bytes (argv
10c17 5b 30 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  [0]);..    }..  
10c18 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
10c19 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10c1a 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
10c1b 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20  eturn;..    }.. 
10c1c 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
10c1d 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
10c1e 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41  ) == SQLITE_FLOA
10c1f 54 29 0a 09 20 20 20 20 20 20 61 20 3d 20 73 71  T)..      a = sq
10c20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
10c21 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  le (argv[1]);.. 
10c22 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
10c23 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10c24 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
10c25 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b  _INTEGER)..    {
10c26 0a 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  ...int_value = s
10c27 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10c28 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 61 20   (argv[1]);...a 
10c29 3d 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20  = int_value;..  
10c2a 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
10c2b 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
10c2c 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
10c2d 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
10c2e 20 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69     }..  if (sqli
10c2f 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10c30 61 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49  argv[2]) == SQLI
10c31 54 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20  TE_FLOAT)..     
10c32 20 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   e = sqlite3_val
10c33 75 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b  ue_double (argv[
10c34 32 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  2]);..  else if 
10c35 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
10c36 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d  ype (argv[2]) ==
10c37 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
10c38 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61  ..    {...int_va
10c39 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lue = sqlite3_va
10c3a 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d  lue_int (argv[2]
10c3b 29 3b 0a 09 09 65 20 3d 20 69 6e 74 5f 76 61 6c  );...e = int_val
10c3c 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  ue;..    }..  el
10c3d 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69  se..    {...sqli
10c3e 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
10c3f 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74  (context);...ret
10c40 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  urn;..    }.    
10c41 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
10c42 28 61 72 67 63 20 3d 3d 20 34 29 0a 20 20 20 20  (argc == 4).    
10c43 20 20 7b 0a 09 20 20 2f 2a 20 33 44 20 73 63 61    {..  /* 3D sca
10c44 6c 65 20 2a 2f 0a 09 20 20 69 66 20 28 73 71 6c  le */..  if (sql
10c45 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
10c46 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c  (argv[0]) == SQL
10c47 49 54 45 5f 42 4c 4f 42 29 0a 09 20 20 20 20 7b  ITE_BLOB)..    {
10c48 0a 09 09 69 62 6c 6f 62 20 3d 20 73 71 6c 69 74  ...iblob = sqlit
10c49 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
10c4a 72 67 76 5b 30 5d 29 3b 0a 09 09 69 62 6c 6f 62  rgv[0]);...iblob
10c4b 5f 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  _sz = sqlite3_va
10c4c 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
10c4d 30 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  0]);..    }..  e
10c4e 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c  lse..    {...sql
10c4f 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
10c50 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65   (context);...re
10c51 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20  turn;..    }..  
10c52 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
10c53 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
10c54 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
10c55 29 0a 09 20 20 20 20 20 20 61 20 3d 20 73 71 6c  )..      a = sql
10c56 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
10c57 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20  e (argv[1]);..  
10c58 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
10c59 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
10c5a 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
10c5b 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a  INTEGER)..    {.
10c5c 09 09 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71  ..int_value = sq
10c5d 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
10c5e 28 61 72 67 76 5b 31 5d 29 3b 0a 09 09 61 20 3d  (argv[1]);...a =
10c5f 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20   int_value;..   
10c60 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
10c61 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75  {...sqlite3_resu
10c62 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10c63 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20  );...return;..  
10c64 20 20 7d 0a 09 20 20 69 66 20 28 73 71 6c 69 74    }..  if (sqlit
10c65 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10c66 72 67 76 5b 32 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[2]) == SQLIT
10c67 45 5f 46 4c 4f 41 54 29 0a 09 20 20 20 20 20 20  E_FLOAT)..      
10c68 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
10c69 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 32  e_double (argv[2
10c6a 5d 29 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28  ]);..  else if (
10c6b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
10c6c 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d 3d 20  pe (argv[2]) == 
10c6d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a  SQLITE_INTEGER).
10c6e 09 20 20 20 20 7b 0a 09 09 69 6e 74 5f 76 61 6c  .    {...int_val
10c6f 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ue = sqlite3_val
10c70 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 32 5d 29  ue_int (argv[2])
10c71 3b 0a 09 09 65 20 3d 20 69 6e 74 5f 76 61 6c 75  ;...e = int_valu
10c72 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  e;..    }..  els
10c73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74  e..    {...sqlit
10c74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
10c75 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75  context);...retu
10c76 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66  rn;..    }..  if
10c77 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
10c78 74 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d  type (argv[3]) =
10c79 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
10c7a 09 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
10c7b 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
10c7c 28 61 72 67 76 5b 33 5d 29 3b 0a 09 20 20 65 6c  (argv[3]);..  el
10c7d 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76  se if (sqlite3_v
10c7e 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10c7f 33 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e  3]) == SQLITE_IN
10c80 54 45 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09  TEGER)..    {...
10c81 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73 71 6c 69  int_value = sqli
10c82 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61  te3_value_int (a
10c83 72 67 76 5b 33 5d 29 3b 0a 09 09 69 20 3d 20 69  rgv[3]);...i = i
10c84 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 20 20 7d  nt_value;..    }
10c85 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
10c86 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
10c87 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
10c88 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20 20  ...return;..    
10c89 7d 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 72  }.      }../* cr
10c8a 65 61 74 69 6e 67 20 74 68 65 20 42 4c 4f 42 2d  eating the BLOB-
10c8b 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65 20 54  encoded Affine T
10c8c 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69 78 20  ransform Matrix 
10c8d 2a 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74 72  */.    gaia_matr
10c8e 69 78 5f 63 72 65 61 74 65 5f 6d 75 6c 74 69 70  ix_create_multip
10c8f 6c 79 20 28 69 62 6c 6f 62 2c 20 69 62 6c 6f 62  ly (iblob, iblob
10c90 5f 73 7a 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  _sz, a, b, c, d,
10c91 20 65 2c 20 66 2c 20 67 2c 20 68 2c 20 69 2c 0a   e, f, g, h, i,.
10c92 09 09 09 09 20 78 6f 66 66 2c 20 79 6f 66 66 2c  .... xoff, yoff,
10c93 20 7a 6f 66 66 2c 20 26 62 6c 6f 62 2c 20 26 62   zoff, &blob, &b
10c94 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20 69 66 20  lob_sz);.    if 
10c95 28 62 6c 6f 62 20 3d 3d 20 4e 55 4c 4c 29 0a 09  (blob == NULL)..
10c96 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10c97 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ull (context);. 
10c98 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74 65 33     else..sqlite3
10c99 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 20 28 63 6f  _result_blob (co
10c9a 6e 74 65 78 74 2c 20 62 6c 6f 62 2c 20 62 6c 6f  ntext, blob, blo
10c9b 62 5f 73 7a 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a  b_sz, free);.}..
10c9c 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
10c9d 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f 72 6d  _AffineTransform
10c9e 4d 61 74 72 69 78 5f 52 6f 74 61 74 65 20 28 73  Matrix_Rotate (s
10c9f 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
10ca0 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
10ca1 67 63 2c 0a 09 09 09 09 20 20 20 73 71 6c 69 74  gc,.....   sqlit
10ca2 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
10ca3 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
10ca4 69 6f 6e 3a 0a 2f 20 41 54 4d 5f 52 6f 74 61 74  ion:./ ATM_Rotat
10ca5 65 28 62 6c 6f 62 20 61 74 6d 2c 20 64 6f 75 62  e(blob atm, doub
10ca6 6c 65 20 61 6e 67 6c 65 49 6e 44 65 67 72 65 65  le angleInDegree
10ca7 73 29 20 2d 20 32 44 0a 2f 20 20 20 20 6f 72 0a  s) - 2D./    or.
10ca8 2f 20 41 54 4d 5f 5a 52 6f 6c 6c 28 62 6c 6f 62  / ATM_ZRoll(blob
10ca9 20 61 74 6d 2c 20 64 6f 75 62 6c 65 20 61 6e 67   atm, double ang
10caa 6c 65 49 6e 44 65 67 72 65 65 73 29 20 2d 20 33  leInDegrees) - 3
10cab 44 0a 2f 0a 2f 20 77 69 6c 6c 20 63 72 65 61 74  D././ will creat
10cac 65 20 61 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64  e a BLOB-encoded
10cad 20 41 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72   Affine Transfor
10cae 6d 20 4d 61 74 72 69 78 0a 2f 20 0a 2f 20 72 65  m Matrix./ ./ re
10caf 74 75 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54 4d  turns a BLOB-ATM
10cb0 20 6f 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c 20   object or NULL 
10cb1 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20  on failure.*/.  
10cb2 20 20 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e 30    double a = 1.0
10cb3 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 62 20 3d  ;.    double b =
10cb4 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
10cb5 20 63 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f   c = 0.0;.    do
10cb6 75 62 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20 20  uble d = 0.0;.  
10cb7 20 20 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e 30    double e = 1.0
10cb8 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 20 3d  ;.    double f =
10cb9 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
10cba 20 67 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f   g = 0.0;.    do
10cbb 75 62 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20 20  uble h = 0.0;.  
10cbc 20 20 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e 30    double i = 1.0
10cbd 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6f 66  ;.    double xof
10cbe 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75  f = 0.0;.    dou
10cbf 62 6c 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b 0a  ble yoff = 0.0;.
10cc0 20 20 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66 20      double zoff 
10cc1 3d 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69  = 0.0;.    int i
10cc2 6e 74 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f  nt_value;.    do
10cc3 75 62 6c 65 20 61 6e 67 6c 65 3b 0a 20 20 20 20  uble angle;.    
10cc4 64 6f 75 62 6c 65 20 63 6f 65 66 66 20 3d 20 2e  double coeff = .
10cc5 30 31 37 34 35 33 32 39 32 35 31 39 39 34 33 32  0174532925199432
10cc6 39 35 38 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  958;.    double 
10cc7 72 61 64 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65  rads;.    double
10cc8 20 76 73 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c   vsin;.    doubl
10cc9 65 20 76 63 6f 73 3b 0a 20 20 20 20 75 6e 73 69  e vcos;.    unsi
10cca 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
10ccb 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a  .    int blob_sz
10ccc 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
10ccd 67 6e 65 64 20 63 68 61 72 20 2a 69 62 6c 6f 62  gned char *iblob
10cce 3b 0a 20 20 20 20 69 6e 74 20 69 62 6c 6f 62 5f  ;.    int iblob_
10ccf 73 7a 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  sz;.    GAIA_UNU
10cd0 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
10cd1 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f  _EXCL_LINE */../
10cd2 2a 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  * validating the
10cd3 20 69 6e 70 75 74 20 61 72 67 73 20 2a 2f 0a 20   input args */. 
10cd4 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
10cd5 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
10cd6 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c  0]) == SQLITE_BL
10cd7 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  OB).      {..  i
10cd8 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  blob = sqlite3_v
10cd9 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
10cda 30 5d 29 3b 0a 09 20 20 69 62 6c 6f 62 5f 73 7a  0]);..  iblob_sz
10cdb 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10cdc 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29  _bytes (argv[0])
10cdd 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
10cde 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
10cdf 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10ce0 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
10ce1 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
10ce2 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f      if (sqlite3_
10ce3 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10ce4 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46  [1]) == SQLITE_F
10ce5 4c 4f 41 54 29 0a 09 61 6e 67 6c 65 20 3d 20 73  LOAT)..angle = s
10ce6 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
10ce7 62 6c 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ble (argv[1]);. 
10ce8 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69     else if (sqli
10ce9 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
10cea 61 72 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49  argv[1]) == SQLI
10ceb 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20  TE_INTEGER).    
10cec 20 20 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65    {..  int_value
10ced 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10cee 5f 69 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a  _int (argv[1]);.
10cef 09 20 20 61 6e 67 6c 65 20 3d 20 69 6e 74 5f 76  .  angle = int_v
10cf0 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alue;.      }.  
10cf1 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
10cf2 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
10cf3 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
10cf4 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
10cf5 20 20 7d 0a 20 20 20 20 72 61 64 73 20 3d 20 61    }.    rads = a
10cf6 6e 67 6c 65 20 2a 20 63 6f 65 66 66 3b 0a 20 20  ngle * coeff;.  
10cf7 20 20 76 73 69 6e 20 3d 20 73 69 6e 20 28 72 61    vsin = sin (ra
10cf8 64 73 29 3b 0a 20 20 20 20 76 63 6f 73 20 3d 20  ds);.    vcos = 
10cf9 63 6f 73 20 28 72 61 64 73 29 3b 0a 20 20 20 20  cos (rads);.    
10cfa 61 20 3d 20 76 63 6f 73 3b 0a 20 20 20 20 62 20  a = vcos;.    b 
10cfb 3d 20 2d 76 73 69 6e 3b 0a 20 20 20 20 64 20 3d  = -vsin;.    d =
10cfc 20 76 73 69 6e 3b 0a 20 20 20 20 65 20 3d 20 76   vsin;.    e = v
10cfd 63 6f 73 3b 0a 0a 2f 2a 20 63 72 65 61 74 69 6e  cos;../* creatin
10cfe 67 20 74 68 65 20 42 4c 4f 42 2d 65 6e 63 6f 64  g the BLOB-encod
10cff 65 64 20 41 66 66 69 6e 65 20 54 72 61 6e 73 66  ed Affine Transf
10d00 6f 72 6d 20 4d 61 74 72 69 78 20 2a 2f 0a 20 20  orm Matrix */.  
10d01 20 20 67 61 69 61 5f 6d 61 74 72 69 78 5f 63 72    gaia_matrix_cr
10d02 65 61 74 65 5f 6d 75 6c 74 69 70 6c 79 20 28 69  eate_multiply (i
10d03 62 6c 6f 62 2c 20 69 62 6c 6f 62 5f 73 7a 2c 20  blob, iblob_sz, 
10d04 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66  a, b, c, d, e, f
10d05 2c 20 67 2c 20 68 2c 20 69 2c 0a 09 09 09 09 20  , g, h, i,..... 
10d06 78 6f 66 66 2c 20 79 6f 66 66 2c 20 7a 6f 66 66  xoff, yoff, zoff
10d07 2c 20 26 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73  , &blob, &blob_s
10d08 7a 29 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f 62  z);.    if (blob
10d09 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74   == NULL)..sqlit
10d0a 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
10d0b 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c  context);.    el
10d0c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  se..sqlite3_resu
10d0d 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74  lt_blob (context
10d0e 2c 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c  , blob, blob_sz,
10d0f 20 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69   free);.}..stati
10d10 63 20 76 6f 69 64 0a 66 6e 63 74 5f 41 66 66 69  c void.fnct_Affi
10d11 6e 65 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69  neTransformMatri
10d12 78 5f 58 52 6f 6c 6c 20 28 73 71 6c 69 74 65 33  x_XRoll (sqlite3
10d13 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
10d14 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
10d15 09 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
10d16 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
10d17 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
10d18 41 54 4d 5f 58 52 6f 6c 6c 28 64 6f 75 62 6c 65  ATM_XRoll(double
10d19 20 61 6e 67 6c 65 49 6e 44 65 67 72 65 65 73 2c   angleInDegrees,
10d1a 20 62 6c 6f 62 20 61 74 6d 29 20 2d 20 33 44 0a   blob atm) - 3D.
10d1b 2f 0a 2f 20 77 69 6c 6c 20 63 72 65 61 74 65 20  /./ will create 
10d1c 61 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20 41  a BLOB-encoded A
10d1d 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20  ffine Transform 
10d1e 4d 61 74 72 69 78 0a 2f 20 0a 2f 20 72 65 74 75  Matrix./ ./ retu
10d1f 72 6e 73 20 61 20 42 4c 4f 42 2d 41 54 4d 20 6f  rns a BLOB-ATM o
10d20 62 6a 65 63 74 20 6f 72 20 4e 55 4c 4c 20 6f 6e  bject or NULL on
10d21 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20   failure.*/.    
10d22 64 6f 75 62 6c 65 20 61 20 3d 20 31 2e 30 3b 0a  double a = 1.0;.
10d23 20 20 20 20 64 6f 75 62 6c 65 20 62 20 3d 20 30      double b = 0
10d24 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63  .0;.    double c
10d25 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
10d26 6c 65 20 64 20 3d 20 30 2e 30 3b 0a 20 20 20 20  le d = 0.0;.    
10d27 64 6f 75 62 6c 65 20 65 20 3d 20 31 2e 30 3b 0a  double e = 1.0;.
10d28 20 20 20 20 64 6f 75 62 6c 65 20 66 20 3d 20 30      double f = 0
10d29 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 67  .0;.    double g
10d2a 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
10d2b 6c 65 20 68 20 3d 20 30 2e 30 3b 0a 20 20 20 20  le h = 0.0;.    
10d2c 64 6f 75 62 6c 65 20 69 20 3d 20 31 2e 30 3b 0a  double i = 1.0;.
10d2d 20 20 20 20 64 6f 75 62 6c 65 20 78 6f 66 66 20      double xoff 
10d2e 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c  = 0.0;.    doubl
10d2f 65 20 79 6f 66 66 20 3d 20 30 2e 30 3b 0a 20 20  e yoff = 0.0;.  
10d30 20 20 64 6f 75 62 6c 65 20 7a 6f 66 66 20 3d 20    double zoff = 
10d31 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74  0.0;.    int int
10d32 5f 76 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62  _value;.    doub
10d33 6c 65 20 61 6e 67 6c 65 3b 0a 20 20 20 20 64 6f  le angle;.    do
10d34 75 62 6c 65 20 63 6f 65 66 66 20 3d 20 2e 30 31  uble coeff = .01
10d35 37 34 35 33 32 39 32 35 31 39 39 34 33 32 39 35  7453292519943295
10d36 38 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61  8;.    double ra
10d37 64 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76  ds;.    double v
10d38 73 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  sin;.    double 
10d39 76 63 6f 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e  vcos;.    unsign
10d3a 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20  ed char *blob;. 
10d3b 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 3b 0a     int blob_sz;.
10d3c 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
10d3d 65 64 20 63 68 61 72 20 2a 69 62 6c 6f 62 3b 0a  ed char *iblob;.
10d3e 20 20 20 20 69 6e 74 20 69 62 6c 6f 62 5f 73 7a      int iblob_sz
10d3f 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
10d40 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
10d41 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20  XCL_LINE */../* 
10d42 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 69  validating the i
10d43 6e 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20 20  nput args */.   
10d44 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
10d45 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d  ue_type (argv[0]
10d46 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) == SQLITE_BLOB
10d47 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 62 6c  ).      {..  ibl
10d48 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
10d49 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d  ue_blob (argv[0]
10d4a 29 3b 0a 09 20 20 69 62 6c 6f 62 5f 73 7a 20 3d  );..  iblob_sz =
10d4b 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10d4c 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
10d4d 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
10d4e 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
10d4f 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
10d50 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
10d51 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
10d52 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
10d53 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
10d54 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
10d55 41 54 29 0a 09 61 6e 67 6c 65 20 3d 20 73 71 6c  AT)..angle = sql
10d56 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
10d57 65 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  e (argv[1]);.   
10d58 20 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65   else if (sqlite
10d59 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10d5a 67 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[1]) == SQLITE
10d5b 5f 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20  _INTEGER).      
10d5c 7b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d  {..  int_value =
10d5d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
10d5e 6e 74 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20  nt (argv[1]);.. 
10d5f 20 61 6e 67 6c 65 20 3d 20 69 6e 74 5f 76 61 6c   angle = int_val
10d60 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
10d61 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
10d62 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10d63 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10d64 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10d65 7d 0a 20 20 20 20 72 61 64 73 20 3d 20 61 6e 67  }.    rads = ang
10d66 6c 65 20 2a 20 63 6f 65 66 66 3b 0a 20 20 20 20  le * coeff;.    
10d67 76 73 69 6e 20 3d 20 73 69 6e 20 28 72 61 64 73  vsin = sin (rads
10d68 29 3b 0a 20 20 20 20 76 63 6f 73 20 3d 20 63 6f  );.    vcos = co
10d69 73 20 28 72 61 64 73 29 3b 0a 20 20 20 20 65 20  s (rads);.    e 
10d6a 3d 20 76 63 6f 73 3b 0a 20 20 20 20 66 20 3d 20  = vcos;.    f = 
10d6b 2d 76 73 69 6e 3b 0a 20 20 20 20 68 20 3d 20 76  -vsin;.    h = v
10d6c 73 69 6e 3b 0a 20 20 20 20 69 20 3d 20 76 63 6f  sin;.    i = vco
10d6d 73 3b 0a 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20  s;../* creating 
10d6e 74 68 65 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64  the BLOB-encoded
10d6f 20 41 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72   Affine Transfor
10d70 6d 20 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20  m Matrix */.    
10d71 67 61 69 61 5f 6d 61 74 72 69 78 5f 63 72 65 61  gaia_matrix_crea
10d72 74 65 5f 6d 75 6c 74 69 70 6c 79 20 28 69 62 6c  te_multiply (ibl
10d73 6f 62 2c 20 69 62 6c 6f 62 5f 73 7a 2c 20 61 2c  ob, iblob_sz, a,
10d74 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20   b, c, d, e, f, 
10d75 67 2c 20 68 2c 20 69 2c 0a 09 09 09 09 20 78 6f  g, h, i,..... xo
10d76 66 66 2c 20 79 6f 66 66 2c 20 7a 6f 66 66 2c 20  ff, yoff, zoff, 
10d77 26 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73 7a 29  &blob, &blob_sz)
10d78 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f 62 20 3d  ;.    if (blob =
10d79 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33  = NULL)..sqlite3
10d7a 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
10d7b 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65  ntext);.    else
10d7c 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
10d7d 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20  _blob (context, 
10d7e 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66  blob, blob_sz, f
10d7f 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ree);.}..static 
10d80 76 6f 69 64 0a 66 6e 63 74 5f 41 66 66 69 6e 65  void.fnct_Affine
10d81 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f  TransformMatrix_
10d82 59 52 6f 6c 6c 20 28 73 71 6c 69 74 65 33 5f 63  YRoll (sqlite3_c
10d83 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
10d84 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09  , int argc,.....
10d85 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10d86 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51  ** argv).{./* SQ
10d87 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41 54  L function:./ AT
10d88 4d 5f 59 52 6f 6c 6c 28 64 6f 75 62 6c 65 20 61  M_YRoll(double a
10d89 6e 67 6c 65 49 6e 44 65 67 72 65 65 73 2c 20 62  ngleInDegrees, b
10d8a 6c 6f 62 20 61 74 6d 29 20 2d 20 33 44 0a 2f 0a  lob atm) - 3D./.
10d8b 2f 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 20  / will create a 
10d8c 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20 41 66 66  BLOB-encoded Aff
10d8d 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20 4d 61  ine Transform Ma
10d8e 74 72 69 78 0a 2f 20 0a 2f 20 72 65 74 75 72 6e  trix./ ./ return
10d8f 73 20 61 20 42 4c 4f 42 2d 41 54 4d 20 6f 62 6a  s a BLOB-ATM obj
10d90 65 63 74 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66  ect or NULL on f
10d91 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 64 6f  ailure.*/.    do
10d92 75 62 6c 65 20 61 20 3d 20 31 2e 30 3b 0a 20 20  uble a = 1.0;.  
10d93 20 20 64 6f 75 62 6c 65 20 62 20 3d 20 30 2e 30    double b = 0.0
10d94 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 20 3d  ;.    double c =
10d95 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
10d96 20 64 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f   d = 0.0;.    do
10d97 75 62 6c 65 20 65 20 3d 20 31 2e 30 3b 0a 20 20  uble e = 1.0;.  
10d98 20 20 64 6f 75 62 6c 65 20 66 20 3d 20 30 2e 30    double f = 0.0
10d99 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 67 20 3d  ;.    double g =
10d9a 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65   0.0;.    double
10d9b 20 68 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f   h = 0.0;.    do
10d9c 75 62 6c 65 20 69 20 3d 20 31 2e 30 3b 0a 20 20  uble i = 1.0;.  
10d9d 20 20 64 6f 75 62 6c 65 20 78 6f 66 66 20 3d 20    double xoff = 
10d9e 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
10d9f 79 6f 66 66 20 3d 20 30 2e 30 3b 0a 20 20 20 20  yoff = 0.0;.    
10da0 64 6f 75 62 6c 65 20 7a 6f 66 66 20 3d 20 30 2e  double zoff = 0.
10da1 30 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76  0;.    int int_v
10da2 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65  alue;.    double
10da3 20 61 6e 67 6c 65 3b 0a 20 20 20 20 64 6f 75 62   angle;.    doub
10da4 6c 65 20 63 6f 65 66 66 20 3d 20 2e 30 31 37 34  le coeff = .0174
10da5 35 33 32 39 32 35 31 39 39 34 33 32 39 35 38 3b  532925199432958;
10da6 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61 64 73  .    double rads
10da7 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 73 69  ;.    double vsi
10da8 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 63  n;.    double vc
10da9 6f 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  os;.    unsigned
10daa 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20   char *blob;.   
10dab 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20   int blob_sz;.  
10dac 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10dad 20 63 68 61 72 20 2a 69 62 6c 6f 62 3b 0a 20 20   char *iblob;.  
10dae 20 20 69 6e 74 20 69 62 6c 6f 62 5f 73 7a 3b 0a    int iblob_sz;.
10daf 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
10db0 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
10db1 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20 76 61  L_LINE */../* va
10db2 6c 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70  lidating the inp
10db3 75 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69  ut args */.    i
10db4 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10db5 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
10db6 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  == SQLITE_BLOB).
10db7 20 20 20 20 20 20 7b 0a 09 20 20 69 62 6c 6f 62        {..  iblob
10db8 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10db9 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
10dba 0a 09 20 20 69 62 6c 6f 62 5f 73 7a 20 3d 20 73  ..  iblob_sz = s
10dbb 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
10dbc 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
10dbd 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
10dbe 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
10dbf 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
10dc0 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75  ontext);..  retu
10dc1 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
10dc2 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
10dc3 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d 29  e_type (argv[1])
10dc4 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54   == SQLITE_FLOAT
10dc5 29 0a 09 61 6e 67 6c 65 20 3d 20 73 71 6c 69 74  )..angle = sqlit
10dc6 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20  e3_value_double 
10dc7 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65  (argv[1]);.    e
10dc8 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33 5f  lse if (sqlite3_
10dc9 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76  value_type (argv
10dca 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  [1]) == SQLITE_I
10dcb 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a  NTEGER).      {.
10dcc 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 3d 20 73  .  int_value = s
10dcd 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10dce 20 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 61   (argv[1]);..  a
10dcf 6e 67 6c 65 20 3d 20 69 6e 74 5f 76 61 6c 75 65  ngle = int_value
10dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
10dd1 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
10dd2 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
10dd3 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
10dd4 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
10dd5 20 20 20 20 72 61 64 73 20 3d 20 61 6e 67 6c 65      rads = angle
10dd6 20 2a 20 63 6f 65 66 66 3b 0a 20 20 20 20 76 73   * coeff;.    vs
10dd7 69 6e 20 3d 20 73 69 6e 20 28 72 61 64 73 29 3b  in = sin (rads);
10dd8 0a 20 20 20 20 76 63 6f 73 20 3d 20 63 6f 73 20  .    vcos = cos 
10dd9 28 72 61 64 73 29 3b 0a 20 20 20 20 61 20 3d 20  (rads);.    a = 
10dda 76 63 6f 73 3b 0a 20 20 20 20 63 20 3d 20 76 73  vcos;.    c = vs
10ddb 69 6e 3b 0a 20 20 20 20 67 20 3d 20 2d 76 73 69  in;.    g = -vsi
10ddc 6e 3b 0a 20 20 20 20 69 20 3d 20 76 63 6f 73 3b  n;.    i = vcos;
10ddd 0a 0a 2f 2a 20 63 72 65 61 74 69 6e 67 20 74 68  ../* creating th
10dde 65 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20 41  e BLOB-encoded A
10ddf 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20  ffine Transform 
10de0 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 67 61  Matrix */.    ga
10de1 69 61 5f 6d 61 74 72 69 78 5f 63 72 65 61 74 65  ia_matrix_create
10de2 5f 6d 75 6c 74 69 70 6c 79 20 28 69 62 6c 6f 62  _multiply (iblob
10de3 2c 20 69 62 6c 6f 62 5f 73 7a 2c 20 61 2c 20 62  , iblob_sz, a, b
10de4 2c 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 67 2c  , c, d, e, f, g,
10de5 20 68 2c 20 69 2c 0a 09 09 09 09 20 78 6f 66 66   h, i,..... xoff
10de6 2c 20 79 6f 66 66 2c 20 7a 6f 66 66 2c 20 26 62  , yoff, zoff, &b
10de7 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73 7a 29 3b 0a  lob, &blob_sz);.
10de8 20 20 20 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20      if (blob == 
10de9 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72  NULL)..sqlite3_r
10dea 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
10deb 65 78 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  ext);.    else..
10dec 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
10ded 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c  lob (context, bl
10dee 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65  ob, blob_sz, fre
10def 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  e);.}..static vo
10df0 69 64 0a 66 6e 63 74 5f 41 66 66 69 6e 65 54 72  id.fnct_AffineTr
10df1 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 44 65  ansformMatrix_De
10df2 74 65 72 6d 69 6e 61 6e 74 20 28 73 71 6c 69 74  terminant (sqlit
10df3 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
10df4 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
10df5 09 09 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c  .....sqlite3_val
10df6 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
10df7 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
10df8 20 41 54 4d 5f 44 65 74 65 72 6d 69 6e 61 6e 74   ATM_Determinant
10df9 28 62 6c 6f 62 20 61 74 6d 29 0a 2f 0a 2f 20 77  (blob atm)././ w
10dfa 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 44  ill return the D
10dfb 65 74 65 72 6d 69 6e 61 6e 74 20 66 72 6f 6d 20  eterminant from 
10dfc 61 20 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20 41  a BLOB-encoded A
10dfd 66 66 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20  ffine Transform 
10dfe 4d 61 74 72 69 78 0a 2f 20 6f 72 20 30 2e 30 20  Matrix./ or 0.0 
10dff 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20  on failure.*/.  
10e00 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10e01 20 63 68 61 72 20 2a 69 62 6c 6f 62 3b 0a 20 20   char *iblob;.  
10e02 20 20 69 6e 74 20 69 62 6c 6f 62 5f 73 7a 3b 0a    int iblob_sz;.
10e03 20 20 20 20 64 6f 75 62 6c 65 20 64 65 74 20 3d      double det =
10e04 20 30 2e 30 3b 0a 20 20 20 20 47 41 49 41 5f 55   0.0;.    GAIA_U
10e05 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43  NUSED ();../* LC
10e06 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a  OV_EXCL_LINE */.
10e07 0a 2f 2a 20 76 61 6c 69 64 61 74 69 6e 67 20 74  ./* validating t
10e08 68 65 20 69 6e 70 75 74 20 61 72 67 73 20 2a 2f  he input args */
10e09 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
10e0a 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
10e0b 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
10e0c 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
10e0d 20 69 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   iblob = sqlite3
10e0e 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67  _value_blob (arg
10e0f 76 5b 30 5d 29 3b 0a 09 20 20 69 62 6c 6f 62 5f  v[0]);..  iblob_
10e10 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  sz = sqlite3_val
10e11 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 30  ue_bytes (argv[0
10e12 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
10e13 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
10e14 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
10e15 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
10e16 64 65 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  det);..  return;
10e17 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 65 76 61  .      }../* eva
10e18 6c 75 61 74 69 6e 67 20 74 68 65 20 41 66 66 69  luating the Affi
10e19 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74  ne Transform Mat
10e1a 72 69 78 20 2a 2f 0a 20 20 20 20 64 65 74 20 3d  rix */.    det =
10e1b 20 67 61 69 61 5f 6d 61 74 72 69 78 5f 64 65 74   gaia_matrix_det
10e1c 65 72 6d 69 6e 61 6e 74 20 28 69 62 6c 6f 62 2c  erminant (iblob,
10e1d 20 69 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20   iblob_sz);.    
10e1e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
10e1f 6f 75 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20  ouble (context, 
10e20 64 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  det);.}..static 
10e21 76 6f 69 64 0a 66 6e 63 74 5f 41 66 66 69 6e 65  void.fnct_Affine
10e22 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f  TransformMatrix_
10e23 49 73 49 6e 76 65 72 74 69 62 6c 65 20 28 73 71  IsInvertible (sq
10e24 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
10e25 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
10e26 63 2c 0a 09 09 09 09 09 20 73 71 6c 69 74 65 33  c,...... sqlite3
10e27 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
10e28 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
10e29 6e 3a 0a 2f 20 41 54 4d 5f 49 73 49 6e 76 65 72  n:./ ATM_IsInver
10e2a 74 69 62 6c 65 28 62 6c 6f 62 20 61 74 6d 29 0a  tible(blob atm).
10e2b 2f 0a 2f 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  /./ will return 
10e2c 54 52 55 45 20 69 66 20 74 68 65 20 61 20 42 4c  TRUE if the a BL
10e2d 4f 42 2d 65 6e 63 6f 64 65 64 20 41 66 66 69 6e  OB-encoded Affin
10e2e 65 20 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72  e Transform Matr
10e2f 69 78 0a 2f 20 69 73 20 49 6e 76 65 72 74 69 62  ix./ is Invertib
10e30 6c 65 2c 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  le, FALSE if not
10e31 0a 2f 20 2d 31 20 6f 6e 20 69 6e 76 61 6c 69 64  ./ -1 on invalid
10e32 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 20 20   arguments.*/.  
10e33 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10e34 20 63 68 61 72 20 2a 69 62 6c 6f 62 3b 0a 20 20   char *iblob;.  
10e35 20 20 69 6e 74 20 69 62 6c 6f 62 5f 73 7a 3b 0a    int iblob_sz;.
10e36 20 20 20 20 64 6f 75 62 6c 65 20 64 65 74 3b 0a      double det;.
10e37 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
10e38 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
10e39 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a 20 76 61  L_LINE */../* va
10e3a 6c 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70  lidating the inp
10e3b 75 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69  ut args */.    i
10e3c 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10e3d 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
10e3e 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  == SQLITE_BLOB).
10e3f 20 20 20 20 20 20 7b 0a 09 20 20 69 62 6c 6f 62        {..  iblob
10e40 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10e41 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
10e42 0a 09 20 20 69 62 6c 6f 62 5f 73 7a 20 3d 20 73  ..  iblob_sz = s
10e43 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
10e44 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  es (argv[0]);.  
10e45 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
10e46 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
10e47 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
10e48 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72  ntext, -1);..  r
10e49 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  eturn;.      }..
10e4a 2f 2a 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  /* evaluating th
10e4b 65 20 41 66 66 69 6e 65 20 54 72 61 6e 73 66 6f  e Affine Transfo
10e4c 72 6d 20 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20  rm Matrix */.   
10e4d 20 64 65 74 20 3d 20 67 61 69 61 5f 6d 61 74 72   det = gaia_matr
10e4e 69 78 5f 64 65 74 65 72 6d 69 6e 61 6e 74 20 28  ix_determinant (
10e4f 69 62 6c 6f 62 2c 20 69 62 6c 6f 62 5f 73 7a 29  iblob, iblob_sz)
10e50 3b 0a 20 20 20 20 69 66 20 28 64 65 74 20 21 3d  ;.    if (det !=
10e51 20 30 2e 30 29 0a 09 73 71 6c 69 74 65 33 5f 72   0.0)..sqlite3_r
10e52 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
10e53 78 74 2c 20 31 29 3b 0a 20 20 20 20 65 6c 73 65  xt, 1);.    else
10e54 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ..sqlite3_result
10e55 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
10e56 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
10e57 64 0a 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61  d.fnct_AffineTra
10e58 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 49 6e 76  nsformMatrix_Inv
10e59 65 72 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ert (sqlite3_con
10e5a 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
10e5b 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20 20  int argc,.....  
10e5c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10e5d 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c  * argv).{./* SQL
10e5e 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 41 54 4d   function:./ ATM
10e5f 5f 49 6e 76 65 72 74 28 62 6c 6f 62 20 61 74 6d  _Invert(blob atm
10e60 29 0a 2f 0a 2f 20 77 69 6c 6c 20 63 72 65 61 74  )././ will creat
10e61 65 20 61 6e 20 49 6e 76 65 72 73 65 20 42 4c 4f  e an Inverse BLO
10e62 42 2d 65 6e 63 6f 64 65 64 20 41 66 66 69 6e 65  B-encoded Affine
10e63 20 54 72 61 6e 73 66 6f 72 6d 20 4d 61 74 72 69   Transform Matri
10e64 78 0a 2f 20 0a 2f 20 72 65 74 75 72 6e 73 20 61  x./ ./ returns a
10e65 20 42 4c 4f 42 2d 41 54 4d 20 6f 62 6a 65 63 74   BLOB-ATM object
10e66 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66 61 69 6c   or NULL on fail
10e67 75 72 65 0a 2a 2f 0a 20 20 20 20 75 6e 73 69 67  ure.*/.    unsig
10e68 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a  ned char *blob;.
10e69 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 3b      int blob_sz;
10e6a 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
10e6b 6e 65 64 20 63 68 61 72 20 2a 69 62 6c 6f 62 3b  ned char *iblob;
10e6c 0a 20 20 20 20 69 6e 74 20 69 62 6c 6f 62 5f 73  .    int iblob_s
10e6d 7a 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  z;.    GAIA_UNUS
10e6e 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
10e6f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 0a 2f 2a  EXCL_LINE */../*
10e70 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20   validating the 
10e71 69 6e 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20  input args */.  
10e72 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
10e73 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30  lue_type (argv[0
10e74 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) == SQLITE_BLO
10e75 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 62  B).      {..  ib
10e76 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
10e77 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30  lue_blob (argv[0
10e78 5d 29 3b 0a 09 20 20 69 62 6c 6f 62 5f 73 7a 20  ]);..  iblob_sz 
10e79 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
10e7a 62 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b  bytes (argv[0]);
10e7b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
10e7c 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  e.      {..  sql
10e7d 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
10e7e 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
10e7f 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  eturn;.      }..
10e80 2f 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  /* creating the 
10e81 42 4c 4f 42 2d 65 6e 63 6f 64 65 64 20 41 66 66  BLOB-encoded Aff
10e82 69 6e 65 20 54 72 61 6e 73 66 6f 72 6d 20 4d 61  ine Transform Ma
10e83 74 72 69 78 20 28 49 6e 76 65 72 73 65 29 20 2a  trix (Inverse) *
10e84 2f 0a 20 20 20 20 67 61 69 61 5f 6d 61 74 72 69  /.    gaia_matri
10e85 78 5f 69 6e 76 65 72 74 20 28 69 62 6c 6f 62 2c  x_invert (iblob,
10e86 20 69 62 6c 6f 62 5f 73 7a 2c 20 26 62 6c 6f 62   iblob_sz, &blob
10e87 2c 20 26 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20  , &blob_sz);.   
10e88 20 69 66 20 28 62 6c 6f 62 20 3d 3d 20 4e 55 4c   if (blob == NUL
10e89 4c 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75  L)..sqlite3_resu
10e8a 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
10e8b 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c  );.    else..sql
10e8c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
10e8d 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62 2c   (context, blob,
10e8e 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29 3b   blob_sz, free);
10e8f 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
10e90 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73  fnct_AffineTrans
10e91 66 6f 72 6d 4d 61 74 72 69 78 5f 47 65 6f 6d 65  formMatrix_Geome
10e92 74 72 79 54 72 61 6e 73 66 6f 72 6d 20 28 73 71  tryTransform (sq
10e93 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
10e94 63 6f 6e 74 65 78 74 2c 0a 09 09 09 09 09 20 20  context,......  
10e95 20 20 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71      int argc, sq
10e96 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
10e97 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
10e98 6e 63 74 69 6f 6e 3a 0a 2f 20 41 54 4d 5f 54 72  nction:./ ATM_Tr
10e99 61 6e 73 66 6f 72 6d 28 62 6c 6f 62 20 67 65 6f  ansform(blob geo
10e9a 6d 2c 20 62 6c 6f 62 20 61 74 6d 20 5b 20 2c 20  m, blob atm [ , 
10e9b 69 6e 74 20 73 72 69 64 5d 20 29 0a 2f 0a 2f 20  int srid] )././ 
10e9c 77 69 6c 6c 20 63 72 65 61 74 65 20 61 20 42 4c  will create a BL
10e9d 4f 42 2d 47 65 6f 6d 65 74 72 79 20 62 79 20 61  OB-Geometry by a
10e9e 70 70 6c 79 69 6e 67 20 74 6f 20 74 68 65 20 69  pplying to the i
10e9f 6e 70 75 74 20 47 65 6f 6d 65 74 72 79 20 61 6c  nput Geometry al
10ea0 6c 0a 2f 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  l./ transformati
10ea1 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 62 79  ons specified by
10ea2 20 74 68 65 20 41 66 66 69 6e 65 20 54 72 61 6e   the Affine Tran
10ea3 73 66 6f 72 6d 20 4d 61 74 72 69 78 0a 2f 20 0a  sform Matrix./ .
10ea4 2f 20 72 65 74 75 72 6e 73 20 61 20 42 4c 4f 42  / returns a BLOB
10ea5 2d 41 54 4d 20 6f 62 6a 65 63 74 20 6f 72 20 4e  -ATM object or N
10ea6 55 4c 4c 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a  ULL on failure.*
10ea7 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
10ea8 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69  har *blob;.    i
10ea9 6e 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20 20  nt blob_sz;.    
10eaa 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10eab 68 61 72 20 2a 69 62 6c 6f 62 31 3b 0a 20 20 20  har *iblob1;.   
10eac 20 69 6e 74 20 69 62 6c 6f 62 31 5f 73 7a 3b 0a   int iblob1_sz;.
10ead 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
10eae 65 64 20 63 68 61 72 20 2a 69 62 6c 6f 62 32 3b  ed char *iblob2;
10eaf 0a 20 20 20 20 69 6e 74 20 69 62 6c 6f 62 32 5f  .    int iblob2_
10eb0 73 7a 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d  sz;.    gaiaGeom
10eb1 43 6f 6c 6c 50 74 72 20 67 31 3b 0a 20 20 20 20  CollPtr g1;.    
10eb2 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
10eb3 67 32 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64  g2;.    int srid
10eb4 20 3d 20 2d 39 39 39 39 3b 0a 20 20 20 20 69 6e   = -9999;.    in
10eb5 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
10eb6 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67  s = 0;.    int g
10eb7 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  pkg_mode = 0;.  
10eb8 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74    int tiny_point
10eb9 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
10eba 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c   splite_internal
10ebb 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20  _cache *cache = 
10ebc 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
10ebd 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  a (context);.   
10ebe 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b   GAIA_UNUSED ();
10ebf 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c  ../* LCOV_EXCL_L
10ec0 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  INE */.    if (c
10ec1 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20  ache != NULL).  
10ec2 20 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d      {..  gpkg_am
10ec3 70 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65  phibious = cache
10ec4 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
10ec5 73 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f  s_mode;..  gpkg_
10ec6 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70  mode = cache->gp
10ec7 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79  kg_mode;..  tiny
10ec8 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e  _point = cache->
10ec9 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  tinyPointEnabled
10eca 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 76 61  ;.      }../* va
10ecb 6c 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70  lidating the inp
10ecc 75 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69  ut args */.    i
10ecd 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10ece 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
10ecf 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a  == SQLITE_BLOB).
10ed0 20 20 20 20 20 20 7b 0a 09 20 20 69 62 6c 6f 62        {..  iblob
10ed1 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  1 = sqlite3_valu
10ed2 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29  e_blob (argv[0])
10ed3 3b 0a 09 20 20 69 62 6c 6f 62 31 5f 73 7a 20 3d  ;..  iblob1_sz =
10ed4 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10ed5 79 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a  ytes (argv[0]);.
10ed6 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
10ed7 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69  .      {..  sqli
10ed8 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
10ed9 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65  (context);..  re
10eda 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
10edb 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
10edc 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
10edd 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ]) == SQLITE_BLO
10ede 42 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 62  B).      {..  ib
10edf 6c 6f 62 32 20 3d 20 73 71 6c 69 74 65 33 5f 76  lob2 = sqlite3_v
10ee0 61 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b  alue_blob (argv[
10ee1 31 5d 29 3b 0a 09 20 20 69 62 6c 6f 62 32 5f 73  1]);..  iblob2_s
10ee2 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
10ee3 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d  e_bytes (argv[1]
10ee4 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65  );.      }.    e
10ee5 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
10ee6 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
10ee7 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20  ll (context);.. 
10ee8 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
10ee9 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d  .    if (argc ==
10eea 20 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   3).      {..  i
10eeb 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
10eec 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20  _type (argv[2]) 
10eed 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  == SQLITE_INTEGE
10eee 52 29 0a 09 20 20 20 20 20 20 73 72 69 64 20 3d  R)..      srid =
10eef 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
10ef0 6e 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20  nt (argv[2]);.. 
10ef1 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73   else..    {...s
10ef2 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
10ef3 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09  ll (context);...
10ef4 72 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20  return;..    }. 
10ef5 20 20 20 20 20 7d 0a 0a 2f 2a 20 61 74 74 65 6d       }../* attem
10ef6 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74  pting to parse t
10ef7 68 65 20 42 4c 4f 42 2d 47 65 6f 6d 65 74 72 79  he BLOB-Geometry
10ef8 20 2a 2f 0a 20 20 20 20 67 31 20 3d 20 67 61 69   */.    g1 = gai
10ef9 61 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42  aFromSpatiaLiteB
10efa 6c 6f 62 57 6b 62 45 78 20 28 69 62 6c 6f 62 31  lobWkbEx (iblob1
10efb 2c 20 69 62 6c 6f 62 31 5f 73 7a 2c 20 67 70 6b  , iblob1_sz, gpk
10efc 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20  g_mode,.....    
10efd 20 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75    gpkg_amphibiou
10efe 73 29 3b 0a 20 20 20 20 69 66 20 28 67 31 20 3d  s);.    if (g1 =
10eff 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
10f00 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10f01 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10f02 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20  ;..  return;.   
10f03 20 20 20 7d 0a 20 20 20 20 67 32 20 3d 20 67 61     }.    g2 = ga
10f04 69 61 5f 6d 61 74 72 69 78 5f 74 72 61 6e 73 66  ia_matrix_transf
10f05 6f 72 6d 5f 67 65 6f 6d 65 74 72 79 20 28 67 31  orm_geometry (g1
10f06 2c 20 69 62 6c 6f 62 32 2c 20 69 62 6c 6f 62 32  , iblob2, iblob2
10f07 5f 73 7a 29 3b 0a 20 20 20 20 67 61 69 61 46 72  _sz);.    gaiaFr
10f08 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 31 29 3b  eeGeomColl (g1);
10f09 0a 20 20 20 20 69 66 20 28 67 32 20 3d 3d 20 4e  .    if (g2 == N
10f0a 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
10f0b 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
10f0c 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
10f0d 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
10f0e 7d 0a 20 20 20 20 69 66 20 28 73 72 69 64 20 21  }.    if (srid !
10f0f 3d 20 2d 39 39 39 39 29 0a 09 67 32 2d 3e 53 72  = -9999)..g2->Sr
10f10 69 64 20 3d 20 73 72 69 64 3b 0a 20 20 20 20 67  id = srid;.    g
10f11 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
10f12 6c 6f 62 57 6b 62 45 78 32 20 28 67 32 2c 20 26  lobWkbEx2 (g2, &
10f13 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73 7a 2c 20  blob, &blob_sz, 
10f14 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f  gpkg_mode, tiny_
10f15 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69 61  point);.    gaia
10f16 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 32  FreeGeomColl (g2
10f17 29 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f 62 20  );.    if (blob 
10f18 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65  == NULL)..sqlite
10f19 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
10f1a 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
10f1b 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
10f1c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
10f1d 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20   blob, blob_sz, 
10f1e 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  free);.}..static
10f1f 20 76 6f 69 64 0a 66 6e 63 74 5f 41 66 66 69 6e   void.fnct_Affin
10f20 65 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78  eTransformMatrix
10f21 5f 49 73 56 61 6c 69 64 20 28 73 71 6c 69 74 65  _IsValid (sqlite
10f22 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
10f23 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
10f24 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ...    sqlite3_v
10f25 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
10f26 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  /* SQL function:
10f27 0a 2f 20 41 54 4d 5f 49 73 56 61 6c 69 64 28 42  ./ ATM_IsValid(B
10f28 4c 4f 42 20 6d 61 74 72 69 78 29 0a 2f 0a 2f 20  LOB matrix)././ 
10f29 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
10f2a 74 68 65 20 63 75 72 72 65 6e 74 20 42 4c 4f 42  the current BLOB
10f2b 20 69 73 20 61 20 76 61 6c 69 64 20 42 4c 4f 42   is a valid BLOB
10f2c 2d 41 54 4d 2c 20 46 41 4c 53 45 20 69 66 20 6e  -ATM, FALSE if n
10f2d 6f 74 20 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61  ot ./ or -1 if a
10f2e 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
10f2f 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 63  untered.*/.    c
10f30 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10f31 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e  ar *blob;.    in
10f32 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20 20 69  t blob_sz;.    i
10f33 6e 74 20 72 65 74 3b 0a 20 20 20 20 47 41 49 41  nt ret;.    GAIA
10f34 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
10f35 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
10f36 2f 0a 2f 2a 20 76 61 6c 69 64 61 74 69 6e 67 20  /./* validating 
10f37 74 68 65 20 69 6e 70 75 74 20 61 72 67 73 20 2a  the input args *
10f38 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
10f39 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
10f3a 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
10f3b 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
10f3c 20 20 62 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20    blob = (const 
10f3d 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
10f3e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10f3f 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  lob (argv[0]);..
10f40 20 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69    blob_sz = sqli
10f41 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
10f42 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
10f43 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
10f44 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
10f45 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
10f46 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
10f47 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  rn;.      }../* 
10f48 76 65 72 69 66 79 69 6e 67 20 74 68 65 20 42 4c  verifying the BL
10f49 4f 42 2d 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20  OB-Matrix */.   
10f4a 20 72 65 74 20 3d 20 67 61 69 61 5f 6d 61 74 72   ret = gaia_matr
10f4b 69 78 5f 69 73 5f 76 61 6c 69 64 20 28 62 6c 6f  ix_is_valid (blo
10f4c 62 2c 20 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20  b, blob_sz);.   
10f4d 20 69 66 20 28 72 65 74 29 0a 09 73 71 6c 69 74   if (ret)..sqlit
10f4e 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
10f4f 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  ontext, 1);.    
10f50 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
10f51 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
10f52 74 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  t, 0);.}..static
10f53 20 76 6f 69 64 0a 66 6e 63 74 5f 41 66 66 69 6e   void.fnct_Affin
10f54 65 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78  eTransformMatrix
10f55 5f 41 73 54 65 78 74 20 28 73 71 6c 69 74 65 33  _AsText (sqlite3
10f56 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
10f57 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
10f58 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ..   sqlite3_val
10f59 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a  ue ** argv).{./*
10f5a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f   SQL function:./
10f5b 20 41 54 4d 5f 41 73 54 65 78 74 28 42 4c 4f 42   ATM_AsText(BLOB
10f5c 20 6d 61 74 72 69 78 29 0a 2f 0a 2f 20 72 65 74   matrix)././ ret
10f5d 75 72 6e 73 20 61 20 74 65 78 74 75 61 6c 20 72  urns a textual r
10f5e 65 70 72 65 73 65 6e 74 61 69 6f 6e 20 6f 66 20  epresentaion of 
10f5f 74 68 65 20 42 4c 4f 42 2d 4d 61 74 72 69 78 0a  the BLOB-Matrix.
10f60 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61 6e 79  / or NULL if any
10f61 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
10f62 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 63 6f 6e  tered.*/.    con
10f63 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
10f64 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20   *blob;.    int 
10f65 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20 20 63 68 61  blob_sz;.    cha
10f66 72 20 2a 74 65 78 74 3b 0a 20 20 20 20 47 41 49  r *text;.    GAI
10f67 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a  A_UNUSED ();../*
10f68 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20   LCOV_EXCL_LINE 
10f69 2a 2f 0a 2f 2a 20 76 61 6c 69 64 61 74 69 6e 67  */./* validating
10f6a 20 74 68 65 20 69 6e 70 75 74 20 61 72 67 73 20   the input args 
10f6b 2a 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74  */.    if (sqlit
10f6c 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61  e3_value_type (a
10f6d 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54  rgv[0]) == SQLIT
10f6e 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a  E_BLOB).      {.
10f6f 09 20 20 62 6c 6f 62 20 3d 20 28 63 6f 6e 73 74  .  blob = (const
10f70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10f71 29 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ) sqlite3_value_
10f72 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a  blob (argv[0]);.
10f73 09 20 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c  .  blob_sz = sql
10f74 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
10f75 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20   (argv[0]);.    
10f76 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20    }.    else.   
10f77 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
10f78 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
10f79 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
10f7a 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 72 65  ;.      }../* re
10f7b 74 72 69 65 76 69 6e 67 20 74 68 65 20 74 65 78  trieving the tex
10f7c 74 75 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74  tual representat
10f7d 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 42 4c 4f  ion from the BLO
10f7e 42 2d 4d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20  B-Matrix */.    
10f7f 74 65 78 74 20 3d 20 67 61 69 61 5f 6d 61 74 72  text = gaia_matr
10f80 69 78 5f 61 73 5f 74 65 78 74 20 28 62 6c 6f 62  ix_as_text (blob
10f81 2c 20 62 6c 6f 62 5f 73 7a 29 3b 0a 20 20 20 20  , blob_sz);.    
10f82 69 66 20 28 74 65 78 74 20 3d 3d 20 4e 55 4c 4c  if (text == NULL
10f83 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  )..sqlite3_resul
10f84 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29  t_null (context)
10f85 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69  ;.    else..sqli
10f86 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 20  te3_result_text 
10f87 28 63 6f 6e 74 65 78 74 2c 20 74 65 78 74 2c 20  (context, text, 
10f88 73 74 72 6c 65 6e 20 28 74 65 78 74 29 2c 20 73  strlen (text), s
10f89 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
10f8a 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 47  .#ifdef ENABLE_G
10f8b 43 50 09 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 43  CP../* only if C
10f8c 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 20 65 6e 61  ontrolPoints ena
10f8d 62 6c 65 64 20 2a 2f 0a 0a 73 74 61 74 69 63 20  bled */..static 
10f8e 69 6e 74 0a 67 65 74 5f 63 6f 6e 74 72 6f 6c 5f  int.get_control_
10f8f 70 6f 69 6e 74 20 28 67 61 69 61 47 65 6f 6d 43  point (gaiaGeomC
10f90 6f 6c 6c 50 74 72 20 67 65 6f 6d 2c 20 64 6f 75  ollPtr geom, dou
10f91 62 6c 65 20 2a 78 2c 20 64 6f 75 62 6c 65 20 2a  ble *x, double *
10f92 79 2c 20 64 6f 75 62 6c 65 20 2a 7a 2c 0a 09 09  y, double *z,...
10f93 20 20 20 69 6e 74 20 2a 68 61 73 33 64 29 0a 7b     int *has3d).{
10f94 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 61 20 43  ./* checking a C
10f95 6f 6e 74 72 6f 6c 20 50 6f 69 6e 74 20 2a 2f 0a  ontrol Point */.
10f96 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72      gaiaPointPtr
10f97 20 70 74 3b 0a 20 20 20 20 69 66 20 28 67 65 6f   pt;.    if (geo
10f98 6d 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75  m == NULL)..retu
10f99 72 6e 20 30 3b 0a 20 20 20 20 69 66 20 28 67 65  rn 0;.    if (ge
10f9a 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72  om->FirstLinestr
10f9b 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 67  ing != NULL || g
10f9c 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f  eom->FirstPolygo
10f9d 6e 20 21 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75  n != NULL)..retu
10f9e 72 6e 20 30 3b 0a 20 20 20 20 70 74 20 3d 20 67  rn 0;.    pt = g
10f9f 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b  eom->FirstPoint;
10fa0 0a 20 20 20 20 69 66 20 28 70 74 20 3d 3d 20 4e  .    if (pt == N
10fa1 55 4c 4c 20 7c 7c 20 70 74 20 21 3d 20 67 65 6f  ULL || pt != geo
10fa2 6d 2d 3e 4c 61 73 74 50 6f 69 6e 74 29 0a 09 72  m->LastPoint)..r
10fa3 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 20  eturn 0;.    if 
10fa4 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
10fa5 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
10fa6 5f 5a 0a 09 7c 7c 20 67 65 6f 6d 2d 3e 44 69 6d  _Z..|| geom->Dim
10fa7 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
10fa8 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 20 20 20 20  AIA_XY_Z_M).    
10fa9 20 20 7b 0a 09 20 20 2a 68 61 73 33 64 20 3d 20    {..  *has3d = 
10faa 31 3b 0a 09 20 20 2a 78 20 3d 20 70 74 2d 3e 58  1;..  *x = pt->X
10fab 3b 0a 09 20 20 2a 79 20 3d 20 70 74 2d 3e 59 3b  ;..  *y = pt->Y;
10fac 0a 09 20 20 2a 7a 20 3d 20 70 74 2d 3e 5a 3b 0a  ..  *z = pt->Z;.
10fad 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
10fae 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 68 61 73  .      {..  *has
10faf 33 64 20 3d 20 30 3b 0a 09 20 20 2a 78 20 3d 20  3d = 0;..  *x = 
10fb0 70 74 2d 3e 58 3b 0a 09 20 20 2a 79 20 3d 20 70  pt->X;..  *y = p
10fb1 74 2d 3e 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t->Y;.      }.  
10fb2 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73    return 1;.}..s
10fb3 74 61 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 5f  tatic int.check_
10fb4 63 6f 6e 74 72 6f 6c 5f 70 6f 69 6e 74 5f 64 69  control_point_di
10fb5 6d 73 20 28 47 61 69 61 43 6f 6e 74 72 6f 6c 50  ms (GaiaControlP
10fb6 6f 69 6e 74 73 50 74 72 20 63 70 5f 68 61 6e 64  ointsPtr cp_hand
10fb7 6c 65 2c 20 69 6e 74 20 68 61 73 33 64 5f 30 2c  le, int has3d_0,
10fb8 0a 09 09 09 20 20 69 6e 74 20 68 61 73 33 64 5f  ....  int has3d_
10fb9 31 29 0a 7b 0a 2f 2a 20 76 61 6c 69 64 61 74 69  1).{./* validati
10fba 6e 67 20 43 6f 6e 74 72 6f 6c 20 50 6f 69 6e 74  ng Control Point
10fbb 20 64 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a 20   dimensions */. 
10fbc 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f 63     struct gaia_c
10fbd 6f 6e 74 72 6f 6c 5f 70 6f 69 6e 74 73 20 2a 63  ontrol_points *c
10fbe 70 20 3d 20 28 73 74 72 75 63 74 20 67 61 69 61  p = (struct gaia
10fbf 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 69 6e 74 73 20  _control_points 
10fc0 2a 29 20 63 70 5f 68 61 6e 64 6c 65 3b 0a 20 20  *) cp_handle;.  
10fc1 20 20 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c    if (cp == NULL
10fc2 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  )..return 0;.   
10fc3 20 69 66 20 28 68 61 73 33 64 5f 30 20 21 3d 20   if (has3d_0 != 
10fc4 63 70 2d 3e 68 61 73 33 64 29 0a 09 72 65 74 75  cp->has3d)..retu
10fc5 72 6e 20 30 3b 0a 20 20 20 20 69 66 20 28 68 61  rn 0;.    if (ha
10fc6 73 33 64 5f 31 20 21 3d 20 63 70 2d 3e 68 61 73  s3d_1 != cp->has
10fc7 33 64 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  3d)..return 0;. 
10fc8 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a     return 1;.}..
10fc9 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
10fca 5f 47 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f  _GroundControlPo
10fcb 69 6e 74 73 5f 43 6f 6d 70 75 74 65 5f 73 74 65  ints_Compute_ste
10fcc 70 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p (sqlite3_conte
10fcd 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 0a 09 09  xt * context,...
10fce 09 09 20 20 20 20 20 20 20 69 6e 74 20 61 72 67  ..       int arg
10fcf 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
10fd0 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
10fd1 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47  QL function:./ G
10fd2 43 50 5f 43 6f 6d 70 75 74 65 28 42 4c 4f 42 20  CP_Compute(BLOB 
10fd3 70 6f 69 6e 74 31 2c 20 42 4c 4f 42 20 70 6f 69  point1, BLOB poi
10fd4 6e 74 32 20 5b 20 2c 20 69 6e 74 20 6f 72 64 65  nt2 [ , int orde
10fd5 72 20 5d 20 29 0a 2f 0a 2f 20 61 67 67 72 65 67  r ] )././ aggreg
10fd6 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20 53  ate function - S
10fd7 54 45 50 0a 2f 0a 2a 2f 0a 20 20 20 20 75 6e 73  TEP./.*/.    uns
10fd8 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c  igned char *p_bl
10fd9 6f 62 30 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62  ob0;.    int n_b
10fda 79 74 65 73 30 3b 0a 20 20 20 20 75 6e 73 69 67  ytes0;.    unsig
10fdb 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62  ned char *p_blob
10fdc 31 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74  1;.    int n_byt
10fdd 65 73 31 3b 0a 20 20 20 20 67 61 69 61 47 65 6f  es1;.    gaiaGeo
10fde 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 30 20 3d  mCollPtr geom0 =
10fdf 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 47   NULL;.    gaiaG
10fe0 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 31  eomCollPtr geom1
10fe1 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 75   = NULL;.    dou
10fe2 62 6c 65 20 78 30 3b 0a 20 20 20 20 64 6f 75 62  ble x0;.    doub
10fe3 6c 65 20 79 30 3b 0a 20 20 20 20 64 6f 75 62 6c  le y0;.    doubl
10fe4 65 20 7a 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65  e z0;.    double
10fe5 20 78 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20   x1;.    double 
10fe6 79 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a  y1;.    double z
10fe7 31 3b 0a 20 20 20 20 69 6e 74 20 68 61 73 33 64  1;.    int has3d
10fe8 5f 30 3b 0a 20 20 20 20 69 6e 74 20 68 61 73 33  _0;.    int has3
10fe9 64 5f 31 3b 0a 20 20 20 20 69 6e 74 20 6f 72 64  d_1;.    int ord
10fea 65 72 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  er = 1;.    int 
10feb 74 70 73 20 3d 20 30 3b 0a 20 20 20 20 47 61 69  tps = 0;.    Gai
10fec 61 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 50 74  aControlPointsPt
10fed 72 20 2a 63 70 3b 0a 20 20 20 20 69 6e 74 20 67  r *cp;.    int g
10fee 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d  pkg_amphibious =
10fef 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67   0;.    int gpkg
10ff0 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  _mode = 0;.    s
10ff1 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
10ff2 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
10ff3 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
10ff4 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
10ff5 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
10ff6 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
10ff7 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
10ff8 69 66 20 28 63 61 63 68 65 20 21 3d 20 4e 55 4c  if (cache != NUL
10ff9 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 70  L).      {..  gp
10ffa 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 20 3d 20  kg_amphibious = 
10ffb 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
10ffc 69 62 69 6f 75 73 5f 6d 6f 64 65 3b 0a 09 20 20  ibious_mode;..  
10ffd 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68  gpkg_mode = cach
10ffe 65 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 20 20  e->gpkg_mode;.  
10fff 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
11000 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
11001 20 28 61 72 67 76 5b 30 5d 29 20 21 3d 20 53 51   (argv[0]) != SQ
11002 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20 20 20  LITE_BLOB).     
11003 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
11004 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
11005 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
11006 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28        }.    if (
11007 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
11008 70 65 20 28 61 72 67 76 5b 31 5d 29 20 21 3d 20  pe (argv[1]) != 
11009 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20 20 20  SQLITE_BLOB).   
1100a 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f     {..  sqlite3_
1100b 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e  result_null (con
1100c 74 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e  text);..  return
1100d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
1100e 20 28 61 72 67 63 20 3d 3d 20 33 29 0a 20 20 20   (argc == 3).   
1100f 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69     {..  if (sqli
11010 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28  te3_value_type (
11011 61 72 67 76 5b 32 5d 29 20 21 3d 20 53 51 4c 49  argv[2]) != SQLI
11012 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20  TE_INTEGER)..   
11013 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73   {...sqlite3_res
11014 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
11015 74 29 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20  t);...return;.. 
11016 20 20 20 7d 0a 09 20 20 6f 72 64 65 72 20 3d 20     }..  order = 
11017 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
11018 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20  t (argv[2]);..  
11019 69 66 20 28 6f 72 64 65 72 20 3e 3d 20 31 20 26  if (order >= 1 &
1101a 26 20 6f 72 64 65 72 20 3c 3d 20 33 29 0a 09 20  & order <= 3).. 
1101b 20 20 20 20 20 3b 09 09 09 2f 2a 20 31 73 74 2c       ;.../* 1st,
1101c 20 32 6e 64 20 6f 72 20 33 72 64 20 70 6f 6c 79   2nd or 3rd poly
1101d 6e 6f 6d 69 61 6c 20 6f 72 64 65 72 20 2a 2f 0a  nomial order */.
1101e 09 20 20 65 6c 73 65 20 69 66 20 28 6f 72 64 65  .  else if (orde
1101f 72 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09  r == 0)..    {..
11020 09 2f 2a 20 54 68 69 6e 20 50 6c 61 74 65 20 53  ./* Thin Plate S
11021 70 6c 69 74 65 20 2a 2f 0a 09 09 6f 72 64 65 72  plite */...order
11022 20 3d 20 31 3b 0a 09 09 74 70 73 20 3d 20 31 3b   = 1;...tps = 1;
11023 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a  ..    }..  else.
11024 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33  .    {...sqlite3
11025 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f  _result_null (co
11026 6e 74 65 78 74 29 3b 0a 09 09 72 65 74 75 72 6e  ntext);...return
11027 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
11028 0a 20 20 20 20 70 5f 62 6c 6f 62 30 20 3d 20 28  .    p_blob0 = (
11029 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1102a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1102b 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  lob (argv[0]);. 
1102c 20 20 20 6e 5f 62 79 74 65 73 30 20 3d 20 73 71     n_bytes0 = sq
1102d 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1102e 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  s (argv[0]);.   
1102f 20 70 5f 62 6c 6f 62 31 20 3d 20 28 75 6e 73 69   p_blob1 = (unsi
11030 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c  gned char *) sql
11031 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20  ite3_value_blob 
11032 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 6e  (argv[1]);.    n
11033 5f 62 79 74 65 73 31 20 3d 20 73 71 6c 69 74 65  _bytes1 = sqlite
11034 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28 61  3_value_bytes (a
11035 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 67 65 6f  rgv[1]);.    geo
11036 6d 30 20 3d 0a 09 67 61 69 61 46 72 6f 6d 53 70  m0 =..gaiaFromSp
11037 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
11038 78 20 28 70 5f 62 6c 6f 62 30 2c 20 6e 5f 62 79  x (p_blob0, n_by
11039 74 65 73 30 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c  tes0, gpkg_mode,
1103a 0a 09 09 09 09 20 20 20 20 20 67 70 6b 67 5f 61  .....     gpkg_a
1103b 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20 20 20 20  mphibious);.    
1103c 67 65 6f 6d 31 20 3d 0a 09 67 61 69 61 46 72 6f  geom1 =..gaiaFro
1103d 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
1103e 6b 62 45 78 20 28 70 5f 62 6c 6f 62 31 2c 20 6e  kbEx (p_blob1, n
1103f 5f 62 79 74 65 73 31 2c 20 67 70 6b 67 5f 6d 6f  _bytes1, gpkg_mo
11040 64 65 2c 0a 09 09 09 09 20 20 20 20 20 67 70 6b  de,.....     gpk
11041 67 5f 61 6d 70 68 69 62 69 6f 75 73 29 3b 0a 20  g_amphibious);. 
11042 20 20 20 69 66 20 28 21 67 65 74 5f 63 6f 6e 74     if (!get_cont
11043 72 6f 6c 5f 70 6f 69 6e 74 20 28 67 65 6f 6d 30  rol_point (geom0
11044 2c 20 26 78 30 2c 20 26 79 30 2c 20 26 7a 30 2c  , &x0, &y0, &z0,
11045 20 26 68 61 73 33 64 5f 30 29 29 0a 09 67 6f 74   &has3d_0))..got
11046 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 20  o error;.    if 
11047 28 21 67 65 74 5f 63 6f 6e 74 72 6f 6c 5f 70 6f  (!get_control_po
11048 69 6e 74 20 28 67 65 6f 6d 31 2c 20 26 78 31 2c  int (geom1, &x1,
11049 20 26 79 31 2c 20 26 7a 31 2c 20 26 68 61 73 33   &y1, &z1, &has3
1104a 64 5f 31 29 29 0a 09 67 6f 74 6f 20 65 72 72 6f  d_1))..goto erro
1104b 72 3b 0a 20 20 20 20 69 66 20 28 68 61 73 33 64  r;.    if (has3d
1104c 5f 30 20 21 3d 20 68 61 73 33 64 5f 31 29 0a 09  _0 != has3d_1)..
1104d 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
1104e 63 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  cp = sqlite3_agg
1104f 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 20 28  regate_context (
11050 63 6f 6e 74 65 78 74 2c 0a 09 09 09 09 20 20 20  context,.....   
11051 20 73 69 7a 65 6f 66 20 28 73 74 72 75 63 74 20   sizeof (struct 
11052 67 61 69 61 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 69  gaia_control_poi
11053 6e 74 73 29 29 3b 0a 20 20 20 20 69 66 20 28 2a  nts));.    if (*
11054 63 70 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  cp == NULL).    
11055 20 20 7b 0a 09 20 20 2f 2a 20 74 68 69 73 20 69    {..  /* this i
11056 73 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  s the first row 
11057 2a 2f 0a 09 20 20 2a 63 70 20 3d 20 67 61 69 61  */..  *cp = gaia
11058 43 72 65 61 74 65 43 6f 6e 74 72 6f 6c 50 6f 69  CreateControlPoi
11059 6e 74 73 20 28 31 30 32 34 2c 20 68 61 73 33 64  nts (1024, has3d
1105a 5f 30 2c 20 6f 72 64 65 72 2c 20 74 70 73 29 3b  _0, order, tps);
1105b 0a 09 20 20 69 66 20 28 68 61 73 33 64 5f 30 29  ..  if (has3d_0)
1105c 0a 09 20 20 20 20 20 20 67 61 69 61 41 64 64 43  ..      gaiaAddC
1105d 6f 6e 74 72 6f 6c 50 6f 69 6e 74 33 44 20 28 2a  ontrolPoint3D (*
1105e 63 70 2c 20 78 30 2c 20 79 30 2c 20 7a 30 2c 20  cp, x0, y0, z0, 
1105f 78 31 2c 20 79 31 2c 20 7a 31 29 3b 0a 09 20 20  x1, y1, z1);..  
11060 65 6c 73 65 0a 09 20 20 20 20 20 20 67 61 69 61  else..      gaia
11061 41 64 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 32  AddControlPoint2
11062 44 20 28 2a 63 70 2c 20 78 30 2c 20 79 30 2c 20  D (*cp, x0, y0, 
11063 78 31 2c 20 79 31 29 3b 0a 20 20 20 20 20 20 7d  x1, y1);.      }
11064 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
11065 7b 0a 09 20 20 2f 2a 20 73 75 62 73 65 71 75 65  {..  /* subseque
11066 6e 74 20 72 6f 77 73 20 2a 2f 0a 09 20 20 69 66  nt rows */..  if
11067 20 28 21 63 68 65 63 6b 5f 63 6f 6e 74 72 6f 6c   (!check_control
11068 5f 70 6f 69 6e 74 5f 64 69 6d 73 20 28 2a 63 70  _point_dims (*cp
11069 2c 20 68 61 73 33 64 5f 30 2c 20 68 61 73 33 64  , has3d_0, has3d
1106a 5f 31 29 29 0a 09 20 20 20 20 20 20 67 6f 74 6f  _1))..      goto
1106b 20 65 72 72 6f 72 3b 0a 09 20 20 69 66 20 28 68   error;..  if (h
1106c 61 73 33 64 5f 30 29 0a 09 20 20 20 20 20 20 67  as3d_0)..      g
1106d 61 69 61 41 64 64 43 6f 6e 74 72 6f 6c 50 6f 69  aiaAddControlPoi
1106e 6e 74 33 44 20 28 2a 63 70 2c 20 78 30 2c 20 79  nt3D (*cp, x0, y
1106f 30 2c 20 7a 30 2c 20 78 31 2c 20 79 31 2c 20 7a  0, z0, x1, y1, z
11070 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  1);..  else..   
11071 20 20 20 67 61 69 61 41 64 64 43 6f 6e 74 72 6f     gaiaAddContro
11072 6c 50 6f 69 6e 74 32 44 20 28 2a 63 70 2c 20 78  lPoint2D (*cp, x
11073 30 2c 20 79 30 2c 20 78 31 2c 20 79 31 29 3b 0a  0, y0, x1, y1);.
11074 20 20 20 20 20 20 7d 0a 20 20 20 20 67 61 69 61        }.    gaia
11075 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  FreeGeomColl (ge
11076 6f 6d 30 29 3b 0a 20 20 20 20 67 61 69 61 46 72  om0);.    gaiaFr
11077 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  eeGeomColl (geom
11078 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
11079 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 69 66  .  error:.    if
1107a 20 28 67 65 6f 6d 30 20 21 3d 20 4e 55 4c 4c 29   (geom0 != NULL)
1107b 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f  ..gaiaFreeGeomCo
1107c 6c 6c 20 28 67 65 6f 6d 30 29 3b 0a 20 20 20 20  ll (geom0);.    
1107d 69 66 20 28 67 65 6f 6d 31 20 21 3d 20 4e 55 4c  if (geom1 != NUL
1107e 4c 29 0a 09 67 61 69 61 46 72 65 65 47 65 6f 6d  L)..gaiaFreeGeom
1107f 43 6f 6c 6c 20 28 67 65 6f 6d 31 29 3b 0a 20 20  Coll (geom1);.  
11080 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
11081 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
11082 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11083 66 6e 63 74 5f 47 72 6f 75 6e 64 43 6f 6e 74 72  fnct_GroundContr
11084 6f 6c 50 6f 69 6e 74 73 5f 43 6f 6d 70 75 74 65  olPoints_Compute
11085 5f 66 69 6e 61 6c 20 28 73 71 6c 69 74 65 33 5f  _final (sqlite3_
11086 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
11087 74 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  t).{./* SQL func
11088 74 69 6f 6e 3a 0a 2f 20 47 43 50 5f 43 6f 6d 70  tion:./ GCP_Comp
11089 75 74 65 28 42 4c 4f 42 20 70 6f 69 6e 74 31 2c  ute(BLOB point1,
1108a 20 42 4c 4f 42 20 70 6f 69 6e 74 32 20 5b 20 2c   BLOB point2 [ ,
1108b 20 69 6e 74 20 6f 72 64 65 72 20 5d 20 29 0a 2f   int order ] )./
1108c 0a 2f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ./ aggregate fun
1108d 63 74 69 6f 6e 20 2d 20 46 49 4e 41 4c 0a 2f 0a  ction - FINAL./.
1108e 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
1108f 63 68 61 72 20 2a 62 6c 6f 62 20 3d 20 4e 55 4c  char *blob = NUL
11090 4c 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f  L;.    int blob_
11091 73 7a 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  sz;.    int ret;
11092 0a 20 20 20 20 47 61 69 61 43 6f 6e 74 72 6f 6c  .    GaiaControl
11093 50 6f 69 6e 74 73 50 74 72 20 2a 63 70 20 3d 20  PointsPtr *cp = 
11094 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
11095 65 5f 63 6f 6e 74 65 78 74 20 28 63 6f 6e 74 65  e_context (conte
11096 78 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28  xt, 0);.    if (
11097 63 70 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  cp == NULL).    
11098 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
11099 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74  esult_null (cont
1109a 65 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b  ext);..  return;
1109b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .      }.    ret
1109c 20 3d 20 67 61 69 61 43 72 65 61 74 65 50 6f 6c   = gaiaCreatePol
1109d 79 6e 6f 6d 69 61 6c 43 6f 65 66 66 73 20 28 2a  ynomialCoeffs (*
1109e 63 70 2c 20 26 62 6c 6f 62 2c 20 26 62 6c 6f 62  cp, &blob, &blob
1109f 5f 73 7a 29 3b 0a 20 20 20 20 69 66 20 28 21 72  _sz);.    if (!r
110a0 65 74 29 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  et)..sqlite3_res
110a1 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78  ult_null (contex
110a2 74 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71  t);.    else..sq
110a3 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
110a4 62 20 28 63 6f 6e 74 65 78 74 2c 20 62 6c 6f 62  b (context, blob
110a5 2c 20 62 6c 6f 62 5f 73 7a 2c 20 66 72 65 65 29  , blob_sz, free)
110a6 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 43 6f  ;.    gaiaFreeCo
110a7 6e 74 72 6f 6c 50 6f 69 6e 74 73 20 28 2a 63 70  ntrolPoints (*cp
110a8 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
110a9 64 0a 66 6e 63 74 5f 47 72 6f 75 6e 64 43 6f 6e  d.fnct_GroundCon
110aa 74 72 6f 6c 50 6f 69 6e 74 73 5f 47 65 6f 6d 65  trolPoints_Geome
110ab 74 72 79 54 72 61 6e 73 66 6f 72 6d 20 28 73 71  tryTransform (sq
110ac 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
110ad 63 6f 6e 74 65 78 74 2c 0a 09 09 09 09 09 20 20  context,......  
110ae 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
110af 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
110b0 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63  v).{./* SQL func
110b1 74 69 6f 6e 3a 0a 2f 20 47 43 50 5f 54 72 61 6e  tion:./ GCP_Tran
110b2 73 66 6f 72 6d 28 62 6c 6f 62 20 67 65 6f 6d 2c  sform(blob geom,
110b3 20 62 6c 6f 62 20 67 63 70 20 5b 20 2c 20 69 6e   blob gcp [ , in
110b4 74 20 73 72 69 64 20 5d 20 29 0a 2f 0a 2f 20 77  t srid ] )././ w
110b5 69 6c 6c 20 63 72 65 61 74 65 20 61 20 42 4c 4f  ill create a BLO
110b6 42 2d 47 65 6f 6d 65 74 72 79 20 62 79 20 61 70  B-Geometry by ap
110b7 70 6c 79 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  plying to the in
110b8 70 75 74 20 47 65 6f 6d 65 74 72 79 20 61 6c 6c  put Geometry all
110b9 0a 2f 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ./ transformatio
110ba 6e 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ns specified by 
110bb 74 68 65 20 50 6f 6c 79 6e 6f 6d 69 61 6c 20 63  the Polynomial c
110bc 6f 65 66 66 69 63 69 65 6e 74 73 0a 2f 20 0a 2f  oefficients./ ./
110bd 20 72 65 74 75 72 6e 73 20 61 20 42 4c 4f 42 2d   returns a BLOB-
110be 41 54 4d 20 6f 62 6a 65 63 74 20 6f 72 20 4e 55  ATM object or NU
110bf 4c 4c 20 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f  LL on failure.*/
110c0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
110c1 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e  ar *blob;.    in
110c2 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20 20 63  t blob_sz;.    c
110c3 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
110c4 61 72 20 2a 69 62 6c 6f 62 31 3b 0a 20 20 20 20  ar *iblob1;.    
110c5 69 6e 74 20 69 62 6c 6f 62 31 5f 73 7a 3b 0a 20  int iblob1_sz;. 
110c6 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
110c7 64 20 63 68 61 72 20 2a 69 62 6c 6f 62 32 3b 0a  d char *iblob2;.
110c8 20 20 20 20 69 6e 74 20 69 62 6c 6f 62 32 5f 73      int iblob2_s
110c9 7a 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  z;.    gaiaGeomC
110ca 6f 6c 6c 50 74 72 20 67 31 3b 0a 20 20 20 20 67  ollPtr g1;.    g
110cb 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
110cc 32 3b 0a 20 20 20 20 69 6e 74 20 73 72 69 64 20  2;.    int srid 
110cd 3d 20 2d 39 39 39 39 3b 0a 20 20 20 20 69 6e 74  = -9999;.    int
110ce 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
110cf 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 67 70   = 0;.    int gp
110d0 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  kg_mode = 0;.   
110d1 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20   int tiny_point 
110d2 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
110d3 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
110d4 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
110d5 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
110d6 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
110d7 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
110d8 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
110d9 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
110da 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  che != NULL).   
110db 20 20 20 7b 0a 09 20 20 67 70 6b 67 5f 61 6d 70     {..  gpkg_amp
110dc 68 69 62 69 6f 75 73 20 3d 20 63 61 63 68 65 2d  hibious = cache-
110dd 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73  >gpkg_amphibious
110de 5f 6d 6f 64 65 3b 0a 09 20 20 67 70 6b 67 5f 6d  _mode;..  gpkg_m
110df 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 6b  ode = cache->gpk
110e0 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 5f  g_mode;..  tiny_
110e1 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e 74  point = cache->t
110e2 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 3b  inyPointEnabled;
110e3 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 76 61 6c  .      }../* val
110e4 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75  idating the inpu
110e5 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66  t args */.    if
110e6 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
110e7 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
110e8 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 0a 20  = SQLITE_BLOB). 
110e9 20 20 20 20 20 7b 0a 09 20 20 69 62 6c 6f 62 31       {..  iblob1
110ea 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
110eb 5f 62 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b  _blob (argv[0]);
110ec 0a 09 20 20 69 62 6c 6f 62 31 5f 73 7a 20 3d 20  ..  iblob1_sz = 
110ed 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
110ee 74 65 73 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20  tes (argv[0]);. 
110ef 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
110f0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
110f1 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28  e3_result_null (
110f2 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72 65 74  context);..  ret
110f3 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
110f4 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
110f5 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31 5d  ue_type (argv[1]
110f6 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42  ) == SQLITE_BLOB
110f7 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 62 6c  ).      {..  ibl
110f8 6f 62 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ob2 = sqlite3_va
110f9 6c 75 65 5f 62 6c 6f 62 20 28 61 72 67 76 5b 31  lue_blob (argv[1
110fa 5d 29 3b 0a 09 20 20 69 62 6c 6f 62 32 5f 73 7a  ]);..  iblob2_sz
110fb 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
110fc 5f 62 79 74 65 73 20 28 61 72 67 76 5b 31 5d 29  _bytes (argv[1])
110fd 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
110fe 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
110ff 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
11100 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
11101 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
11102 20 20 20 20 69 66 20 28 61 72 67 63 20 3d 3d 20      if (argc == 
11103 33 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  3).      {..  if
11104 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
11105 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
11106 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
11107 29 0a 09 20 20 20 20 20 20 73 72 69 64 20 3d 20  )..      srid = 
11108 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
11109 74 20 28 61 72 67 76 5b 32 5d 29 3b 0a 09 20 20  t (argv[2]);..  
1110a 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 71  else..    {...sq
1110b 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
1110c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 09 72  l (context);...r
1110d 65 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 20 20  eturn;..    }.  
1110e 20 20 20 20 7d 0a 0a 2f 2a 20 61 74 74 65 6d 70      }../* attemp
1110f 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68  ting to parse th
11110 65 20 42 4c 4f 42 2d 47 65 6f 6d 65 74 72 79 20  e BLOB-Geometry 
11111 2a 2f 0a 20 20 20 20 67 31 20 3d 20 67 61 69 61  */.    g1 = gaia
11112 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
11113 6f 62 57 6b 62 45 78 20 28 69 62 6c 6f 62 31 2c  obWkbEx (iblob1,
11114 20 69 62 6c 6f 62 31 5f 73 7a 2c 20 67 70 6b 67   iblob1_sz, gpkg
11115 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20  _mode,.....     
11116 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73   gpkg_amphibious
11117 29 3b 0a 20 20 20 20 69 66 20 28 67 31 20 3d 3d  );.    if (g1 ==
11118 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
11119 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1111a 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b  _null (context);
1111b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
1111c 20 20 7d 0a 20 20 20 20 67 32 20 3d 20 67 61 69    }.    g2 = gai
1111d 61 50 6f 6c 79 6e 6f 6d 69 61 6c 54 72 61 6e 73  aPolynomialTrans
1111e 66 6f 72 6d 47 65 6f 6d 65 74 72 79 20 28 67 31  formGeometry (g1
1111f 2c 20 69 62 6c 6f 62 32 2c 20 69 62 6c 6f 62 32  , iblob2, iblob2
11120 5f 73 7a 29 3b 0a 20 20 20 20 67 61 69 61 46 72  _sz);.    gaiaFr
11121 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 31 29 3b  eeGeomColl (g1);
11122 0a 20 20 20 20 69 66 20 28 67 32 20 3d 3d 20 4e  .    if (g2 == N
11123 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
11124 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
11125 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09  ull (context);..
11126 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
11127 7d 0a 20 20 20 20 69 66 20 28 73 72 69 64 20 21  }.    if (srid !
11128 3d 20 2d 39 39 39 39 29 0a 09 67 32 2d 3e 53 72  = -9999)..g2->Sr
11129 69 64 20 3d 20 73 72 69 64 3b 0a 20 20 20 20 67  id = srid;.    g
1112a 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42  aiaToSpatiaLiteB
1112b 6c 6f 62 57 6b 62 45 78 32 20 28 67 32 2c 20 26  lobWkbEx2 (g2, &
1112c 62 6c 6f 62 2c 20 26 62 6c 6f 62 5f 73 7a 2c 20  blob, &blob_sz, 
1112d 67 70 6b 67 5f 6d 6f 64 65 2c 20 74 69 6e 79 5f  gpkg_mode, tiny_
1112e 70 6f 69 6e 74 29 3b 0a 20 20 20 20 67 61 69 61  point);.    gaia
1112f 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 32  FreeGeomColl (g2
11130 29 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f 62 20  );.    if (blob 
11131 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65  == NULL)..sqlite
11132 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20 28 63  3_result_null (c
11133 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65 6c 73  ontext);.    els
11134 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  e..sqlite3_resul
11135 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c  t_blob (context,
11136 20 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 2c 20   blob, blob_sz, 
11137 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  free);.}..static
11138 20 76 6f 69 64 0a 66 6e 63 74 5f 47 72 6f 75 6e   void.fnct_Groun
11139 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 5f 49  dControlPoints_I
1113a 73 56 61 6c 69 64 20 28 73 71 6c 69 74 65 33 5f  sValid (sqlite3_
1113b 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
1113c 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09  t, int argc,....
1113d 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1113e 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
1113f 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47  QL function:./ G
11140 43 4f 5f 49 73 56 61 6c 69 64 28 42 4c 4f 42 20  CO_IsValid(BLOB 
11141 70 6f 6c 79 6e 6f 6d 61 69 6c 29 0a 2f 0a 2f 20  polynomail)././ 
11142 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
11143 74 68 65 20 63 75 72 72 65 6e 74 20 42 4c 4f 42  the current BLOB
11144 20 69 73 20 61 20 76 61 6c 69 64 20 42 4c 4f 42   is a valid BLOB
11145 2d 47 43 50 2c 20 46 41 4c 53 45 20 69 66 20 6e  -GCP, FALSE if n
11146 6f 74 20 0a 2f 20 6f 72 20 2d 31 20 69 66 20 61  ot ./ or -1 if a
11147 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
11148 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 63  untered.*/.    c
11149 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1114a 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e  ar *blob;.    in
1114b 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20 20 69  t blob_sz;.    i
1114c 6e 74 20 72 65 74 3b 0a 20 20 20 20 47 41 49 41  nt ret;.    GAIA
1114d 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
1114e 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
1114f 2f 0a 2f 2a 20 76 61 6c 69 64 61 74 69 6e 67 20  /./* validating 
11150 74 68 65 20 69 6e 70 75 74 20 61 72 67 73 20 2a  the input args *
11151 2f 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  /.    if (sqlite
11152 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
11153 67 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[0]) == SQLITE
11154 5f 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09  _BLOB).      {..
11155 20 20 62 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20    blob = (const 
11156 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
11157 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
11158 6c 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09  lob (argv[0]);..
11159 20 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69    blob_sz = sqli
1115a 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20  te3_value_bytes 
1115b 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
1115c 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
1115d 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
1115e 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
1115f 78 74 2c 20 2d 31 29 3b 0a 09 20 20 72 65 74 75  xt, -1);..  retu
11160 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20  rn;.      }../* 
11161 76 65 72 69 66 79 69 6e 67 20 74 68 65 20 42 4c  verifying the BL
11162 4f 42 2d 50 6f 6c 79 6e 6f 6d 61 69 6c 20 2a 2f  OB-Polynomail */
11163 0a 20 20 20 20 72 65 74 20 3d 20 67 61 69 61 50  .    ret = gaiaP
11164 6f 6c 79 6e 6f 6d 69 61 6c 49 73 56 61 6c 69 64  olynomialIsValid
11165 20 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29   (blob, blob_sz)
11166 3b 0a 20 20 20 20 69 66 20 28 72 65 74 29 0a 09  ;.    if (ret)..
11167 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
11168 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  nt (context, 1);
11169 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 69 74  .    else..sqlit
1116a 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
1116b 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 7d 0a 0a 73  ontext, 0);.}..s
1116c 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
1116d 47 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69  GroundControlPoi
1116e 6e 74 73 5f 41 73 54 65 78 74 20 28 73 71 6c 69  nts_AsText (sqli
1116f 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
11170 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
11171 0a 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61  ..... sqlite3_va
11172 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
11173 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
11174 2f 20 47 43 50 5f 41 73 54 65 78 74 28 42 4c 4f  / GCP_AsText(BLO
11175 42 20 70 6f 6c 79 6e 6f 6d 61 69 6c 29 0a 2f 0a  B polynomail)./.
11176 2f 20 72 65 74 75 72 6e 73 20 61 20 74 65 78 74  / returns a text
11177 75 61 6c 20 72 65 70 72 65 73 65 6e 74 61 69 6f  ual representaio
11178 6e 20 6f 66 20 74 68 65 20 42 4c 4f 42 2d 50 6f  n of the BLOB-Po
11179 6c 79 6e 6f 6d 69 61 6c 0a 2f 20 6f 72 20 4e 55  lynomial./ or NU
1117a 4c 4c 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  LL if any error 
1117b 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
1117c 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
1117d 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 3b  gned char *blob;
1117e 0a 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a  .    int blob_sz
1117f 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 78 74  ;.    char *text
11180 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
11181 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
11182 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 2f 2a 20 76  XCL_LINE */./* v
11183 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 69 6e  alidating the in
11184 70 75 74 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  put args */.    
11185 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  if (sqlite3_valu
11186 65 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29  e_type (argv[0])
11187 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29   == SQLITE_BLOB)
11188 0a 20 20 20 20 20 20 7b 0a 09 20 20 62 6c 6f 62  .      {..  blob
11189 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1118a 65 64 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  ed char *) sqlit
1118b 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 20 28 61  e3_value_blob (a
1118c 72 67 76 5b 30 5d 29 3b 0a 09 20 20 62 6c 6f 62  rgv[0]);..  blob
1118d 5f 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  _sz = sqlite3_va
1118e 6c 75 65 5f 62 79 74 65 73 20 28 61 72 67 76 5b  lue_bytes (argv[
1118f 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0]);.      }.   
11190 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
11191 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11192 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a  null (context);.
11193 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
11194 20 7d 0a 0a 2f 2a 20 72 65 74 72 69 65 76 69 6e   }../* retrievin
11195 67 20 74 68 65 20 74 65 78 74 75 61 6c 20 72 65  g the textual re
11196 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 72 6f  presentation fro
11197 6d 20 74 68 65 20 42 4c 4f 42 2d 4d 61 74 72 69  m the BLOB-Matri
11198 78 20 2a 2f 0a 20 20 20 20 74 65 78 74 20 3d 20  x */.    text = 
11199 67 61 69 61 50 6f 6c 79 6e 6f 6d 69 61 6c 41 73  gaiaPolynomialAs
1119a 54 65 78 74 20 28 62 6c 6f 62 2c 20 62 6c 6f 62  Text (blob, blob
1119b 5f 73 7a 29 3b 0a 20 20 20 20 69 66 20 28 74 65  _sz);.    if (te
1119c 78 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c  xt == NULL)..sql
1119d 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
1119e 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
1119f 65 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65  else..sqlite3_re
111a0 73 75 6c 74 5f 74 65 78 74 20 28 63 6f 6e 74 65  sult_text (conte
111a1 78 74 2c 20 74 65 78 74 2c 20 73 74 72 6c 65 6e  xt, text, strlen
111a2 20 28 74 65 78 74 29 2c 20 73 71 6c 69 74 65 33   (text), sqlite3
111a3 5f 66 72 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69  _free);.}..stati
111a4 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 72 6f 75  c void.fnct_Grou
111a5 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 5f  ndControlPoints_
111a6 54 6f 41 54 4d 20 28 73 71 6c 69 74 65 33 5f 63  ToATM (sqlite3_c
111a7 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
111a8 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09  , int argc,.....
111a9 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
111aa 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
111ab 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 47 43 50 32  function:./ GCP2
111ac 41 54 4d 28 42 4c 4f 42 20 70 6f 6c 79 6e 6f 6d  ATM(BLOB polynom
111ad 61 69 6c 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  ail)././ returns
111ae 20 61 20 42 4c 4f 42 2d 41 74 6d 20 63 6f 72 72   a BLOB-Atm corr
111af 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 61 20 42  esponding to a B
111b0 4c 4f 42 2d 50 6f 6c 79 6e 6f 6d 69 61 6c 20 28  LOB-Polynomial (
111b1 66 69 72 73 74 20 6f 72 64 65 72 20 6f 6e 6c 79  first order only
111b2 29 0a 2f 20 6f 72 20 4e 55 4c 4c 20 69 66 20 61  )./ or NULL if a
111b3 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
111b4 75 6e 74 65 72 65 64 0a 2a 2f 0a 20 20 20 20 63  untered.*/.    c
111b5 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
111b6 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20 20 69 6e  ar *blob;.    in
111b7 74 20 62 6c 6f 62 5f 73 7a 3b 0a 20 20 20 20 75  t blob_sz;.    u
111b8 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 62  nsigned char *ob
111b9 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6f 62 6c  lob;.    int obl
111ba 6f 62 5f 73 7a 3b 0a 20 20 20 20 47 41 49 41 5f  ob_sz;.    GAIA_
111bb 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
111bc 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
111bd 0a 2f 2a 20 76 61 6c 69 64 61 74 69 6e 67 20 74  ./* validating t
111be 68 65 20 69 6e 70 75 74 20 61 72 67 73 20 2a 2f  he input args */
111bf 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33  .    if (sqlite3
111c0 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
111c1 76 5b 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[0]) == SQLITE_
111c2 42 4c 4f 42 29 0a 20 20 20 20 20 20 7b 0a 09 20  BLOB).      {.. 
111c3 20 62 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 75   blob = (const u
111c4 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
111c5 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
111c6 6f 62 20 28 61 72 67 76 5b 30 5d 29 3b 0a 09 20  ob (argv[0]);.. 
111c7 20 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69 74   blob_sz = sqlit
111c8 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 20 28  e3_value_bytes (
111c9 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
111ca 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
111cb 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
111cc 73 75 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65  sult_null (conte
111cd 78 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a  xt);..  return;.
111ce 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 6f 6e 76        }../* conv
111cf 65 72 74 69 6e 67 20 50 6f 6c 79 6e 6f 6d 69 61  erting Polynomia
111d0 6c 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 69  l coefficients i
111d1 6e 74 6f 20 61 6e 20 41 66 66 69 6e 65 20 54 72  nto an Affine Tr
111d2 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6d 61 74  ansformation mat
111d3 72 69 78 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  rix */.    if (!
111d4 67 61 69 61 50 6f 6c 79 6e 6f 6d 69 61 6c 54 6f  gaiaPolynomialTo
111d5 4d 61 74 72 69 78 20 28 62 6c 6f 62 2c 20 62 6c  Matrix (blob, bl
111d6 6f 62 5f 73 7a 2c 20 26 6f 62 6c 6f 62 2c 20 26  ob_sz, &oblob, &
111d7 6f 62 6c 6f 62 5f 73 7a 29 29 0a 09 73 71 6c 69  oblob_sz))..sqli
111d8 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 20  te3_result_null 
111d9 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 65  (context);.    e
111da 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 72 65 73  lse..sqlite3_res
111db 75 6c 74 5f 62 6c 6f 62 20 28 63 6f 6e 74 65 78  ult_blob (contex
111dc 74 2c 20 6f 62 6c 6f 62 2c 20 6f 62 6c 6f 62 5f  t, oblob, oblob_
111dd 73 7a 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 23 65  sz, free);.}..#e
111de 6e 64 69 66 20 2f 2a 20 65 6e 64 20 69 6e 63 6c  ndif /* end incl
111df 75 64 69 6e 67 20 47 43 50 20 2a 2f 0a 0a 23 69  uding GCP */..#i
111e0 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 45 4f 50  fdef ENABLE_GEOP
111e1 41 43 4b 41 47 45 09 2f 2a 20 47 45 4f 50 41 43  ACKAGE./* GEOPAC
111e2 4b 41 47 45 20 65 6e 61 62 6c 65 64 3a 20 73 75  KAGE enabled: su
111e3 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65  pporting GPKG ge
111e4 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 0a 73 74 61  ometries */..sta
111e5 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 65 6e  tic void.fnct_en
111e6 61 62 6c 65 47 70 6b 67 4d 6f 64 65 20 28 73 71  ableGpkgMode (sq
111e7 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
111e8 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
111e9 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
111ea 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53   ** argv).{./* S
111eb 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 45  QL function:./ E
111ec 6e 61 62 6c 65 47 70 6b 67 4d 6f 64 65 20 28 20  nableGpkgMode ( 
111ed 76 6f 69 64 20 29 0a 2f 0a 2f 20 72 65 74 75 72  void )././ retur
111ee 6e 73 3a 20 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20  ns: nothing.*/. 
111ef 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
111f0 74 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b  te;.    int ret;
111f1 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
111f2 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
111f3 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
111f4 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
111f5 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
111f6 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
111f7 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
111f8 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
111f9 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  == NULL)..return
111fa 3b 0a 20 20 20 20 73 71 6c 69 74 65 20 3d 20 73  ;.    sqlite = s
111fb 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
111fc 62 5f 68 61 6e 64 6c 65 20 28 63 6f 6e 74 65 78  b_handle (contex
111fd 74 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 63 68  t);.    ret = ch
111fe 65 63 6b 53 70 61 74 69 61 6c 4d 65 74 61 44 61  eckSpatialMetaDa
111ff 74 61 20 28 73 71 6c 69 74 65 29 3b 0a 20 20 20  ta (sqlite);.   
11200 20 69 66 20 28 72 65 74 20 21 3d 20 34 29 0a 09   if (ret != 4)..
11201 72 65 74 75 72 6e 3b 09 09 09 2f 2a 20 6e 6f 74  return;.../* not
11202 20 47 65 6f 50 61 63 6b 61 67 65 20 2a 2f 0a 20   GeoPackage */. 
11203 20 20 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d     cache->gpkg_m
11204 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 63 61 63  ode = 1;.    cac
11205 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69  he->gpkg_amphibi
11206 6f 75 73 5f 6d 6f 64 65 20 3d 20 30 3b 0a 7d 0a  ous_mode = 0;.}.
11207 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
11208 74 5f 64 69 73 61 62 6c 65 47 70 6b 67 4d 6f 64  t_disableGpkgMod
11209 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
1120a 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
1120b 74 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20  t argc,...      
1120c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1120d 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
1120e 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 44 69 73 61  function:./ Disa
1120f 62 6c 65 47 70 6b 67 4d 6f 64 65 20 28 20 76 6f  bleGpkgMode ( vo
11210 69 64 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  id )././ returns
11211 3a 20 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20 20 20  : nothing.*/.   
11212 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
11213 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
11214 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
11215 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
11216 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
11217 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
11218 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
11219 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e    if (cache == N
1121a 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20  ULL)..return;.  
1121b 20 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f    cache->gpkg_mo
1121c 64 65 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  de = 0;.}..stati
1121d 63 20 76 6f 69 64 0a 66 6e 63 74 5f 67 65 74 47  c void.fnct_getG
1121e 70 6b 67 4d 6f 64 65 20 28 73 71 6c 69 74 65 33  pkgMode (sqlite3
1121f 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
11220 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
11221 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
11222 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
11223 6e 63 74 69 6f 6e 3a 0a 2f 20 47 65 74 47 70 6b  nction:./ GetGpk
11224 67 4d 6f 64 65 20 28 20 76 6f 69 64 20 29 0a 2f  gMode ( void )./
11225 0a 2f 20 72 65 74 75 72 6e 73 3a 20 54 52 55 45  ./ returns: TRUE
11226 20 6f 72 20 46 41 4c 53 45 0a 2a 2f 0a 20 20 20   or FALSE.*/.   
11227 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69   struct splite_i
11228 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63  nternal_cache *c
11229 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75  ache = sqlite3_u
1122a 73 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78  ser_data (contex
1122b 74 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55  t);.    GAIA_UNU
1122c 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56  SED ();../* LCOV
1122d 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20  _EXCL_LINE */.  
1122e 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e    if (cache == N
1122f 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ULL).      {..  
11230 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
11231 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  nt (context, 0);
11232 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
11233 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
11234 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
11235 65 78 74 2c 20 63 61 63 68 65 2d 3e 67 70 6b 67  ext, cache->gpkg
11236 5f 6d 6f 64 65 29 3b 0a 7d 0a 0a 0a 73 74 61 74  _mode);.}...stat
11237 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 65 6e 61  ic void.fnct_ena
11238 62 6c 65 47 70 6b 67 41 6d 70 68 69 62 69 6f 75  bleGpkgAmphibiou
11239 73 4d 6f 64 65 20 28 73 71 6c 69 74 65 33 5f 63  sMode (sqlite3_c
1123a 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
1123b 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
1123c 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
1123d 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
1123e 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
1123f 2f 20 45 6e 61 62 6c 65 47 70 6b 67 41 6d 70 68  / EnableGpkgAmph
11240 69 62 69 6f 75 73 4d 6f 64 65 20 28 20 76 6f 69  ibiousMode ( voi
11241 64 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a  d )././ returns:
11242 20 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20 20 20 20   nothing.*/.    
11243 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
11244 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
11245 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  che = sqlite3_us
11246 65 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74  er_data (context
11247 29 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53  );.    GAIA_UNUS
11248 45 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f  ED ();../* LCOV_
11249 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20  EXCL_LINE */.   
1124a 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e 55   if (cache == NU
1124b 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  LL)..return;.   
1124c 20 63 61 63 68 65 2d 3e 67 70 6b 67 5f 6d 6f 64   cache->gpkg_mod
1124d 65 20 3d 20 30 3b 0a 20 20 20 20 63 61 63 68 65  e = 0;.    cache
1124e 2d 3e 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  ->gpkg_amphibiou
1124f 73 5f 6d 6f 64 65 20 3d 20 31 3b 0a 7d 0a 0a 73  s_mode = 1;.}..s
11250 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
11251 64 69 73 61 62 6c 65 47 70 6b 67 41 6d 70 68 69  disableGpkgAmphi
11252 62 69 6f 75 73 4d 6f 64 65 20 28 73 71 6c 69 74  biousMode (sqlit
11253 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
11254 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
11255 09 09 09 09 73 71 6c 69 74 65 33 5f 76 61 6c 75  ....sqlite3_valu
11256 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f 2a 20  e ** argv).{./* 
11257 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20  SQL function:./ 
11258 44 69 73 61 62 6c 65 47 70 6b 67 41 6d 70 68 69  DisableGpkgAmphi
11259 62 69 6f 75 73 4d 6f 64 65 20 28 20 76 6f 69 64  biousMode ( void
1125a 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20   )././ returns: 
1125b 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20 20 20 20 73  nothing.*/.    s
1125c 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
1125d 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
1125e 68 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  he = sqlite3_use
1125f 72 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29  r_data (context)
11260 3b 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45  ;.    GAIA_UNUSE
11261 44 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45  D ();../* LCOV_E
11262 58 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20  XCL_LINE */.    
11263 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c  if (cache == NUL
11264 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  L)..return;.    
11265 63 61 63 68 65 2d 3e 67 70 6b 67 5f 61 6d 70 68  cache->gpkg_amph
11266 69 62 69 6f 75 73 5f 6d 6f 64 65 20 3d 20 30 3b  ibious_mode = 0;
11267 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11268 66 6e 63 74 5f 67 65 74 47 70 6b 67 41 6d 70 68  fnct_getGpkgAmph
11269 69 62 69 6f 75 73 4d 6f 64 65 20 28 73 71 6c 69  ibiousMode (sqli
1126a 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
1126b 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1126c 0a 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f  ....    sqlite3_
1126d 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
1126e 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ./* SQL function
1126f 3a 0a 2f 20 47 65 74 47 70 6b 67 41 6d 70 68 69  :./ GetGpkgAmphi
11270 62 69 6f 75 73 4d 6f 64 65 20 28 20 76 6f 69 64  biousMode ( void
11271 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20   )././ returns: 
11272 54 52 55 45 20 6f 72 20 46 41 4c 53 45 0a 2a 2f  TRUE or FALSE.*/
11273 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69  .    struct spli
11274 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
11275 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74  e *cache = sqlit
11276 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f  e3_user_data (co
11277 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41  ntext);.    GAIA
11278 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20  _UNUSED ();../* 
11279 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a  LCOV_EXCL_LINE *
1127a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20  /.    if (cache 
1127b 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b  == NULL).      {
1127c 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
1127d 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
1127e 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a   0);..  return;.
1127f 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69        }.    sqli
11280 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28  te3_result_int (
11281 63 6f 6e 74 65 78 74 2c 20 63 61 63 68 65 2d 3e  context, cache->
11282 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75 73 5f  gpkg_amphibious_
11283 6d 6f 64 65 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  mode);.}..#endif
11284 20 2f 2a 20 65 6e 64 20 47 50 4b 47 20 63 6f 6e   /* end GPKG con
11285 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a 0a 73 74 61  ditional */..sta
11286 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 73 65  tic void.fnct_se
11287 74 44 65 63 69 6d 61 6c 50 72 65 63 69 73 69 6f  tDecimalPrecisio
11288 6e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  n (sqlite3_conte
11289 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
1128a 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c  t argc,....  sql
1128b 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
1128c 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
1128d 63 74 69 6f 6e 3a 0a 2f 20 53 65 74 44 65 63 69  ction:./ SetDeci
1128e 6d 61 6c 50 72 65 63 69 73 69 6f 6e 20 28 20 69  malPrecision ( i
1128f 6e 74 20 70 72 65 63 69 73 69 6f 6e 20 29 0a 2f  nt precision )./
11290 20 61 20 6e 65 67 61 74 69 76 65 20 70 72 65 63   a negative prec
11291 69 73 69 6f 6e 20 69 64 65 6e 74 69 66 69 65 73  ision identifies
11292 20 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74   the default set
11293 74 69 6e 67 0a 2f 0a 2f 20 72 65 74 75 72 6e 73  ting././ returns
11294 3a 20 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20 20 20  : nothing.*/.   
11295 20 69 6e 74 20 70 72 65 63 69 73 69 6f 6e 20 3d   int precision =
11296 20 2d 31 3b 0a 20 20 20 20 73 74 72 75 63 74 20   -1;.    struct 
11297 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f  splite_internal_
11298 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73  cache *cache = s
11299 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
1129a 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   (context);.    
1129b 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09  GAIA_UNUSED ();.
1129c 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49  ./* LCOV_EXCL_LI
1129d 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61  NE */.    if (ca
1129e 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65  che == NULL)..re
1129f 74 75 72 6e 3b 0a 20 20 20 20 69 66 20 28 73 71  turn;.    if (sq
112a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
112a1 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20 53 51   (argv[0]) == SQ
112a2 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 70  LITE_INTEGER)..p
112a3 72 65 63 69 73 69 6f 6e 20 3d 20 73 71 6c 69 74  recision = sqlit
112a4 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72  e3_value_int (ar
112a5 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[0]);.    else
112a6 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ..return;.    if
112a7 20 28 70 72 65 63 69 73 69 6f 6e 20 3c 20 30 29   (precision < 0)
112a8 0a 09 70 72 65 63 69 73 69 6f 6e 20 3d 20 2d 31  ..precision = -1
112a9 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70  ;.    else if (p
112aa 72 65 63 69 73 69 6f 6e 20 3d 3d 20 36 29 0a 09  recision == 6)..
112ab 70 72 65 63 69 73 69 6f 6e 20 3d 20 2d 31 3b 0a  precision = -1;.
112ac 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 72 65      else if (pre
112ad 63 69 73 69 6f 6e 20 3e 20 31 38 29 0a 09 70 72  cision > 18)..pr
112ae 65 63 69 73 69 6f 6e 20 3d 20 31 38 3b 0a 20 20  ecision = 18;.  
112af 20 20 63 61 63 68 65 2d 3e 64 65 63 69 6d 61 6c    cache->decimal
112b0 5f 70 72 65 63 69 73 69 6f 6e 20 3d 20 70 72 65  _precision = pre
112b1 63 69 73 69 6f 6e 3b 0a 7d 0a 0a 73 74 61 74 69  cision;.}..stati
112b2 63 20 76 6f 69 64 0a 66 6e 63 74 5f 67 65 74 44  c void.fnct_getD
112b3 65 63 69 6d 61 6c 50 72 65 63 69 73 69 6f 6e 20  ecimalPrecision 
112b4 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
112b5 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
112b6 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c 69 74  argc,....  sqlit
112b7 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
112b8 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
112b9 69 6f 6e 3a 0a 2f 20 47 65 74 44 65 63 69 6d 61  ion:./ GetDecima
112ba 6c 50 72 65 63 69 73 69 6f 6e 20 28 20 76 6f 69  lPrecision ( voi
112bb 64 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a  d )././ returns:
112bc 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73   the currently s
112bd 65 74 20 44 65 63 69 6d 61 6c 20 50 72 65 63 69  et Decimal Preci
112be 73 69 6f 6e 0a 2a 2f 0a 20 20 20 20 73 74 72 75  sion.*/.    stru
112bf 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e  ct splite_intern
112c0 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20  al_cache *cache 
112c1 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
112c2 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ata (context);. 
112c3 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28     GAIA_UNUSED (
112c4 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c  );../* LCOV_EXCL
112c5 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20  _LINE */.    if 
112c6 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a  (cache == NULL).
112c7 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74        {..  sqlit
112c8 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63  e3_result_int (c
112c9 6f 6e 74 65 78 74 2c 20 2d 31 29 3b 0a 09 20 20  ontext, -1);..  
112ca 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
112cb 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
112cc 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  lt_int (context,
112cd 20 63 61 63 68 65 2d 3e 64 65 63 69 6d 61 6c 5f   cache->decimal_
112ce 70 72 65 63 69 73 69 6f 6e 29 3b 0a 7d 0a 0a 73  precision);.}..s
112cf 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
112d0 65 6e 61 62 6c 65 54 69 6e 79 50 6f 69 6e 74 20  enableTinyPoint 
112d1 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
112d2 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
112d3 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 73 71  argc,...      sq
112d4 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
112d5 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75  rgv).{./* SQL fu
112d6 6e 63 74 69 6f 6e 3a 0a 2f 20 45 6e 61 62 6c 65  nction:./ Enable
112d7 54 69 6e 79 50 6f 69 6e 74 20 28 20 76 6f 69 64  TinyPoint ( void
112d8 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20   )././ returns: 
112d9 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20 20 20 20 63  nothing.*/.    c
112da 6f 6e 73 74 20 76 6f 69 64 20 2a 63 61 63 68 65  onst void *cache
112db 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
112dc 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
112dd 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
112de 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
112df 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 65 6e  L_LINE */.    en
112e0 61 62 6c 65 5f 74 69 6e 79 5f 70 6f 69 6e 74 20  able_tiny_point 
112e1 28 63 61 63 68 65 29 3b 0a 7d 0a 0a 73 74 61 74  (cache);.}..stat
112e2 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 64 69 73  ic void.fnct_dis
112e3 61 62 6c 65 54 69 6e 79 50 6f 69 6e 74 20 28 73  ableTinyPoint (s
112e4 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
112e5 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
112e6 67 63 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c  gc,...       sql
112e7 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
112e8 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e  gv).{./* SQL fun
112e9 63 74 69 6f 6e 3a 0a 2f 20 44 69 73 61 62 6c 65  ction:./ Disable
112ea 54 69 6e 79 50 6f 69 6e 74 20 28 20 76 6f 69 64  TinyPoint ( void
112eb 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20   )././ returns: 
112ec 6e 6f 74 68 69 6e 67 0a 2a 2f 0a 20 20 20 20 63  nothing.*/.    c
112ed 6f 6e 73 74 20 76 6f 69 64 20 2a 63 61 63 68 65  onst void *cache
112ee 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
112ef 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b 0a  data (context);.
112f0 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20      GAIA_UNUSED 
112f1 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43  ();../* LCOV_EXC
112f2 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 64 69  L_LINE */.    di
112f3 73 61 62 6c 65 5f 74 69 6e 79 5f 70 6f 69 6e 74  sable_tiny_point
112f4 20 28 63 61 63 68 65 29 3b 0a 7d 0a 0a 73 74 61   (cache);.}..sta
112f5 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 69 73  tic void.fnct_is
112f6 54 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64  TinyPointEnabled
112f7 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
112f8 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
112f9 20 61 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74   argc,.... sqlit
112fa 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
112fb 29 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74  ).{./* SQL funct
112fc 69 6f 6e 3a 0a 2f 20 49 73 54 69 6e 79 50 6f 69  ion:./ IsTinyPoi
112fd 6e 74 45 6e 61 62 6c 65 64 20 28 20 76 6f 69 64  ntEnabled ( void
112fe 20 29 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20   )././ returns: 
112ff 54 52 55 45 20 6f 72 20 46 41 4c 53 45 0a 2a 2f  TRUE or FALSE.*/
11300 0a 20 20 20 20 69 6e 74 20 65 6e 61 62 6c 65 64  .    int enabled
11301 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
11302 20 2a 63 61 63 68 65 20 3d 20 73 71 6c 69 74 65   *cache = sqlite
11303 33 5f 75 73 65 72 5f 64 61 74 61 20 28 63 6f 6e  3_user_data (con
11304 74 65 78 74 29 3b 0a 20 20 20 20 47 41 49 41 5f  text);.    GAIA_
11305 55 4e 55 53 45 44 20 28 29 3b 09 09 2f 2a 20 4c  UNUSED ();../* L
11306 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45 20 2a 2f  COV_EXCL_LINE */
11307 0a 20 20 20 20 65 6e 61 62 6c 65 64 20 3d 20 69  .    enabled = i
11308 73 5f 74 69 6e 79 5f 70 6f 69 6e 74 5f 65 6e 61  s_tiny_point_ena
11309 62 6c 65 64 20 28 63 61 63 68 65 29 3b 0a 20 20  bled (cache);.  
1130a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1130b 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 65  _int (context, e
1130c 6e 61 62 6c 65 64 29 3b 0a 7d 0a 0a 73 74 61 74  nabled);.}..stat
1130d 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 61 64 64  ic void.fnct_add
1130e 53 68 61 70 65 66 69 6c 65 45 78 74 65 6e 74 20  ShapefileExtent 
1130f 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11310 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
11311 61 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65  argc,.... sqlite
11312 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
11313 0a 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69  .{./* SQL functi
11314 6f 6e 3a 0a 2f 20 41 64 64 53 68 61 70 65 66 69  on:./ AddShapefi
11315 6c 65 45 78 74 65 6e 74 20 28 20 74 61 62 6c 65  leExtent ( table
11316 20 54 65 78 74 2c 20 6d 69 6e 78 20 44 6f 75 62   Text, minx Doub
11317 6c 65 20 6d 69 6e 79 20 44 6f 75 62 6c 65 2c 20  le miny Double, 
11318 6d 61 78 78 20 44 6f 75 62 6c 65 2c 0a 2f 20 20  maxx Double,./  
11319 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1131a 20 20 20 20 6d 61 78 79 20 44 6f 75 62 6c 65 2c      maxy Double,
1131b 20 73 72 69 64 20 49 6e 74 65 67 65 72 20 29 0a   srid Integer ).
1131c 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20 31 20 6f  /./ returns: 1 o
1131d 6e 20 73 75 63 63 65 73 73 2c 20 30 20 6f 6e 20  n success, 0 on 
1131e 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20 63  failure.*/.    c
1131f 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65  onst char *table
11320 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e  ;.    double min
11321 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69  x;.    double mi
11322 6e 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  ny;.    double m
11323 61 78 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  axx;.    double 
11324 6d 61 78 79 3b 0a 20 20 20 20 69 6e 74 20 73 72  maxy;.    int sr
11325 69 64 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  id;.    struct s
11326 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
11327 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71  ache *cache = sq
11328 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20  lite3_user_data 
11329 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47  (context);.    G
1132a 41 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09  AIA_UNUSED ();..
1132b 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e  /* LCOV_EXCL_LIN
1132c 45 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63  E */.    if (cac
1132d 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  he == NULL).    
1132e 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72    {..  sqlite3_r
1132f 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
11330 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72  xt, 0);..  retur
11331 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69  n;.      }.    i
11332 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f (sqlite3_value
11333 5f 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20  _type (argv[0]) 
11334 3d 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a  == SQLITE_TEXT).
11335 09 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20  .table = (const 
11336 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f  char *) sqlite3_
11337 76 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76  value_text (argv
11338 5b 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20  [0]);.    else. 
11339 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
1133a 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
1133b 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65  ntext, 0);..  re
1133c 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
1133d 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
1133e 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 31  lue_type (argv[1
1133f 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f  ]) == SQLITE_FLO
11340 41 54 29 0a 09 6d 69 6e 78 20 3d 20 73 71 6c 69  AT)..minx = sqli
11341 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
11342 20 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20   (argv[1]);.    
11343 65 6c 73 65 20 69 66 20 28 73 71 6c 69 74 65 33  else if (sqlite3
11344 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67  _value_type (arg
11345 76 5b 31 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f  v[1]) == SQLITE_
11346 49 4e 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b  INTEGER).      {
11347 0a 09 20 20 69 6e 74 20 76 61 6c 20 3d 20 73 71  ..  int val = sq
11348 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
11349 28 61 72 67 76 5b 31 5d 29 3b 0a 09 20 20 6d 69  (argv[1]);..  mi
1134a 6e 78 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20  nx = val;.      
1134b 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
1134c 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
1134d 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
1134e 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e  t, 0);..  return
1134f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
11350 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
11351 74 79 70 65 20 28 61 72 67 76 5b 32 5d 29 20 3d  type (argv[2]) =
11352 3d 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a  = SQLITE_FLOAT).
11353 09 6d 69 6e 79 20 3d 20 73 71 6c 69 74 65 33 5f  .miny = sqlite3_
11354 76 61 6c 75 65 5f 64 6f 75 62 6c 65 20 28 61 72  value_double (ar
11355 67 76 5b 32 5d 29 3b 0a 20 20 20 20 65 6c 73 65  gv[2]);.    else
11356 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61 6c   if (sqlite3_val
11357 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 32 5d  ue_type (argv[2]
11358 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  ) == SQLITE_INTE
11359 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  GER).      {..  
1135a 69 6e 74 20 76 61 6c 20 3d 20 73 71 6c 69 74 65  int val = sqlite
1135b 33 5f 76 61 6c 75 65 5f 69 6e 74 20 28 61 72 67  3_value_int (arg
1135c 76 5b 32 5d 29 3b 0a 09 20 20 6d 69 6e 79 20 3d  v[2]);..  miny =
1135d 20 76 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20   val;.      }.  
1135e 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09    else.      {..
1135f 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
11360 5f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 30  _int (context, 0
11361 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
11362 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 71      }.    if (sq
11363 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
11364 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d 20 53 51   (argv[3]) == SQ
11365 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 6d 61 78  LITE_FLOAT)..max
11366 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
11367 65 5f 64 6f 75 62 6c 65 20 28 61 72 67 76 5b 33  e_double (argv[3
11368 5d 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ]);.    else if 
11369 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  (sqlite3_value_t
1136a 79 70 65 20 28 61 72 67 76 5b 33 5d 29 20 3d 3d  ype (argv[3]) ==
1136b 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29   SQLITE_INTEGER)
1136c 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 20  .      {..  int 
1136d 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  val = sqlite3_va
1136e 6c 75 65 5f 69 6e 74 20 28 61 72 67 76 5b 33 5d  lue_int (argv[3]
1136f 29 3b 0a 09 20 20 6d 61 78 78 20 3d 20 76 61 6c  );..  maxx = val
11370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
11371 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
11372 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
11373 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 09   (context, 0);..
11374 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
11375 7d 0a 20 20 20 20 69 66 20 28 73 71 6c 69 74 65  }.    if (sqlite
11376 33 5f 76 61 6c 75 65 5f 74 79 70 65 20 28 61 72  3_value_type (ar
11377 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c 49 54 45  gv[4]) == SQLITE
11378 5f 46 4c 4f 41 54 29 0a 09 6d 61 78 79 20 3d 20  _FLOAT)..maxy = 
11379 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
1137a 75 62 6c 65 20 28 61 72 67 76 5b 34 5d 29 3b 0a  uble (argv[4]);.
1137b 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 71 6c      else if (sql
1137c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 20  ite3_value_type 
1137d 28 61 72 67 76 5b 34 5d 29 20 3d 3d 20 53 51 4c  (argv[4]) == SQL
1137e 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20 20  ITE_INTEGER).   
1137f 20 20 20 7b 0a 09 20 20 69 6e 74 20 76 61 6c 20     {..  int val 
11380 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
11381 69 6e 74 20 28 61 72 67 76 5b 34 5d 29 3b 0a 09  int (argv[4]);..
11382 20 20 6d 61 78 79 20 3d 20 76 61 6c 3b 0a 20 20    maxy = val;.  
11383 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20      }.    else. 
11384 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65       {..  sqlite
11385 33 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f  3_result_int (co
11386 6e 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65  ntext, 0);..  re
11387 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
11388 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76 61    if (sqlite3_va
11389 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b 35  lue_type (argv[5
1138a 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ]) == SQLITE_INT
1138b 45 47 45 52 29 0a 09 73 72 69 64 20 3d 20 73 71  EGER)..srid = sq
1138c 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 20  lite3_value_int 
1138d 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 20 20 65  (argv[5]);.    e
1138e 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73  lse.      {..  s
1138f 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
11390 74 20 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  t (context, 0);.
11391 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  .  return;.     
11392 20 7d 0a 20 20 20 20 61 64 64 5f 73 68 70 5f 65   }.    add_shp_e
11393 78 74 65 6e 74 20 28 74 61 62 6c 65 2c 20 6d 69  xtent (table, mi
11394 6e 78 2c 20 6d 69 6e 79 2c 20 6d 61 78 78 2c 20  nx, miny, maxx, 
11395 6d 61 78 79 2c 20 73 72 69 64 2c 20 63 61 63 68  maxy, srid, cach
11396 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
11397 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74  result_int (cont
11398 65 78 74 2c 20 31 29 3b 0a 7d 0a 0a 73 74 61 74  ext, 1);.}..stat
11399 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 72 65 6d  ic void.fnct_rem
1139a 6f 76 65 53 68 61 70 65 66 69 6c 65 45 78 74 65  oveShapefileExte
1139b 6e 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nt (sqlite3_cont
1139c 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
1139d 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20  nt argc,....    
1139e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1139f 20 61 72 67 76 29 0a 7b 0a 2f 2a 20 53 51 4c 20   argv).{./* SQL 
113a0 66 75 6e 63 74 69 6f 6e 3a 0a 2f 20 52 65 6d 6f  function:./ Remo
113a1 76 65 53 68 61 70 65 66 69 6c 65 45 78 74 65 6e  veShapefileExten
113a2 74 20 28 20 74 61 62 6c 65 20 54 65 78 74 20 29  t ( table Text )
113a3 0a 2f 0a 2f 20 72 65 74 75 72 6e 73 3a 20 31 20  ././ returns: 1 
113a4 6f 6e 20 73 75 63 63 65 73 73 2c 20 30 20 6f 6e  on success, 0 on
113a5 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 20 20 20 20   failure.*/.    
113a6 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c  const char *tabl
113a7 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  e;.    struct sp
113a8 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
113a9 63 68 65 20 2a 63 61 63 68 65 20 3d 20 73 71 6c  che *cache = sql
113aa 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 20 28  ite3_user_data (
113ab 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 47 41  context);.    GA
113ac 49 41 5f 55 4e 55 53 45 44 20 28 29 3b 09 09 2f  IA_UNUSED ();../
113ad 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f 4c 49 4e 45  * LCOV_EXCL_LINE
113ae 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 61 63 68   */.    if (cach
113af 65 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  e == NULL).     
113b0 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65   {..  sqlite3_re
113b1 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65 78  sult_int (contex
113b2 74 2c 20 30 29 3b 0a 09 20 20 72 65 74 75 72 6e  t, 0);..  return
113b3 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66  ;.      }.    if
113b4 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f   (sqlite3_value_
113b5 74 79 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d  type (argv[0]) =
113b6 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09  = SQLITE_TEXT)..
113b7 74 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  table = (const c
113b8 68 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 76  har *) sqlite3_v
113b9 61 6c 75 65 5f 74 65 78 74 20 28 61 72 67 76 5b  alue_text (argv[
113ba 30 5d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20  0]);.    else.  
113bb 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33      {..  sqlite3
113bc 5f 72 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e  _result_int (con
113bd 74 65 78 74 2c 20 30 29 3b 0a 09 20 20 72 65 74  text, 0);..  ret
113be 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
113bf 20 72 65 6d 6f 76 65 5f 73 68 70 5f 65 78 74 65   remove_shp_exte
113c0 6e 74 20 28 74 61 62 6c 65 2c 20 63 61 63 68 65  nt (table, cache
113c1 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
113c2 65 73 75 6c 74 5f 69 6e 74 20 28 63 6f 6e 74 65  esult_int (conte
113c3 78 74 2c 20 31 29 3b 0a 7d 0a 0a 73 74 61 74 69  xt, 1);.}..stati
113c4 63 20 76 6f 69 64 0a 66 6e 63 74 5f 67 65 74 53  c void.fnct_getS
113c5 68 61 70 65 66 69 6c 65 45 78 74 65 6e 74 20 28  hapefileExtent (
113c6 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
113c7 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
113c8 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65 33  rgc,.... sqlite3
113c9 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
113ca 7b 0a 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  {./* SQL functio
113cb 6e 3a 0a 2f 20 47 65 74 53 68 61 70 65 66 69 6c  n:./ GetShapefil
113cc 65 45 78 74 65 6e 74 20 28 20 74 61 62 6c 65 20  eExtent ( table 
113cd 54 65 78 74 20 29 0a 2f 0a 2f 20 72 65 74 75 72  Text )././ retur
113ce 6e 73 3a 20 74 68 65 20 53 68 61 70 65 66 69 6c  ns: the Shapefil
113cf 65 27 73 20 46 75 6c 6c 20 45 78 74 65 6e 74 20  e's Full Extent 
113d0 28 45 6e 76 65 6c 6f 70 65 29 0a 2f 20 20 20 20  (Envelope)./    
113d1 20 20 20 20 20 20 6f 72 20 4e 55 4c 4c 20 6f 6e        or NULL on
113d2 20 65 72 72 6f 72 0a 2a 2f 0a 20 20 20 20 63 6f   error.*/.    co
113d3 6e 73 74 20 63 68 61 72 20 2a 74 61 62 6c 65 3b  nst char *table;
113d4 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e 78  .    double minx
113d5 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e  ;.    double min
113d6 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 61  y;.    double ma
113d7 78 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  xx;.    double m
113d8 61 78 79 3b 0a 20 20 20 20 69 6e 74 20 73 72 69  axy;.    int sri
113d9 64 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  d;.    gaiaGeomC
113da 6f 6c 6c 50 74 72 20 62 62 6f 78 3b 0a 20 20 20  ollPtr bbox;.   
113db 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
113dc 70 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69 61 52  polyg;.    gaiaR
113dd 69 6e 67 50 74 72 20 72 65 63 74 3b 0a 20 20 20  ingPtr rect;.   
113de 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20 20   char *sql;.    
113df 63 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20  char *xtable;.  
113e0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75    int len;.    u
113e1 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f  nsigned char *p_
113e2 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20  result = NULL;. 
113e3 20 20 20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69     sqlite3 *sqli
113e4 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  te = sqlite3_con
113e5 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 20 28  text_db_handle (
113e6 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 74  context);.    st
113e7 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
113e8 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
113e9 65 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  e = sqlite3_user
113ea 5f 64 61 74 61 20 28 63 6f 6e 74 65 78 74 29 3b  _data (context);
113eb 0a 20 20 20 20 47 41 49 41 5f 55 4e 55 53 45 44  .    GAIA_UNUSED
113ec 20 28 29 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58   ();../* LCOV_EX
113ed 43 4c 5f 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69  CL_LINE */.    i
113ee 66 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c  f (cache == NULL
113ef 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c  ).      {..  sql
113f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
113f1 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20 72   (context);..  r
113f2 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
113f3 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 76     if (sqlite3_v
113f4 61 6c 75 65 5f 74 79 70 65 20 28 61 72 67 76 5b  alue_type (argv[
113f5 30 5d 29 20 3d 3d 20 53 51 4c 49 54 45 5f 54 45  0]) == SQLITE_TE
113f6 58 54 29 0a 09 74 61 62 6c 65 20 3d 20 28 63 6f  XT)..table = (co
113f7 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
113f8 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 20 28  te3_value_text (
113f9 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 6c  argv[0]);.    el
113fa 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71  se.      {..  sq
113fb 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
113fc 6c 20 28 63 6f 6e 74 65 78 74 29 3b 0a 09 20 20  l (context);..  
113fd 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
113fe 0a 2f 2a 20 65 6e 73 75 72 69 6e 67 20 74 6f 20  ./* ensuring to 
113ff 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56  initialize the V
11400 69 72 74 75 61 6c 53 68 61 70 65 20 54 61 62 6c  irtualShape Tabl
11401 65 20 2a 2f 0a 20 20 20 20 78 74 61 62 6c 65 20  e */.    xtable 
11402 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74  = gaiaDoubleQuot
11403 65 64 53 71 6c 20 28 74 61 62 6c 65 29 3b 0a 20  edSql (table);. 
11404 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33     sql = sqlite3
11405 5f 6d 70 72 69 6e 74 66 20 28 22 50 52 41 47 4d  _mprintf ("PRAGM
11406 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 5c 22 25  A table_info(\"%
11407 73 5c 22 29 22 2c 20 78 74 61 62 6c 65 29 3b 0a  s\")", xtable);.
11408 20 20 20 20 66 72 65 65 20 28 78 74 61 62 6c 65      free (xtable
11409 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
1140a 78 65 63 20 28 73 71 6c 69 74 65 2c 20 73 71 6c  xec (sqlite, sql
1140b 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
1140c 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  LL);.    sqlite3
1140d 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 0a 20 20  _free (sql);..  
1140e 20 20 69 66 20 28 21 67 65 74 5f 73 68 70 5f 65    if (!get_shp_e
1140f 78 74 65 6e 74 20 28 74 61 62 6c 65 2c 20 26 6d  xtent (table, &m
11410 69 6e 78 2c 20 26 6d 69 6e 79 2c 20 26 6d 61 78  inx, &miny, &max
11411 78 2c 20 26 6d 61 78 79 2c 20 26 73 72 69 64 2c  x, &maxy, &srid,
11412 20 63 61 63 68 65 29 29 0a 20 20 20 20 20 20 7b   cache)).      {
11413 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
11414 6c 74 5f 6e 75 6c 6c 20 28 63 6f 6e 74 65 78 74  lt_null (context
11415 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
11416 20 20 20 20 7d 0a 0a 2f 2a 20 62 75 69 6c 64 69      }../* buildi
11417 6e 67 20 74 68 65 20 45 6e 76 65 6c 6f 70 65 20  ng the Envelope 
11418 2a 2f 0a 20 20 20 20 62 62 6f 78 20 3d 20 67 61  */.    bbox = ga
11419 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20  iaAllocGeomColl 
1141a 28 29 3b 0a 20 20 20 20 62 62 6f 78 2d 3e 53 72  ();.    bbox->Sr
1141b 69 64 20 3d 20 73 72 69 64 3b 0a 20 20 20 20 70  id = srid;.    p
1141c 6f 6c 79 67 20 3d 20 67 61 69 61 41 64 64 50 6f  olyg = gaiaAddPo
1141d 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f 6c 6c 20  lygonToGeomColl 
1141e 28 62 62 6f 78 2c 20 35 2c 20 30 29 3b 0a 20 20  (bbox, 5, 0);.  
1141f 20 20 72 65 63 74 20 3d 20 70 6f 6c 79 67 2d 3e    rect = polyg->
11420 45 78 74 65 72 69 6f 72 3b 0a 20 20 20 20 67 61  Exterior;.    ga
11421 69 61 53 65 74 50 6f 69 6e 74 20 28 72 65 63 74  iaSetPoint (rect
11422 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 6d 69 6e  ->Coords, 0, min
11423 78 2c 20 6d 69 6e 79 29 3b 09 2f 2a 20 76 65 72  x, miny);./* ver
11424 74 65 78 20 23 20 31 20 2a 2f 0a 20 20 20 20 67  tex # 1 */.    g
11425 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72 65 63  aiaSetPoint (rec
11426 74 2d 3e 43 6f 6f 72 64 73 2c 20 31 2c 20 6d 61  t->Coords, 1, ma
11427 78 78 2c 20 6d 69 6e 79 29 3b 09 2f 2a 20 76 65  xx, miny);./* ve
11428 72 74 65 78 20 23 20 32 20 2a 2f 0a 20 20 20 20  rtex # 2 */.    
11429 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72 65  gaiaSetPoint (re
1142a 63 74 2d 3e 43 6f 6f 72 64 73 2c 20 32 2c 20 6d  ct->Coords, 2, m
1142b 61 78 78 2c 20 6d 61 78 79 29 3b 09 2f 2a 20 76  axx, maxy);./* v
1142c 65 72 74 65 78 20 23 20 33 20 2a 2f 0a 20 20 20  ertex # 3 */.   
1142d 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72   gaiaSetPoint (r
1142e 65 63 74 2d 3e 43 6f 6f 72 64 73 2c 20 33 2c 20  ect->Coords, 3, 
1142f 6d 69 6e 78 2c 20 6d 61 78 79 29 3b 09 2f 2a 20  minx, maxy);./* 
11430 76 65 72 74 65 78 20 23 20 34 20 2a 2f 0a 20 20  vertex # 4 */.  
11431 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28    gaiaSetPoint (
11432 72 65 63 74 2d 3e 43 6f 6f 72 64 73 2c 20 34 2c  rect->Coords, 4,
11433 20 6d 69 6e 78 2c 20 6d 69 6e 79 29 3b 09 2f 2a   minx, miny);./*
11434 20 76 65 72 74 65 78 20 23 20 35 20 5b 73 61 6d   vertex # 5 [sam
11435 65 20 61 73 20 76 65 72 74 65 78 20 23 20 31 20  e as vertex # 1 
11436 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 70 6f 6c  to close the pol
11437 79 67 6f 6e 5d 20 2a 2f 0a 2f 2a 20 62 75 69 6c  ygon] */./* buil
11438 64 73 20 74 68 65 20 42 4c 4f 42 20 67 65 6f 6d  ds the BLOB geom
11439 65 74 72 79 20 74 6f 20 62 65 20 72 65 74 75 72  etry to be retur
1143a 6e 65 64 20 2a 2f 0a 20 20 20 20 67 61 69 61 54  ned */.    gaiaT
1143b 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  oSpatiaLiteBlobW
1143c 6b 62 20 28 62 62 6f 78 2c 20 26 70 5f 72 65 73  kb (bbox, &p_res
1143d 75 6c 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  ult, &len);.    
1143e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
1143f 6c 6f 62 20 28 63 6f 6e 74 65 78 74 2c 20 70 5f  lob (context, p_
11440 72 65 73 75 6c 74 2c 20 6c 65 6e 2c 20 66 72 65  result, len, fre
11441 65 29 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65  e);.    gaiaFree
11442 47 65 6f 6d 43 6f 6c 6c 20 28 62 62 6f 78 29 3b  GeomColl (bbox);
11443 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11444 66 6e 63 74 5f 69 73 4c 6f 77 41 53 43 49 49 20  fnct_isLowASCII 
11445 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11446 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
11447 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
11448 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 2f  lue ** argv).{./
11449 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a  * SQL function:.
1144a 2f 20 49 73 4c 6f 77 41 53 43 49 49 20 28 20 73  / IsLowASCII ( s
1144b 74 72 69 6e 67 20 54 65 78 74 20 29 0a 2f 0a 2f  tring Text )././
1144c 20 72 65 74 75 72 6e 73 3a 20 31 20 28 54 52 55   returns: 1 (TRU
1144d 45 29 20 69 73 20 74 68 65 20 61 72 67 75 6d 65  E) is the argume
1144e 6e 74 20 69 73 20 61 20 74 65 78 74 20 73 74 72  nt is a text str
1144f 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2f  ing containing./
11450 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 6c 6f            all lo
11451 77 2d 41 53 43 49 49 20 63 68 61 72 73 20 28 37  w-ASCII chars (7
11452 2d 62 69 74 2c 20 3c 20 31 32 38 29 0a 2f 20 20  -bit, < 128)./  
11453 20 20 20 20 20 20 20 20 30 20 69 66 20 6e 6f 74          0 if not
11454 0a 2f 20 20 20 20 20 20 20 20 20 20 2d 31 20 6f  ./          -1 o
11455 6e 20 69 6e 76 61 6c 69 64 20 61 72 67 0a 2a 2f  n invalid arg.*/
11456 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
11457 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
11458 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11459 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e   *string;.    in
1145a 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
1145b 20 20 47 41 49 41 5f 55 4e 55 53 45 44 20 28 29    GAIA_UNUSED ()
1145c 3b 09 09 2f 2a 20 4c 43 4f 56 5f 45 58 43 4c 5f  ;../* LCOV_EXCL_
1145d 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 69 66 20 28  LINE */.    if (
1145e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1145f 70 65 20 28 61 72 67 76 5b 30 5d 29 20 3d 3d 20  pe (argv[0]) == 
11460 53 51 4c 49 54 45 5f 54 45 58 54 29 0a 09 73 74  SQLITE_TEXT)..st
11461 72 69 6e 67 20 3d 20 28 63 6f 6e 73 74 20 75 6e  ring = (const un
11462 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73  signed char *) s
11463 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11464 74 20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  t (argv[0]);.   
11465 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
11466 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11467 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c 20 2d 31  int (context, -1
11468 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20  );..  return;.  
11469 20 20 20 20 7d 0a 0a 20 20 20 20 6c 65 6e 20 3d      }..    len =
1146a 20 73 74 72 6c 65 6e 20 28 28 63 6f 6e 73 74 20   strlen ((const 
1146b 63 68 61 72 20 2a 29 20 73 74 72 69 6e 67 29 3b  char *) string);
1146c 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
1146d 20 69 20 3c 20 6c 65 6e 3b 20 69 2b 2b 29 0a 20   i < len; i++). 
1146e 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 74       {..  if (st
1146f 72 69 6e 67 5b 69 5d 20 3e 3d 20 31 32 38 29 0a  ring[i] >= 128).
11470 09 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
11471 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73  0;.      }.    s
11472 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
11473 74 20 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 75  t (context, resu
11474 6c 74 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 45  lt);.}..#ifdef E
11475 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09 09 2f 2a  NABLE_RTTOPO../*
11476 20 6f 6e 6c 79 20 69 66 20 52 54 54 4f 50 4f 20   only if RTTOPO 
11477 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 0a 73  is enabled */..s
11478 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
11479 43 72 65 61 74 65 54 6f 70 6f 54 61 62 6c 65 73  CreateTopoTables
1147a 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
1147b 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
1147c 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 20   argc,...       
1147d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1147e 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
1147f 74 61 75 78 5f 43 72 65 61 74 65 54 6f 70 6f 54  taux_CreateTopoT
11480 61 62 6c 65 73 20 28 63 6f 6e 74 65 78 74 2c 20  ables (context, 
11481 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a  argc, argv);.}..
11482 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
11483 5f 43 72 65 61 74 65 54 6f 70 6f 6c 6f 67 79 20  _CreateTopology 
11484 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11485 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
11486 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
11487 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
11488 20 20 20 66 6e 63 74 61 75 78 5f 43 72 65 61 74     fnctaux_Creat
11489 65 54 6f 70 6f 6c 6f 67 79 20 28 63 6f 6e 74 65  eTopology (conte
1148a 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
1148b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
1148c 66 6e 63 74 5f 44 72 6f 70 54 6f 70 6f 6c 6f 67  fnct_DropTopolog
1148d 79 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  y (sqlite3_conte
1148e 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
1148f 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
11490 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
11491 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 44 72 6f  .    fnctaux_Dro
11492 70 54 6f 70 6f 6c 6f 67 79 20 28 63 6f 6e 74 65  pTopology (conte
11493 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
11494 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11495 66 6e 63 74 5f 47 65 74 4c 61 73 74 54 6f 70 6f  fnct_GetLastTopo
11496 6c 6f 67 79 45 78 63 65 70 74 69 6f 6e 20 28 73  logyException (s
11497 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
11498 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
11499 67 63 2c 0a 09 09 09 20 20 20 20 20 20 20 73 71  gc,....       sq
1149a 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
1149b 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61  rgv).{.    fncta
1149c 75 78 5f 47 65 74 4c 61 73 74 54 6f 70 6f 6c 6f  ux_GetLastTopolo
1149d 67 79 45 78 63 65 70 74 69 6f 6e 20 28 63 6f 6e  gyException (con
1149e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
1149f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
114a0 64 0a 66 6e 63 74 5f 41 64 64 49 73 6f 4e 6f 64  d.fnct_AddIsoNod
114a1 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
114a2 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
114a3 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
114a4 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
114a5 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 41 64 64  .    fnctaux_Add
114a6 49 73 6f 4e 6f 64 65 20 28 63 6f 6e 74 65 78 74  IsoNode (context
114a7 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
114a8 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
114a9 63 74 5f 4d 6f 76 65 49 73 6f 4e 6f 64 65 20 28  ct_MoveIsoNode (
114aa 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
114ab 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
114ac 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
114ad 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
114ae 20 20 66 6e 63 74 61 75 78 5f 4d 6f 76 65 49 73    fnctaux_MoveIs
114af 6f 4e 6f 64 65 20 28 63 6f 6e 74 65 78 74 2c 20  oNode (context, 
114b0 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a  argc, argv);.}..
114b1 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
114b2 5f 52 65 6d 49 73 6f 4e 6f 64 65 20 28 73 71 6c  _RemIsoNode (sql
114b3 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
114b4 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
114b5 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
114b6 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66  ** argv).{.    f
114b7 6e 63 74 61 75 78 5f 52 65 6d 49 73 6f 4e 6f 64  nctaux_RemIsoNod
114b8 65 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  e (context, argc
114b9 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74  , argv);.}..stat
114ba 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 41 64 64  ic void.fnct_Add
114bb 49 73 6f 45 64 67 65 20 28 73 71 6c 69 74 65 33  IsoEdge (sqlite3
114bc 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
114bd 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
114be 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
114bf 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61  rgv).{.    fncta
114c0 75 78 5f 41 64 64 49 73 6f 45 64 67 65 20 28 63  ux_AddIsoEdge (c
114c1 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
114c2 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
114c3 6f 69 64 0a 66 6e 63 74 5f 52 65 6d 49 73 6f 45  oid.fnct_RemIsoE
114c4 64 67 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  dge (sqlite3_con
114c5 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
114c6 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
114c7 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
114c8 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 52  .{.    fnctaux_R
114c9 65 6d 49 73 6f 45 64 67 65 20 28 63 6f 6e 74 65  emIsoEdge (conte
114ca 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
114cb 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
114cc 66 6e 63 74 5f 4d 6f 64 45 64 67 65 53 70 6c 69  fnct_ModEdgeSpli
114cd 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  t (sqlite3_conte
114ce 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
114cf 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
114d0 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
114d1 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 4d 6f 64  .    fnctaux_Mod
114d2 45 64 67 65 53 70 6c 69 74 20 28 63 6f 6e 74 65  EdgeSplit (conte
114d3 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
114d4 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
114d5 66 6e 63 74 5f 4e 65 77 45 64 67 65 73 53 70 6c  fnct_NewEdgesSpl
114d6 69 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  it (sqlite3_cont
114d7 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
114d8 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
114d9 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
114da 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 4e 65  {.    fnctaux_Ne
114db 77 45 64 67 65 73 53 70 6c 69 74 20 28 63 6f 6e  wEdgesSplit (con
114dc 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
114dd 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
114de 64 0a 66 6e 63 74 5f 41 64 64 45 64 67 65 4d 6f  d.fnct_AddEdgeMo
114df 64 46 61 63 65 20 28 73 71 6c 69 74 65 33 5f 63  dFace (sqlite3_c
114e0 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
114e1 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
114e2 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
114e3 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78  v).{.    fnctaux
114e4 5f 41 64 64 45 64 67 65 4d 6f 64 46 61 63 65 20  _AddEdgeModFace 
114e5 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
114e6 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
114e7 20 76 6f 69 64 0a 66 6e 63 74 5f 41 64 64 45 64   void.fnct_AddEd
114e8 67 65 4e 65 77 46 61 63 65 73 20 28 73 71 6c 69  geNewFaces (sqli
114e9 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
114ea 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
114eb 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
114ec 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
114ed 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 41 64  {.    fnctaux_Ad
114ee 64 45 64 67 65 4e 65 77 46 61 63 65 73 20 28 63  dEdgeNewFaces (c
114ef 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
114f0 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
114f1 6f 69 64 0a 66 6e 63 74 5f 43 68 61 6e 67 65 45  oid.fnct_ChangeE
114f2 64 67 65 47 65 6f 6d 20 28 73 71 6c 69 74 65 33  dgeGeom (sqlite3
114f3 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
114f4 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
114f5 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
114f6 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61  rgv).{.    fncta
114f7 75 78 5f 43 68 61 6e 67 65 45 64 67 65 47 65 6f  ux_ChangeEdgeGeo
114f8 6d 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  m (context, argc
114f9 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74  , argv);.}..stat
114fa 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52 65 6d  ic void.fnct_Rem
114fb 45 64 67 65 4d 6f 64 46 61 63 65 20 28 73 71 6c  EdgeModFace (sql
114fc 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
114fd 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
114fe 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
114ff 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66  ** argv).{.    f
11500 6e 63 74 61 75 78 5f 52 65 6d 45 64 67 65 4d 6f  nctaux_RemEdgeMo
11501 64 46 61 63 65 20 28 63 6f 6e 74 65 78 74 2c 20  dFace (context, 
11502 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a  argc, argv);.}..
11503 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
11504 5f 52 65 6d 45 64 67 65 4e 65 77 46 61 63 65 20  _RemEdgeNewFace 
11505 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11506 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
11507 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
11508 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
11509 20 20 20 66 6e 63 74 61 75 78 5f 52 65 6d 45 64     fnctaux_RemEd
1150a 67 65 4e 65 77 46 61 63 65 20 28 63 6f 6e 74 65  geNewFace (conte
1150b 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
1150c 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
1150d 66 6e 63 74 5f 4d 6f 64 45 64 67 65 48 65 61 6c  fnct_ModEdgeHeal
1150e 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
1150f 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
11510 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
11511 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
11512 20 20 20 20 66 6e 63 74 61 75 78 5f 4d 6f 64 45      fnctaux_ModE
11513 64 67 65 48 65 61 6c 20 28 63 6f 6e 74 65 78 74  dgeHeal (context
11514 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
11515 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
11516 63 74 5f 4e 65 77 45 64 67 65 48 65 61 6c 20 28  ct_NewEdgeHeal (
11517 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
11518 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
11519 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1151a 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
1151b 20 20 66 6e 63 74 61 75 78 5f 4e 65 77 45 64 67    fnctaux_NewEdg
1151c 65 48 65 61 6c 20 28 63 6f 6e 74 65 78 74 2c 20  eHeal (context, 
1151d 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a  argc, argv);.}..
1151e 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
1151f 5f 47 65 74 46 61 63 65 47 65 6f 6d 65 74 72 79  _GetFaceGeometry
11520 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
11521 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
11522 20 61 72 67 63 2c 0a 09 09 20 20 20 20 20 20 73   argc,...      s
11523 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
11524 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74  argv).{.    fnct
11525 61 75 78 5f 47 65 74 46 61 63 65 47 65 6f 6d 65  aux_GetFaceGeome
11526 74 72 79 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  try (context, ar
11527 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
11528 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47  atic void.fnct_G
11529 65 74 46 61 63 65 45 64 67 65 73 20 28 73 71 6c  etFaceEdges (sql
1152a 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
1152b 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1152c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1152d 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66  ** argv).{.    f
1152e 6e 63 74 61 75 78 5f 47 65 74 46 61 63 65 45 64  nctaux_GetFaceEd
1152f 67 65 73 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  ges (context, ar
11530 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
11531 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 56  atic void.fnct_V
11532 61 6c 69 64 61 74 65 54 6f 70 6f 47 65 6f 20 28  alidateTopoGeo (
11533 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
11534 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
11535 72 67 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c  rgc,...      sql
11536 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
11537 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75  gv).{.    fnctau
11538 78 5f 56 61 6c 69 64 61 74 65 54 6f 70 6f 47 65  x_ValidateTopoGe
11539 6f 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  o (context, argc
1153a 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74  , argv);.}..stat
1153b 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 72 65  ic void.fnct_Cre
1153c 61 74 65 54 6f 70 6f 47 65 6f 20 28 73 71 6c 69  ateTopoGeo (sqli
1153d 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
1153e 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1153f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
11540 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e  * argv).{.    fn
11541 63 74 61 75 78 5f 43 72 65 61 74 65 54 6f 70 6f  ctaux_CreateTopo
11542 47 65 6f 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  Geo (context, ar
11543 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
11544 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47  atic void.fnct_G
11545 65 74 4e 6f 64 65 42 79 50 6f 69 6e 74 20 28 73  etNodeByPoint (s
11546 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
11547 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
11548 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
11549 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
1154a 20 66 6e 63 74 61 75 78 5f 47 65 74 4e 6f 64 65   fnctaux_GetNode
1154b 42 79 50 6f 69 6e 74 20 28 63 6f 6e 74 65 78 74  ByPoint (context
1154c 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
1154d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
1154e 63 74 5f 47 65 74 45 64 67 65 42 79 50 6f 69 6e  ct_GetEdgeByPoin
1154f 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  t (sqlite3_conte
11550 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
11551 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
11552 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
11553 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 47 65 74  .    fnctaux_Get
11554 45 64 67 65 42 79 50 6f 69 6e 74 20 28 63 6f 6e  EdgeByPoint (con
11555 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
11556 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
11557 64 0a 66 6e 63 74 5f 47 65 74 46 61 63 65 42 79  d.fnct_GetFaceBy
11558 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33 5f 63  Point (sqlite3_c
11559 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
1155a 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
1155b 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
1155c 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78  v).{.    fnctaux
1155d 5f 47 65 74 46 61 63 65 42 79 50 6f 69 6e 74 20  _GetFaceByPoint 
1155e 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
1155f 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
11560 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47   void.fnct_TopoG
11561 65 6f 5f 41 64 64 50 6f 69 6e 74 20 28 73 71 6c  eo_AddPoint (sql
11562 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
11563 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
11564 2c 0a 09 09 20 20 20 20 20 20 20 73 71 6c 69 74  ,...       sqlit
11565 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
11566 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f  ).{.    fnctaux_
11567 54 6f 70 6f 47 65 6f 5f 41 64 64 50 6f 69 6e 74  TopoGeo_AddPoint
11568 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
11569 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69   argv);.}..stati
1156a 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f  c void.fnct_Topo
1156b 47 65 6f 5f 41 64 64 4c 69 6e 65 53 74 72 69 6e  Geo_AddLineStrin
1156c 67 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  g (sqlite3_conte
1156d 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
1156e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 73  t argc,....    s
1156f 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
11570 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74  argv).{.    fnct
11571 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 41 64 64 4c  aux_TopoGeo_AddL
11572 69 6e 65 53 74 72 69 6e 67 20 28 63 6f 6e 74 65  ineString (conte
11573 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
11574 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11575 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 41 64 64  fnct_TopoGeo_Add
11576 4c 69 6e 65 53 74 72 69 6e 67 4e 6f 46 61 63 65  LineStringNoFace
11577 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
11578 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
11579 20 61 72 67 63 2c 0a 09 09 09 09 20 20 73 71 6c   argc,.....  sql
1157a 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
1157b 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75  gv).{.    fnctau
1157c 78 5f 54 6f 70 6f 47 65 6f 5f 41 64 64 4c 69 6e  x_TopoGeo_AddLin
1157d 65 53 74 72 69 6e 67 4e 6f 46 61 63 65 20 28 63  eStringNoFace (c
1157e 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
1157f 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
11580 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
11581 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65 20 28 73  _FromGeoTable (s
11582 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
11583 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
11584 67 63 2c 0a 09 09 09 20 20 20 73 71 6c 69 74 65  gc,....   sqlite
11585 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
11586 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54  .{.    fnctaux_T
11587 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61  opoGeo_FromGeoTa
11588 62 6c 65 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  ble (context, ar
11589 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
1158a 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54  atic void.fnct_T
1158b 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61  opoGeo_FromGeoTa
1158c 62 6c 65 4e 6f 46 61 63 65 20 28 73 71 6c 69 74  bleNoFace (sqlit
1158d 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
1158e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
1158f 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61 6c  .... sqlite3_val
11590 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
11591 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47 65    fnctaux_TopoGe
11592 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65 4e 6f  o_FromGeoTableNo
11593 46 61 63 65 20 28 63 6f 6e 74 65 78 74 2c 20 61  Face (context, a
11594 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73  rgc, argv);.}..s
11595 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
11596 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54  TopoGeo_FromGeoT
11597 61 62 6c 65 45 78 74 20 28 73 71 6c 69 74 65 33  ableExt (sqlite3
11598 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
11599 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
1159a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
1159b 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
1159c 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f      fnctaux_Topo
1159d 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Geo_FromGeoTable
1159e 45 78 74 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  Ext (context, ar
1159f 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
115a0 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54  atic void.fnct_T
115a1 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61  opoGeo_FromGeoTa
115a2 62 6c 65 4e 6f 46 61 63 65 45 78 74 20 28 73 71  bleNoFaceExt (sq
115a3 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
115a4 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
115a5 63 2c 0a 09 09 09 09 20 20 20 20 73 71 6c 69 74  c,.....    sqlit
115a6 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
115a7 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f  ).{.    fnctaux_
115a8 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54  TopoGeo_FromGeoT
115a9 61 62 6c 65 4e 6f 46 61 63 65 45 78 74 20 28 63  ableNoFaceExt (c
115aa 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
115ab 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
115ac 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
115ad 5f 50 6f 6c 79 67 6f 6e 69 7a 65 20 28 73 71 6c  _Polygonize (sql
115ae 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
115af 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
115b0 2c 0a 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61  ,.... sqlite3_va
115b1 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
115b2 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47     fnctaux_TopoG
115b3 65 6f 5f 50 6f 6c 79 67 6f 6e 69 7a 65 20 28 63  eo_Polygonize (c
115b4 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
115b5 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
115b6 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
115b7 5f 54 6f 70 6f 53 6e 61 70 20 28 73 71 6c 69 74  _TopoSnap (sqlit
115b8 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
115b9 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
115ba 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  ..       sqlite3
115bb 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
115bc 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f  {.    fnctaux_To
115bd 70 6f 47 65 6f 5f 54 6f 70 6f 53 6e 61 70 20 28  poGeo_TopoSnap (
115be 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
115bf 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rgv);.}..static 
115c0 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65  void.fnct_TopoGe
115c1 6f 5f 53 6e 61 70 70 65 64 47 65 6f 54 61 62 6c  o_SnappedGeoTabl
115c2 65 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e (sqlite3_conte
115c3 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
115c4 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20  t argc,....     
115c5 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
115c6 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e  * argv).{.    fn
115c7 63 74 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 53 6e  ctaux_TopoGeo_Sn
115c8 61 70 70 65 64 47 65 6f 54 61 62 6c 65 20 28 63  appedGeoTable (c
115c9 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
115ca 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
115cb 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
115cc 5f 54 6f 47 65 6f 54 61 62 6c 65 20 28 73 71 6c  _ToGeoTable (sql
115cd 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
115ce 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
115cf 2c 0a 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61  ,.... sqlite3_va
115d0 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
115d1 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47     fnctaux_TopoG
115d2 65 6f 5f 54 6f 47 65 6f 54 61 62 6c 65 20 28 63  eo_ToGeoTable (c
115d3 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
115d4 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
115d5 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
115d6 5f 50 6f 6c 79 46 61 63 65 73 4c 69 73 74 20 28  _PolyFacesList (
115d7 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
115d8 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
115d9 72 67 63 2c 0a 09 09 09 20 20 20 20 73 71 6c 69  rgc,....    sqli
115da 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
115db 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78  v).{.    fnctaux
115dc 5f 54 6f 70 6f 47 65 6f 5f 50 6f 6c 79 46 61 63  _TopoGeo_PolyFac
115dd 65 73 4c 69 73 74 20 28 63 6f 6e 74 65 78 74 2c  esList (context,
115de 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a   argc, argv);.}.
115df 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
115e0 74 5f 54 6f 70 6f 47 65 6f 5f 4c 69 6e 65 45 64  t_TopoGeo_LineEd
115e1 67 65 73 4c 69 73 74 20 28 73 71 6c 69 74 65 33  gesList (sqlite3
115e2 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
115e3 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
115e4 09 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
115e5 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
115e6 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47 65    fnctaux_TopoGe
115e7 6f 5f 4c 69 6e 65 45 64 67 65 73 4c 69 73 74 20  o_LineEdgesList 
115e8 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
115e9 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
115ea 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47   void.fnct_TopoG
115eb 65 6f 5f 54 6f 47 65 6f 54 61 62 6c 65 47 65 6e  eo_ToGeoTableGen
115ec 65 72 61 6c 69 7a 65 20 28 73 71 6c 69 74 65 33  eralize (sqlite3
115ed 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
115ee 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
115ef 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ..   sqlite3_val
115f0 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
115f1 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47 65    fnctaux_TopoGe
115f2 6f 5f 54 6f 47 65 6f 54 61 62 6c 65 47 65 6e 65  o_ToGeoTableGene
115f3 72 61 6c 69 7a 65 20 28 63 6f 6e 74 65 78 74 2c  ralize (context,
115f4 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a   argc, argv);.}.
115f5 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
115f6 74 5f 54 6f 70 6f 47 65 6f 5f 52 65 6d 6f 76 65  t_TopoGeo_Remove
115f7 53 6d 61 6c 6c 46 61 63 65 73 20 28 73 71 6c 69  SmallFaces (sqli
115f8 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
115f9 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
115fa 0a 09 09 09 20 20 20 20 20 20 20 73 71 6c 69 74  ....       sqlit
115fb 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
115fc 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f  ).{.    fnctaux_
115fd 54 6f 70 6f 47 65 6f 5f 52 65 6d 6f 76 65 53 6d  TopoGeo_RemoveSm
115fe 61 6c 6c 46 61 63 65 73 20 28 63 6f 6e 74 65 78  allFaces (contex
115ff 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  t, argc, argv);.
11600 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66  }..static void.f
11601 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 52 65 6d 6f  nct_TopoGeo_Remo
11602 76 65 44 61 6e 67 6c 69 6e 67 45 64 67 65 73 20  veDanglingEdges 
11603 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11604 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
11605 61 72 67 63 2c 0a 09 09 09 09 20 20 73 71 6c 69  argc,.....  sqli
11606 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
11607 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78  v).{.    fnctaux
11608 5f 54 6f 70 6f 47 65 6f 5f 52 65 6d 6f 76 65 44  _TopoGeo_RemoveD
11609 61 6e 67 6c 69 6e 67 45 64 67 65 73 20 28 63 6f  anglingEdges (co
1160a 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
1160b 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  v);.}..static vo
1160c 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  id.fnct_TopoGeo_
1160d 52 65 6d 6f 76 65 44 61 6e 67 6c 69 6e 67 4e 6f  RemoveDanglingNo
1160e 64 65 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  des (sqlite3_con
1160f 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
11610 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 09 20 20  int argc,.....  
11611 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
11612 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
11613 74 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 52 65 6d  taux_TopoGeo_Rem
11614 6f 76 65 44 61 6e 67 6c 69 6e 67 4e 6f 64 65 73  oveDanglingNodes
11615 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
11616 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69   argv);.}..stati
11617 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f  c void.fnct_Topo
11618 47 65 6f 5f 4e 65 77 45 64 67 65 48 65 61 6c 20  Geo_NewEdgeHeal 
11619 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1161a 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
1161b 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c 69 74  argc,....  sqlit
1161c 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
1161d 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f  ).{.    fnctaux_
1161e 54 6f 70 6f 47 65 6f 5f 4e 65 77 45 64 67 65 48  TopoGeo_NewEdgeH
1161f 65 61 6c 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  eal (context, ar
11620 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
11621 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54  atic void.fnct_T
11622 6f 70 6f 47 65 6f 5f 4d 6f 64 45 64 67 65 48 65  opoGeo_ModEdgeHe
11623 61 6c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al (sqlite3_cont
11624 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69  ext * context, i
11625 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71  nt argc,....  sq
11626 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61  lite3_value ** a
11627 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61  rgv).{.    fncta
11628 75 78 5f 54 6f 70 6f 47 65 6f 5f 4d 6f 64 45 64  ux_TopoGeo_ModEd
11629 67 65 48 65 61 6c 20 28 63 6f 6e 74 65 78 74 2c  geHeal (context,
1162a 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a   argc, argv);.}.
1162b 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
1162c 74 5f 54 6f 70 6f 47 65 6f 5f 4e 65 77 45 64 67  t_TopoGeo_NewEdg
1162d 65 73 53 70 6c 69 74 20 28 73 71 6c 69 74 65 33  esSplit (sqlite3
1162e 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
1162f 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
11630 09 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
11631 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
11632 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47 65    fnctaux_TopoGe
11633 6f 5f 4e 65 77 45 64 67 65 73 53 70 6c 69 74 20  o_NewEdgesSplit 
11634 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
11635 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
11636 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47   void.fnct_TopoG
11637 65 6f 5f 4d 6f 64 45 64 67 65 53 70 6c 69 74 20  eo_ModEdgeSplit 
11638 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11639 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
1163a 61 72 67 63 2c 0a 09 09 09 20 20 20 73 71 6c 69  argc,....   sqli
1163b 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
1163c 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78  v).{.    fnctaux
1163d 5f 54 6f 70 6f 47 65 6f 5f 4d 6f 64 45 64 67 65  _TopoGeo_ModEdge
1163e 53 70 6c 69 74 20 28 63 6f 6e 74 65 78 74 2c 20  Split (context, 
1163f 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a  argc, argv);.}..
11640 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
11641 5f 54 6f 70 6f 47 65 6f 5f 43 72 65 61 74 65 54  _TopoGeo_CreateT
11642 6f 70 6f 4c 61 79 65 72 20 28 73 71 6c 69 74 65  opoLayer (sqlite
11643 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
11644 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
11645 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
11646 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b  value ** argv).{
11647 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70  .    fnctaux_Top
11648 6f 47 65 6f 5f 43 72 65 61 74 65 54 6f 70 6f 4c  oGeo_CreateTopoL
11649 61 79 65 72 20 28 63 6f 6e 74 65 78 74 2c 20 61  ayer (context, a
1164a 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73  rgc, argv);.}..s
1164b 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
1164c 54 6f 70 6f 47 65 6f 5f 49 6e 69 74 54 6f 70 6f  TopoGeo_InitTopo
1164d 4c 61 79 65 72 20 28 73 71 6c 69 74 65 33 5f 63  Layer (sqlite3_c
1164e 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
1164f 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
11650 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
11651 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
11652 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47 65 6f 5f  fnctaux_TopoGeo_
11653 49 6e 69 74 54 6f 70 6f 4c 61 79 65 72 20 28 63  InitTopoLayer (c
11654 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
11655 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
11656 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
11657 5f 52 65 6d 6f 76 65 54 6f 70 6f 4c 61 79 65 72  _RemoveTopoLayer
11658 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
11659 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
1165a 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20 20   argc,....      
1165b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1165c 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
1165d 74 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 52 65 6d  taux_TopoGeo_Rem
1165e 6f 76 65 54 6f 70 6f 4c 61 79 65 72 20 28 63 6f  oveTopoLayer (co
1165f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
11660 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  v);.}..static vo
11661 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  id.fnct_TopoGeo_
11662 45 78 70 6f 72 74 54 6f 70 6f 4c 61 79 65 72 20  ExportTopoLayer 
11663 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11664 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20   * context, int 
11665 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20 20 73  argc,....      s
11666 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
11667 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74  argv).{.    fnct
11668 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 45 78 70 6f  aux_TopoGeo_Expo
11669 72 74 54 6f 70 6f 4c 61 79 65 72 20 28 63 6f 6e  rtTopoLayer (con
1166a 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
1166b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1166c 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 49  d.fnct_TopoGeo_I
1166d 6e 73 65 72 74 46 65 61 74 75 72 65 46 72 6f 6d  nsertFeatureFrom
1166e 54 6f 70 6f 4c 61 79 65 72 20 28 73 71 6c 69 74  TopoLayer (sqlit
1166f 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
11670 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a  text, int argc,.
11671 09 09 09 09 09 20 73 71 6c 69 74 65 33 5f 76 61  ..... sqlite3_va
11672 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
11673 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 47     fnctaux_TopoG
11674 65 6f 5f 49 6e 73 65 72 74 46 65 61 74 75 72 65  eo_InsertFeature
11675 46 72 6f 6d 54 6f 70 6f 4c 61 79 65 72 20 28 63  FromTopoLayer (c
11676 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
11677 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
11678 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  oid.fnct_TopoGeo
11679 5f 43 6c 6f 6e 65 20 28 73 71 6c 69 74 65 33 5f  _Clone (sqlite3_
1167a 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
1167b 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
1167c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
1167d 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75  gv).{.    fnctau
1167e 78 5f 54 6f 70 6f 47 65 6f 5f 43 6c 6f 6e 65 20  x_TopoGeo_Clone 
1167f 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
11680 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
11681 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47   void.fnct_TopoG
11682 65 6f 5f 53 75 62 64 69 76 69 64 65 4c 69 6e 65  eo_SubdivideLine
11683 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  s (sqlite3_conte
11684 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e  xt * context, in
11685 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20 20 20  t argc,....     
11686 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
11687 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
11688 74 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 53 75 62  taux_TopoGeo_Sub
11689 64 69 76 69 64 65 4c 69 6e 65 73 20 28 63 6f 6e  divideLines (con
1168a 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
1168b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1168c 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 44  d.fnct_TopoGeo_D
1168d 69 73 61 6d 62 69 67 75 61 74 65 53 65 67 6d 65  isambiguateSegme
1168e 6e 74 45 64 67 65 73 20 28 73 71 6c 69 74 65 33  ntEdges (sqlite3
1168f 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65  _context * conte
11690 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09  xt, int argc,...
11691 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  ..       sqlite3
11692 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
11693 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f  {.    fnctaux_To
11694 70 6f 47 65 6f 5f 44 69 73 61 6d 62 69 67 75 61  poGeo_Disambigua
11695 74 65 53 65 67 6d 65 6e 74 45 64 67 65 73 20 28  teSegmentEdges (
11696 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
11697 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rgv);.}..static 
11698 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 47 65  void.fnct_TopoGe
11699 6f 5f 47 65 74 45 64 67 65 53 65 65 64 20 28 73  o_GetEdgeSeed (s
1169a 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1169b 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
1169c 67 63 2c 0a 09 09 09 20 20 73 71 6c 69 74 65 33  gc,....  sqlite3
1169d 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
1169e 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f  {.    fnctaux_To
1169f 70 6f 47 65 6f 5f 47 65 74 45 64 67 65 53 65 65  poGeo_GetEdgeSee
116a0 64 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  d (context, argc
116a1 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74  , argv);.}..stat
116a2 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70  ic void.fnct_Top
116a3 6f 47 65 6f 5f 47 65 74 46 61 63 65 53 65 65 64  oGeo_GetFaceSeed
116a4 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
116a5 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
116a6 20 61 72 67 63 2c 0a 09 09 09 20 20 73 71 6c 69   argc,....  sqli
116a7 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67  te3_value ** arg
116a8 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78  v).{.    fnctaux
116a9 5f 54 6f 70 6f 47 65 6f 5f 47 65 74 46 61 63 65  _TopoGeo_GetFace
116aa 53 65 65 64 20 28 63 6f 6e 74 65 78 74 2c 20 61  Seed (context, a
116ab 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73  rgc, argv);.}..s
116ac 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
116ad 54 6f 70 6f 47 65 6f 5f 55 70 64 61 74 65 53 65  TopoGeo_UpdateSe
116ae 65 64 73 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  eds (sqlite3_con
116af 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
116b0 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 73  int argc,....  s
116b1 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20  qlite3_value ** 
116b2 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74  argv).{.    fnct
116b3 61 75 78 5f 54 6f 70 6f 47 65 6f 5f 55 70 64 61  aux_TopoGeo_Upda
116b4 74 65 53 65 65 64 73 20 28 63 6f 6e 74 65 78 74  teSeeds (context
116b5 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
116b6 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
116b7 63 74 5f 54 6f 70 6f 47 65 6f 5f 53 6e 61 70 50  ct_TopoGeo_SnapP
116b8 6f 69 6e 74 54 6f 53 65 65 64 20 28 73 71 6c 69  ointToSeed (sqli
116b9 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
116ba 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
116bb 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 74 65  ....      sqlite
116bc 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29  3_value ** argv)
116bd 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54  .{.    fnctaux_T
116be 6f 70 6f 47 65 6f 5f 53 6e 61 70 50 6f 69 6e 74  opoGeo_SnapPoint
116bf 54 6f 53 65 65 64 20 28 63 6f 6e 74 65 78 74 2c  ToSeed (context,
116c0 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a   argc, argv);.}.
116c1 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
116c2 74 5f 54 6f 70 6f 47 65 6f 5f 53 6e 61 70 4c 69  t_TopoGeo_SnapLi
116c3 6e 65 54 6f 53 65 65 64 20 28 73 71 6c 69 74 65  neToSeed (sqlite
116c4 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
116c5 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
116c6 09 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ..     sqlite3_v
116c7 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
116c8 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f      fnctaux_Topo
116c9 47 65 6f 5f 53 6e 61 70 4c 69 6e 65 54 6f 53 65  Geo_SnapLineToSe
116ca 65 64 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ed (context, arg
116cb 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61  c, argv);.}..sta
116cc 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 43 72  tic void.fnct_Cr
116cd 65 61 74 65 4e 65 74 77 6f 72 6b 20 28 73 71 6c  eateNetwork (sql
116ce 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
116cf 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
116d0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
116d1 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66  ** argv).{.    f
116d2 6e 63 74 61 75 78 5f 43 72 65 61 74 65 4e 65 74  nctaux_CreateNet
116d3 77 6f 72 6b 20 28 63 6f 6e 74 65 78 74 2c 20 61  work (context, a
116d4 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73  rgc, argv);.}..s
116d5 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f  tatic void.fnct_
116d6 44 72 6f 70 4e 65 74 77 6f 72 6b 20 28 73 71 6c  DropNetwork (sql
116d7 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
116d8 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
116d9 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
116da 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66  ** argv).{.    f
116db 6e 63 74 61 75 78 5f 44 72 6f 70 4e 65 74 77 6f  nctaux_DropNetwo
116dc 72 6b 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  rk (context, arg
116dd 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61  c, argv);.}..sta
116de 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 47 65  tic void.fnct_Ge
116df 74 4c 61 73 74 4e 65 74 77 6f 72 6b 45 78 63 65  tLastNetworkExce
116e0 70 74 69 6f 6e 20 28 73 71 6c 69 74 65 33 5f 63  ption (sqlite3_c
116e1 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74  ontext * context
116e2 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20  , int argc,.... 
116e3 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
116e4 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
116e5 20 20 66 6e 63 74 61 75 78 5f 47 65 74 4c 61 73    fnctaux_GetLas
116e6 74 4e 65 74 77 6f 72 6b 45 78 63 65 70 74 69 6f  tNetworkExceptio
116e7 6e 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  n (context, argc
116e8 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74  , argv);.}..stat
116e9 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 41 64 64  ic void.fnct_Add
116ea 49 73 6f 4e 65 74 4e 6f 64 65 20 28 73 71 6c 69  IsoNetNode (sqli
116eb 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
116ec 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
116ed 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
116ee 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e  * argv).{.    fn
116ef 63 74 61 75 78 5f 41 64 64 49 73 6f 4e 65 74 4e  ctaux_AddIsoNetN
116f0 6f 64 65 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  ode (context, ar
116f1 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
116f2 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4d  atic void.fnct_M
116f3 6f 76 65 49 73 6f 4e 65 74 4e 6f 64 65 20 28 73  oveIsoNetNode (s
116f4 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
116f5 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72   context, int ar
116f6 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
116f7 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
116f8 20 66 6e 63 74 61 75 78 5f 4d 6f 76 65 49 73 6f   fnctaux_MoveIso
116f9 4e 65 74 4e 6f 64 65 20 28 63 6f 6e 74 65 78 74  NetNode (context
116fa 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
116fb 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
116fc 63 74 5f 52 65 6d 49 73 6f 4e 65 74 4e 6f 64 65  ct_RemIsoNetNode
116fd 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
116fe 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
116ff 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
11700 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
11701 20 20 20 20 66 6e 63 74 61 75 78 5f 52 65 6d 49      fnctaux_RemI
11702 73 6f 4e 65 74 4e 6f 64 65 20 28 63 6f 6e 74 65  soNetNode (conte
11703 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
11704 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
11705 66 6e 63 74 5f 41 64 64 4c 69 6e 6b 20 28 73 71  fnct_AddLink (sq
11706 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
11707 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
11708 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
11709 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
1170a 66 6e 63 74 61 75 78 5f 41 64 64 4c 69 6e 6b 20  fnctaux_AddLink 
1170b 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
1170c 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
1170d 20 76 6f 69 64 0a 66 6e 63 74 5f 43 68 61 6e 67   void.fnct_Chang
1170e 65 4c 69 6e 6b 47 65 6f 6d 20 28 73 71 6c 69 74  eLinkGeom (sqlit
1170f 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
11710 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
11711 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
11712 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
11713 74 61 75 78 5f 43 68 61 6e 67 65 4c 69 6e 6b 47  taux_ChangeLinkG
11714 65 6f 6d 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  eom (context, ar
11715 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
11716 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 52  atic void.fnct_R
11717 65 6d 6f 76 65 4c 69 6e 6b 20 28 73 71 6c 69 74  emoveLink (sqlit
11718 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e  e3_context * con
11719 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
1171a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1171b 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
1171c 74 61 75 78 5f 52 65 6d 6f 76 65 4c 69 6e 6b 20  taux_RemoveLink 
1171d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
1171e 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
1171f 20 76 6f 69 64 0a 66 6e 63 74 5f 4e 65 77 4c 6f   void.fnct_NewLo
11720 67 4c 69 6e 6b 53 70 6c 69 74 20 28 73 71 6c 69  gLinkSplit (sqli
11721 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
11722 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
11723 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
11724 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
11725 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 4e 65  {.    fnctaux_Ne
11726 77 4c 6f 67 4c 69 6e 6b 53 70 6c 69 74 20 28 63  wLogLinkSplit (c
11727 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
11728 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
11729 6f 69 64 0a 66 6e 63 74 5f 4d 6f 64 4c 6f 67 4c  oid.fnct_ModLogL
1172a 69 6e 6b 53 70 6c 69 74 20 28 73 71 6c 69 74 65  inkSplit (sqlite
1172b 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
1172c 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
1172d 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
1172e 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
1172f 20 20 20 20 66 6e 63 74 61 75 78 5f 4d 6f 64 4c      fnctaux_ModL
11730 6f 67 4c 69 6e 6b 53 70 6c 69 74 20 28 63 6f 6e  ogLinkSplit (con
11731 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
11732 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
11733 64 0a 66 6e 63 74 5f 4e 65 77 47 65 6f 4c 69 6e  d.fnct_NewGeoLin
11734 6b 53 70 6c 69 74 20 28 73 71 6c 69 74 65 33 5f  kSplit (sqlite3_
11735 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
11736 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20  t, int argc,... 
11737 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
11738 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
11739 20 20 66 6e 63 74 61 75 78 5f 4e 65 77 47 65 6f    fnctaux_NewGeo
1173a 4c 69 6e 6b 53 70 6c 69 74 20 28 63 6f 6e 74 65  LinkSplit (conte
1173b 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
1173c 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
1173d 66 6e 63 74 5f 4d 6f 64 47 65 6f 4c 69 6e 6b 53  fnct_ModGeoLinkS
1173e 70 6c 69 74 20 28 73 71 6c 69 74 65 33 5f 63 6f  plit (sqlite3_co
1173f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c  ntext * context,
11740 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20 20 20   int argc,...   
11741 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
11742 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
11743 66 6e 63 74 61 75 78 5f 4d 6f 64 47 65 6f 4c 69  fnctaux_ModGeoLi
11744 6e 6b 53 70 6c 69 74 20 28 63 6f 6e 74 65 78 74  nkSplit (context
11745 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
11746 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
11747 63 74 5f 4d 6f 64 4c 69 6e 6b 48 65 61 6c 20 28  ct_ModLinkHeal (
11748 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
11749 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
1174a 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1174b 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
1174c 20 20 66 6e 63 74 61 75 78 5f 4d 6f 64 4c 69 6e    fnctaux_ModLin
1174d 6b 48 65 61 6c 20 28 63 6f 6e 74 65 78 74 2c 20  kHeal (context, 
1174e 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a  argc, argv);.}..
1174f 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74  static void.fnct
11750 5f 4e 65 77 4c 69 6e 6b 48 65 61 6c 20 28 73 71  _NewLinkHeal (sq
11751 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
11752 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
11753 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
11754 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20   ** argv).{.    
11755 66 6e 63 74 61 75 78 5f 4e 65 77 4c 69 6e 6b 48  fnctaux_NewLinkH
11756 65 61 6c 20 28 63 6f 6e 74 65 78 74 2c 20 61 72  eal (context, ar
11757 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74  gc, argv);.}..st
11758 61 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 4c  atic void.fnct_L
11759 6f 67 69 4e 65 74 46 72 6f 6d 54 47 65 6f 20 28  ogiNetFromTGeo (
1175a 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1175b 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
1175c 72 67 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c  rgc,...      sql
1175d 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
1175e 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75  gv).{.    fnctau
1175f 78 5f 4c 6f 67 69 4e 65 74 46 72 6f 6d 54 47 65  x_LogiNetFromTGe
11760 6f 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  o (context, argc
11761 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74  , argv);.}..stat
11762 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 53 70 61  ic void.fnct_Spa
11763 74 4e 65 74 46 72 6f 6d 54 47 65 6f 20 28 73 71  tNetFromTGeo (sq
11764 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20  lite3_context * 
11765 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
11766 63 2c 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74  c,...      sqlit
11767 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76  e3_value ** argv
11768 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f  ).{.    fnctaux_
11769 53 70 61 74 4e 65 74 46 72 6f 6d 54 47 65 6f 20  SpatNetFromTGeo 
1176a 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
1176b 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
1176c 20 76 6f 69 64 0a 66 6e 63 74 5f 53 70 61 74 4e   void.fnct_SpatN
1176d 65 74 46 72 6f 6d 47 65 6f 6d 20 28 73 71 6c 69  etFromGeom (sqli
1176e 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
1176f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
11770 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33  ...      sqlite3
11771 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
11772 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 53 70  {.    fnctaux_Sp
11773 61 74 4e 65 74 46 72 6f 6d 47 65 6f 6d 20 28 63  atNetFromGeom (c
11774 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
11775 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  gv);.}..static v
11776 6f 69 64 0a 66 6e 63 74 5f 56 61 6c 69 64 4c 6f  oid.fnct_ValidLo
11777 67 69 63 61 6c 4e 65 74 20 28 73 71 6c 69 74 65  gicalNet (sqlite
11778 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
11779 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
1177a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
1177b 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
1177c 20 20 20 20 66 6e 63 74 61 75 78 5f 56 61 6c 69      fnctaux_Vali
1177d 64 4c 6f 67 69 63 61 6c 4e 65 74 20 28 63 6f 6e  dLogicalNet (con
1177e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
1177f 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
11780 64 0a 66 6e 63 74 5f 56 61 6c 69 64 53 70 61 74  d.fnct_ValidSpat
11781 69 61 6c 4e 65 74 20 28 73 71 6c 69 74 65 33 5f  ialNet (sqlite3_
11782 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
11783 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 20  t, int argc,... 
11784 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
11785 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20  ue ** argv).{.  
11786 20 20 66 6e 63 74 61 75 78 5f 56 61 6c 69 64 53    fnctaux_ValidS
11787 70 61 74 69 61 6c 4e 65 74 20 28 63 6f 6e 74 65  patialNet (conte
11788 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
11789 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
1178a 66 6e 63 74 5f 47 65 74 4e 65 74 4e 6f 64 65 42  fnct_GetNetNodeB
1178b 79 50 6f 69 6e 74 20 28 73 71 6c 69 74 65 33 5f  yPoint (sqlite3_
1178c 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74 65 78  context * contex
1178d 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09 09 09  t, int argc,....
1178e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1178f 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63   argv).{.    fnc
11790 74 61 75 78 5f 47 65 74 4e 65 74 4e 6f 64 65 42  taux_GetNetNodeB
11791 79 50 6f 69 6e 74 20 28 63 6f 6e 74 65 78 74 2c  yPoint (context,
11792 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d 0a   argc, argv);.}.
11793 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e 63  .static void.fnc
11794 74 5f 47 65 74 4c 69 6e 6b 42 79 50 6f 69 6e 74  t_GetLinkByPoint
11795 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
11796 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
11797 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
11798 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
11799 20 20 20 20 66 6e 63 74 61 75 78 5f 47 65 74 4c      fnctaux_GetL
1179a 69 6e 6b 42 79 50 6f 69 6e 74 20 28 63 6f 6e 74  inkByPoint (cont
1179b 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29  ext, argc, argv)
1179c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1179d 0a 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f 46 72  .fnct_TopoNet_Fr
1179e 6f 6d 47 65 6f 54 61 62 6c 65 20 28 73 71 6c 69  omGeoTable (sqli
1179f 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f  te3_context * co
117a0 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
117a1 0a 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76  ....   sqlite3_v
117a2 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
117a3 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f      fnctaux_Topo
117a4 4e 65 74 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Net_FromGeoTable
117a5 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
117a6 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69   argv);.}..stati
117a7 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f  c void.fnct_Topo
117a8 4e 65 74 5f 54 6f 47 65 6f 54 61 62 6c 65 20 28  Net_ToGeoTable (
117a9 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
117aa 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  * context, int a
117ab 72 67 63 2c 0a 09 09 09 20 73 71 6c 69 74 65 33  rgc,.... sqlite3
117ac 5f 76 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a  _value ** argv).
117ad 7b 0a 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f  {.    fnctaux_To
117ae 70 6f 4e 65 74 5f 54 6f 47 65 6f 54 61 62 6c 65  poNet_ToGeoTable
117af 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c   (context, argc,
117b0 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69   argv);.}..stati
117b1 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f  c void.fnct_Topo
117b2 4e 65 74 5f 54 6f 47 65 6f 54 61 62 6c 65 47 65  Net_ToGeoTableGe
117b3 6e 65 72 61 6c 69 7a 65 20 28 73 71 6c 69 74 65  neralize (sqlite
117b4 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
117b5 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
117b6 09 09 09 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ...   sqlite3_va
117b7 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20  lue ** argv).{. 
117b8 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 4e     fnctaux_TopoN
117b9 65 74 5f 54 6f 47 65 6f 54 61 62 6c 65 47 65 6e  et_ToGeoTableGen
117ba 65 72 61 6c 69 7a 65 20 28 63 6f 6e 74 65 78 74  eralize (context
117bb 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 7d  , argc, argv);.}
117bc 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 66 6e  ..static void.fn
117bd 63 74 5f 54 6f 70 6f 4e 65 74 5f 43 6c 6f 6e 65  ct_TopoNet_Clone
117be 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
117bf 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  t * context, int
117c0 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
117c1 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
117c2 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f      fnctaux_Topo
117c3 4e 65 74 5f 43 6c 6f 6e 65 20 28 63 6f 6e 74 65  Net_Clone (conte
117c4 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  xt, argc, argv);
117c5 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
117c6 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f 47 65 74  fnct_TopoNet_Get
117c7 4c 69 6e 6b 53 65 65 64 20 28 73 71 6c 69 74 65  LinkSeed (sqlite
117c8 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63 6f 6e 74  3_context * cont
117c9 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 0a 09  ext, int argc,..
117ca 09 09 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
117cb 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20  e ** argv).{.   
117cc 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f 4e 65 74   fnctaux_TopoNet
117cd 5f 47 65 74 4c 69 6e 6b 53 65 65 64 20 28 63 6f  _GetLinkSeed (co
117ce 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
117cf 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  v);.}..static vo
117d0 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f  id.fnct_TopoNet_
117d1 55 70 64 61 74 65 53 65 65 64 73 20 28 73 71 6c  UpdateSeeds (sql
117d2 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
117d3 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
117d4 2c 0a 09 09 09 20 20 73 71 6c 69 74 65 33 5f 76  ,....  sqlite3_v
117d5 61 6c 75 65 20 2a 2a 20 61 72 67 76 29 0a 7b 0a  alue ** argv).{.
117d6 20 20 20 20 66 6e 63 74 61 75 78 5f 54 6f 70 6f      fnctaux_Topo
117d7 4e 65 74 5f 55 70 64 61 74 65 53 65 65 64 73 20  Net_UpdateSeeds 
117d8 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
117d9 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  argv);.}..static
117da 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f 70 6f 4e   void.fnct_TopoN
117db 65 74 5f 44 69 73 61 6d 62 69 67 75 61 74 65 53  et_DisambiguateS
117dc 65 67 6d 65 6e 74 4c 69 6e 6b 73 20 28 73 71 6c  egmentLinks (sql
117dd 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 20 63  ite3_context * c
117de 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
117df 2c 0a 09 09 09 09 20 20 20 20 20 20 20 73 71 6c  ,.....       sql
117e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 20 61 72  ite3_value ** ar
117e1 67 76 29 0a 7b 0a 20 20 20 20 66 6e 63 74 61 75  gv).{.    fnctau
117e2 78 5f 54 6f 70 6f 4e 65 74 5f 44 69 73 61 6d 62  x_TopoNet_Disamb
117e3 69 67 75 61 74 65 53 65 67 6d 65 6e 74 4c 69 6e  iguateSegmentLin
117e4 6b 73 20 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ks (context, arg
117e5 63 2c 20 61 72 67 76 29 3b 0a 7d 0a 0a 73 74 61  c, argv);.}..sta
117e6 74 69 63 20 76 6f 69 64 0a 66 6e 63 74 5f 54 6f  tic void.fnct_To
117e7 70 6f 4e 65 74 5f 4c 69 6e 65 4c 69 6e 6b 73 4c  poNet_LineLinksL
117e8 69 73 74 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  ist (sqlite3_con
117e9 74 65 78 74 20 2a 20 63 6f 6e 74 65 78 74 2c 20  text * context, 
117ea 69 6e 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  int argc,....   
117eb 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
117ec 2a 20 61 72 67 76 29 0a 7b 0a 20 20 20 20 66 6e  * argv).{.    fn
117ed 63 74 61 75 78 5f 54 6f 70 6f 4e 65 74 5f 4c 69  ctaux_TopoNet_Li
117ee 6e 65 4c 69 6e 6b 73 4c 69 73 74 20 28 63 6f 6e  neLinksList (con
117ef 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
117f0 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
117f1 65 6e 64 20 54 4f 50 4f 4c 4f 47 59 20 63 6f 6e  end TOPOLOGY con
117f2 64 69 74 69 6f 6e 61 6c 73 20 2a 2f 0a 0a 23 69  ditionals */..#i
117f3 66 64 65 66 20 4c 4f 41 44 41 42 4c 45 5f 45 58  fdef LOADABLE_EX
117f4 54 45 4e 53 49 4f 4e 0a 73 74 61 74 69 63 20 76  TENSION.static v
117f5 6f 69 64 0a 73 70 6c 69 74 65 5f 63 6c 6f 73 65  oid.splite_close
117f6 5f 63 61 6c 6c 62 61 63 6b 20 28 76 6f 69 64 20  _callback (void 
117f7 2a 70 5f 63 61 63 68 65 29 0a 7b 0a 2f 2a 0a 2f  *p_cache).{./*./
117f8 20 74 68 65 20 44 42 20 63 6f 6e 6e 65 63 74 69   the DB connecti
117f9 6f 6e 20 68 61 73 20 62 65 65 6e 20 74 65 72 6d  on has been term
117fa 69 6e 61 74 65 64 20 0a 2f 0a 2f 20 74 68 69 73  inated ././ this
117fb 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
117fc 6f 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  on is expected t
117fd 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 6f 6e 6c  o be invoked onl
117fe 79 20 69 66 20 0a 2f 20 53 70 61 74 69 61 4c 69  y if ./ SpatiaLi
117ff 74 65 20 77 61 73 20 6c 6f 61 64 65 64 20 61 73  te was loaded as
11800 20 61 20 64 79 6e 61 6d 69 63 20 65 78 74 65 6e   a dynamic exten
11801 73 69 6f 6e 20 61 6e 64 20 77 69 6c 6c 0a 2f 20  sion and will./ 
11802 70 65 72 66 6f 72 6d 20 61 20 66 69 6e 61 6c 20  perform a final 
11803 63 6c 65 61 6e 2d 75 70 20 72 65 6c 65 61 73 69  clean-up releasi
11804 6e 67 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ng the internal 
11805 63 61 63 68 65 0a 2f 0a 2a 2f 0a 20 20 20 20 73  cache./.*/.    s
11806 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74  truct splite_int
11807 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63  ernal_cache *cac
11808 68 65 20 3d 0a 09 28 73 74 72 75 63 74 20 73 70  he =..(struct sp
11809 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
1180a 63 68 65 20 2a 29 20 70 5f 63 61 63 68 65 3b 0a  che *) p_cache;.
1180b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 3d  .    if (cache =
1180c 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  = NULL)..return;
1180d 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e  .    if (cache->
1180e 6d 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 41  magic1 != SPATIA
1180f 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43  LITE_CACHE_MAGIC
11810 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67  1..|| cache->mag
11811 69 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54  ic2 != SPATIALIT
11812 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a  E_CACHE_MAGIC2).
11813 09 72 65 74 75 72 6e 3b 0a 0a 23 69 66 64 65 66  .return;..#ifdef
11814 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 0a 20   ENABLE_RTTOPO. 
11815 20 20 20 67 61 69 61 52 65 73 65 74 52 74 54 6f     gaiaResetRtTo
11816 70 6f 4d 73 67 20 28 63 61 63 68 65 29 3b 0a 23  poMsg (cache);.#
11817 65 6e 64 69 66 0a 0a 20 20 20 20 66 72 65 65 5f  endif..    free_
11818 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 28  internal_cache (
11819 63 61 63 68 65 29 3b 0a 7d 0a 23 65 6e 64 69 66  cache);.}.#endif
1181a 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f 50 52 49  ..SPATIALITE_PRI
1181b 56 41 54 45 20 76 6f 69 64 20 2a 0a 72 65 67 69  VATE void *.regi
1181c 73 74 65 72 5f 73 70 61 74 69 61 6c 69 74 65 5f  ster_spatialite_
1181d 73 71 6c 5f 66 75 6e 63 74 69 6f 6e 73 20 28 76  sql_functions (v
1181e 6f 69 64 20 2a 70 5f 64 62 2c 20 63 6f 6e 73 74  oid *p_db, const
1181f 20 76 6f 69 64 20 2a 70 5f 63 61 63 68 65 29 0a   void *p_cache).
11820 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
11821 62 20 3d 20 70 5f 64 62 3b 0a 20 20 20 20 73 74  b = p_db;.    st
11822 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
11823 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68  rnal_cache *cach
11824 65 20 3d 0a 09 28 73 74 72 75 63 74 20 73 70 6c  e =..(struct spl
11825 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63  ite_internal_cac
11826 68 65 20 2a 29 20 70 5f 63 61 63 68 65 3b 0a 20  he *) p_cache;. 
11827 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
11828 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 3b 0a 0a  ecurity_level;..
11829 23 69 66 64 65 66 20 4c 4f 41 44 41 42 4c 45 5f  #ifdef LOADABLE_
1182a 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 20 72 65 67  EXTENSION./* reg
1182b 69 73 74 65 72 69 6e 67 20 74 68 65 20 43 4c 4f  istering the CLO
1182c 53 45 2d 43 41 4c 4c 42 41 43 4b 20 66 75 6e 63  SE-CALLBACK func
1182d 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  tion */.    sqli
1182e 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1182f 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 73 70 61  ion_v2 (db, "spa
11830 74 69 61 6c 69 74 65 5f 76 65 72 73 69 6f 6e 22  tialite_version"
11831 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
11832 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11833 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11834 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70 61  he,.....fnct_spa
11835 74 69 61 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c  tialite_version,
11836 20 30 2c 20 30 2c 0a 09 09 09 09 73 70 6c 69 74   0, 0,.....split
11837 65 5f 63 6c 6f 73 65 5f 63 61 6c 6c 62 61 63 6b  e_close_callback
11838 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
11839 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1183a 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 73 70  tion_v2 (db, "sp
1183b 61 74 69 61 6c 69 74 65 5f 76 65 72 73 69 6f 6e  atialite_version
1183c 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 0,.....SQLITE
1183d 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1183e 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1183f 0a 09 09 09 09 66 6e 63 74 5f 73 70 61 74 69 61  .....fnct_spatia
11840 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20 30 2c  lite_version, 0,
11841 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a   0, 0);.#endif..
11842 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11843 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11844 64 62 2c 20 22 73 70 61 74 69 61 6c 69 74 65 5f  db, "spatialite_
11845 74 61 72 67 65 74 5f 63 70 75 22 2c 20 30 2c 0a  target_cpu", 0,.
11846 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11847 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11848 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
11849 6e 63 74 5f 73 70 61 74 69 61 6c 69 74 65 5f 74  nct_spatialite_t
1184a 61 72 67 65 74 5f 63 70 75 2c 20 30 2c 20 30 2c  arget_cpu, 0, 0,
1184b 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1184c 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1184d 5f 76 32 20 28 64 62 2c 20 22 66 72 65 65 78 6c  _v2 (db, "freexl
1184e 5f 76 65 72 73 69 6f 6e 22 2c 20 30 2c 0a 09 09  _version", 0,...
1184f 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11850 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11851 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11852 74 5f 66 72 65 65 78 6c 5f 76 65 72 73 69 6f 6e  t_freexl_version
11853 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11854 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11855 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11856 22 70 72 6f 6a 34 5f 76 65 72 73 69 6f 6e 22 2c  "proj4_version",
11857 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   0,.....SQLITE_U
11858 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11859 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
1185a 09 09 09 66 6e 63 74 5f 70 72 6f 6a 34 5f 76 65  ...fnct_proj4_ve
1185b 72 73 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  rsion, 0, 0, 0);
1185c 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1185d 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1185e 28 64 62 2c 20 22 67 65 6f 73 5f 76 65 72 73 69  (db, "geos_versi
1185f 6f 6e 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49  on", 0,.....SQLI
11860 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
11861 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
11862 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67 65 6f 73  0,.....fnct_geos
11863 5f 76 65 72 73 69 6f 6e 2c 20 30 2c 20 30 2c 20  _version, 0, 0, 
11864 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11865 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11866 76 32 20 28 64 62 2c 20 22 72 74 74 6f 70 6f 5f  v2 (db, "rttopo_
11867 76 65 72 73 69 6f 6e 22 2c 20 30 2c 0a 09 09 09  version", 0,....
11868 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11869 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1186a 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1186b 5f 72 74 74 6f 70 6f 5f 76 65 72 73 69 6f 6e 2c  _rttopo_version,
1186c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1186d 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1186e 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1186f 6c 69 62 78 6d 6c 32 5f 76 65 72 73 69 6f 6e 22  libxml2_version"
11870 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
11871 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11872 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
11873 09 09 09 09 66 6e 63 74 5f 6c 69 62 78 6d 6c 32  ....fnct_libxml2
11874 5f 76 65 72 73 69 6f 6e 2c 20 30 2c 20 30 2c 20  _version, 0, 0, 
11875 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11876 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11877 76 32 20 28 64 62 2c 20 22 48 61 73 50 72 6f 6a  v2 (db, "HasProj
11878 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 0,.....SQLITE
11879 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1187a 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1187b 0a 09 09 09 09 66 6e 63 74 5f 68 61 73 5f 70 72  .....fnct_has_pr
1187c 6f 6a 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  oj, 0, 0, 0);.  
1187d 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1187e 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1187f 2c 20 22 48 61 73 50 72 6f 6a 47 65 6f 64 65 73  , "HasProjGeodes
11880 69 63 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49  ic", 0,.....SQLI
11881 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
11882 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
11883 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68 61 73 5f  0,.....fnct_has_
11884 70 72 6f 6a 5f 67 65 6f 64 65 73 69 63 2c 20 30  proj_geodesic, 0
11885 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11886 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11887 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 48 61  tion_v2 (db, "Ha
11888 73 47 65 6f 73 22 2c 20 30 2c 0a 09 09 09 09 53  sGeos", 0,.....S
11889 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1188a 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1188b 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68  C, 0,.....fnct_h
1188c 61 73 5f 67 65 6f 73 2c 20 30 2c 20 30 2c 20 30  as_geos, 0, 0, 0
1188d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1188e 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1188f 32 20 28 64 62 2c 20 22 48 61 73 47 65 6f 73 41  2 (db, "HasGeosA
11890 64 76 61 6e 63 65 64 22 2c 20 30 2c 0a 09 09 09  dvanced", 0,....
11891 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11892 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11893 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11894 5f 68 61 73 5f 67 65 6f 73 5f 61 64 76 61 6e 63  _has_geos_advanc
11895 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
11896 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11897 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11898 2c 20 22 48 61 73 47 65 6f 73 54 72 75 6e 6b 22  , "HasGeosTrunk"
11899 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
1189a 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1189b 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
1189c 09 09 09 09 66 6e 63 74 5f 68 61 73 5f 67 65 6f  ....fnct_has_geo
1189d 73 5f 74 72 75 6e 6b 2c 20 30 2c 20 30 2c 20 30  s_trunk, 0, 0, 0
1189e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1189f 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
118a0 32 20 28 64 62 2c 20 22 48 61 73 47 65 6f 73 52  2 (db, "HasGeosR
118a1 65 65 6e 74 72 61 6e 74 22 2c 20 30 2c 0a 09 09  eentrant", 0,...
118a2 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
118a3 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
118a4 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
118a5 74 5f 68 61 73 5f 67 65 6f 73 5f 72 65 65 6e 74  t_has_geos_reent
118a6 72 61 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rant, 0, 0, 0);.
118a7 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
118a8 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
118a9 64 62 2c 20 22 48 61 73 47 65 6f 73 4f 6e 6c 79  db, "HasGeosOnly
118aa 52 65 65 6e 74 72 61 6e 74 22 2c 20 30 2c 0a 09  Reentrant", 0,..
118ab 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
118ac 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
118ad 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
118ae 63 74 5f 68 61 73 5f 67 65 6f 73 5f 6f 6e 6c 79  ct_has_geos_only
118af 5f 72 65 65 6e 74 72 61 6e 74 2c 20 30 2c 20 30  _reentrant, 0, 0
118b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
118b1 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
118b2 6e 5f 76 32 20 28 64 62 2c 20 22 48 61 73 52 74  n_v2 (db, "HasRt
118b3 54 6f 70 6f 22 2c 20 30 2c 0a 09 09 09 09 53 51  Topo", 0,.....SQ
118b4 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
118b5 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
118b6 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68 61  , 0,.....fnct_ha
118b7 73 5f 72 74 74 6f 70 6f 2c 20 30 2c 20 30 2c 20  s_rttopo, 0, 0, 
118b8 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
118b9 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
118ba 76 32 20 28 64 62 2c 20 22 48 61 73 4d 61 74 68  v2 (db, "HasMath
118bb 53 71 6c 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c  Sql", 0,.....SQL
118bc 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
118bd 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
118be 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68 61 73   0,.....fnct_has
118bf 5f 6d 61 74 68 5f 73 71 6c 2c 20 30 2c 20 30 2c  _math_sql, 0, 0,
118c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
118c1 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
118c2 5f 76 32 20 28 64 62 2c 20 22 48 61 73 47 65 6f  _v2 (db, "HasGeo
118c3 43 61 6c 6c 62 61 63 6b 73 22 2c 20 30 2c 0a 09  Callbacks", 0,..
118c4 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
118c5 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
118c6 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
118c7 63 74 5f 68 61 73 5f 67 65 6f 5f 63 61 6c 6c 62  ct_has_geo_callb
118c8 61 63 6b 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  acks, 0, 0, 0);.
118c9 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
118ca 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
118cb 64 62 2c 20 22 48 61 73 49 63 6f 6e 76 22 2c 20  db, "HasIconv", 
118cc 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  0,.....SQLITE_UT
118cd 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
118ce 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
118cf 09 09 66 6e 63 74 5f 68 61 73 5f 69 63 6f 6e 76  ..fnct_has_iconv
118d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
118d1 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
118d2 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
118d3 22 48 61 73 46 72 65 65 58 4c 22 2c 20 30 2c 0a  "HasFreeXL", 0,.
118d4 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
118d5 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
118d6 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
118d7 6e 63 74 5f 68 61 73 5f 66 72 65 65 58 4c 2c 20  nct_has_freeXL, 
118d8 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
118d9 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
118da 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 48  ction_v2 (db, "H
118db 61 73 45 70 73 67 22 2c 20 30 2c 0a 09 09 09 09  asEpsg", 0,.....
118dc 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
118dd 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
118de 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
118df 68 61 73 5f 65 70 73 67 2c 20 30 2c 20 30 2c 20  has_epsg, 0, 0, 
118e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
118e1 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
118e2 76 32 20 28 64 62 2c 20 22 48 61 73 4c 69 62 58  v2 (db, "HasLibX
118e3 4d 4c 32 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c  ML2", 0,.....SQL
118e4 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
118e5 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
118e6 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68 61 73   0,.....fnct_has
118e7 5f 6c 69 62 78 6d 6c 32 2c 20 30 2c 20 30 2c 20  _libxml2, 0, 0, 
118e8 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
118e9 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
118ea 76 32 20 28 64 62 2c 20 22 48 61 73 47 65 6f 50  v2 (db, "HasGeoP
118eb 61 63 6b 61 67 65 22 2c 20 30 2c 0a 09 09 09 09  ackage", 0,.....
118ec 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
118ed 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
118ee 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
118ef 68 61 73 5f 67 65 6f 70 61 63 6b 61 67 65 2c 20  has_geopackage, 
118f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
118f1 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
118f2 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 48  ction_v2 (db, "H
118f3 61 73 47 43 50 22 2c 20 30 2c 0a 09 09 09 09 53  asGCP", 0,.....S
118f4 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
118f5 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
118f6 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68  C, 0,.....fnct_h
118f7 61 73 5f 67 63 70 2c 20 30 2c 20 30 2c 20 30 29  as_gcp, 0, 0, 0)
118f8 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
118f9 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
118fa 20 28 64 62 2c 20 22 48 61 73 47 72 6f 75 6e 64   (db, "HasGround
118fb 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 22 2c 20  ControlPoints", 
118fc 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  0,.....SQLITE_UT
118fd 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
118fe 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
118ff 09 09 66 6e 63 74 5f 68 61 73 5f 67 63 70 2c 20  ..fnct_has_gcp, 
11900 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11901 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11902 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 48  ction_v2 (db, "H
11903 61 73 54 6f 70 6f 6c 6f 67 79 22 2c 20 30 2c 0a  asTopology", 0,.
11904 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11905 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11906 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
11907 6e 63 74 5f 68 61 73 5f 74 6f 70 6f 6c 6f 67 79  nct_has_topology
11908 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11909 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1190a 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1190b 22 48 61 73 4b 4e 4e 22 2c 20 30 2c 0a 09 09 09  "HasKNN", 0,....
1190c 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1190d 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1190e 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1190f 5f 68 61 73 5f 6b 6e 6e 2c 20 30 2c 20 30 2c 20  _has_knn, 0, 0, 
11910 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11911 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11912 76 32 20 28 64 62 2c 20 22 48 61 73 52 6f 75 74  v2 (db, "HasRout
11913 69 6e 67 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c  ing", 0,.....SQL
11914 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11915 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11916 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 68 61 73   0,.....fnct_has
11917 5f 72 6f 75 74 69 6e 67 2c 20 30 2c 20 30 2c 20  _routing, 0, 0, 
11918 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11919 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1191a 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 65 74 72  v2 (db, "Geometr
1191b 79 43 6f 6e 73 74 72 61 69 6e 74 73 22 2c 20 33  yConstraints", 3
1191c 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1191d 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1191e 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
1191f 09 66 6e 63 74 5f 47 65 6f 6d 65 74 72 79 43 6f  .fnct_GeometryCo
11920 6e 73 74 72 61 69 6e 74 73 2c 20 30 2c 20 30 2c  nstraints, 0, 0,
11921 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11922 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11923 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 65 74  _v2 (db, "Geomet
11924 72 79 43 6f 6e 73 74 72 61 69 6e 74 73 22 2c 20  ryConstraints", 
11925 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  4,.....SQLITE_UT
11926 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11927 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
11928 09 09 66 6e 63 74 5f 47 65 6f 6d 65 74 72 79 43  ..fnct_GeometryC
11929 6f 6e 73 74 72 61 69 6e 74 73 2c 20 30 2c 20 30  onstraints, 0, 0
1192a 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1192b 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1192c 6e 5f 76 32 20 28 64 62 2c 20 22 52 54 72 65 65  n_v2 (db, "RTree
1192d 41 6c 69 67 6e 22 2c 20 33 2c 0a 09 09 09 09 53  Align", 3,.....S
1192e 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1192f 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11930 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 52  C, 0,.....fnct_R
11931 54 72 65 65 41 6c 69 67 6e 2c 20 30 2c 20 30 2c  TreeAlign, 0, 0,
11932 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11933 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11934 5f 76 32 20 28 64 62 2c 20 22 49 73 56 61 6c 69  _v2 (db, "IsVali
11935 64 46 6f 6e 74 22 2c 20 31 2c 0a 09 09 09 09 53  dFont", 1,.....S
11936 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11937 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11938 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 49  C, 0,.....fnct_I
11939 73 56 61 6c 69 64 46 6f 6e 74 2c 20 30 2c 20 30  sValidFont, 0, 0
1193a 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1193b 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1193c 6e 5f 76 32 20 28 64 62 2c 20 22 43 68 65 63 6b  n_v2 (db, "Check
1193d 46 6f 6e 74 46 61 63 65 4e 61 6d 65 22 2c 20 32  FontFaceName", 2
1193e 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1193f 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11940 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
11941 09 66 6e 63 74 5f 43 68 65 63 6b 46 6f 6e 74 46  .fnct_CheckFontF
11942 61 63 65 6e 61 6d 65 2c 20 30 2c 20 30 2c 20 30  acename, 0, 0, 0
11943 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11944 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11945 32 20 28 64 62 2c 20 22 47 65 74 46 6f 6e 74 46  2 (db, "GetFontF
11946 61 6d 69 6c 79 22 2c 20 31 2c 0a 09 09 09 09 53  amily", 1,.....S
11947 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11948 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11949 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 47  C, 0,.....fnct_G
1194a 65 74 46 6f 6e 74 46 61 6d 69 6c 79 2c 20 30 2c  etFontFamily, 0,
1194b 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1194c 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1194d 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 46  ion_v2 (db, "IsF
1194e 6f 6e 74 42 6f 6c 64 22 2c 20 31 2c 0a 09 09 09  ontBold", 1,....
1194f 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11950 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11951 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11952 5f 49 73 46 6f 6e 74 42 6f 6c 64 2c 20 30 2c 20  _IsFontBold, 0, 
11953 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11954 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11955 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 46 6f  on_v2 (db, "IsFo
11956 6e 74 49 74 61 6c 69 63 22 2c 20 31 2c 0a 09 09  ntItalic", 1,...
11957 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11958 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11959 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
1195a 74 5f 49 73 46 6f 6e 74 49 74 61 6c 69 63 2c 20  t_IsFontItalic, 
1195b 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1195c 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1195d 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
1195e 73 56 61 6c 69 64 50 69 78 65 6c 22 2c 20 33 2c  sValidPixel", 3,
1195f 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11960 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11961 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
11962 66 6e 63 74 5f 49 73 56 61 6c 69 64 50 69 78 65  fnct_IsValidPixe
11963 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
11964 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11965 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
11966 20 22 49 73 56 61 6c 69 64 52 61 73 74 65 72 50   "IsValidRasterP
11967 61 6c 65 74 74 65 22 2c 20 32 2c 0a 09 09 09 09  alette", 2,.....
11968 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11969 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1196a 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
1196b 49 73 56 61 6c 69 64 52 61 73 74 65 72 50 61 6c  IsValidRasterPal
1196c 65 74 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ette, 0, 0, 0);.
1196d 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1196e 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1196f 64 62 2c 20 22 49 73 56 61 6c 69 64 52 61 73 74  db, "IsValidRast
11970 65 72 53 74 61 74 69 73 74 69 63 73 22 2c 20 33  erStatistics", 3
11971 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11972 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11973 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
11974 09 66 6e 63 74 5f 49 73 56 61 6c 69 64 52 61 73  .fnct_IsValidRas
11975 74 65 72 53 74 61 74 69 73 74 69 63 73 2c 20 30  terStatistics, 0
11976 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11977 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11978 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73  tion_v2 (db, "Is
11979 56 61 6c 69 64 52 61 73 74 65 72 54 69 6c 65 22  ValidRasterTile"
1197a 2c 20 35 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 5,.....SQLITE_
1197b 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1197c 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
1197d 09 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69 64  ....fnct_IsValid
1197e 52 61 73 74 65 72 54 69 6c 65 2c 20 30 2c 20 30  RasterTile, 0, 0
1197f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11980 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11981 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 50 6f 70  n_v2 (db, "IsPop
11982 75 6c 61 74 65 64 43 6f 76 65 72 61 67 65 22 2c  ulatedCoverage",
11983 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
11984 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11985 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
11986 09 09 09 66 6e 63 74 5f 49 73 50 6f 70 75 6c 61  ...fnct_IsPopula
11987 74 65 64 43 6f 76 65 72 61 67 65 2c 20 30 2c 20  tedCoverage, 0, 
11988 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11989 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1198a 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 68 65 63  on_v2 (db, "Chec
1198b 6b 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61  kSpatialMetaData
1198c 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 0,.....SQLITE
1198d 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1198e 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1198f 0a 09 09 09 09 66 6e 63 74 5f 43 68 65 63 6b 53  .....fnct_CheckS
11990 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 2c 20  patialMetaData, 
11991 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11992 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11993 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
11994 68 65 63 6b 53 70 61 74 69 61 6c 4d 65 74 61 44  heckSpatialMetaD
11995 61 74 61 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ata", 1,.....SQL
11996 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11997 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11998 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 68 65   0,.....fnct_Che
11999 63 6b 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74  ckSpatialMetaDat
1199a 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  a, 0, 0, 0);.   
1199b 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1199c 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1199d 20 22 43 68 65 63 6b 47 65 6f 50 61 63 6b 61 67   "CheckGeoPackag
1199e 65 4d 65 74 61 44 61 74 61 22 2c 20 30 2c 0a 09  eMetaData", 0,..
1199f 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
119a0 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
119a1 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
119a2 63 74 5f 43 68 65 63 6b 47 65 6f 50 61 63 6b 61  ct_CheckGeoPacka
119a3 67 65 4d 65 74 61 44 61 74 61 2c 20 30 2c 20 30  geMetaData, 0, 0
119a4 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
119a5 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
119a6 6e 5f 76 32 20 28 64 62 2c 20 22 43 68 65 63 6b  n_v2 (db, "Check
119a7 47 65 6f 50 61 63 6b 61 67 65 4d 65 74 61 44 61  GeoPackageMetaDa
119a8 74 61 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  ta", 1,.....SQLI
119a9 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
119aa 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
119ab 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 68 65 63  0,.....fnct_Chec
119ac 6b 47 65 6f 50 61 63 6b 61 67 65 4d 65 74 61 44  kGeoPackageMetaD
119ad 61 74 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ata, 0, 0, 0);. 
119ae 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
119af 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
119b0 62 2c 20 22 41 75 74 6f 46 44 4f 53 74 61 72 74  b, "AutoFDOStart
119b1 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 0,.....SQLITE
119b2 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
119b3 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
119b4 0a 09 09 09 09 66 6e 63 74 5f 41 75 74 6f 46 44  .....fnct_AutoFD
119b5 4f 53 74 61 72 74 2c 20 30 2c 20 30 2c 20 30 29  OStart, 0, 0, 0)
119b6 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
119b7 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
119b8 20 28 64 62 2c 20 22 41 75 74 6f 46 44 4f 53 74   (db, "AutoFDOSt
119b9 61 72 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  art", 1,.....SQL
119ba 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
119bb 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
119bc 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 41 75 74   0,.....fnct_Aut
119bd 6f 46 44 4f 53 74 61 72 74 2c 20 30 2c 20 30 2c  oFDOStart, 0, 0,
119be 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
119bf 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
119c0 5f 76 32 20 28 64 62 2c 20 22 41 75 74 6f 46 44  _v2 (db, "AutoFD
119c1 4f 53 74 6f 70 22 2c 20 30 2c 0a 09 09 09 09 53  OStop", 0,.....S
119c2 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
119c3 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
119c4 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 41  C, 0,.....fnct_A
119c5 75 74 6f 46 44 4f 53 74 6f 70 2c 20 30 2c 20 30  utoFDOStop, 0, 0
119c6 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
119c7 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
119c8 6e 5f 76 32 20 28 64 62 2c 20 22 41 75 74 6f 46  n_v2 (db, "AutoF
119c9 44 4f 53 74 6f 70 22 2c 20 31 2c 0a 09 09 09 09  DOStop", 1,.....
119ca 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
119cb 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
119cc 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
119cd 41 75 74 6f 46 44 4f 53 74 6f 70 2c 20 30 2c 20  AutoFDOStop, 0, 
119ce 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
119cf 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
119d0 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e 69 74  on_v2 (db, "Init
119d1 46 44 4f 53 70 61 74 69 61 6c 4d 65 74 61 44 61  FDOSpatialMetaDa
119d2 74 61 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49  ta", 0,.....SQLI
119d3 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
119d4 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
119d5 30 2c 0a 09 09 09 09 66 6e 63 74 5f 49 6e 69 74  0,.....fnct_Init
119d6 46 44 4f 53 70 61 74 69 61 6c 4d 65 74 61 44 61  FDOSpatialMetaDa
119d7 74 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ta, 0, 0, 0);.  
119d8 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
119d9 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
119da 2c 20 22 41 64 64 46 44 4f 47 65 6f 6d 65 74 72  , "AddFDOGeometr
119db 79 43 6f 6c 75 6d 6e 22 2c 20 36 2c 0a 09 09 09  yColumn", 6,....
119dc 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
119dd 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
119de 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
119df 5f 41 64 64 46 44 4f 47 65 6f 6d 65 74 72 79 43  _AddFDOGeometryC
119e0 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  olumn, 0, 0, 0);
119e1 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
119e2 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
119e3 28 64 62 2c 20 22 52 65 63 6f 76 65 72 46 44 4f  (db, "RecoverFDO
119e4 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 22 2c  GeometryColumn",
119e5 20 36 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   6,.....SQLITE_U
119e6 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
119e7 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
119e8 09 09 09 66 6e 63 74 5f 52 65 63 6f 76 65 72 46  ...fnct_RecoverF
119e9 44 4f 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e  DOGeometryColumn
119ea 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
119eb 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
119ec 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
119ed 22 44 69 73 63 61 72 64 46 44 4f 47 65 6f 6d 65  "DiscardFDOGeome
119ee 74 72 79 43 6f 6c 75 6d 6e 22 2c 20 32 2c 0a 09  tryColumn", 2,..
119ef 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
119f0 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
119f1 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
119f2 63 74 5f 44 69 73 63 61 72 64 46 44 4f 47 65 6f  ct_DiscardFDOGeo
119f3 6d 65 74 72 79 43 6f 6c 75 6d 6e 2c 20 30 2c 20  metryColumn, 0, 
119f4 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
119f5 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
119f6 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e 69 74  on_v2 (db, "Init
119f7 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 22  SpatialMetaData"
119f8 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
119f9 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
119fa 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
119fb 09 09 09 09 66 6e 63 74 5f 49 6e 69 74 53 70 61  ....fnct_InitSpa
119fc 74 69 61 6c 4d 65 74 61 44 61 74 61 2c 20 30 2c  tialMetaData, 0,
119fd 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
119fe 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
119ff 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e 69  ion_v2 (db, "Ini
11a00 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61  tSpatialMetaData
11a01 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
11a02 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11a03 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
11a04 0a 09 09 09 09 66 6e 63 74 5f 49 6e 69 74 53 70  .....fnct_InitSp
11a05 61 74 69 61 6c 4d 65 74 61 44 61 74 61 2c 20 30  atialMetaData, 0
11a06 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11a07 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11a08 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e  tion_v2 (db, "In
11a09 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61 74  itSpatialMetaDat
11a0a 61 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  a", 2,.....SQLIT
11a0b 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11a0c 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
11a0d 2c 0a 09 09 09 09 66 6e 63 74 5f 49 6e 69 74 53  ,.....fnct_InitS
11a0e 70 61 74 69 61 6c 4d 65 74 61 44 61 74 61 2c 20  patialMetaData, 
11a0f 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11a10 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11a11 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
11a12 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44 61  nitSpatialMetaDa
11a13 74 61 46 75 6c 6c 22 2c 20 30 2c 0a 09 09 09 09  taFull", 0,.....
11a14 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11a15 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11a16 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11a17 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61 44  InitSpatialMetaD
11a18 61 74 61 46 75 6c 6c 2c 20 30 2c 20 30 2c 20 30  ataFull, 0, 0, 0
11a19 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11a1a 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11a1b 32 20 28 64 62 2c 20 22 49 6e 69 74 53 70 61 74  2 (db, "InitSpat
11a1c 69 61 6c 4d 65 74 61 44 61 74 61 46 75 6c 6c 22  ialMetaDataFull"
11a1d 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
11a1e 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11a1f 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
11a20 09 09 09 09 66 6e 63 74 5f 49 6e 69 74 53 70 61  ....fnct_InitSpa
11a21 74 69 61 6c 4d 65 74 61 44 61 74 61 46 75 6c 6c  tialMetaDataFull
11a22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11a23 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11a24 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11a25 22 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74 61  "InitSpatialMeta
11a26 44 61 74 61 46 75 6c 6c 22 2c 20 32 2c 0a 09 09  DataFull", 2,...
11a27 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11a28 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11a29 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11a2a 74 5f 49 6e 69 74 53 70 61 74 69 61 6c 4d 65 74  t_InitSpatialMet
11a2b 61 44 61 74 61 46 75 6c 6c 2c 20 30 2c 20 30 2c  aDataFull, 0, 0,
11a2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11a2d 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11a2e 5f 76 32 20 28 64 62 2c 20 22 49 6e 73 65 72 74  _v2 (db, "Insert
11a2f 45 70 73 67 53 72 69 64 22 2c 20 31 2c 0a 09 09  EpsgSrid", 1,...
11a30 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11a31 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11a32 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11a33 74 5f 49 6e 73 65 72 74 45 70 73 67 53 72 69 64  t_InsertEpsgSrid
11a34 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11a35 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11a36 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11a37 22 53 72 69 64 49 73 47 65 6f 67 72 61 70 68 69  "SridIsGeographi
11a38 63 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  c", 1,.....SQLIT
11a39 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11a3a 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
11a3b 2c 0a 09 09 09 09 66 6e 63 74 5f 53 72 69 64 49  ,.....fnct_SridI
11a3c 73 47 65 6f 67 72 61 70 68 69 63 2c 20 30 2c 20  sGeographic, 0, 
11a3d 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11a3e 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11a3f 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 72 69 64  on_v2 (db, "Srid
11a40 49 73 50 72 6f 6a 65 63 74 65 64 22 2c 20 31 2c  IsProjected", 1,
11a41 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11a42 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11a43 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
11a44 66 6e 63 74 5f 53 72 69 64 49 73 50 72 6f 6a 65  fnct_SridIsProje
11a45 63 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  cted, 0, 0, 0);.
11a46 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11a47 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11a48 64 62 2c 20 22 53 72 69 64 48 61 73 46 6c 69 70  db, "SridHasFlip
11a49 70 65 64 41 78 65 73 22 2c 20 31 2c 0a 09 09 09  pedAxes", 1,....
11a4a 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11a4b 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11a4c 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11a4d 5f 53 72 69 64 48 61 73 46 6c 69 70 70 65 64 41  _SridHasFlippedA
11a4e 78 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  xes, 0, 0, 0);. 
11a4f 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11a50 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11a51 62 2c 20 22 53 72 69 64 47 65 74 53 70 68 65 72  b, "SridGetSpher
11a52 6f 69 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  oid", 1,.....SQL
11a53 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11a54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11a55 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 53 72 69   0,.....fnct_Sri
11a56 64 47 65 74 53 70 68 65 72 6f 69 64 2c 20 30 2c  dGetSpheroid, 0,
11a57 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11a58 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11a59 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 72 69  ion_v2 (db, "Sri
11a5a 64 47 65 74 45 6c 6c 69 70 73 6f 69 64 22 2c 20  dGetEllipsoid", 
11a5b 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
11a5c 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11a5d 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
11a5e 09 09 66 6e 63 74 5f 53 72 69 64 47 65 74 53 70  ..fnct_SridGetSp
11a5f 68 65 72 6f 69 64 2c 20 30 2c 20 30 2c 20 30 29  heroid, 0, 0, 0)
11a60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11a61 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11a62 20 28 64 62 2c 20 22 53 72 69 64 47 65 74 50 72   (db, "SridGetPr
11a63 69 6d 65 4d 65 72 69 64 69 61 6e 22 2c 20 31 2c  imeMeridian", 1,
11a64 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11a65 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11a66 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
11a67 66 6e 63 74 5f 53 72 69 64 47 65 74 50 72 69 6d  fnct_SridGetPrim
11a68 65 4d 65 72 69 64 69 61 6e 2c 20 30 2c 20 30 2c  eMeridian, 0, 0,
11a69 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11a6a 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11a6b 5f 76 32 20 28 64 62 2c 20 22 53 72 69 64 47 65  _v2 (db, "SridGe
11a6c 74 44 61 74 75 6d 22 2c 20 31 2c 0a 09 09 09 09  tDatum", 1,.....
11a6d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11a6e 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11a6f 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11a70 53 72 69 64 47 65 74 44 61 74 75 6d 2c 20 30 2c  SridGetDatum, 0,
11a71 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11a72 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11a73 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 72 69  ion_v2 (db, "Sri
11a74 64 47 65 74 50 72 6f 6a 65 63 74 69 6f 6e 22 2c  dGetProjection",
11a75 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11a76 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11a77 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
11a78 09 09 09 66 6e 63 74 5f 53 72 69 64 47 65 74 50  ...fnct_SridGetP
11a79 72 6f 6a 65 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  rojection, 0, 0,
11a7a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11a7b 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11a7c 5f 76 32 20 28 64 62 2c 20 22 53 72 69 64 47 65  _v2 (db, "SridGe
11a7d 74 55 6e 69 74 22 2c 20 31 2c 0a 09 09 09 09 53  tUnit", 1,.....S
11a7e 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11a7f 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11a80 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 53  C, 0,.....fnct_S
11a81 72 69 64 47 65 74 55 6e 69 74 2c 20 30 2c 20 30  ridGetUnit, 0, 0
11a82 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11a83 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11a84 6e 5f 76 32 20 28 64 62 2c 20 22 53 72 69 64 47  n_v2 (db, "SridG
11a85 65 74 41 78 69 73 5f 31 5f 4e 61 6d 65 22 2c 20  etAxis_1_Name", 
11a86 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
11a87 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11a88 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
11a89 09 09 66 6e 63 74 5f 53 72 69 64 47 65 74 41 78  ..fnct_SridGetAx
11a8a 69 73 31 4e 61 6d 65 2c 20 30 2c 20 30 2c 20 30  is1Name, 0, 0, 0
11a8b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11a8c 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11a8d 32 20 28 64 62 2c 20 22 53 72 69 64 47 65 74 41  2 (db, "SridGetA
11a8e 78 69 73 5f 31 5f 4f 72 69 65 6e 74 61 74 69 6f  xis_1_Orientatio
11a8f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  n", 1,.....SQLIT
11a90 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11a91 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
11a92 2c 0a 09 09 09 09 66 6e 63 74 5f 53 72 69 64 47  ,.....fnct_SridG
11a93 65 74 41 78 69 73 31 4f 72 69 65 6e 74 61 74 69  etAxis1Orientati
11a94 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
11a95 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11a96 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11a97 2c 20 22 53 72 69 64 47 65 74 41 78 69 73 5f 32  , "SridGetAxis_2
11a98 5f 4e 61 6d 65 22 2c 20 31 2c 0a 09 09 09 09 53  _Name", 1,.....S
11a99 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11a9a 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11a9b 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 53  C, 0,.....fnct_S
11a9c 72 69 64 47 65 74 41 78 69 73 32 4e 61 6d 65 2c  ridGetAxis2Name,
11a9d 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
11a9e 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
11a9f 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
11aa0 53 72 69 64 47 65 74 41 78 69 73 5f 32 5f 4f 72  SridGetAxis_2_Or
11aa1 69 65 6e 74 61 74 69 6f 6e 22 2c 20 31 2c 0a 09  ientation", 1,..
11aa2 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11aa3 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11aa4 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
11aa5 63 74 5f 53 72 69 64 47 65 74 41 78 69 73 32 4f  ct_SridGetAxis2O
11aa6 72 69 65 6e 74 61 74 69 6f 6e 2c 20 30 2c 20 30  rientation, 0, 0
11aa7 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11aa8 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11aa9 6e 5f 76 32 20 28 64 62 2c 20 22 41 64 64 47 65  n_v2 (db, "AddGe
11aaa 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 22 2c 20 34  ometryColumn", 4
11aab 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11aac 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11aad 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
11aae 09 66 6e 63 74 5f 41 64 64 47 65 6f 6d 65 74 72  .fnct_AddGeometr
11aaf 79 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30  yColumn, 0, 0, 0
11ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11ab1 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11ab2 32 20 28 64 62 2c 20 22 41 64 64 47 65 6f 6d 65  2 (db, "AddGeome
11ab3 74 72 79 43 6f 6c 75 6d 6e 22 2c 20 35 2c 0a 09  tryColumn", 5,..
11ab4 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11ab5 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11ab6 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
11ab7 63 74 5f 41 64 64 47 65 6f 6d 65 74 72 79 43 6f  ct_AddGeometryCo
11ab8 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  lumn, 0, 0, 0);.
11ab9 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11aba 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11abb 64 62 2c 20 22 41 64 64 47 65 6f 6d 65 74 72 79  db, "AddGeometry
11abc 43 6f 6c 75 6d 6e 22 2c 20 36 2c 0a 09 09 09 09  Column", 6,.....
11abd 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11abe 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11abf 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11ac0 41 64 64 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d  AddGeometryColum
11ac1 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
11ac2 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11ac3 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
11ac4 20 22 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72   "RecoverGeometr
11ac5 79 43 6f 6c 75 6d 6e 22 2c 20 34 2c 0a 09 09 09  yColumn", 4,....
11ac6 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11ac7 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11ac8 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11ac9 5f 52 65 63 6f 76 65 72 47 65 6f 6d 65 74 72 79  _RecoverGeometry
11aca 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29  Column, 0, 0, 0)
11acb 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11acc 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11acd 20 28 64 62 2c 20 22 52 65 63 6f 76 65 72 47 65   (db, "RecoverGe
11ace 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 22 2c 20 35  ometryColumn", 5
11acf 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11ad0 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11ad1 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
11ad2 09 66 6e 63 74 5f 52 65 63 6f 76 65 72 47 65 6f  .fnct_RecoverGeo
11ad3 6d 65 74 72 79 43 6f 6c 75 6d 6e 2c 20 30 2c 20  metryColumn, 0, 
11ad4 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11ad5 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11ad6 6f 6e 5f 76 32 20 28 64 62 2c 20 22 55 70 67 72  on_v2 (db, "Upgr
11ad7 61 64 65 47 65 6f 6d 65 74 72 79 54 72 69 67 67  adeGeometryTrigg
11ad8 65 72 73 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ers", 1,.....SQL
11ad9 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11ada 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11adb 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55 70 67   0,.....fnct_Upg
11adc 72 61 64 65 47 65 6f 6d 65 74 72 79 54 72 69 67  radeGeometryTrig
11add 67 65 72 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  gers, 0, 0, 0);.
11ade 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11adf 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11ae0 64 62 2c 20 22 44 69 73 63 61 72 64 47 65 6f 6d  db, "DiscardGeom
11ae1 65 74 72 79 43 6f 6c 75 6d 6e 22 2c 20 32 2c 0a  etryColumn", 2,.
11ae2 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11ae3 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11ae4 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
11ae5 6e 63 74 5f 44 69 73 63 61 72 64 47 65 6f 6d 65  nct_DiscardGeome
11ae6 74 72 79 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c  tryColumn, 0, 0,
11ae7 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11ae8 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11ae9 5f 76 32 20 28 64 62 2c 20 22 52 65 67 69 73 74  _v2 (db, "Regist
11aea 65 72 56 69 72 74 75 61 6c 47 65 6f 6d 65 74 72  erVirtualGeometr
11aeb 79 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  y", 1,.....SQLIT
11aec 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11aed 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
11aee 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65 67 69 73  ,.....fnct_Regis
11aef 74 65 72 56 69 72 74 75 61 6c 47 65 6f 6d 65 74  terVirtualGeomet
11af0 72 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ry, 0, 0, 0);.  
11af1 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11af2 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11af3 2c 20 22 44 72 6f 70 56 69 72 74 75 61 6c 47 65  , "DropVirtualGe
11af4 6f 6d 65 74 72 79 22 2c 20 31 2c 0a 09 09 09 09  ometry", 1,.....
11af5 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11af6 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11af7 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11af8 44 72 6f 70 56 69 72 74 75 61 6c 47 65 6f 6d 65  DropVirtualGeome
11af9 74 72 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  try, 0, 0, 0);. 
11afa 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11afb 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11afc 62 2c 20 22 52 65 63 6f 76 65 72 53 70 61 74 69  b, "RecoverSpati
11afd 61 6c 49 6e 64 65 78 22 2c 20 30 2c 0a 09 09 09  alIndex", 0,....
11afe 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11aff 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11b00 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11b01 5f 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c 49  _RecoverSpatialI
11b02 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ndex, 0, 0, 0);.
11b03 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11b04 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11b05 64 62 2c 20 22 52 65 63 6f 76 65 72 53 70 61 74  db, "RecoverSpat
11b06 69 61 6c 49 6e 64 65 78 22 2c 20 31 2c 0a 09 09  ialIndex", 1,...
11b07 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11b08 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11b09 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11b0a 74 5f 52 65 63 6f 76 65 72 53 70 61 74 69 61 6c  t_RecoverSpatial
11b0b 49 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 29 3b  Index, 0, 0, 0);
11b0c 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
11b0d 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
11b0e 28 64 62 2c 20 22 52 65 63 6f 76 65 72 53 70 61  (db, "RecoverSpa
11b0f 74 69 61 6c 49 6e 64 65 78 22 2c 20 32 2c 0a 09  tialIndex", 2,..
11b10 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11b11 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11b12 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
11b13 63 74 5f 52 65 63 6f 76 65 72 53 70 61 74 69 61  ct_RecoverSpatia
11b14 6c 49 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 29  lIndex, 0, 0, 0)
11b15 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11b16 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11b17 20 28 64 62 2c 20 22 52 65 63 6f 76 65 72 53 70   (db, "RecoverSp
11b18 61 74 69 61 6c 49 6e 64 65 78 22 2c 20 33 2c 0a  atialIndex", 3,.
11b19 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11b1a 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11b1b 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
11b1c 6e 63 74 5f 52 65 63 6f 76 65 72 53 70 61 74 69  nct_RecoverSpati
11b1d 61 6c 49 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30  alIndex, 0, 0, 0
11b1e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11b1f 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11b20 32 20 28 64 62 2c 20 22 43 68 65 63 6b 53 70 61  2 (db, "CheckSpa
11b21 74 69 61 6c 49 6e 64 65 78 22 2c 20 30 2c 0a 09  tialIndex", 0,..
11b22 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11b23 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11b24 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
11b25 63 74 5f 43 68 65 63 6b 53 70 61 74 69 61 6c 49  ct_CheckSpatialI
11b26 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ndex, 0, 0, 0);.
11b27 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11b28 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11b29 64 62 2c 20 22 43 68 65 63 6b 53 70 61 74 69 61  db, "CheckSpatia
11b2a 6c 49 6e 64 65 78 22 2c 20 32 2c 0a 09 09 09 09  lIndex", 2,.....
11b2b 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11b2c 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11b2d 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11b2e 43 68 65 63 6b 53 70 61 74 69 61 6c 49 6e 64 65  CheckSpatialInde
11b2f 78 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  x, 0, 0, 0);.   
11b30 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11b31 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
11b32 20 22 43 68 65 63 6b 53 68 61 64 6f 77 65 64 52   "CheckShadowedR
11b33 6f 77 69 64 22 2c 20 31 2c 0a 09 09 09 09 53 51  owid", 1,.....SQ
11b34 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11b35 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11b36 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 68  , 0,.....fnct_Ch
11b37 65 63 6b 53 68 61 64 6f 77 65 64 52 6f 77 69 64  eckShadowedRowid
11b38 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11b39 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11b3a 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11b3b 22 43 68 65 63 6b 57 69 74 68 6f 75 74 52 6f 77  "CheckWithoutRow
11b3c 69 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  id", 1,.....SQLI
11b3d 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
11b3e 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
11b3f 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 68 65 63  0,.....fnct_Chec
11b40 6b 57 69 74 68 6f 75 74 52 6f 77 69 64 2c 20 30  kWithoutRowid, 0
11b41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11b42 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11b43 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72  tion_v2 (db, "Cr
11b44 65 61 74 65 53 70 61 74 69 61 6c 49 6e 64 65 78  eateSpatialIndex
11b45 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
11b46 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11b47 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
11b48 0a 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74 65  .....fnct_Create
11b49 53 70 61 74 69 61 6c 49 6e 64 65 78 2c 20 30 2c  SpatialIndex, 0,
11b4a 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11b4b 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11b4c 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72 65  ion_v2 (db, "Cre
11b4d 61 74 65 4d 62 72 43 61 63 68 65 22 2c 20 32 2c  ateMbrCache", 2,
11b4e 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11b4f 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11b50 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
11b51 66 6e 63 74 5f 43 72 65 61 74 65 4d 62 72 43 61  fnct_CreateMbrCa
11b52 63 68 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  che, 0, 0, 0);. 
11b53 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11b54 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11b55 62 2c 20 22 44 69 73 61 62 6c 65 53 70 61 74 69  b, "DisableSpati
11b56 61 6c 49 6e 64 65 78 22 2c 20 32 2c 0a 09 09 09  alIndex", 2,....
11b57 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11b58 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11b59 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11b5a 5f 44 69 73 61 62 6c 65 53 70 61 74 69 61 6c 49  _DisableSpatialI
11b5b 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ndex, 0, 0, 0);.
11b5c 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11b5d 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11b5e 64 62 2c 20 22 52 65 62 75 69 6c 64 47 65 6f 6d  db, "RebuildGeom
11b5f 65 74 72 79 54 72 69 67 67 65 72 73 22 2c 20 32  etryTriggers", 2
11b60 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11b61 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11b62 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
11b63 09 66 6e 63 74 5f 52 65 62 75 69 6c 64 47 65 6f  .fnct_RebuildGeo
11b64 6d 65 74 72 79 54 72 69 67 67 65 72 73 2c 20 30  metryTriggers, 0
11b65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11b66 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11b67 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 55 70  tion_v2 (db, "Up
11b68 64 61 74 65 4c 61 79 65 72 53 74 61 74 69 73 74  dateLayerStatist
11b69 69 63 73 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c  ics", 0,.....SQL
11b6a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11b6b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11b6c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55 70 64   0,.....fnct_Upd
11b6d 61 74 65 4c 61 79 65 72 53 74 61 74 69 73 74 69  ateLayerStatisti
11b6e 63 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  cs, 0, 0, 0);.  
11b6f 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11b70 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11b71 2c 20 22 55 70 64 61 74 65 4c 61 79 65 72 53 74  , "UpdateLayerSt
11b72 61 74 69 73 74 69 63 73 22 2c 20 31 2c 0a 09 09  atistics", 1,...
11b73 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11b74 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11b75 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11b76 74 5f 55 70 64 61 74 65 4c 61 79 65 72 53 74 61  t_UpdateLayerSta
11b77 74 69 73 74 69 63 73 2c 20 30 2c 20 30 2c 20 30  tistics, 0, 0, 0
11b78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11b79 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11b7a 32 20 28 64 62 2c 20 22 55 70 64 61 74 65 4c 61  2 (db, "UpdateLa
11b7b 79 65 72 53 74 61 74 69 73 74 69 63 73 22 2c 20  yerStatistics", 
11b7c 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
11b7d 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11b7e 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
11b7f 09 09 66 6e 63 74 5f 55 70 64 61 74 65 4c 61 79  ..fnct_UpdateLay
11b80 65 72 53 74 61 74 69 73 74 69 63 73 2c 20 30 2c  erStatistics, 0,
11b81 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11b82 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11b83 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 74  ion_v2 (db, "Get
11b84 4c 61 79 65 72 45 78 74 65 6e 74 22 2c 20 31 2c  LayerExtent", 1,
11b85 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11b86 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11b87 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
11b88 09 09 09 09 66 6e 63 74 5f 47 65 74 4c 61 79 65  ....fnct_GetLaye
11b89 72 45 78 74 65 6e 74 2c 20 30 2c 20 30 2c 20 30  rExtent, 0, 0, 0
11b8a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11b8b 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11b8c 32 20 28 64 62 2c 20 22 47 65 74 4c 61 79 65 72  2 (db, "GetLayer
11b8d 45 78 74 65 6e 74 22 2c 20 32 2c 0a 09 09 09 09  Extent", 2,.....
11b8e 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11b8f 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11b90 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11b91 6e 63 74 5f 47 65 74 4c 61 79 65 72 45 78 74 65  nct_GetLayerExte
11b92 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
11b93 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11b94 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11b95 2c 20 22 47 65 74 4c 61 79 65 72 45 78 74 65 6e  , "GetLayerExten
11b96 74 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54  t", 3,.....SQLIT
11b97 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11b98 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
11b99 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47  ache,.....fnct_G
11b9a 65 74 4c 61 79 65 72 45 78 74 65 6e 74 2c 20 30  etLayerExtent, 0
11b9b 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11b9c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11b9d 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e  tion_v2 (db, "In
11b9e 76 61 6c 69 64 61 74 65 4c 61 79 65 72 53 74 61  validateLayerSta
11b9f 74 69 73 74 69 63 73 22 2c 20 30 2c 0a 09 09 09  tistics", 0,....
11ba0 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11ba1 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11ba2 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11ba3 5f 49 6e 76 61 6c 69 64 61 74 65 4c 61 79 65 72  _InvalidateLayer
11ba4 53 74 61 74 69 73 74 69 63 73 2c 20 30 2c 20 30  Statistics, 0, 0
11ba5 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11ba6 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11ba7 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e 76 61 6c  n_v2 (db, "Inval
11ba8 69 64 61 74 65 4c 61 79 65 72 53 74 61 74 69 73  idateLayerStatis
11ba9 74 69 63 73 22 2c 20 31 2c 0a 09 09 09 09 53 51  tics", 1,.....SQ
11baa 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11bab 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11bac 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 49 6e  , 0,.....fnct_In
11bad 76 61 6c 69 64 61 74 65 4c 61 79 65 72 53 74 61  validateLayerSta
11bae 74 69 73 74 69 63 73 2c 20 30 2c 20 30 2c 20 30  tistics, 0, 0, 0
11baf 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11bb0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11bb1 32 20 28 64 62 2c 20 22 49 6e 76 61 6c 69 64 61  2 (db, "Invalida
11bb2 74 65 4c 61 79 65 72 53 74 61 74 69 73 74 69 63  teLayerStatistic
11bb3 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  s", 2,.....SQLIT
11bb4 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11bb5 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
11bb6 2c 0a 09 09 09 09 66 6e 63 74 5f 49 6e 76 61 6c  ,.....fnct_Inval
11bb7 69 64 61 74 65 4c 61 79 65 72 53 74 61 74 69 73  idateLayerStatis
11bb8 74 69 63 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tics, 0, 0, 0);.
11bb9 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11bba 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11bbb 64 62 2c 20 22 43 72 65 61 74 65 52 61 73 74 65  db, "CreateRaste
11bbc 72 43 6f 76 65 72 61 67 65 73 54 61 62 6c 65 22  rCoveragesTable"
11bbd 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
11bbe 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11bbf 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
11bc0 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74 65 52  ....fnct_CreateR
11bc1 61 73 74 65 72 43 6f 76 65 72 61 67 65 73 54 61  asterCoveragesTa
11bc2 62 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ble, 0, 0, 0);. 
11bc3 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11bc4 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11bc5 62 2c 20 22 43 72 65 61 74 65 56 65 63 74 6f 72  b, "CreateVector
11bc6 43 6f 76 65 72 61 67 65 73 54 61 62 6c 65 73 22  CoveragesTables"
11bc7 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
11bc8 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11bc9 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
11bca 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74 65 56  ....fnct_CreateV
11bcb 65 63 74 6f 72 43 6f 76 65 72 61 67 65 73 54 61  ectorCoveragesTa
11bcc 62 6c 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  bles, 0, 0, 0);.
11bcd 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11bce 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11bcf 64 62 2c 20 22 57 4d 53 5f 43 72 65 61 74 65 54  db, "WMS_CreateT
11bd0 61 62 6c 65 73 22 2c 20 30 2c 0a 09 09 09 09 53  ables", 0,.....S
11bd1 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11bd2 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11bd3 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43  C, 0,.....fnct_C
11bd4 72 65 61 74 65 57 4d 53 54 61 62 6c 65 73 2c 20  reateWMSTables, 
11bd5 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11bd6 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11bd7 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d 53 5f  ction (db, "WMS_
11bd8 52 65 67 69 73 74 65 72 47 65 74 43 61 70 61 62  RegisterGetCapab
11bd9 69 6c 69 74 69 65 73 22 2c 20 31 2c 20 53 51 4c  ilities", 1, SQL
11bda 49 54 45 5f 41 4e 59 2c 0a 09 09 09 20 20 20 20  ITE_ANY,....    
11bdb 20 30 2c 20 66 6e 63 74 5f 52 65 67 69 73 74 65   0, fnct_Registe
11bdc 72 57 4d 53 47 65 74 43 61 70 61 62 69 6c 69 74  rWMSGetCapabilit
11bdd 69 65 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ies, 0, 0);.    
11bde 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11bdf 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d  unction (db, "WM
11be0 53 5f 52 65 67 69 73 74 65 72 47 65 74 43 61 70  S_RegisterGetCap
11be1 61 62 69 6c 69 74 69 65 73 22 2c 20 33 2c 20 53  abilities", 3, S
11be2 51 4c 49 54 45 5f 41 4e 59 2c 0a 09 09 09 20 20  QLITE_ANY,....  
11be3 20 20 20 30 2c 20 66 6e 63 74 5f 52 65 67 69 73     0, fnct_Regis
11be4 74 65 72 57 4d 53 47 65 74 43 61 70 61 62 69 6c  terWMSGetCapabil
11be5 69 74 69 65 73 2c 20 30 2c 20 30 29 3b 0a 20 20  ities, 0, 0);.  
11be6 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11be7 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22  _function (db, "
11be8 57 4d 53 5f 55 6e 52 65 67 69 73 74 65 72 47 65  WMS_UnRegisterGe
11be9 74 43 61 70 61 62 69 6c 69 74 69 65 73 22 2c 20  tCapabilities", 
11bea 31 2c 0a 09 09 09 20 20 20 20 20 53 51 4c 49 54  1,....     SQLIT
11beb 45 5f 41 4e 59 2c 20 30 2c 20 66 6e 63 74 5f 55  E_ANY, 0, fnct_U
11bec 6e 72 65 67 69 73 74 65 72 57 4d 53 47 65 74 43  nregisterWMSGetC
11bed 61 70 61 62 69 6c 69 74 69 65 73 2c 0a 09 09 09  apabilities,....
11bee 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20       0, 0);.    
11bef 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11bf0 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d  unction (db, "WM
11bf1 53 5f 53 65 74 47 65 74 43 61 70 61 62 69 6c 69  S_SetGetCapabili
11bf2 74 69 65 73 49 6e 66 6f 73 22 2c 20 33 2c 20 53  tiesInfos", 3, S
11bf3 51 4c 49 54 45 5f 41 4e 59 2c 0a 09 09 09 20 20  QLITE_ANY,....  
11bf4 20 20 20 30 2c 20 66 6e 63 74 5f 53 65 74 57 4d     0, fnct_SetWM
11bf5 53 47 65 74 43 61 70 61 62 69 6c 69 74 69 65 73  SGetCapabilities
11bf6 49 6e 66 6f 73 2c 20 30 2c 20 30 29 3b 0a 20 20  Infos, 0, 0);.  
11bf7 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11bf8 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22  _function (db, "
11bf9 57 4d 53 5f 52 65 67 69 73 74 65 72 47 65 74 4d  WMS_RegisterGetM
11bfa 61 70 22 2c 20 39 2c 20 53 51 4c 49 54 45 5f 41  ap", 9, SQLITE_A
11bfb 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20 20 66  NY, 0,....     f
11bfc 6e 63 74 5f 52 65 67 69 73 74 65 72 57 4d 53 47  nct_RegisterWMSG
11bfd 65 74 4d 61 70 2c 20 30 2c 20 30 29 3b 0a 20 20  etMap, 0, 0);.  
11bfe 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11bff 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22  _function (db, "
11c00 57 4d 53 5f 52 65 67 69 73 74 65 72 47 65 74 4d  WMS_RegisterGetM
11c01 61 70 22 2c 20 31 33 2c 20 53 51 4c 49 54 45 5f  ap", 13, SQLITE_
11c02 41 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20 20  ANY, 0,....     
11c03 66 6e 63 74 5f 52 65 67 69 73 74 65 72 57 4d 53  fnct_RegisterWMS
11c04 47 65 74 4d 61 70 2c 20 30 2c 20 30 29 3b 0a 20  GetMap, 0, 0);. 
11c05 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11c06 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20  e_function (db, 
11c07 22 57 4d 53 5f 52 65 67 69 73 74 65 72 47 65 74  "WMS_RegisterGet
11c08 4d 61 70 22 2c 20 31 38 2c 20 53 51 4c 49 54 45  Map", 18, SQLITE
11c09 5f 41 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20  _ANY, 0,....    
11c0a 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72 57 4d   fnct_RegisterWM
11c0b 53 47 65 74 4d 61 70 2c 20 30 2c 20 30 29 3b 0a  SGetMap, 0, 0);.
11c0c 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11c0d 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
11c0e 20 22 57 4d 53 5f 55 6e 52 65 67 69 73 74 65 72   "WMS_UnRegister
11c0f 47 65 74 4d 61 70 22 2c 20 32 2c 20 53 51 4c 49  GetMap", 2, SQLI
11c10 54 45 5f 41 4e 59 2c 20 30 2c 0a 09 09 09 20 20  TE_ANY, 0,....  
11c11 20 20 20 66 6e 63 74 5f 55 6e 72 65 67 69 73 74     fnct_Unregist
11c12 65 72 57 4d 53 47 65 74 4d 61 70 2c 20 30 2c 20  erWMSGetMap, 0, 
11c13 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11c14 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
11c15 28 64 62 2c 20 22 57 4d 53 5f 53 65 74 47 65 74  (db, "WMS_SetGet
11c16 4d 61 70 49 6e 66 6f 73 22 2c 20 34 2c 20 53 51  MapInfos", 4, SQ
11c17 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09 09 09  LITE_ANY, 0,....
11c18 20 20 20 20 20 66 6e 63 74 5f 53 65 74 57 4d 53       fnct_SetWMS
11c19 47 65 74 4d 61 70 49 6e 66 6f 73 2c 20 30 2c 20  GetMapInfos, 0, 
11c1a 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11c1b 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
11c1c 28 64 62 2c 20 22 57 4d 53 5f 53 65 74 47 65 74  (db, "WMS_SetGet
11c1d 4d 61 70 43 6f 70 79 72 69 67 68 74 22 2c 20 33  MapCopyright", 3
11c1e 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
11c1f 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f 53 65  ....     fnct_Se
11c20 74 57 4d 53 47 65 74 4d 61 70 43 6f 70 79 72 69  tWMSGetMapCopyri
11c21 67 68 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ght, 0, 0);.    
11c22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11c23 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d  unction (db, "WM
11c24 53 5f 53 65 74 47 65 74 4d 61 70 43 6f 70 79 72  S_SetGetMapCopyr
11c25 69 67 68 74 22 2c 20 34 2c 20 53 51 4c 49 54 45  ight", 4, SQLITE
11c26 5f 41 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20  _ANY, 0,....    
11c27 20 66 6e 63 74 5f 53 65 74 57 4d 53 47 65 74 4d   fnct_SetWMSGetM
11c28 61 70 43 6f 70 79 72 69 67 68 74 2c 20 30 2c 20  apCopyright, 0, 
11c29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11c2a 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
11c2b 28 64 62 2c 20 22 57 4d 53 5f 53 65 74 47 65 74  (db, "WMS_SetGet
11c2c 4d 61 70 4f 70 74 69 6f 6e 73 22 2c 20 33 2c 20  MapOptions", 3, 
11c2d 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09  SQLITE_ANY, 0,..
11c2e 09 09 20 20 20 20 20 66 6e 63 74 5f 53 65 74 57  ..     fnct_SetW
11c2f 4d 53 47 65 74 4d 61 70 4f 70 74 69 6f 6e 73 2c  MSGetMapOptions,
11c30 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11c31 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11c32 69 6f 6e 20 28 64 62 2c 20 22 57 4d 53 5f 53 65  ion (db, "WMS_Se
11c33 74 47 65 74 4d 61 70 4f 70 74 69 6f 6e 73 22 2c  tGetMapOptions",
11c34 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   4, SQLITE_ANY, 
11c35 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f  0,....     fnct_
11c36 53 65 74 57 4d 53 47 65 74 4d 61 70 4f 70 74 69  SetWMSGetMapOpti
11c37 6f 6e 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ons, 0, 0);.    
11c38 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11c39 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d  unction (db, "WM
11c3a 53 5f 53 65 74 47 65 74 4d 61 70 4f 70 74 69 6f  S_SetGetMapOptio
11c3b 6e 73 22 2c 20 36 2c 20 53 51 4c 49 54 45 5f 41  ns", 6, SQLITE_A
11c3c 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20 20 66  NY, 0,....     f
11c3d 6e 63 74 5f 53 65 74 57 4d 53 47 65 74 4d 61 70  nct_SetWMSGetMap
11c3e 4f 70 74 69 6f 6e 73 2c 20 30 2c 20 30 29 3b 0a  Options, 0, 0);.
11c3f 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11c40 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
11c41 20 22 57 4d 53 5f 52 65 67 69 73 74 65 72 53 65   "WMS_RegisterSe
11c42 74 74 69 6e 67 22 2c 20 34 2c 20 53 51 4c 49 54  tting", 4, SQLIT
11c43 45 5f 41 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20  E_ANY, 0,....   
11c44 20 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72 57    fnct_RegisterW
11c45 4d 53 53 65 74 74 69 6e 67 2c 20 30 2c 20 30 29  MSSetting, 0, 0)
11c46 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11c47 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64  eate_function (d
11c48 62 2c 20 22 57 4d 53 5f 52 65 67 69 73 74 65 72  b, "WMS_Register
11c49 53 65 74 74 69 6e 67 22 2c 20 35 2c 20 53 51 4c  Setting", 5, SQL
11c4a 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09 09 09 20  ITE_ANY, 0,.... 
11c4b 20 20 20 20 66 6e 63 74 5f 52 65 67 69 73 74 65      fnct_Registe
11c4c 72 57 4d 53 53 65 74 74 69 6e 67 2c 20 30 2c 20  rWMSSetting, 0, 
11c4d 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11c4e 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
11c4f 28 64 62 2c 20 22 57 4d 53 5f 44 65 66 61 75 6c  (db, "WMS_Defaul
11c50 74 53 65 74 74 69 6e 67 22 2c 20 34 2c 20 53 51  tSetting", 4, SQ
11c51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09 09 09  LITE_ANY, 0,....
11c52 20 20 20 20 20 66 6e 63 74 5f 44 65 66 61 75 6c       fnct_Defaul
11c53 74 57 4d 53 53 65 74 74 69 6e 67 2c 20 30 2c 20  tWMSSetting, 0, 
11c54 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11c55 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
11c56 28 64 62 2c 20 22 57 4d 53 5f 55 6e 52 65 67 69  (db, "WMS_UnRegi
11c57 73 74 65 72 53 65 74 74 69 6e 67 22 2c 20 34 2c  sterSetting", 4,
11c58 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a   SQLITE_ANY, 0,.
11c59 09 09 09 20 20 20 20 20 66 6e 63 74 5f 55 6e 72  ...     fnct_Unr
11c5a 65 67 69 73 74 65 72 57 4d 53 53 65 74 74 69 6e  egisterWMSSettin
11c5b 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
11c5c 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11c5d 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d 53 5f  ction (db, "WMS_
11c5e 52 65 67 69 73 74 65 72 52 65 66 53 79 73 22 2c  RegisterRefSys",
11c5f 20 37 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   7, SQLITE_ANY, 
11c60 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f  0,....     fnct_
11c61 52 65 67 69 73 74 65 72 57 4d 53 52 65 66 53 79  RegisterWMSRefSy
11c62 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  s, 0, 0);.    sq
11c63 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11c64 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d 53 5f  ction (db, "WMS_
11c65 52 65 67 69 73 74 65 72 52 65 66 53 79 73 22 2c  RegisterRefSys",
11c66 20 38 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   8, SQLITE_ANY, 
11c67 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f  0,....     fnct_
11c68 52 65 67 69 73 74 65 72 57 4d 53 52 65 66 53 79  RegisterWMSRefSy
11c69 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  s, 0, 0);.    sq
11c6a 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11c6b 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d 53 5f  ction (db, "WMS_
11c6c 44 65 66 61 75 6c 74 52 65 66 53 79 73 22 2c 20  DefaultRefSys", 
11c6d 33 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30  3, SQLITE_ANY, 0
11c6e 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f 44  ,....     fnct_D
11c6f 65 66 61 75 6c 74 57 4d 53 52 65 66 53 79 73 2c  efaultWMSRefSys,
11c70 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11c71 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11c72 69 6f 6e 20 28 64 62 2c 20 22 57 4d 53 5f 55 6e  ion (db, "WMS_Un
11c73 52 65 67 69 73 74 65 72 52 65 66 53 79 73 22 2c  RegisterRefSys",
11c74 20 33 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   3, SQLITE_ANY, 
11c75 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f  0,....     fnct_
11c76 55 6e 72 65 67 69 73 74 65 72 57 4d 53 52 65 66  UnregisterWMSRef
11c77 53 79 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Sys, 0, 0);.    
11c78 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11c79 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 57 4d  unction (db, "WM
11c7a 53 5f 47 65 74 4d 61 70 52 65 71 75 65 73 74 55  S_GetMapRequestU
11c7b 52 4c 22 2c 20 38 2c 20 53 51 4c 49 54 45 5f 41  RL", 8, SQLITE_A
11c7c 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20 20 66  NY, 0,....     f
11c7d 6e 63 74 5f 57 4d 53 47 65 74 4d 61 70 52 65 71  nct_WMSGetMapReq
11c7e 75 65 73 74 55 52 4c 2c 20 30 2c 20 30 29 3b 0a  uestURL, 0, 0);.
11c7f 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11c80 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
11c81 20 22 57 4d 53 5f 47 65 74 46 65 61 74 75 72 65   "WMS_GetFeature
11c82 49 6e 66 6f 52 65 71 75 65 73 74 55 52 4c 22 2c  InfoRequestURL",
11c83 20 31 30 2c 0a 09 09 09 20 20 20 20 20 53 51 4c   10,....     SQL
11c84 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e 63 74  ITE_ANY, 0, fnct
11c85 5f 57 4d 53 47 65 74 46 65 61 74 75 72 65 49 6e  _WMSGetFeatureIn
11c86 66 6f 52 65 71 75 65 73 74 55 52 4c 2c 0a 09 09  foRequestURL,...
11c87 09 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20  .     0, 0);.   
11c88 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11c89 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 57  function (db, "W
11c8a 4d 53 5f 47 65 74 46 65 61 74 75 72 65 49 6e 66  MS_GetFeatureInf
11c8b 6f 52 65 71 75 65 73 74 55 52 4c 22 2c 20 31 31  oRequestURL", 11
11c8c 2c 0a 09 09 09 20 20 20 20 20 53 51 4c 49 54 45  ,....     SQLITE
11c8d 5f 41 4e 59 2c 20 30 2c 20 66 6e 63 74 5f 57 4d  _ANY, 0, fnct_WM
11c8e 53 47 65 74 46 65 61 74 75 72 65 49 6e 66 6f 52  SGetFeatureInfoR
11c8f 65 71 75 65 73 74 55 52 4c 2c 0a 09 09 09 20 20  equestURL,....  
11c90 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71     0, 0);.    sq
11c91 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11c92 63 74 69 6f 6e 20 28 64 62 2c 20 22 52 65 67 69  ction (db, "Regi
11c93 73 74 65 72 44 61 74 61 4c 69 63 65 6e 73 65 22  sterDataLicense"
11c94 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
11c95 20 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74   0,....     fnct
11c96 5f 52 65 67 69 73 74 65 72 44 61 74 61 4c 69 63  _RegisterDataLic
11c97 65 6e 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ense, 0, 0);.   
11c98 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11c99 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 52  function (db, "R
11c9a 65 67 69 73 74 65 72 44 61 74 61 4c 69 63 65 6e  egisterDataLicen
11c9b 73 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 41  se", 2, SQLITE_A
11c9c 4e 59 2c 20 30 2c 0a 09 09 09 20 20 20 20 20 66  NY, 0,....     f
11c9d 6e 63 74 5f 52 65 67 69 73 74 65 72 44 61 74 61  nct_RegisterData
11c9e 4c 69 63 65 6e 73 65 2c 20 30 2c 20 30 29 3b 0a  License, 0, 0);.
11c9f 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11ca0 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
11ca1 20 22 55 6e 52 65 67 69 73 74 65 72 44 61 74 61   "UnRegisterData
11ca2 4c 69 63 65 6e 73 65 22 2c 20 31 2c 20 53 51 4c  License", 1, SQL
11ca3 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09 09 09 20  ITE_ANY, 0,.... 
11ca4 20 20 20 20 66 6e 63 74 5f 55 6e 52 65 67 69 73      fnct_UnRegis
11ca5 74 65 72 44 61 74 61 4c 69 63 65 6e 73 65 2c 20  terDataLicense, 
11ca6 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11ca7 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11ca8 6f 6e 20 28 64 62 2c 20 22 52 65 6e 61 6d 65 44  on (db, "RenameD
11ca9 61 74 61 4c 69 63 65 6e 73 65 22 2c 20 32 2c 20  ataLicense", 2, 
11caa 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09  SQLITE_ANY, 0,..
11cab 09 09 20 20 20 20 20 66 6e 63 74 5f 52 65 6e 61  ..     fnct_Rena
11cac 6d 65 44 61 74 61 4c 69 63 65 6e 73 65 2c 20 30  meDataLicense, 0
11cad 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11cae 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11caf 6e 20 28 64 62 2c 20 22 53 65 74 44 61 74 61 4c  n (db, "SetDataL
11cb0 69 63 65 6e 73 65 55 72 6c 22 2c 20 32 2c 20 53  icenseUrl", 2, S
11cb1 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09 09  QLITE_ANY, 0,...
11cb2 09 20 20 20 20 20 66 6e 63 74 5f 53 65 74 44 61  .     fnct_SetDa
11cb3 74 61 4c 69 63 65 6e 73 65 55 72 6c 2c 20 30 2c  taLicenseUrl, 0,
11cb4 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11cb5 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11cb6 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61 74 65  _v2 (db, "Create
11cb7 4d 65 74 61 43 61 74 61 6c 6f 67 54 61 62 6c 65  MetaCatalogTable
11cb8 73 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  s", 1,.....SQLIT
11cb9 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11cba 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
11cbb 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74  ,.....fnct_Creat
11cbc 65 4d 65 74 61 43 61 74 61 6c 6f 67 54 61 62 6c  eMetaCatalogTabl
11cbd 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  es, 0, 0, 0);.  
11cbe 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11cbf 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11cc0 2c 20 22 55 70 64 61 74 65 4d 65 74 61 43 61 74  , "UpdateMetaCat
11cc1 61 6c 6f 67 53 74 61 74 69 73 74 69 63 73 22 2c  alogStatistics",
11cc2 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
11cc3 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11cc4 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
11cc5 09 09 09 66 6e 63 74 5f 55 70 64 61 74 65 4d 65  ...fnct_UpdateMe
11cc6 74 61 43 61 74 61 6c 6f 67 53 74 61 74 69 73 74  taCatalogStatist
11cc7 69 63 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ics, 0, 0, 0);. 
11cc8 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11cc9 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11cca 62 2c 20 22 55 70 64 61 74 65 4d 65 74 61 43 61  b, "UpdateMetaCa
11ccb 74 61 6c 6f 67 53 74 61 74 69 73 74 69 63 73 22  talogStatistics"
11ccc 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 4,.....SQLITE_
11ccd 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11cce 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
11ccf 09 09 09 09 66 6e 63 74 5f 55 70 64 61 74 65 4d  ....fnct_UpdateM
11cd0 65 74 61 43 61 74 61 6c 6f 67 53 74 61 74 69 73  etaCatalogStatis
11cd1 74 69 63 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tics, 0, 0, 0);.
11cd2 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11cd3 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11cd4 64 62 2c 20 22 41 73 54 65 78 74 22 2c 20 31 2c  db, "AsText", 1,
11cd5 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11cd6 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11cd7 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
11cd8 09 09 09 09 66 6e 63 74 5f 41 73 54 65 78 74 2c  ....fnct_AsText,
11cd9 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
11cda 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
11cdb 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
11cdc 53 54 5f 41 73 54 65 78 74 22 2c 20 31 2c 0a 09  ST_AsText", 1,..
11cdd 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11cde 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11cdf 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
11ce0 09 09 66 6e 63 74 5f 41 73 54 65 78 74 2c 20 30  ..fnct_AsText, 0
11ce1 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11ce2 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11ce3 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41 73  tion_v2 (db, "As
11ce4 57 6b 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  Wkt", 1,.....SQL
11ce5 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11ce6 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11ce7 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11ce8 5f 41 73 57 6b 74 2c 20 30 2c 20 30 2c 20 30 29  _AsWkt, 0, 0, 0)
11ce9 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11cea 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11ceb 20 28 64 62 2c 20 22 41 73 57 6b 74 22 2c 20 32   (db, "AsWkt", 2
11cec 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11ced 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11cee 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
11cef 0a 09 09 09 09 66 6e 63 74 5f 41 73 57 6b 74 2c  .....fnct_AsWkt,
11cf0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
11cf1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
11cf2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
11cf3 41 73 53 76 67 22 2c 20 31 2c 0a 09 09 09 09 53  AsSvg", 1,.....S
11cf4 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11cf5 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11cf6 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
11cf7 63 74 5f 41 73 53 76 67 31 2c 20 30 2c 20 30 2c  ct_AsSvg1, 0, 0,
11cf8 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11cf9 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11cfa 5f 76 32 20 28 64 62 2c 20 22 41 73 53 76 67 22  _v2 (db, "AsSvg"
11cfb 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
11cfc 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11cfd 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11cfe 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 53  he,.....fnct_AsS
11cff 76 67 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  vg2, 0, 0, 0);. 
11d00 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11d01 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11d02 62 2c 20 22 41 73 53 76 67 22 2c 20 33 2c 0a 09  b, "AsSvg", 3,..
11d03 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11d04 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11d05 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
11d06 09 09 66 6e 63 74 5f 41 73 53 76 67 33 2c 20 30  ..fnct_AsSvg3, 0
11d07 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11d08 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11d09 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 6c  tion_v2 (db, "Cl
11d0a 6f 6e 65 54 61 62 6c 65 22 2c 20 34 2c 0a 09 09  oneTable", 4,...
11d0b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11d0c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11d0d 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11d0e 74 5f 43 6c 6f 6e 65 54 61 62 6c 65 2c 20 30 2c  t_CloneTable, 0,
11d0f 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11d10 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11d11 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 6c 6f  ion_v2 (db, "Clo
11d12 6e 65 54 61 62 6c 65 22 2c 20 35 2c 0a 09 09 09  neTable", 5,....
11d13 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11d14 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11d15 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
11d16 5f 43 6c 6f 6e 65 54 61 62 6c 65 2c 20 30 2c 20  _CloneTable, 0, 
11d17 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11d18 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11d19 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 6c 6f 6e  on_v2 (db, "Clon
11d1a 65 54 61 62 6c 65 22 2c 20 36 2c 0a 09 09 09 09  eTable", 6,.....
11d1b 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11d1c 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11d1d 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11d1e 43 6c 6f 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30  CloneTable, 0, 0
11d1f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11d20 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11d21 6e 5f 76 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65  n_v2 (db, "Clone
11d22 54 61 62 6c 65 22 2c 20 37 2c 0a 09 09 09 09 53  Table", 7,.....S
11d23 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11d24 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11d25 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43  C, 0,.....fnct_C
11d26 6c 6f 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c  loneTable, 0, 0,
11d27 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11d28 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11d29 5f 76 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54  _v2 (db, "CloneT
11d2a 61 62 6c 65 22 2c 20 38 2c 0a 09 09 09 09 53 51  able", 8,.....SQ
11d2b 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11d2c 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11d2d 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c  , 0,.....fnct_Cl
11d2e 6f 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20  oneTable, 0, 0, 
11d2f 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11d30 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11d31 76 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54 61  v2 (db, "CloneTa
11d32 62 6c 65 22 2c 20 39 2c 0a 09 09 09 09 53 51 4c  ble", 9,.....SQL
11d33 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d34 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d35 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f   0,.....fnct_Clo
11d36 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30  neTable, 0, 0, 0
11d37 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11d38 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11d39 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54 61 62  2 (db, "CloneTab
11d3a 6c 65 22 2c 20 31 30 2c 0a 09 09 09 09 53 51 4c  le", 10,.....SQL
11d3b 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d3c 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d3d 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f   0,.....fnct_Clo
11d3e 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30  neTable, 0, 0, 0
11d3f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11d40 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11d41 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54 61 62  2 (db, "CloneTab
11d42 6c 65 22 2c 20 31 31 2c 0a 09 09 09 09 53 51 4c  le", 11,.....SQL
11d43 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d44 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d45 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f   0,.....fnct_Clo
11d46 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30  neTable, 0, 0, 0
11d47 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11d48 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11d49 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54 61 62  2 (db, "CloneTab
11d4a 6c 65 22 2c 20 31 32 2c 0a 09 09 09 09 53 51 4c  le", 12,.....SQL
11d4b 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d4c 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d4d 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f   0,.....fnct_Clo
11d4e 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30  neTable, 0, 0, 0
11d4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11d50 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11d51 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54 61 62  2 (db, "CloneTab
11d52 6c 65 22 2c 20 31 33 2c 0a 09 09 09 09 53 51 4c  le", 13,.....SQL
11d53 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d55 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f   0,.....fnct_Clo
11d56 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30  neTable, 0, 0, 0
11d57 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11d58 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11d59 32 20 28 64 62 2c 20 22 43 6c 6f 6e 65 54 61 62  2 (db, "CloneTab
11d5a 6c 65 22 2c 20 31 34 2c 0a 09 09 09 09 53 51 4c  le", 14,.....SQL
11d5b 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d5c 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d5d 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f   0,.....fnct_Clo
11d5e 6e 65 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30  neTable, 0, 0, 0
11d5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11d60 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11d61 32 20 28 64 62 2c 20 22 43 72 65 61 74 65 43 6c  2 (db, "CreateCl
11d62 6f 6e 65 64 54 61 62 6c 65 22 2c 20 34 2c 0a 09  onedTable", 4,..
11d63 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11d64 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11d65 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
11d66 63 74 5f 43 72 65 61 74 65 43 6c 6f 6e 65 64 54  ct_CreateClonedT
11d67 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  able, 0, 0, 0);.
11d68 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11d69 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11d6a 64 62 2c 20 22 43 72 65 61 74 65 43 6c 6f 6e 65  db, "CreateClone
11d6b 64 54 61 62 6c 65 22 2c 20 35 2c 0a 09 09 09 09  dTable", 5,.....
11d6c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11d6d 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11d6e 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11d6f 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c  CreateClonedTabl
11d70 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
11d71 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11d72 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
11d73 20 22 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61   "CreateClonedTa
11d74 62 6c 65 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c  ble", 6,.....SQL
11d75 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11d76 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11d77 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72 65   0,.....fnct_Cre
11d78 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 2c 20  ateClonedTable, 
11d79 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11d7a 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11d7b 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
11d7c 72 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65  reateClonedTable
11d7d 22 2c 20 37 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 7,.....SQLITE
11d7e 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11d7f 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
11d80 0a 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74 65  .....fnct_Create
11d81 43 6c 6f 6e 65 64 54 61 62 6c 65 2c 20 30 2c 20  ClonedTable, 0, 
11d82 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11d83 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11d84 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61  on_v2 (db, "Crea
11d85 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 22 2c 20  teClonedTable", 
11d86 38 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  8,.....SQLITE_UT
11d87 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11d88 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
11d89 09 09 66 6e 63 74 5f 43 72 65 61 74 65 43 6c 6f  ..fnct_CreateClo
11d8a 6e 65 64 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20  nedTable, 0, 0, 
11d8b 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11d8c 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11d8d 76 32 20 28 64 62 2c 20 22 43 72 65 61 74 65 43  v2 (db, "CreateC
11d8e 6c 6f 6e 65 64 54 61 62 6c 65 22 2c 20 39 2c 0a  lonedTable", 9,.
11d8f 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11d90 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11d91 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
11d92 6e 63 74 5f 43 72 65 61 74 65 43 6c 6f 6e 65 64  nct_CreateCloned
11d93 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b  Table, 0, 0, 0);
11d94 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
11d95 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
11d96 28 64 62 2c 20 22 43 72 65 61 74 65 43 6c 6f 6e  (db, "CreateClon
11d97 65 64 54 61 62 6c 65 22 2c 20 31 30 2c 0a 09 09  edTable", 10,...
11d98 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11d99 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11d9a 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
11d9b 74 5f 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61  t_CreateClonedTa
11d9c 62 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ble, 0, 0, 0);. 
11d9d 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11d9e 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11d9f 62 2c 20 22 43 72 65 61 74 65 43 6c 6f 6e 65 64  b, "CreateCloned
11da0 54 61 62 6c 65 22 2c 20 31 31 2c 0a 09 09 09 09  Table", 11,.....
11da1 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11da2 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11da3 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
11da4 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c  CreateClonedTabl
11da5 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
11da6 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11da7 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
11da8 20 22 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61   "CreateClonedTa
11da9 62 6c 65 22 2c 20 31 32 2c 0a 09 09 09 09 53 51  ble", 12,.....SQ
11daa 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11dab 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11dac 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72  , 0,.....fnct_Cr
11dad 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 2c  eateClonedTable,
11dae 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
11daf 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
11db0 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
11db1 43 72 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c  CreateClonedTabl
11db2 65 22 2c 20 31 33 2c 0a 09 09 09 09 53 51 4c 49  e", 13,.....SQLI
11db3 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
11db4 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
11db5 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72 65 61  0,.....fnct_Crea
11db6 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 2c 20 30  teClonedTable, 0
11db7 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11db8 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11db9 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72  tion_v2 (db, "Cr
11dba 65 61 74 65 43 6c 6f 6e 65 64 54 61 62 6c 65 22  eateClonedTable"
11dbb 2c 20 31 34 2c 0a 09 09 09 09 53 51 4c 49 54 45  , 14,.....SQLITE
11dbc 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11dbd 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
11dbe 0a 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74 65  .....fnct_Create
11dbf 43 6c 6f 6e 65 64 54 61 62 6c 65 2c 20 30 2c 20  ClonedTable, 0, 
11dc0 30 2c 20 30 29 3b 0a 0a 23 69 66 6e 64 65 66 20  0, 0);..#ifndef 
11dc1 4f 4d 49 54 5f 50 52 4f 4a 09 09 2f 2a 20 50 52  OMIT_PROJ../* PR
11dc2 4f 4a 2e 34 20 69 73 20 73 74 72 69 63 74 6c 79  OJ.4 is strictly
11dc3 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 75 70   required to sup
11dc4 70 6f 72 74 20 4b 4d 4c 20 2a 2f 0a 20 20 20 20  port KML */.    
11dc5 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11dc6 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11dc7 22 41 73 4b 6d 6c 22 2c 20 31 2c 0a 09 09 09 09  "AsKml", 1,.....
11dc8 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11dc9 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11dca 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11dcb 6e 63 74 5f 41 73 4b 6d 6c 2c 20 30 2c 20 30 2c  nct_AsKml, 0, 0,
11dcc 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11dcd 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11dce 5f 76 32 20 28 64 62 2c 20 22 41 73 4b 6d 6c 22  _v2 (db, "AsKml"
11dcf 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
11dd0 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11dd1 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11dd2 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 4b  he,.....fnct_AsK
11dd3 6d 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ml, 0, 0, 0);.  
11dd4 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11dd5 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11dd6 2c 20 22 41 73 4b 6d 6c 22 2c 20 33 2c 0a 09 09  , "AsKml", 3,...
11dd7 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11dd8 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11dd9 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
11dda 09 66 6e 63 74 5f 41 73 4b 6d 6c 2c 20 30 2c 20  .fnct_AsKml, 0, 
11ddb 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11ddc 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11ddd 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41 73 4b 6d  on_v2 (db, "AsKm
11dde 6c 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54  l", 4,.....SQLIT
11ddf 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
11de0 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
11de1 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41  ache,.....fnct_A
11de2 73 4b 6d 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  sKml, 0, 0, 0);.
11de3 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 69 6e  #endif /* end in
11de4 63 6c 75 64 69 6e 67 20 50 52 4f 4a 2e 34 20 2a  cluding PROJ.4 *
11de5 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  /..    sqlite3_c
11de6 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11de7 32 20 28 64 62 2c 20 22 41 73 47 6d 6c 22 2c 20  2 (db, "AsGml", 
11de8 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
11de9 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11dea 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
11deb 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 47 6d 6c  ,.....fnct_AsGml
11dec 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11ded 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11dee 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11def 22 41 73 47 6d 6c 22 2c 20 32 2c 0a 09 09 09 09  "AsGml", 2,.....
11df0 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11df1 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11df2 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11df3 6e 63 74 5f 41 73 47 6d 6c 2c 20 30 2c 20 30 2c  nct_AsGml, 0, 0,
11df4 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11df5 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11df6 5f 76 32 20 28 64 62 2c 20 22 41 73 47 6d 6c 22  _v2 (db, "AsGml"
11df7 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
11df8 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11df9 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11dfa 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 47  he,.....fnct_AsG
11dfb 6d 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ml, 0, 0, 0);.  
11dfc 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11dfd 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11dfe 2c 20 22 47 65 6f 6d 46 72 6f 6d 47 6d 6c 22 2c  , "GeomFromGml",
11dff 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11e00 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11e01 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11e02 65 2c 0a 09 09 09 09 66 6e 63 74 5f 46 72 6f 6d  e,.....fnct_From
11e03 47 6d 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Gml, 0, 0, 0);. 
11e04 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
11e05 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
11e06 62 2c 20 22 41 73 47 65 6f 4a 53 4f 4e 22 2c 20  b, "AsGeoJSON", 
11e07 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
11e08 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11e09 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
11e0a 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 47 65 6f  ,.....fnct_AsGeo
11e0b 4a 53 4f 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  JSON, 0, 0, 0);.
11e0c 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11e0d 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11e0e 64 62 2c 20 22 41 73 47 65 6f 4a 53 4f 4e 22 2c  db, "AsGeoJSON",
11e0f 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
11e10 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11e11 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11e12 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 47 65  e,.....fnct_AsGe
11e13 6f 4a 53 4f 4e 2c 20 30 2c 20 30 2c 20 30 29 3b  oJSON, 0, 0, 0);
11e14 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
11e15 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
11e16 28 64 62 2c 20 22 41 73 47 65 6f 4a 53 4f 4e 22  (db, "AsGeoJSON"
11e17 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
11e18 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11e19 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11e1a 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 47  he,.....fnct_AsG
11e1b 65 6f 4a 53 4f 4e 2c 20 30 2c 20 30 2c 20 30 29  eoJSON, 0, 0, 0)
11e1c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11e1d 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11e1e 20 28 64 62 2c 20 22 47 65 6f 6d 46 72 6f 6d 47   (db, "GeomFromG
11e1f 65 6f 4a 53 4f 4e 22 2c 20 31 2c 0a 09 09 09 09  eoJSON", 1,.....
11e20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11e21 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11e22 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11e23 6e 63 74 5f 46 72 6f 6d 47 65 6f 4a 53 4f 4e 2c  nct_FromGeoJSON,
11e24 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
11e25 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
11e26 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
11e27 47 65 6f 6d 46 72 6f 6d 4b 6d 6c 22 2c 20 31 2c  GeomFromKml", 1,
11e28 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11e29 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11e2a 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
11e2b 09 09 09 09 66 6e 63 74 5f 46 72 6f 6d 4b 6d 6c  ....fnct_FromKml
11e2c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11e2d 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11e2e 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11e2f 22 41 73 46 47 46 22 2c 20 32 2c 0a 09 09 09 09  "AsFGF", 2,.....
11e30 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11e31 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11e32 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11e33 6e 63 74 5f 41 73 46 47 46 2c 20 30 2c 20 30 2c  nct_AsFGF, 0, 0,
11e34 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11e35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
11e36 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 46 72  _v2 (db, "GeomFr
11e37 6f 6d 45 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09  omEWKB", 1,.....
11e38 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11e39 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11e3a 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11e3b 6e 63 74 5f 46 72 6f 6d 45 57 4b 42 2c 20 30 2c  nct_FromEWKB, 0,
11e3c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11e3d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11e3e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41 73 45  ion_v2 (db, "AsE
11e3f 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  WKB", 1,.....SQL
11e40 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11e41 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11e42 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11e43 5f 54 6f 45 57 4b 42 2c 20 30 2c 20 30 2c 20 30  _ToEWKB, 0, 0, 0
11e44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
11e45 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
11e46 32 20 28 64 62 2c 20 22 41 73 45 57 4b 54 22 2c  2 (db, "AsEWKT",
11e47 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11e48 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11e49 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11e4a 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 6f 45 57  e,.....fnct_ToEW
11e4b 4b 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  KT, 0, 0, 0);.  
11e4c 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11e4d 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11e4e 2c 20 22 47 65 6f 6d 46 72 6f 6d 45 57 4b 54 22  , "GeomFromEWKT"
11e4f 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
11e50 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11e51 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11e52 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 46 72 6f  he,.....fnct_Fro
11e53 6d 45 57 4b 54 2c 20 30 2c 20 30 2c 20 30 29 3b  mEWKT, 0, 0, 0);
11e54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
11e55 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
11e56 28 64 62 2c 20 22 41 73 42 69 6e 61 72 79 22 2c  (db, "AsBinary",
11e57 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11e58 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11e59 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11e5a 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 42 69  e,.....fnct_AsBi
11e5b 6e 61 72 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nary, 0, 0, 0);.
11e5c 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11e5d 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11e5e 64 62 2c 20 22 53 54 5f 41 73 42 69 6e 61 72 79  db, "ST_AsBinary
11e5f 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
11e60 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11e61 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11e62 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73  che,.....fnct_As
11e63 42 69 6e 61 72 79 2c 20 30 2c 20 30 2c 20 30 29  Binary, 0, 0, 0)
11e64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11e65 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11e66 20 28 64 62 2c 20 22 47 65 6f 6d 46 72 6f 6d 54   (db, "GeomFromT
11e67 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ext", 1,.....SQL
11e68 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11e69 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11e6a 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11e6b 5f 47 65 6f 6d 46 72 6f 6d 54 65 78 74 31 2c 20  _GeomFromText1, 
11e6c 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11e6d 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11e6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47  ction_v2 (db, "G
11e6f 65 6f 6d 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c  eomFromText", 2,
11e70 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11e71 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11e72 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
11e73 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f  ....fnct_GeomFro
11e74 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
11e75 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11e76 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11e77 20 28 64 62 2c 20 22 47 65 6f 6d 65 74 72 79 46   (db, "GeometryF
11e78 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09  romText", 1,....
11e79 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11e7a 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11e7b 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
11e7c 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d 54 65 78  fnct_GeomFromTex
11e7d 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t1, 0, 0, 0);.  
11e7e 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11e7f 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11e80 2c 20 22 47 65 6f 6d 65 74 72 79 46 72 6f 6d 54  , "GeometryFromT
11e81 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  ext", 2,.....SQL
11e82 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11e83 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11e84 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11e85 5f 47 65 6f 6d 46 72 6f 6d 54 65 78 74 32 2c 20  _GeomFromText2, 
11e86 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11e87 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11e88 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47  ction_v2 (db, "G
11e89 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 54 65 78 74 22  eomCollFromText"
11e8a 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
11e8b 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11e8c 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11e8d 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f  he,.....fnct_Geo
11e8e 6d 43 6f 6c 6c 46 72 6f 6d 54 65 78 74 31 2c 20  mCollFromText1, 
11e8f 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11e90 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11e91 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47  ction_v2 (db, "G
11e92 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 54 65 78 74 22  eomCollFromText"
11e93 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
11e94 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11e95 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11e96 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f  he,.....fnct_Geo
11e97 6d 43 6f 6c 6c 46 72 6f 6d 54 65 78 74 32 2c 20  mCollFromText2, 
11e98 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11e99 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11e9a 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47  ction_v2 (db, "G
11e9b 65 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74 69 6f  eometryCollectio
11e9c 6e 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09  nFromText", 1,..
11e9d 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11e9e 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11e9f 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
11ea0 09 09 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46  ..fnct_GeomCollF
11ea1 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c 20  romText1, 0, 0, 
11ea2 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11ea3 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11ea4 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 65 74 72  v2 (db, "Geometr
11ea5 79 43 6f 6c 6c 65 63 74 69 6f 6e 46 72 6f 6d 54  yCollectionFromT
11ea6 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  ext", 2,.....SQL
11ea7 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11ea8 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11ea9 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11eaa 5f 47 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 54 65 78  _GeomCollFromTex
11eab 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t2, 0, 0, 0);.  
11eac 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11ead 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11eae 2c 20 22 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74  , "PointFromText
11eaf 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
11eb0 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11eb1 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11eb2 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f  che,.....fnct_Po
11eb3 69 6e 74 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c  intFromText1, 0,
11eb4 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11eb5 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11eb6 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 50 6f 69  ion_v2 (db, "Poi
11eb7 6e 74 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a  ntFromText", 2,.
11eb8 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11eb9 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11eba 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
11ebb 09 09 09 66 6e 63 74 5f 50 6f 69 6e 74 46 72 6f  ...fnct_PointFro
11ebc 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
11ebd 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11ebe 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11ebf 20 28 64 62 2c 20 22 4c 69 6e 65 46 72 6f 6d 54   (db, "LineFromT
11ec0 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ext", 1,.....SQL
11ec1 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11ec2 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11ec3 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11ec4 5f 4c 69 6e 65 46 72 6f 6d 54 65 78 74 31 2c 20  _LineFromText1, 
11ec5 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11ec6 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11ec7 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4c  ction_v2 (db, "L
11ec8 69 6e 65 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c  ineFromText", 2,
11ec9 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11eca 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11ecb 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
11ecc 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f  ....fnct_LineFro
11ecd 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
11ece 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11ecf 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11ed0 20 28 64 62 2c 20 22 4c 69 6e 65 53 74 72 69 6e   (db, "LineStrin
11ed1 67 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09  gFromText", 1,..
11ed2 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11ed3 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11ed4 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
11ed5 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 54  ..fnct_LineFromT
11ed6 65 78 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext1, 0, 0, 0);.
11ed7 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11ed8 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11ed9 64 62 2c 20 22 4c 69 6e 65 53 74 72 69 6e 67 46  db, "LineStringF
11eda 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09 09  romText", 2,....
11edb 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11edc 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11edd 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
11ede 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 54 65 78  fnct_LineFromTex
11edf 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t2, 0, 0, 0);.  
11ee0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11ee1 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11ee2 2c 20 22 50 6f 6c 79 46 72 6f 6d 54 65 78 74 22  , "PolyFromText"
11ee3 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
11ee4 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11ee5 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
11ee6 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 6c  he,.....fnct_Pol
11ee7 79 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30  yFromText1, 0, 0
11ee8 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11ee9 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11eea 6e 5f 76 32 20 28 64 62 2c 20 22 50 6f 6c 79 46  n_v2 (db, "PolyF
11eeb 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09 09  romText", 2,....
11eec 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11eed 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11eee 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
11eef 66 6e 63 74 5f 50 6f 6c 79 46 72 6f 6d 54 65 78  fnct_PolyFromTex
11ef0 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t2, 0, 0, 0);.  
11ef1 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11ef2 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11ef3 2c 20 22 50 6f 6c 79 67 6f 6e 46 72 6f 6d 54 65  , "PolygonFromTe
11ef4 78 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  xt", 1,.....SQLI
11ef5 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
11ef6 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
11ef7 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
11ef8 50 6f 6c 79 46 72 6f 6d 54 65 78 74 31 2c 20 30  PolyFromText1, 0
11ef9 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11efa 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11efb 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 50 6f  tion_v2 (db, "Po
11efc 6c 79 67 6f 6e 46 72 6f 6d 54 65 78 74 22 2c 20  lygonFromText", 
11efd 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
11efe 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11eff 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
11f00 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 6c 79 46  ,.....fnct_PolyF
11f01 72 6f 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20  romText2, 0, 0, 
11f02 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11f03 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11f04 76 32 20 28 64 62 2c 20 22 4d 50 6f 69 6e 74 46  v2 (db, "MPointF
11f05 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09  romText", 1,....
11f06 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
11f07 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
11f08 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
11f09 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72 6f 6d 54  fnct_MPointFromT
11f0a 65 78 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext1, 0, 0, 0);.
11f0b 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11f0c 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11f0d 64 62 2c 20 22 4d 50 6f 69 6e 74 46 72 6f 6d 54  db, "MPointFromT
11f0e 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  ext", 2,.....SQL
11f0f 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11f10 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11f11 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11f12 5f 4d 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74 32  _MPointFromText2
11f13 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11f14 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11f15 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11f16 22 4d 75 6c 74 69 50 6f 69 6e 74 46 72 6f 6d 54  "MultiPointFromT
11f17 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ext", 1,.....SQL
11f18 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11f19 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11f1a 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11f1b 5f 4d 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74 31  _MPointFromText1
11f1c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11f1d 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11f1e 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11f1f 22 4d 75 6c 74 69 50 6f 69 6e 74 46 72 6f 6d 54  "MultiPointFromT
11f20 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  ext", 2,.....SQL
11f21 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11f22 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11f23 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11f24 5f 4d 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74 32  _MPointFromText2
11f25 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11f26 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11f27 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11f28 22 4d 4c 69 6e 65 46 72 6f 6d 54 65 78 74 22 2c  "MLineFromText",
11f29 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11f2a 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11f2b 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11f2c 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 4c 69 6e  e,.....fnct_MLin
11f2d 65 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30  eFromText1, 0, 0
11f2e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11f2f 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11f30 6e 5f 76 32 20 28 64 62 2c 20 22 4d 4c 69 6e 65  n_v2 (db, "MLine
11f31 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09  FromText", 2,...
11f32 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11f33 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11f34 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
11f35 09 66 6e 63 74 5f 4d 4c 69 6e 65 46 72 6f 6d 54  .fnct_MLineFromT
11f36 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext2, 0, 0, 0);.
11f37 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11f38 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11f39 64 62 2c 20 22 4d 75 6c 74 69 4c 69 6e 65 53 74  db, "MultiLineSt
11f3a 72 69 6e 67 46 72 6f 6d 54 65 78 74 22 2c 20 31  ringFromText", 1
11f3b 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11f3c 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11f3d 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
11f3e 0a 09 09 09 09 66 6e 63 74 5f 4d 4c 69 6e 65 46  .....fnct_MLineF
11f3f 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c 20  romText1, 0, 0, 
11f40 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11f41 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11f42 76 32 20 28 64 62 2c 20 22 4d 75 6c 74 69 4c 69  v2 (db, "MultiLi
11f43 6e 65 53 74 72 69 6e 67 46 72 6f 6d 54 65 78 74  neStringFromText
11f44 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
11f45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11f46 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11f47 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 4c  che,.....fnct_ML
11f48 69 6e 65 46 72 6f 6d 54 65 78 74 32 2c 20 30 2c  ineFromText2, 0,
11f49 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11f4a 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11f4b 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 50 6f  ion_v2 (db, "MPo
11f4c 6c 79 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a  lyFromText", 1,.
11f4d 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11f4e 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11f4f 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
11f50 09 09 09 66 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f  ...fnct_MPolyFro
11f51 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c 20 30 29  mText1, 0, 0, 0)
11f52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11f53 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11f54 20 28 64 62 2c 20 22 4d 50 6f 6c 79 46 72 6f 6d   (db, "MPolyFrom
11f55 54 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51  Text", 2,.....SQ
11f56 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11f57 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11f58 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
11f59 74 5f 4d 50 6f 6c 79 46 72 6f 6d 54 65 78 74 32  t_MPolyFromText2
11f5a 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11f5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11f5c 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11f5d 22 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 46 72 6f  "MultiPolygonFro
11f5e 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53  mText", 1,.....S
11f5f 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
11f60 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
11f61 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
11f62 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 54 65 78 74  ct_MPolyFromText
11f63 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
11f64 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11f65 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
11f66 20 22 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 46 72   "MultiPolygonFr
11f67 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09 09 09  omText", 2,.....
11f68 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
11f69 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
11f6a 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
11f6b 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 54 65 78  nct_MPolyFromTex
11f6c 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t2, 0, 0, 0);.  
11f6d 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11f6e 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11f6f 2c 20 22 47 65 6f 6d 46 72 6f 6d 57 4b 42 22 2c  , "GeomFromWKB",
11f70 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11f71 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11f72 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11f73 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d  e,.....fnct_Geom
11f74 46 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20  FromWkb1, 0, 0, 
11f75 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11f76 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11f77 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 46 72 6f  v2 (db, "GeomFro
11f78 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51  mWKB", 2,.....SQ
11f79 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11f7a 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11f7b 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
11f7c 74 5f 47 65 6f 6d 46 72 6f 6d 57 6b 62 32 2c 20  t_GeomFromWkb2, 
11f7d 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11f7e 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11f7f 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47  ction_v2 (db, "G
11f80 65 6f 6d 65 74 72 79 46 72 6f 6d 57 4b 42 22 2c  eometryFromWKB",
11f81 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
11f82 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
11f83 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
11f84 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d  e,.....fnct_Geom
11f85 46 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20  FromWkb1, 0, 0, 
11f86 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11f87 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
11f88 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 65 74 72  v2 (db, "Geometr
11f89 79 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09  yFromWKB", 2,...
11f8a 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11f8b 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11f8c 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
11f8d 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d 57 6b  .fnct_GeomFromWk
11f8e 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b2, 0, 0, 0);.  
11f8f 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11f90 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11f91 2c 20 22 47 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 57  , "GeomCollFromW
11f92 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  KB", 1,.....SQLI
11f93 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
11f94 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
11f95 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
11f96 47 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 57 6b 62 31  GeomCollFromWkb1
11f97 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11f98 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11f99 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
11f9a 22 47 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 57 4b 42  "GeomCollFromWKB
11f9b 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
11f9c 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11f9d 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11f9e 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65  che,.....fnct_Ge
11f9f 6f 6d 43 6f 6c 6c 46 72 6f 6d 57 6b 62 32 2c 20  omCollFromWkb2, 
11fa0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11fa1 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11fa2 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47  ction_v2 (db, "G
11fa3 65 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74 69 6f  eometryCollectio
11fa4 6e 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09  nFromWKB", 1,...
11fa5 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
11fa6 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
11fa7 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
11fa8 09 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72  .fnct_GeomCollFr
11fa9 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29  omWkb1, 0, 0, 0)
11faa 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11fab 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11fac 20 28 64 62 2c 20 22 47 65 6f 6d 65 74 72 79 43   (db, "GeometryC
11fad 6f 6c 6c 65 63 74 69 6f 6e 46 72 6f 6d 57 4b 42  ollectionFromWKB
11fae 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
11faf 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11fb0 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11fb1 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65  che,.....fnct_Ge
11fb2 6f 6d 43 6f 6c 6c 46 72 6f 6d 57 6b 62 32 2c 20  omCollFromWkb2, 
11fb3 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11fb4 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11fb5 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 50  ction_v2 (db, "P
11fb6 6f 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20 31 2c  ointFromWKB", 1,
11fb7 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
11fb8 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
11fb9 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
11fba 09 09 09 09 66 6e 63 74 5f 50 6f 69 6e 74 46 72  ....fnct_PointFr
11fbb 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29  omWkb1, 0, 0, 0)
11fbc 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
11fbd 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
11fbe 20 28 64 62 2c 20 22 50 6f 69 6e 74 46 72 6f 6d   (db, "PointFrom
11fbf 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  WKB", 2,.....SQL
11fc0 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
11fc1 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
11fc2 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
11fc3 5f 50 6f 69 6e 74 46 72 6f 6d 57 6b 62 32 2c 20  _PointFromWkb2, 
11fc4 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11fc5 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11fc6 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4c  ction_v2 (db, "L
11fc7 69 6e 65 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a  ineFromWKB", 1,.
11fc8 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11fc9 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11fca 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
11fcb 09 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d  ...fnct_LineFrom
11fcc 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Wkb1, 0, 0, 0);.
11fcd 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11fce 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11fcf 64 62 2c 20 22 4c 69 6e 65 46 72 6f 6d 57 4b 42  db, "LineFromWKB
11fd0 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
11fd1 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11fd2 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11fd3 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 69  che,.....fnct_Li
11fd4 6e 65 46 72 6f 6d 57 6b 62 32 2c 20 30 2c 20 30  neFromWkb2, 0, 0
11fd5 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11fd6 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11fd7 6e 5f 76 32 20 28 64 62 2c 20 22 4c 69 6e 65 53  n_v2 (db, "LineS
11fd8 74 72 69 6e 67 46 72 6f 6d 57 4b 42 22 2c 20 31  tringFromWKB", 1
11fd9 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
11fda 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11fdb 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
11fdc 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 57 6b  .fnct_LineFromWk
11fdd 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b1, 0, 0, 0);.  
11fde 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
11fdf 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
11fe0 2c 20 22 4c 69 6e 65 53 74 72 69 6e 67 46 72 6f  , "LineStringFro
11fe1 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51  mWKB", 2,.....SQ
11fe2 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11fe3 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11fe4 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
11fe5 74 5f 4c 69 6e 65 46 72 6f 6d 57 6b 62 32 2c 20  t_LineFromWkb2, 
11fe6 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
11fe7 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11fe8 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 50  ction_v2 (db, "P
11fe9 6f 6c 79 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a  olyFromWKB", 1,.
11fea 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
11feb 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11fec 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
11fed 09 09 09 66 6e 63 74 5f 50 6f 6c 79 46 72 6f 6d  ...fnct_PolyFrom
11fee 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Wkb1, 0, 0, 0);.
11fef 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
11ff0 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
11ff1 64 62 2c 20 22 50 6f 6c 79 46 72 6f 6d 57 4b 42  db, "PolyFromWKB
11ff2 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
11ff3 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11ff4 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
11ff5 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f  che,.....fnct_Po
11ff6 6c 79 46 72 6f 6d 57 6b 62 32 2c 20 30 2c 20 30  lyFromWkb2, 0, 0
11ff7 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11ff8 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11ff9 6e 5f 76 32 20 28 64 62 2c 20 22 50 6f 6c 79 67  n_v2 (db, "Polyg
11ffa 6f 6e 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09  onFromWKB", 1,..
11ffb 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
11ffc 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
11ffd 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
11ffe 09 09 66 6e 63 74 5f 50 6f 6c 79 46 72 6f 6d 57  ..fnct_PolyFromW
11fff 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  kb1, 0, 0, 0);. 
12000 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12001 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12002 62 2c 20 22 50 6f 6c 79 67 6f 6e 46 72 6f 6d 57  b, "PolygonFromW
12003 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  KB", 2,.....SQLI
12004 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12005 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12006 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12007 50 6f 6c 79 46 72 6f 6d 57 6b 62 32 2c 20 30 2c  PolyFromWkb2, 0,
12008 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12009 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1200a 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 50 6f  ion_v2 (db, "MPo
1200b 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a  intFromWKB", 1,.
1200c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1200d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1200e 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1200f 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72  ...fnct_MPointFr
12010 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29  omWkb1, 0, 0, 0)
12011 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12012 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12013 20 28 64 62 2c 20 22 4d 50 6f 69 6e 74 46 72 6f   (db, "MPointFro
12014 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51  mWKB", 2,.....SQ
12015 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12016 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12017 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
12018 74 5f 4d 50 6f 69 6e 74 46 72 6f 6d 57 6b 62 32  t_MPointFromWkb2
12019 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1201a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1201b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1201c 22 4d 75 6c 74 69 50 6f 69 6e 74 46 72 6f 6d 57  "MultiPointFromW
1201d 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  KB", 1,.....SQLI
1201e 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1201f 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12020 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12021 4d 50 6f 69 6e 74 46 72 6f 6d 57 6b 62 31 2c 20  MPointFromWkb1, 
12022 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12023 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12024 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d  ction_v2 (db, "M
12025 75 6c 74 69 50 6f 69 6e 74 46 72 6f 6d 57 4b 42  ultiPointFromWKB
12026 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
12027 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12028 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12029 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 50  che,.....fnct_MP
1202a 6f 69 6e 74 46 72 6f 6d 57 6b 62 32 2c 20 30 2c  ointFromWkb2, 0,
1202b 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1202c 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1202d 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 4c 69  ion_v2 (db, "MLi
1202e 6e 65 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09  neFromWKB", 1,..
1202f 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12030 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12031 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
12032 09 09 66 6e 63 74 5f 4d 4c 69 6e 65 46 72 6f 6d  ..fnct_MLineFrom
12033 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Wkb1, 0, 0, 0);.
12034 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12035 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12036 64 62 2c 20 22 4d 4c 69 6e 65 46 72 6f 6d 57 4b  db, "MLineFromWK
12037 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  B", 2,.....SQLIT
12038 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12039 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
1203a 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d  ache,.....fnct_M
1203b 4c 69 6e 65 46 72 6f 6d 57 6b 62 32 2c 20 30 2c  LineFromWkb2, 0,
1203c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1203d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1203e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 75 6c  ion_v2 (db, "Mul
1203f 74 69 4c 69 6e 65 53 74 72 69 6e 67 46 72 6f 6d  tiLineStringFrom
12040 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  WKB", 1,.....SQL
12041 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12042 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
12043 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12044 5f 4d 4c 69 6e 65 46 72 6f 6d 57 6b 62 31 2c 20  _MLineFromWkb1, 
12045 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12046 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12047 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d  ction_v2 (db, "M
12048 75 6c 74 69 4c 69 6e 65 53 74 72 69 6e 67 46 72  ultiLineStringFr
12049 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53  omWKB", 2,.....S
1204a 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1204b 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1204c 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
1204d 63 74 5f 4d 4c 69 6e 65 46 72 6f 6d 57 6b 62 32  ct_MLineFromWkb2
1204e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1204f 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12050 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12051 22 4d 50 6f 6c 79 46 72 6f 6d 57 4b 42 22 2c 20  "MPolyFromWKB", 
12052 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12053 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12054 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12055 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 50 6f 6c 79  ,.....fnct_MPoly
12056 46 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20  FromWkb1, 0, 0, 
12057 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12058 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12059 76 32 20 28 64 62 2c 20 22 4d 50 6f 6c 79 46 72  v2 (db, "MPolyFr
1205a 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53  omWKB", 2,.....S
1205b 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1205c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1205d 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
1205e 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b 62 32  ct_MPolyFromWkb2
1205f 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12060 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12061 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12062 22 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 46 72 6f  "MultiPolygonFro
12063 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51  mWKB", 1,.....SQ
12064 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12065 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12066 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
12067 74 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b 62 31 2c  t_MPolyFromWkb1,
12068 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12069 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1206a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1206b 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 46 72 6f 6d  MultiPolygonFrom
1206c 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  WKB", 2,.....SQL
1206d 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1206e 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1206f 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12070 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b 62 32 2c 20  _MPolyFromWkb2, 
12071 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12072 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12073 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12074 54 5f 57 4b 54 54 6f 53 51 4c 22 2c 20 31 2c 0a  T_WKTToSQL", 1,.
12075 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12076 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12077 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12078 09 09 09 66 6e 63 74 5f 57 6b 74 54 6f 53 71 6c  ...fnct_WktToSql
12079 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1207a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1207b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1207c 22 53 54 5f 47 65 6f 6d 46 72 6f 6d 54 65 78 74  "ST_GeomFromText
1207d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
1207e 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1207f 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12080 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65  che,.....fnct_Ge
12081 6f 6d 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20  omFromText1, 0, 
12082 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12083 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12084 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 47  on_v2 (db, "ST_G
12085 65 6f 6d 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c  eomFromText", 2,
12086 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12087 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12088 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12089 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f  ....fnct_GeomFro
1208a 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
1208b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1208c 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1208d 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 65 74   (db, "ST_Geomet
1208e 72 79 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a  ryFromText", 1,.
1208f 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12090 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12091 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12092 09 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d  ...fnct_GeomFrom
12093 54 65 78 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b  Text1, 0, 0, 0);
12094 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12095 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12096 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 65 74 72  (db, "ST_Geometr
12097 79 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09  yFromText", 2,..
12098 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12099 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1209a 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
1209b 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d 54  ..fnct_GeomFromT
1209c 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext2, 0, 0, 0);.
1209d 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1209e 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1209f 64 62 2c 20 22 53 54 5f 47 65 6f 6d 43 6f 6c 6c  db, "ST_GeomColl
120a0 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09  FromText", 1,...
120a1 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
120a2 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
120a3 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
120a4 09 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72  .fnct_GeomCollFr
120a5 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c 20 30  omText1, 0, 0, 0
120a6 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
120a7 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
120a8 32 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 43  2 (db, "ST_GeomC
120a9 6f 6c 6c 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c  ollFromText", 2,
120aa 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
120ab 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
120ac 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
120ad 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c  ....fnct_GeomCol
120ae 6c 46 72 6f 6d 54 65 78 74 32 2c 20 30 2c 20 30  lFromText2, 0, 0
120af 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
120b0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
120b1 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 47 65  n_v2 (db, "ST_Ge
120b2 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74 69 6f 6e  ometryCollection
120b3 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09  FromText", 1,...
120b4 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
120b5 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
120b6 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
120b7 09 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72  .fnct_GeomCollFr
120b8 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c 20 30  omText1, 0, 0, 0
120b9 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
120ba 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
120bb 32 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 65  2 (db, "ST_Geome
120bc 74 72 79 43 6f 6c 6c 65 63 74 69 6f 6e 46 72 6f  tryCollectionFro
120bd 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53  mText", 2,.....S
120be 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
120bf 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
120c0 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
120c1 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 54  ct_GeomCollFromT
120c2 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext2, 0, 0, 0);.
120c3 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
120c4 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
120c5 64 62 2c 20 22 53 54 5f 50 6f 69 6e 74 46 72 6f  db, "ST_PointFro
120c6 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53  mText", 1,.....S
120c7 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
120c8 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
120c9 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
120ca 63 74 5f 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74  ct_PointFromText
120cb 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
120cc 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
120cd 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
120ce 20 22 53 54 5f 50 6f 69 6e 74 46 72 6f 6d 54 65   "ST_PointFromTe
120cf 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  xt", 2,.....SQLI
120d0 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
120d1 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
120d2 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
120d3 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74 32 2c 20  PointFromText2, 
120d4 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
120d5 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
120d6 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
120d7 54 5f 4c 69 6e 65 46 72 6f 6d 54 65 78 74 22 2c  T_LineFromText",
120d8 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
120d9 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
120da 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
120db 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65  e,.....fnct_Line
120dc 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c  FromText1, 0, 0,
120dd 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
120de 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
120df 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4c 69 6e  _v2 (db, "ST_Lin
120e0 65 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09  eFromText", 2,..
120e1 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
120e2 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
120e3 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
120e4 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 54  ..fnct_LineFromT
120e5 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext2, 0, 0, 0);.
120e6 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
120e7 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
120e8 64 62 2c 20 22 53 54 5f 4c 69 6e 65 53 74 72 69  db, "ST_LineStri
120e9 6e 67 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a  ngFromText", 1,.
120ea 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
120eb 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
120ec 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
120ed 09 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d  ...fnct_LineFrom
120ee 54 65 78 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b  Text1, 0, 0, 0);
120ef 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
120f0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
120f1 28 64 62 2c 20 22 53 54 5f 4c 69 6e 65 53 74 72  (db, "ST_LineStr
120f2 69 6e 67 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c  ingFromText", 2,
120f3 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
120f4 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
120f5 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
120f6 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f  ....fnct_LineFro
120f7 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
120f8 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
120f9 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
120fa 20 28 64 62 2c 20 22 53 54 5f 50 6f 6c 79 46 72   (db, "ST_PolyFr
120fb 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09  omText", 1,.....
120fc 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
120fd 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
120fe 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
120ff 6e 63 74 5f 50 6f 6c 79 46 72 6f 6d 54 65 78 74  nct_PolyFromText
12100 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
12101 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12102 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12103 20 22 53 54 5f 50 6f 6c 79 46 72 6f 6d 54 65 78   "ST_PolyFromTex
12104 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  t", 2,.....SQLIT
12105 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12106 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12107 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50  ache,.....fnct_P
12108 6f 6c 79 46 72 6f 6d 54 65 78 74 32 2c 20 30 2c  olyFromText2, 0,
12109 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1210a 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1210b 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
1210c 50 6f 6c 79 67 6f 6e 46 72 6f 6d 54 65 78 74 22  PolygonFromText"
1210d 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
1210e 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1210f 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
12110 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 6c  he,.....fnct_Pol
12111 79 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30  yFromText1, 0, 0
12112 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12113 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12114 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 50 6f  n_v2 (db, "ST_Po
12115 6c 79 67 6f 6e 46 72 6f 6d 54 65 78 74 22 2c 20  lygonFromText", 
12116 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
12117 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12118 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12119 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 6c 79 46  ,.....fnct_PolyF
1211a 72 6f 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20  romText2, 0, 0, 
1211b 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1211c 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1211d 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 50 6f 69  v2 (db, "ST_MPoi
1211e 6e 74 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c 0a  ntFromText", 1,.
1211f 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12120 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12121 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12122 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72  ...fnct_MPointFr
12123 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c 20 30  omText1, 0, 0, 0
12124 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12125 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12126 32 20 28 64 62 2c 20 22 53 54 5f 4d 50 6f 69 6e  2 (db, "ST_MPoin
12127 74 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09  tFromText", 2,..
12128 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12129 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1212a 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
1212b 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72 6f  ..fnct_MPointFro
1212c 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
1212d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1212e 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1212f 20 28 64 62 2c 20 22 53 54 5f 4d 75 6c 74 69 50   (db, "ST_MultiP
12130 6f 69 6e 74 46 72 6f 6d 54 65 78 74 22 2c 20 31  ointFromText", 1
12131 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12132 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12133 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12134 0a 09 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74  .....fnct_MPoint
12135 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c  FromText1, 0, 0,
12136 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12137 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12138 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 75 6c  _v2 (db, "ST_Mul
12139 74 69 50 6f 69 6e 74 46 72 6f 6d 54 65 78 74 22  tiPointFromText"
1213a 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
1213b 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1213c 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1213d 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 50 6f  he,.....fnct_MPo
1213e 69 6e 74 46 72 6f 6d 54 65 78 74 32 2c 20 30 2c  intFromText2, 0,
1213f 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12140 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12141 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12142 4d 4c 69 6e 65 46 72 6f 6d 54 65 78 74 22 2c 20  MLineFromText", 
12143 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12144 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12145 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12146 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 4c 69 6e 65  ,.....fnct_MLine
12147 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c  FromText1, 0, 0,
12148 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12149 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1214a 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 4c 69  _v2 (db, "ST_MLi
1214b 6e 65 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a  neFromText", 2,.
1214c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1214d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1214e 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1214f 09 09 09 66 6e 63 74 5f 4d 4c 69 6e 65 46 72 6f  ...fnct_MLineFro
12150 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
12151 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12152 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12153 20 28 64 62 2c 20 22 53 54 5f 4d 75 6c 74 69 4c   (db, "ST_MultiL
12154 69 6e 65 53 74 72 69 6e 67 46 72 6f 6d 54 65 78  ineStringFromTex
12155 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  t", 1,.....SQLIT
12156 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12157 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12158 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d  ache,.....fnct_M
12159 4c 69 6e 65 46 72 6f 6d 54 65 78 74 31 2c 20 30  LineFromText1, 0
1215a 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1215b 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1215c 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
1215d 5f 4d 75 6c 74 69 4c 69 6e 65 53 74 72 69 6e 67  _MultiLineString
1215e 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09  FromText", 2,...
1215f 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12160 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12161 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12162 09 66 6e 63 74 5f 4d 4c 69 6e 65 46 72 6f 6d 54  .fnct_MLineFromT
12163 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ext2, 0, 0, 0);.
12164 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12165 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12166 64 62 2c 20 22 53 54 5f 4d 50 6f 6c 79 46 72 6f  db, "ST_MPolyFro
12167 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53  mText", 1,.....S
12168 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12169 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1216a 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
1216b 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 54 65 78 74  ct_MPolyFromText
1216c 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
1216d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1216e 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1216f 20 22 53 54 5f 4d 50 6f 6c 79 46 72 6f 6d 54 65   "ST_MPolyFromTe
12170 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  xt", 2,.....SQLI
12171 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12172 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12173 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12174 4d 50 6f 6c 79 46 72 6f 6d 54 65 78 74 32 2c 20  MPolyFromText2, 
12175 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12176 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12177 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12178 54 5f 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 46 72  T_MultiPolygonFr
12179 6f 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09  omText", 1,.....
1217a 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1217b 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1217c 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
1217d 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 54 65 78  nct_MPolyFromTex
1217e 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t1, 0, 0, 0);.  
1217f 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12180 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12181 2c 20 22 53 54 5f 4d 75 6c 74 69 50 6f 6c 79 67  , "ST_MultiPolyg
12182 6f 6e 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a  onFromText", 2,.
12183 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12184 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12185 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12186 09 09 09 66 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f  ...fnct_MPolyFro
12187 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30 29  mText2, 0, 0, 0)
12188 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12189 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1218a 20 28 64 62 2c 20 22 53 54 5f 57 4b 42 54 6f 53   (db, "ST_WKBToS
1218b 51 4c 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  QL", 1,.....SQLI
1218c 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1218d 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1218e 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
1218f 57 6b 62 54 6f 53 71 6c 2c 20 30 2c 20 30 2c 20  WkbToSql, 0, 0, 
12190 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12191 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12192 76 32 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d  v2 (db, "ST_Geom
12193 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09  FromWKB", 1,....
12194 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12195 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12196 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
12197 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d 57 6b 62  fnct_GeomFromWkb
12198 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
12199 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1219a 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1219b 20 22 53 54 5f 47 65 6f 6d 46 72 6f 6d 57 4b 42   "ST_GeomFromWKB
1219c 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
1219d 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1219e 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1219f 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65  che,.....fnct_Ge
121a0 6f 6d 46 72 6f 6d 57 6b 62 32 2c 20 30 2c 20 30  omFromWkb2, 0, 0
121a1 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
121a2 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
121a3 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 47 65  n_v2 (db, "ST_Ge
121a4 6f 6d 65 74 72 79 46 72 6f 6d 57 4b 42 22 2c 20  ometryFromWKB", 
121a5 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
121a6 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
121a7 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
121a8 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d 46  ,.....fnct_GeomF
121a9 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30  romWkb1, 0, 0, 0
121aa 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
121ab 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
121ac 32 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 65  2 (db, "ST_Geome
121ad 74 72 79 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a  tryFromWKB", 2,.
121ae 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
121af 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
121b0 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
121b1 09 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d  ...fnct_GeomFrom
121b2 57 6b 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Wkb2, 0, 0, 0);.
121b3 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
121b4 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
121b5 64 62 2c 20 22 53 54 5f 47 65 6f 6d 43 6f 6c 6c  db, "ST_GeomColl
121b6 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09  FromWKB", 1,....
121b7 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
121b8 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
121b9 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
121ba 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72 6f  fnct_GeomCollFro
121bb 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b  mWkb1, 0, 0, 0);
121bc 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
121bd 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
121be 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 43 6f 6c  (db, "ST_GeomCol
121bf 6c 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09  lFromWKB", 2,...
121c0 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
121c1 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
121c2 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
121c3 09 66 6e 63 74 5f 47 65 6f 6d 43 6f 6c 6c 46 72  .fnct_GeomCollFr
121c4 6f 6d 57 6b 62 32 2c 20 30 2c 20 30 2c 20 30 29  omWkb2, 0, 0, 0)
121c5 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
121c6 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
121c7 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 6d 65 74   (db, "ST_Geomet
121c8 72 79 43 6f 6c 6c 65 63 74 69 6f 6e 46 72 6f 6d  ryCollectionFrom
121c9 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  WKB", 1,.....SQL
121ca 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
121cb 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
121cc 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
121cd 5f 47 65 6f 6d 43 6f 6c 6c 46 72 6f 6d 57 6b 62  _GeomCollFromWkb
121ce 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
121cf 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
121d0 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
121d1 20 22 53 54 5f 47 65 6f 6d 65 74 72 79 43 6f 6c   "ST_GeometryCol
121d2 6c 65 63 74 69 6f 6e 46 72 6f 6d 57 4b 42 22 2c  lectionFromWKB",
121d3 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
121d4 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
121d5 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
121d6 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d  e,.....fnct_Geom
121d7 43 6f 6c 6c 46 72 6f 6d 57 6b 62 32 2c 20 30 2c  CollFromWkb2, 0,
121d8 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
121d9 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
121da 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
121db 50 6f 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20 31  PointFromWKB", 1
121dc 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
121dd 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
121de 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
121df 0a 09 09 09 09 66 6e 63 74 5f 50 6f 69 6e 74 46  .....fnct_PointF
121e0 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30  romWkb1, 0, 0, 0
121e1 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
121e2 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
121e3 32 20 28 64 62 2c 20 22 53 54 5f 50 6f 69 6e 74  2 (db, "ST_Point
121e4 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09  FromWKB", 2,....
121e5 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
121e6 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
121e7 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
121e8 66 6e 63 74 5f 50 6f 69 6e 74 46 72 6f 6d 57 6b  fnct_PointFromWk
121e9 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b2, 0, 0, 0);.  
121ea 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
121eb 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
121ec 2c 20 22 53 54 5f 4c 69 6e 65 46 72 6f 6d 57 4b  , "ST_LineFromWK
121ed 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  B", 1,.....SQLIT
121ee 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
121ef 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
121f0 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c  ache,.....fnct_L
121f1 69 6e 65 46 72 6f 6d 57 6b 62 31 2c 20 30 2c 20  ineFromWkb1, 0, 
121f2 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
121f3 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
121f4 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4c  on_v2 (db, "ST_L
121f5 69 6e 65 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a  ineFromWKB", 2,.
121f6 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
121f7 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
121f8 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
121f9 09 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d  ...fnct_LineFrom
121fa 57 6b 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Wkb2, 0, 0, 0);.
121fb 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
121fc 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
121fd 64 62 2c 20 22 53 54 5f 4c 69 6e 65 53 74 72 69  db, "ST_LineStri
121fe 6e 67 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09  ngFromWKB", 1,..
121ff 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12200 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12201 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
12202 09 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 57  ..fnct_LineFromW
12203 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  kb1, 0, 0, 0);. 
12204 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12205 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12206 62 2c 20 22 53 54 5f 4c 69 6e 65 53 74 72 69 6e  b, "ST_LineStrin
12207 67 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09  gFromWKB", 2,...
12208 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12209 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1220a 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1220b 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 57 6b  .fnct_LineFromWk
1220c 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b2, 0, 0, 0);.  
1220d 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1220e 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1220f 2c 20 22 53 54 5f 50 6f 6c 79 46 72 6f 6d 57 4b  , "ST_PolyFromWK
12210 42 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  B", 1,.....SQLIT
12211 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12212 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12213 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50  ache,.....fnct_P
12214 6f 6c 79 46 72 6f 6d 57 6b 62 31 2c 20 30 2c 20  olyFromWkb1, 0, 
12215 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12216 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12217 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 50  on_v2 (db, "ST_P
12218 6f 6c 79 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a  olyFromWKB", 2,.
12219 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1221a 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1221b 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1221c 09 09 09 66 6e 63 74 5f 50 6f 6c 79 46 72 6f 6d  ...fnct_PolyFrom
1221d 57 6b 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Wkb2, 0, 0, 0);.
1221e 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1221f 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12220 64 62 2c 20 22 53 54 5f 50 6f 6c 79 67 6f 6e 46  db, "ST_PolygonF
12221 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09  romWKB", 1,.....
12222 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12223 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12224 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
12225 6e 63 74 5f 50 6f 6c 79 46 72 6f 6d 57 6b 62 31  nct_PolyFromWkb1
12226 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12227 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12228 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12229 22 53 54 5f 50 6f 6c 79 67 6f 6e 46 72 6f 6d 57  "ST_PolygonFromW
1222a 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  KB", 2,.....SQLI
1222b 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1222c 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1222d 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
1222e 50 6f 6c 79 46 72 6f 6d 57 6b 62 32 2c 20 30 2c  PolyFromWkb2, 0,
1222f 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12230 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12231 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12232 4d 50 6f 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20  MPointFromWKB", 
12233 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12234 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12235 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12236 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e  ,.....fnct_MPoin
12237 74 46 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c  tFromWkb1, 0, 0,
12238 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12239 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1223a 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 50 6f  _v2 (db, "ST_MPo
1223b 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a  intFromWKB", 2,.
1223c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1223d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1223e 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1223f 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74 46 72  ...fnct_MPointFr
12240 6f 6d 57 6b 62 32 2c 20 30 2c 20 30 2c 20 30 29  omWkb2, 0, 0, 0)
12241 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12242 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12243 20 28 64 62 2c 20 22 53 54 5f 4d 75 6c 74 69 50   (db, "ST_MultiP
12244 6f 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20 31 2c  ointFromWKB", 1,
12245 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12246 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12247 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12248 09 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74 46  ....fnct_MPointF
12249 72 6f 6d 57 6b 62 31 2c 20 30 2c 20 30 2c 20 30  romWkb1, 0, 0, 0
1224a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1224b 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1224c 32 20 28 64 62 2c 20 22 53 54 5f 4d 75 6c 74 69  2 (db, "ST_Multi
1224d 50 6f 69 6e 74 46 72 6f 6d 57 4b 42 22 2c 20 32  PointFromWKB", 2
1224e 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1224f 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12250 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12251 0a 09 09 09 09 66 6e 63 74 5f 4d 50 6f 69 6e 74  .....fnct_MPoint
12252 46 72 6f 6d 57 6b 62 32 2c 20 30 2c 20 30 2c 20  FromWkb2, 0, 0, 
12253 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12254 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12255 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 4c 69 6e  v2 (db, "ST_MLin
12256 65 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09  eFromWKB", 1,...
12257 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12258 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12259 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1225a 09 66 6e 63 74 5f 4d 4c 69 6e 65 46 72 6f 6d 57  .fnct_MLineFromW
1225b 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  kb1, 0, 0, 0);. 
1225c 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1225d 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1225e 62 2c 20 22 53 54 5f 4d 4c 69 6e 65 46 72 6f 6d  b, "ST_MLineFrom
1225f 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  WKB", 2,.....SQL
12260 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12261 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
12262 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12263 5f 4d 4c 69 6e 65 46 72 6f 6d 57 6b 62 32 2c 20  _MLineFromWkb2, 
12264 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12265 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12266 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12267 54 5f 4d 75 6c 74 69 4c 69 6e 65 53 74 72 69 6e  T_MultiLineStrin
12268 67 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09  gFromWKB", 1,...
12269 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1226a 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1226b 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1226c 09 66 6e 63 74 5f 4d 4c 69 6e 65 46 72 6f 6d 57  .fnct_MLineFromW
1226d 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  kb1, 0, 0, 0);. 
1226e 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1226f 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12270 62 2c 20 22 53 54 5f 4d 75 6c 74 69 4c 69 6e 65  b, "ST_MultiLine
12271 53 74 72 69 6e 67 46 72 6f 6d 57 4b 42 22 2c 20  StringFromWKB", 
12272 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
12273 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12274 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12275 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 4c 69 6e 65  ,.....fnct_MLine
12276 46 72 6f 6d 57 6b 62 32 2c 20 30 2c 20 30 2c 20  FromWkb2, 0, 0, 
12277 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12278 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12279 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 50 6f 6c  v2 (db, "ST_MPol
1227a 79 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09  yFromWKB", 1,...
1227b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1227c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1227d 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1227e 09 66 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 57  .fnct_MPolyFromW
1227f 6b 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  kb1, 0, 0, 0);. 
12280 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12281 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12282 62 2c 20 22 53 54 5f 4d 50 6f 6c 79 46 72 6f 6d  b, "ST_MPolyFrom
12283 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  WKB", 2,.....SQL
12284 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12285 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
12286 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12287 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b 62 32 2c 20  _MPolyFromWkb2, 
12288 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12289 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1228a 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
1228b 54 5f 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 46 72  T_MultiPolygonFr
1228c 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53  omWKB", 1,.....S
1228d 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1228e 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1228f 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
12290 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b 62 31  ct_MPolyFromWkb1
12291 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12292 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12293 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12294 22 53 54 5f 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e  "ST_MultiPolygon
12295 46 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09  FromWKB", 2,....
12296 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12297 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12298 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
12299 66 6e 63 74 5f 4d 50 6f 6c 79 46 72 6f 6d 57 6b  fnct_MPolyFromWk
1229a 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b2, 0, 0, 0);.  
1229b 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1229c 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1229d 2c 20 22 47 65 6f 6d 46 72 6f 6d 46 47 46 22 2c  , "GeomFromFGF",
1229e 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
1229f 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
122a0 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
122a1 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d  e,.....fnct_Geom
122a2 65 74 72 79 46 72 6f 6d 46 47 46 31 2c 20 30 2c  etryFromFGF1, 0,
122a3 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
122a4 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
122a5 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 6f  ion_v2 (db, "Geo
122a6 6d 46 72 6f 6d 46 47 46 22 2c 20 32 2c 0a 09 09  mFromFGF", 2,...
122a7 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
122a8 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
122a9 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
122aa 09 66 6e 63 74 5f 47 65 6f 6d 65 74 72 79 46 72  .fnct_GeometryFr
122ab 6f 6d 46 47 46 32 2c 20 30 2c 20 30 2c 20 30 29  omFGF2, 0, 0, 0)
122ac 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
122ad 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
122ae 20 28 64 62 2c 20 22 43 6f 6d 70 72 65 73 73 47   (db, "CompressG
122af 65 6f 6d 65 74 72 79 22 2c 20 31 2c 0a 09 09 09  eometry", 1,....
122b0 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
122b1 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
122b2 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
122b3 66 6e 63 74 5f 43 6f 6d 70 72 65 73 73 47 65 6f  fnct_CompressGeo
122b4 6d 65 74 72 79 2c 20 30 2c 20 30 2c 20 30 29 3b  metry, 0, 0, 0);
122b5 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
122b6 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
122b7 28 64 62 2c 20 22 55 6e 63 6f 6d 70 72 65 73 73  (db, "Uncompress
122b8 47 65 6f 6d 65 74 72 79 22 2c 20 31 2c 0a 09 09  Geometry", 1,...
122b9 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
122ba 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
122bb 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
122bc 09 66 6e 63 74 5f 55 6e 63 6f 6d 70 72 65 73 73  .fnct_Uncompress
122bd 47 65 6f 6d 65 74 72 79 2c 20 30 2c 20 30 2c 20  Geometry, 0, 0, 
122be 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
122bf 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
122c0 76 32 20 28 64 62 2c 20 22 53 61 6e 69 74 69 7a  v2 (db, "Sanitiz
122c1 65 47 65 6f 6d 65 74 72 79 22 2c 20 31 2c 0a 09  eGeometry", 1,..
122c2 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
122c3 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
122c4 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
122c5 09 09 66 6e 63 74 5f 53 61 6e 69 74 69 7a 65 47  ..fnct_SanitizeG
122c6 65 6f 6d 65 74 72 79 2c 20 30 2c 20 30 2c 20 30  eometry, 0, 0, 0
122c7 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
122c8 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
122c9 32 20 28 64 62 2c 20 22 45 6e 73 75 72 65 43 6c  2 (db, "EnsureCl
122ca 6f 73 65 64 52 69 6e 67 73 22 2c 20 31 2c 0a 09  osedRings", 1,..
122cb 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
122cc 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
122cd 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
122ce 09 09 66 6e 63 74 5f 45 6e 73 75 72 65 43 6c 6f  ..fnct_EnsureClo
122cf 73 65 64 52 69 6e 67 73 2c 20 30 2c 20 30 2c 20  sedRings, 0, 0, 
122d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
122d1 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
122d2 76 32 20 28 64 62 2c 20 22 52 65 6d 6f 76 65 52  v2 (db, "RemoveR
122d3 65 70 65 61 74 65 64 50 6f 69 6e 74 73 22 2c 20  epeatedPoints", 
122d4 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
122d5 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
122d6 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
122d7 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65 6d 6f 76  ,.....fnct_Remov
122d8 65 52 65 70 65 61 74 65 64 50 6f 69 6e 74 73 2c  eRepeatedPoints,
122d9 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
122da 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
122db 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
122dc 52 65 6d 6f 76 65 52 65 70 65 61 74 65 64 50 6f  RemoveRepeatedPo
122dd 69 6e 74 73 22 2c 20 32 2c 0a 09 09 09 09 53 51  ints", 2,.....SQ
122de 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
122df 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
122e0 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
122e1 74 5f 52 65 6d 6f 76 65 52 65 70 65 61 74 65 64  t_RemoveRepeated
122e2 50 6f 69 6e 74 73 2c 20 30 2c 20 30 2c 20 30 29  Points, 0, 0, 0)
122e3 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
122e4 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
122e5 20 28 64 62 2c 20 22 43 61 73 74 54 6f 49 6e 74   (db, "CastToInt
122e6 65 67 65 72 22 2c 20 31 2c 0a 09 09 09 09 53 51  eger", 1,.....SQ
122e7 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
122e8 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
122e9 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61  , 0,.....fnct_Ca
122ea 73 74 54 6f 49 6e 74 65 67 65 72 2c 20 30 2c 20  stToInteger, 0, 
122eb 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
122ec 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
122ed 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 61 73 74  on_v2 (db, "Cast
122ee 54 6f 44 6f 75 62 6c 65 22 2c 20 31 2c 0a 09 09  ToDouble", 1,...
122ef 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
122f0 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
122f1 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
122f2 74 5f 43 61 73 74 54 6f 44 6f 75 62 6c 65 2c 20  t_CastToDouble, 
122f3 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
122f4 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
122f5 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
122f6 61 73 74 54 6f 54 65 78 74 22 2c 20 31 2c 0a 09  astToText", 1,..
122f7 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
122f8 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
122f9 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
122fa 63 74 5f 43 61 73 74 54 6f 54 65 78 74 2c 20 30  ct_CastToText, 0
122fb 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
122fc 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
122fd 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 61  tion_v2 (db, "Ca
122fe 73 74 54 6f 54 65 78 74 22 2c 20 32 2c 0a 09 09  stToText", 2,...
122ff 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12300 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12301 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
12302 74 5f 43 61 73 74 54 6f 54 65 78 74 2c 20 30 2c  t_CastToText, 0,
12303 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12304 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12305 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 61 73  ion_v2 (db, "Cas
12306 74 54 6f 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09  tToBlob", 1,....
12307 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12308 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12309 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1230a 5f 43 61 73 74 54 6f 42 6c 6f 62 2c 20 30 2c 20  _CastToBlob, 0, 
1230b 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1230c 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1230d 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 61 73 74  on_v2 (db, "Cast
1230e 54 6f 42 6c 6f 62 22 2c 20 32 2c 0a 09 09 09 09  ToBlob", 2,.....
1230f 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12310 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12311 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12312 43 61 73 74 54 6f 42 6c 6f 62 2c 20 30 2c 20 30  CastToBlob, 0, 0
12313 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12314 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12315 6e 5f 76 32 20 28 64 62 2c 20 22 46 6f 72 63 65  n_v2 (db, "Force
12316 41 73 4e 75 6c 6c 22 2c 20 32 2c 0a 09 09 09 09  AsNull", 2,.....
12317 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12318 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12319 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
1231a 46 6f 72 63 65 41 73 4e 75 6c 6c 2c 20 30 2c 20  ForceAsNull, 0, 
1231b 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1231c 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1231d 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61  on_v2 (db, "Crea
1231e 74 65 55 55 49 44 22 2c 20 30 2c 20 53 51 4c 49  teUUID", 0, SQLI
1231f 54 45 5f 55 54 46 38 2c 20 30 2c 0a 09 09 09 09  TE_UTF8, 0,.....
12320 66 6e 63 74 5f 43 72 65 61 74 65 55 55 49 44 2c  fnct_CreateUUID,
12321 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12322 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12323 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12324 4d 44 35 43 68 65 63 6b 73 75 6d 22 2c 20 31 2c  MD5Checksum", 1,
12325 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12326 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12327 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12328 66 6e 63 74 5f 4d 44 35 43 68 65 63 6b 73 75 6d  fnct_MD5Checksum
12329 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1232a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1232b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1232c 22 4d 44 35 54 6f 74 61 6c 43 68 65 63 6b 73 75  "MD5TotalChecksu
1232d 6d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  m", 1,.....SQLIT
1232e 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1232f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12330 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 44  , 0,.....fnct_MD
12331 35 54 6f 74 61 6c 43 68 65 63 6b 73 75 6d 5f 73  5TotalChecksum_s
12332 74 65 70 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 44  tep,.....fnct_MD
12333 35 54 6f 74 61 6c 43 68 65 63 6b 73 75 6d 5f 66  5TotalChecksum_f
12334 69 6e 61 6c 2c 20 30 29 3b 0a 0a 23 69 66 20 4f  inal, 0);..#if O
12335 4d 49 54 5f 49 43 4f 4e 56 20 3d 3d 20 30 09 09  MIT_ICONV == 0..
12336 2f 2a 20 49 43 4f 4e 56 20 69 73 20 61 62 73 6f  /* ICONV is abso
12337 6c 75 74 65 6c 79 20 72 65 71 75 69 72 65 64 20  lutely required 
12338 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  */..    sqlite3_
12339 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1233a 76 32 20 28 64 62 2c 20 22 45 6e 63 6f 64 65 55  v2 (db, "EncodeU
1233b 52 4c 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  RL", 1,.....SQLI
1233c 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1233d 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1233e 30 2c 0a 09 09 09 09 66 6e 63 74 5f 45 6e 63 6f  0,.....fnct_Enco
1233f 64 65 55 52 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  deURL, 0, 0, 0);
12340 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12341 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12342 28 64 62 2c 20 22 45 6e 63 6f 64 65 55 52 4c 22  (db, "EncodeURL"
12343 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
12344 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12345 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
12346 09 09 09 09 66 6e 63 74 5f 45 6e 63 6f 64 65 55  ....fnct_EncodeU
12347 52 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  RL, 0, 0, 0);.  
12348 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12349 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1234a 2c 20 22 44 65 63 6f 64 65 55 52 4c 22 2c 20 31  , "DecodeURL", 1
1234b 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1234c 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1234d 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
1234e 09 66 6e 63 74 5f 44 65 63 6f 64 65 55 52 4c 2c  .fnct_DecodeURL,
1234f 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12350 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12351 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12352 44 65 63 6f 64 65 55 52 4c 22 2c 20 32 2c 0a 09  DecodeURL", 2,..
12353 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12354 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12355 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
12356 63 74 5f 44 65 63 6f 64 65 55 52 4c 2c 20 30 2c  ct_DecodeURL, 0,
12357 20 30 2c 20 30 29 3b 0a 0a 23 65 6e 64 69 66 20   0, 0);..#endif 
12358 2f 2a 20 49 43 4f 4e 56 20 65 6e 61 62 6c 65 64  /* ICONV enabled
12359 2f 64 69 73 61 62 6c 65 64 20 2a 2f 0a 0a 20 20  /disabled */..  
1235a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1235b 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1235c 2c 20 22 44 69 72 4e 61 6d 65 46 72 6f 6d 50 61  , "DirNameFromPa
1235d 74 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  th", 1,.....SQLI
1235e 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1235f 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12360 30 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 72 4e  0,.....fnct_DirN
12361 61 6d 65 46 72 6f 6d 50 61 74 68 2c 20 30 2c 20  ameFromPath, 0, 
12362 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12363 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12364 6f 6e 5f 76 32 20 28 64 62 2c 20 22 46 75 6c 6c  on_v2 (db, "Full
12365 46 69 6c 65 4e 61 6d 65 46 72 6f 6d 50 61 74 68  FileNameFromPath
12366 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
12367 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12368 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
12369 0a 09 09 09 09 66 6e 63 74 5f 46 75 6c 6c 46 69  .....fnct_FullFi
1236a 6c 65 4e 61 6d 65 46 72 6f 6d 50 61 74 68 2c 20  leNameFromPath, 
1236b 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1236c 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1236d 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 46  ction_v2 (db, "F
1236e 69 6c 65 4e 61 6d 65 46 72 6f 6d 50 61 74 68 22  ileNameFromPath"
1236f 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12370 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12371 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
12372 09 09 09 09 66 6e 63 74 5f 46 69 6c 65 4e 61 6d  ....fnct_FileNam
12373 65 46 72 6f 6d 50 61 74 68 2c 20 30 2c 20 30 2c  eFromPath, 0, 0,
12374 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12375 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12376 5f 76 32 20 28 64 62 2c 20 22 46 69 6c 65 45 78  _v2 (db, "FileEx
12377 74 46 72 6f 6d 50 61 74 68 22 2c 20 31 2c 0a 09  tFromPath", 1,..
12378 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12379 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1237a 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
1237b 63 74 5f 46 69 6c 65 45 78 74 46 72 6f 6d 50 61  ct_FileExtFromPa
1237c 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  th, 0, 0, 0);.  
1237d 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1237e 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1237f 2c 20 22 43 61 73 74 54 6f 50 6f 69 6e 74 22 2c  , "CastToPoint",
12380 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12381 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12382 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12383 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61 73 74  e,.....fnct_Cast
12384 54 6f 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30  ToPoint, 0, 0, 0
12385 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12386 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12387 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f 4c 69  2 (db, "CastToLi
12388 6e 65 73 74 72 69 6e 67 22 2c 20 31 2c 0a 09 09  nestring", 1,...
12389 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1238a 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1238b 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1238c 09 66 6e 63 74 5f 43 61 73 74 54 6f 4c 69 6e 65  .fnct_CastToLine
1238d 73 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 30 29  string, 0, 0, 0)
1238e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1238f 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12390 20 28 64 62 2c 20 22 43 61 73 74 54 6f 50 6f 6c   (db, "CastToPol
12391 79 67 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51  ygon", 1,.....SQ
12392 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12393 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12394 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
12395 74 5f 43 61 73 74 54 6f 50 6f 6c 79 67 6f 6e 2c  t_CastToPolygon,
12396 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12397 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12398 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12399 43 61 73 74 54 6f 4d 75 6c 74 69 50 6f 69 6e 74  CastToMultiPoint
1239a 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
1239b 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1239c 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1239d 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61  che,.....fnct_Ca
1239e 73 74 54 6f 4d 75 6c 74 69 50 6f 69 6e 74 2c 20  stToMultiPoint, 
1239f 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
123a0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
123a1 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
123a2 61 73 74 54 6f 4d 75 6c 74 69 4c 69 6e 65 73 74  astToMultiLinest
123a3 72 69 6e 67 22 2c 20 31 2c 0a 09 09 09 09 53 51  ring", 1,.....SQ
123a4 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
123a5 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
123a6 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
123a7 74 5f 43 61 73 74 54 6f 4d 75 6c 74 69 4c 69 6e  t_CastToMultiLin
123a8 65 73 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 30  estring, 0, 0, 0
123a9 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
123aa 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
123ab 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f 4d 75  2 (db, "CastToMu
123ac 6c 74 69 50 6f 6c 79 67 6f 6e 22 2c 20 31 2c 0a  ltiPolygon", 1,.
123ad 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
123ae 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
123af 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
123b0 09 09 09 66 6e 63 74 5f 43 61 73 74 54 6f 4d 75  ...fnct_CastToMu
123b1 6c 74 69 50 6f 6c 79 67 6f 6e 2c 20 30 2c 20 30  ltiPolygon, 0, 0
123b2 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
123b3 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
123b4 6e 5f 76 32 20 28 64 62 2c 20 22 43 61 73 74 54  n_v2 (db, "CastT
123b5 6f 47 65 6f 6d 65 74 72 79 43 6f 6c 6c 65 63 74  oGeometryCollect
123b6 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ion", 1,.....SQL
123b7 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
123b8 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
123b9 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
123ba 5f 43 61 73 74 54 6f 47 65 6f 6d 65 74 72 79 43  _CastToGeometryC
123bb 6f 6c 6c 65 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  ollection, 0, 0,
123bc 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
123bd 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
123be 5f 76 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f  _v2 (db, "CastTo
123bf 4d 75 6c 74 69 22 2c 20 31 2c 0a 09 09 09 09 53  Multi", 1,.....S
123c0 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
123c1 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
123c2 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
123c3 63 74 5f 43 61 73 74 54 6f 4d 75 6c 74 69 2c 20  ct_CastToMulti, 
123c4 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
123c5 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
123c6 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
123c7 54 5f 4d 75 6c 74 69 22 2c 20 31 2c 0a 09 09 09  T_Multi", 1,....
123c8 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
123c9 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
123ca 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
123cb 66 6e 63 74 5f 43 61 73 74 54 6f 4d 75 6c 74 69  fnct_CastToMulti
123cc 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
123cd 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
123ce 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
123cf 22 43 61 73 74 54 6f 53 69 6e 67 6c 65 22 2c 20  "CastToSingle", 
123d0 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
123d1 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
123d2 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
123d3 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61 73 74 54  ,.....fnct_CastT
123d4 6f 53 69 6e 67 6c 65 2c 20 30 2c 20 30 2c 20 30  oSingle, 0, 0, 0
123d5 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
123d6 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
123d7 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f 58 59  2 (db, "CastToXY
123d8 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
123d9 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
123da 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
123db 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61  che,.....fnct_Ca
123dc 73 74 54 6f 58 59 2c 20 30 2c 20 30 2c 20 30 29  stToXY, 0, 0, 0)
123dd 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
123de 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
123df 20 28 64 62 2c 20 22 43 61 73 74 54 6f 58 59 5a   (db, "CastToXYZ
123e0 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
123e1 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
123e2 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
123e3 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61  che,.....fnct_Ca
123e4 73 74 54 6f 58 59 5a 2c 20 30 2c 20 30 2c 20 30  stToXYZ, 0, 0, 0
123e5 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
123e6 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
123e7 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f 58 59  2 (db, "CastToXY
123e8 5a 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  Z", 2,.....SQLIT
123e9 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
123ea 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
123eb 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43  ache,.....fnct_C
123ec 61 73 74 54 6f 58 59 5a 2c 20 30 2c 20 30 2c 20  astToXYZ, 0, 0, 
123ed 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
123ee 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
123ef 76 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f 58  v2 (db, "CastToX
123f0 59 4d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  YM", 1,.....SQLI
123f1 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
123f2 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
123f3 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
123f4 43 61 73 74 54 6f 58 59 4d 2c 20 30 2c 20 30 2c  CastToXYM, 0, 0,
123f5 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
123f6 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
123f7 5f 76 32 20 28 64 62 2c 20 22 43 61 73 74 54 6f  _v2 (db, "CastTo
123f8 58 59 4d 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  XYM", 2,.....SQL
123f9 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
123fa 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
123fb 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
123fc 5f 43 61 73 74 54 6f 58 59 4d 2c 20 30 2c 20 30  _CastToXYM, 0, 0
123fd 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
123fe 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
123ff 6e 5f 76 32 20 28 64 62 2c 20 22 43 61 73 74 54  n_v2 (db, "CastT
12400 6f 58 59 5a 4d 22 2c 20 31 2c 0a 09 09 09 09 53  oXYZM", 1,.....S
12401 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12402 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12403 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
12404 63 74 5f 43 61 73 74 54 6f 58 59 5a 4d 2c 20 30  ct_CastToXYZM, 0
12405 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12406 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12407 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 61  tion_v2 (db, "Ca
12408 73 74 54 6f 58 59 5a 4d 22 2c 20 33 2c 0a 09 09  stToXYZM", 3,...
12409 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1240a 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1240b 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1240c 09 66 6e 63 74 5f 43 61 73 74 54 6f 58 59 5a 4d  .fnct_CastToXYZM
1240d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1240e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1240f 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12410 22 45 78 74 72 61 63 74 4d 75 6c 74 69 50 6f 69  "ExtractMultiPoi
12411 6e 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  nt", 1,.....SQLI
12412 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12413 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12414 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12415 45 78 74 72 61 63 74 4d 75 6c 74 69 50 6f 69 6e  ExtractMultiPoin
12416 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
12417 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12418 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12419 20 22 45 78 74 72 61 63 74 4d 75 6c 74 69 4c 69   "ExtractMultiLi
1241a 6e 65 73 74 72 69 6e 67 22 2c 20 31 2c 0a 09 09  nestring", 1,...
1241b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1241c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1241d 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1241e 09 66 6e 63 74 5f 45 78 74 72 61 63 74 4d 75 6c  .fnct_ExtractMul
1241f 74 69 4c 69 6e 65 73 74 72 69 6e 67 2c 20 30 2c  tiLinestring, 0,
12420 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12421 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12422 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78 74  ion_v2 (db, "Ext
12423 72 61 63 74 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e  ractMultiPolygon
12424 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
12425 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12426 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12427 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 45 78  che,.....fnct_Ex
12428 74 72 61 63 74 4d 75 6c 74 69 50 6f 6c 79 67 6f  tractMultiPolygo
12429 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
1242a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1242b 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1242c 20 22 53 54 5f 52 65 76 65 72 73 65 22 2c 20 31   "ST_Reverse", 1
1242d 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1242e 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1242f 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12430 0a 09 09 09 09 66 6e 63 74 5f 52 65 76 65 72 73  .....fnct_Revers
12431 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
12432 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12433 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12434 20 22 53 54 5f 46 6f 72 63 65 4c 48 52 22 2c 20   "ST_ForceLHR", 
12435 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12436 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12437 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12438 2c 0a 09 09 09 09 66 6e 63 74 5f 46 6f 72 63 65  ,.....fnct_Force
12439 50 6f 6c 79 67 6f 6e 43 57 2c 20 30 2c 20 30 2c  PolygonCW, 0, 0,
1243a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1243b 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1243c 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 46 6f 72  _v2 (db, "ST_For
1243d 63 65 50 6f 6c 79 67 6f 6e 43 57 22 2c 20 31 2c  cePolygonCW", 1,
1243e 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1243f 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12440 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12441 09 09 09 09 66 6e 63 74 5f 46 6f 72 63 65 50 6f  ....fnct_ForcePo
12442 6c 79 67 6f 6e 43 57 2c 20 30 2c 20 30 2c 20 30  lygonCW, 0, 0, 0
12443 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12444 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12445 32 20 28 64 62 2c 20 22 53 54 5f 46 6f 72 63 65  2 (db, "ST_Force
12446 50 6f 6c 79 67 6f 6e 43 43 57 22 2c 20 31 2c 0a  PolygonCCW", 1,.
12447 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12448 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12449 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1244a 09 09 09 66 6e 63 74 5f 46 6f 72 63 65 50 6f 6c  ...fnct_ForcePol
1244b 79 67 6f 6e 43 43 57 2c 20 30 2c 20 30 2c 20 30  ygonCCW, 0, 0, 0
1244c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1244d 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1244e 32 20 28 64 62 2c 20 22 53 54 5f 49 73 50 6f 6c  2 (db, "ST_IsPol
1244f 79 67 6f 6e 43 57 22 2c 20 31 2c 0a 09 09 09 09  ygonCW", 1,.....
12450 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12451 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12452 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
12453 6e 63 74 5f 49 73 50 6f 6c 79 67 6f 6e 43 57 2c  nct_IsPolygonCW,
12454 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12455 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12456 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12457 53 54 5f 49 73 50 6f 6c 79 67 6f 6e 43 43 57 22  ST_IsPolygonCCW"
12458 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12459 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1245a 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1245b 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 49 73 50  he,.....fnct_IsP
1245c 6f 6c 79 67 6f 6e 43 43 57 2c 20 30 2c 20 30 2c  olygonCCW, 0, 0,
1245d 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1245e 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1245f 5f 76 32 20 28 64 62 2c 20 22 44 69 6d 65 6e 73  _v2 (db, "Dimens
12460 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ion", 1,.....SQL
12461 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12462 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
12463 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12464 5f 44 69 6d 65 6e 73 69 6f 6e 2c 20 30 2c 20 30  _Dimension, 0, 0
12465 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12466 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12467 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 44 69  n_v2 (db, "ST_Di
12468 6d 65 6e 73 69 6f 6e 22 2c 20 31 2c 0a 09 09 09  mension", 1,....
12469 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1246a 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1246b 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
1246c 66 6e 63 74 5f 44 69 6d 65 6e 73 69 6f 6e 2c 20  fnct_Dimension, 
1246d 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1246e 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1246f 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
12470 6f 6f 72 64 44 69 6d 65 6e 73 69 6f 6e 22 2c 20  oordDimension", 
12471 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12472 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12473 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12474 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6f 72 64  ,.....fnct_Coord
12475 44 69 6d 65 6e 73 69 6f 6e 2c 20 30 2c 20 30 2c  Dimension, 0, 0,
12476 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12477 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12478 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4e 44 69  _v2 (db, "ST_NDi
12479 6d 73 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  ms", 1,.....SQLI
1247a 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1247b 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1247c 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
1247d 4e 44 69 6d 73 2c 20 30 2c 20 30 2c 20 30 29 3b  NDims, 0, 0, 0);
1247e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1247f 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12480 28 64 62 2c 20 22 47 65 6f 6d 65 74 72 79 54 79  (db, "GeometryTy
12481 70 65 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  pe", 1,.....SQLI
12482 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12483 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12484 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12485 47 65 6f 6d 65 74 72 79 54 79 70 65 2c 20 30 2c  GeometryType, 0,
12486 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12487 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12488 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12489 47 65 6f 6d 65 74 72 79 54 79 70 65 22 2c 20 31  GeometryType", 1
1248a 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1248b 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1248c 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1248d 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d 65 74  .....fnct_Geomet
1248e 72 79 54 79 70 65 2c 20 30 2c 20 30 2c 20 30 29  ryType, 0, 0, 0)
1248f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12490 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12491 20 28 64 62 2c 20 22 47 65 6f 6d 65 74 72 79 41   (db, "GeometryA
12492 6c 69 61 73 54 79 70 65 22 2c 20 31 2c 0a 09 09  liasType", 1,...
12493 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12494 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12495 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12496 09 66 6e 63 74 5f 47 65 6f 6d 65 74 72 79 41 6c  .fnct_GeometryAl
12497 69 61 73 54 79 70 65 2c 20 30 2c 20 30 2c 20 30  iasType, 0, 0, 0
12498 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12499 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1249a 32 20 28 64 62 2c 20 22 53 72 69 64 46 72 6f 6d  2 (db, "SridFrom
1249b 41 75 74 68 43 52 53 22 2c 20 32 2c 0a 09 09 09  AuthCRS", 2,....
1249c 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1249d 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1249e 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1249f 5f 53 72 69 64 46 72 6f 6d 41 75 74 68 43 52 53  _SridFromAuthCRS
124a0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
124a1 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
124a2 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
124a3 22 53 52 49 44 22 2c 20 31 2c 0a 09 09 09 09 53  "SRID", 1,.....S
124a4 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
124a5 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
124a6 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
124a7 63 74 5f 53 52 49 44 2c 20 30 2c 20 30 2c 20 30  ct_SRID, 0, 0, 0
124a8 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
124a9 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
124aa 32 20 28 64 62 2c 20 22 53 54 5f 53 52 49 44 22  2 (db, "ST_SRID"
124ab 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
124ac 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
124ad 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
124ae 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 52 49  he,.....fnct_SRI
124af 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
124b0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
124b1 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
124b2 20 22 53 65 74 53 52 49 44 22 2c 20 32 2c 0a 09   "SetSRID", 2,..
124b3 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
124b4 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
124b5 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
124b6 09 09 66 6e 63 74 5f 53 65 74 53 52 49 44 2c 20  ..fnct_SetSRID, 
124b7 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
124b8 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
124b9 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
124ba 73 45 6d 70 74 79 22 2c 20 31 2c 0a 09 09 09 09  sEmpty", 1,.....
124bb 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
124bc 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
124bd 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
124be 6e 63 74 5f 49 73 45 6d 70 74 79 2c 20 30 2c 20  nct_IsEmpty, 0, 
124bf 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
124c0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
124c1 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 49  on_v2 (db, "ST_I
124c2 73 45 6d 70 74 79 22 2c 20 31 2c 0a 09 09 09 09  sEmpty", 1,.....
124c3 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
124c4 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
124c5 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
124c6 6e 63 74 5f 49 73 45 6d 70 74 79 2c 20 30 2c 20  nct_IsEmpty, 0, 
124c7 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
124c8 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
124c9 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 49  on_v2 (db, "ST_I
124ca 73 33 44 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  s3D", 1,.....SQL
124cb 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
124cc 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
124cd 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
124ce 5f 49 73 33 44 2c 20 30 2c 20 30 2c 20 30 29 3b  _Is3D, 0, 0, 0);
124cf 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
124d0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
124d1 28 64 62 2c 20 22 53 54 5f 49 73 4d 65 61 73 75  (db, "ST_IsMeasu
124d2 72 65 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  red", 1,.....SQL
124d3 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
124d4 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
124d5 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
124d6 5f 49 73 4d 65 61 73 75 72 65 64 2c 20 30 2c 20  _IsMeasured, 0, 
124d7 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
124d8 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
124d9 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 6e 76 65  on_v2 (db, "Enve
124da 6c 6f 70 65 22 2c 20 31 2c 0a 09 09 09 09 53 51  lope", 1,.....SQ
124db 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
124dc 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
124dd 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
124de 74 5f 45 6e 76 65 6c 6f 70 65 2c 20 30 2c 20 30  t_Envelope, 0, 0
124df 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
124e0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
124e1 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 45 6e  n_v2 (db, "ST_En
124e2 76 65 6c 6f 70 65 22 2c 20 31 2c 0a 09 09 09 09  velope", 1,.....
124e3 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
124e4 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
124e5 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
124e6 6e 63 74 5f 45 6e 76 65 6c 6f 70 65 2c 20 30 2c  nct_Envelope, 0,
124e7 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
124e8 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
124e9 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
124ea 45 78 70 61 6e 64 22 2c 20 32 2c 0a 09 09 09 09  Expand", 2,.....
124eb 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
124ec 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
124ed 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
124ee 6e 63 74 5f 45 78 70 61 6e 64 2c 20 30 2c 20 30  nct_Expand, 0, 0
124ef 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
124f0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
124f1 6e 5f 76 32 20 28 64 62 2c 20 22 58 22 2c 20 31  n_v2 (db, "X", 1
124f2 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
124f3 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
124f4 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
124f5 0a 09 09 09 09 66 6e 63 74 5f 58 2c 20 30 2c 20  .....fnct_X, 0, 
124f6 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
124f7 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
124f8 6f 6e 5f 76 32 20 28 64 62 2c 20 22 59 22 2c 20  on_v2 (db, "Y", 
124f9 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
124fa 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
124fb 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
124fc 2c 0a 09 09 09 09 66 6e 63 74 5f 59 2c 20 30 2c  ,.....fnct_Y, 0,
124fd 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
124fe 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
124ff 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 5a 22 2c  ion_v2 (db, "Z",
12500 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12501 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12502 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12503 65 2c 0a 09 09 09 09 66 6e 63 74 5f 5a 2c 20 30  e,.....fnct_Z, 0
12504 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12505 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12506 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 22  tion_v2 (db, "M"
12507 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12508 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12509 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1250a 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 2c 20  he,.....fnct_M, 
1250b 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1250c 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1250d 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
1250e 54 5f 58 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  T_X", 1,.....SQL
1250f 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12510 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
12511 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12512 5f 58 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  _X, 0, 0, 0);.  
12513 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12514 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12515 2c 20 22 53 54 5f 59 22 2c 20 31 2c 0a 09 09 09  , "ST_Y", 1,....
12516 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12517 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12518 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
12519 66 6e 63 74 5f 59 2c 20 30 2c 20 30 2c 20 30 29  fnct_Y, 0, 0, 0)
1251a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1251b 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1251c 20 28 64 62 2c 20 22 53 54 5f 5a 22 2c 20 31 2c   (db, "ST_Z", 1,
1251d 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1251e 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1251f 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12520 09 09 09 09 66 6e 63 74 5f 5a 2c 20 30 2c 20 30  ....fnct_Z, 0, 0
12521 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12522 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12523 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 22  n_v2 (db, "ST_M"
12524 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12525 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12526 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
12527 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 2c 20  he,.....fnct_M, 
12528 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12529 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1252a 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
1252b 54 5f 4d 69 6e 58 22 2c 20 31 2c 0a 09 09 09 09  T_MinX", 1,.....
1252c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1252d 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1252e 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
1252f 4d 62 72 4d 69 6e 58 2c 20 30 2c 20 30 2c 20 30  MbrMinX, 0, 0, 0
12530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12531 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12532 32 20 28 64 62 2c 20 22 53 54 5f 4d 69 6e 59 22  2 (db, "ST_MinY"
12533 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12534 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12535 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
12536 09 09 09 09 66 6e 63 74 5f 4d 62 72 4d 69 6e 59  ....fnct_MbrMinY
12537 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12538 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12539 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1253a 22 53 54 5f 4d 69 6e 5a 22 2c 20 31 2c 0a 09 09  "ST_MinZ", 1,...
1253b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1253c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1253d 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
1253e 74 5f 4d 69 6e 5a 2c 20 30 2c 20 30 2c 20 30 29  t_MinZ, 0, 0, 0)
1253f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12540 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12541 20 28 64 62 2c 20 22 53 54 5f 4d 69 6e 4d 22 2c   (db, "ST_MinM",
12542 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12543 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12544 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12545 09 09 09 66 6e 63 74 5f 4d 69 6e 4d 2c 20 30 2c  ...fnct_MinM, 0,
12546 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12547 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12548 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12549 4d 61 78 58 22 2c 20 31 2c 0a 09 09 09 09 53 51  MaxX", 1,.....SQ
1254a 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
1254b 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1254c 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 62  , 0,.....fnct_Mb
1254d 72 4d 61 78 58 2c 20 30 2c 20 30 2c 20 30 29 3b  rMaxX, 0, 0, 0);
1254e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1254f 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12550 28 64 62 2c 20 22 53 54 5f 4d 61 78 59 22 2c 20  (db, "ST_MaxY", 
12551 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12552 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12553 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
12554 09 09 66 6e 63 74 5f 4d 62 72 4d 61 78 59 2c 20  ..fnct_MbrMaxY, 
12555 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12556 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12557 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12558 54 5f 4d 61 78 5a 22 2c 20 31 2c 0a 09 09 09 09  T_MaxZ", 1,.....
12559 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1255a 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1255b 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
1255c 4d 61 78 5a 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MaxZ, 0, 0, 0);.
1255d 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1255e 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1255f 64 62 2c 20 22 53 54 5f 4d 61 78 4d 22 2c 20 31  db, "ST_MaxM", 1
12560 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12561 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12562 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
12563 09 66 6e 63 74 5f 4d 61 78 4d 2c 20 30 2c 20 30  .fnct_MaxM, 0, 0
12564 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12565 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12566 6e 5f 76 32 20 28 64 62 2c 20 22 4e 75 6d 50 6f  n_v2 (db, "NumPo
12567 69 6e 74 73 22 2c 20 31 2c 0a 09 09 09 09 53 51  ints", 1,.....SQ
12568 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12569 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1256a 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
1256b 74 5f 4e 75 6d 50 6f 69 6e 74 73 2c 20 30 2c 20  t_NumPoints, 0, 
1256c 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1256d 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1256e 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4e  on_v2 (db, "ST_N
1256f 75 6d 50 6f 69 6e 74 73 22 2c 20 31 2c 0a 09 09  umPoints", 1,...
12570 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12571 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12572 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12573 09 66 6e 63 74 5f 4e 75 6d 50 6f 69 6e 74 73 2c  .fnct_NumPoints,
12574 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12575 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12576 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12577 53 74 61 72 74 50 6f 69 6e 74 22 2c 20 31 2c 0a  StartPoint", 1,.
12578 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12579 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1257a 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1257b 09 09 09 66 6e 63 74 5f 53 74 61 72 74 50 6f 69  ...fnct_StartPoi
1257c 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
1257d 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1257e 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1257f 2c 20 22 45 6e 64 50 6f 69 6e 74 22 2c 20 31 2c  , "EndPoint", 1,
12580 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12581 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12582 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12583 09 09 09 09 66 6e 63 74 5f 45 6e 64 50 6f 69 6e  ....fnct_EndPoin
12584 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
12585 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12586 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12587 20 22 53 54 5f 53 74 61 72 74 50 6f 69 6e 74 22   "ST_StartPoint"
12588 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12589 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1258a 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1258b 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 74 61  he,.....fnct_Sta
1258c 72 74 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30  rtPoint, 0, 0, 0
1258d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1258e 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1258f 32 20 28 64 62 2c 20 22 53 54 5f 45 6e 64 50 6f  2 (db, "ST_EndPo
12590 69 6e 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  int", 1,.....SQL
12591 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12592 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
12593 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12594 5f 45 6e 64 50 6f 69 6e 74 2c 20 30 2c 20 30 2c  _EndPoint, 0, 0,
12595 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12596 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12597 5f 76 32 20 28 64 62 2c 20 22 50 6f 69 6e 74 4e  _v2 (db, "PointN
12598 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
12599 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1259a 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1259b 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f  che,.....fnct_Po
1259c 69 6e 74 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  intN, 0, 0, 0);.
1259d 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1259e 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1259f 64 62 2c 20 22 53 54 5f 50 6f 69 6e 74 4e 22 2c  db, "ST_PointN",
125a0 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
125a1 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
125a2 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
125a3 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 69 6e  e,.....fnct_Poin
125a4 74 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  tN, 0, 0, 0);.  
125a5 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
125a6 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
125a7 2c 20 22 45 78 74 65 72 69 6f 72 52 69 6e 67 22  , "ExteriorRing"
125a8 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
125a9 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
125aa 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
125ab 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 45 78 74  he,.....fnct_Ext
125ac 65 72 69 6f 72 52 69 6e 67 2c 20 30 2c 20 30 2c  eriorRing, 0, 0,
125ad 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
125ae 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
125af 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 45 78 74  _v2 (db, "ST_Ext
125b0 65 72 69 6f 72 52 69 6e 67 22 2c 20 31 2c 0a 09  eriorRing", 1,..
125b1 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
125b2 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
125b3 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
125b4 09 09 66 6e 63 74 5f 45 78 74 65 72 69 6f 72 52  ..fnct_ExteriorR
125b5 69 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ing, 0, 0, 0);. 
125b6 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
125b7 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
125b8 62 2c 20 22 4e 75 6d 49 6e 74 65 72 69 6f 72 52  b, "NumInteriorR
125b9 69 6e 67 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ing", 1,.....SQL
125ba 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
125bb 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
125bc 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
125bd 5f 4e 75 6d 49 6e 74 65 72 69 6f 72 52 69 6e 67  _NumInteriorRing
125be 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
125bf 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
125c0 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
125c1 20 22 4e 75 6d 49 6e 74 65 72 69 6f 72 52 69 6e   "NumInteriorRin
125c2 67 73 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  gs", 1,.....SQLI
125c3 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
125c4 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
125c5 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
125c6 4e 75 6d 49 6e 74 65 72 69 6f 72 52 69 6e 67 73  NumInteriorRings
125c7 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
125c8 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
125c9 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
125ca 22 53 54 5f 4e 75 6d 49 6e 74 65 72 69 6f 72 52  "ST_NumInteriorR
125cb 69 6e 67 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ing", 1,.....SQL
125cc 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
125cd 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
125ce 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
125cf 5f 4e 75 6d 49 6e 74 65 72 69 6f 72 52 69 6e 67  _NumInteriorRing
125d0 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
125d1 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
125d2 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
125d3 20 22 49 6e 74 65 72 69 6f 72 52 69 6e 67 4e 22   "InteriorRingN"
125d4 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
125d5 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
125d6 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
125d7 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 49 6e 74  he,.....fnct_Int
125d8 65 72 69 6f 72 52 69 6e 67 4e 2c 20 30 2c 20 30  eriorRingN, 0, 0
125d9 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
125da 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
125db 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 49 6e  n_v2 (db, "ST_In
125dc 74 65 72 69 6f 72 52 69 6e 67 4e 22 2c 20 32 2c  teriorRingN", 2,
125dd 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
125de 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
125df 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
125e0 09 09 09 09 66 6e 63 74 5f 49 6e 74 65 72 69 6f  ....fnct_Interio
125e1 72 52 69 6e 67 4e 2c 20 30 2c 20 30 2c 20 30 29  rRingN, 0, 0, 0)
125e2 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
125e3 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
125e4 20 28 64 62 2c 20 22 4e 75 6d 47 65 6f 6d 65 74   (db, "NumGeomet
125e5 72 69 65 73 22 2c 20 31 2c 0a 09 09 09 09 53 51  ries", 1,.....SQ
125e6 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
125e7 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
125e8 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
125e9 74 5f 4e 75 6d 47 65 6f 6d 65 74 72 69 65 73 2c  t_NumGeometries,
125ea 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
125eb 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
125ec 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
125ed 53 54 5f 4e 75 6d 47 65 6f 6d 65 74 72 69 65 73  ST_NumGeometries
125ee 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
125ef 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
125f0 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
125f1 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4e 75  che,.....fnct_Nu
125f2 6d 47 65 6f 6d 65 74 72 69 65 73 2c 20 30 2c 20  mGeometries, 0, 
125f3 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
125f4 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
125f5 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 6d  on_v2 (db, "Geom
125f6 65 74 72 79 4e 22 2c 20 32 2c 0a 09 09 09 09 53  etryN", 2,.....S
125f7 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
125f8 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
125f9 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
125fa 63 74 5f 47 65 6f 6d 65 74 72 79 4e 2c 20 30 2c  ct_GeometryN, 0,
125fb 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
125fc 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
125fd 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
125fe 47 65 6f 6d 65 74 72 79 4e 22 2c 20 32 2c 0a 09  GeometryN", 2,..
125ff 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12600 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12601 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
12602 09 09 66 6e 63 74 5f 47 65 6f 6d 65 74 72 79 4e  ..fnct_GeometryN
12603 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12604 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12605 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12606 22 4d 42 52 43 6f 6e 74 61 69 6e 73 22 2c 20 32  "MBRContains", 2
12607 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12608 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12609 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
1260a 09 66 6e 63 74 5f 4d 62 72 43 6f 6e 74 61 69 6e  .fnct_MbrContain
1260b 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
1260c 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1260d 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1260e 20 22 4d 62 72 44 69 73 6a 6f 69 6e 74 22 2c 20   "MbrDisjoint", 
1260f 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
12610 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12611 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
12612 09 09 66 6e 63 74 5f 4d 62 72 44 69 73 6a 6f 69  ..fnct_MbrDisjoi
12613 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
12614 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12615 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12616 2c 20 22 4d 42 52 45 71 75 61 6c 22 2c 20 32 2c  , "MBREqual", 2,
12617 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12618 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12619 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
1261a 66 6e 63 74 5f 4d 62 72 45 71 75 61 6c 2c 20 30  fnct_MbrEqual, 0
1261b 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1261c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1261d 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 62  tion_v2 (db, "Mb
1261e 72 49 6e 74 65 72 73 65 63 74 73 22 2c 20 32 2c  rIntersects", 2,
1261f 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12620 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12621 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12622 66 6e 63 74 5f 4d 62 72 49 6e 74 65 72 73 65 63  fnct_MbrIntersec
12623 74 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ts, 0, 0, 0);.  
12624 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12625 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12626 2c 20 22 53 54 5f 45 6e 76 49 6e 74 65 72 73 65  , "ST_EnvInterse
12627 63 74 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  cts", 2,.....SQL
12628 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
12629 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1262a 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 62 72   0,.....fnct_Mbr
1262b 49 6e 74 65 72 73 65 63 74 73 2c 20 30 2c 20 30  Intersects, 0, 0
1262c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1262d 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1262e 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 45 6e  n_v2 (db, "ST_En
1262f 76 49 6e 74 65 72 73 65 63 74 73 22 2c 20 35 2c  vIntersects", 5,
12630 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12631 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12632 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12633 09 09 09 09 66 6e 63 74 5f 45 6e 76 49 6e 74 65  ....fnct_EnvInte
12634 72 73 65 63 74 73 2c 20 30 2c 20 30 2c 20 30 29  rsects, 0, 0, 0)
12635 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12636 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12637 20 28 64 62 2c 20 22 53 54 5f 45 6e 76 65 6c 6f   (db, "ST_Envelo
12638 70 65 73 49 6e 74 65 72 73 65 63 74 73 22 2c 20  pesIntersects", 
12639 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
1263a 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1263b 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
1263c 09 09 66 6e 63 74 5f 4d 62 72 49 6e 74 65 72 73  ..fnct_MbrInters
1263d 65 63 74 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ects, 0, 0, 0);.
1263e 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1263f 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12640 64 62 2c 20 22 53 54 5f 45 6e 76 65 6c 6f 70 65  db, "ST_Envelope
12641 73 49 6e 74 65 72 73 65 63 74 73 22 2c 20 35 2c  sIntersects", 5,
12642 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12643 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12644 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12645 09 09 09 09 66 6e 63 74 5f 45 6e 76 49 6e 74 65  ....fnct_EnvInte
12646 72 73 65 63 74 73 2c 20 30 2c 20 30 2c 20 30 29  rsects, 0, 0, 0)
12647 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12648 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12649 20 28 64 62 2c 20 22 4d 42 52 4f 76 65 72 6c 61   (db, "MBROverla
1264a 70 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  ps", 2,.....SQLI
1264b 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1264c 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1264d 30 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 62 72 4f  0,.....fnct_MbrO
1264e 76 65 72 6c 61 70 73 2c 20 30 2c 20 30 2c 20 30  verlaps, 0, 0, 0
1264f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12650 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12651 32 20 28 64 62 2c 20 22 4d 62 72 54 6f 75 63 68  2 (db, "MbrTouch
12652 65 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  es", 2,.....SQLI
12653 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12654 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12655 30 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 62 72 54  0,.....fnct_MbrT
12656 6f 75 63 68 65 73 2c 20 30 2c 20 30 2c 20 30 29  ouches, 0, 0, 0)
12657 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12658 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12659 20 28 64 62 2c 20 22 4d 62 72 57 69 74 68 69 6e   (db, "MbrWithin
1265a 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
1265b 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1265c 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1265d 0a 09 09 09 09 66 6e 63 74 5f 4d 62 72 57 69 74  .....fnct_MbrWit
1265e 68 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  hin, 0, 0, 0);. 
1265f 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12660 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12661 62 2c 20 22 53 68 69 66 74 43 6f 6f 72 64 73 22  b, "ShiftCoords"
12662 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
12663 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12664 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
12665 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 68 69  he,.....fnct_Shi
12666 66 74 43 6f 6f 72 64 73 2c 20 30 2c 20 30 2c 20  ftCoords, 0, 0, 
12667 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12668 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12669 76 32 20 28 64 62 2c 20 22 53 68 69 66 74 43 6f  v2 (db, "ShiftCo
1266a 6f 72 64 69 6e 61 74 65 73 22 2c 20 33 2c 0a 09  ordinates", 3,..
1266b 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1266c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1266d 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
1266e 09 09 66 6e 63 74 5f 53 68 69 66 74 43 6f 6f 72  ..fnct_ShiftCoor
1266f 64 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ds, 0, 0, 0);.  
12670 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12671 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12672 2c 20 22 53 54 5f 54 72 61 6e 73 6c 61 74 65 22  , "ST_Translate"
12673 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 4,.....SQLITE_
12674 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12675 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
12676 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 72 61  he,.....fnct_Tra
12677 6e 73 6c 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  nslate, 0, 0, 0)
12678 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12679 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1267a 20 28 64 62 2c 20 22 53 54 5f 53 68 69 66 74 5f   (db, "ST_Shift_
1267b 4c 6f 6e 67 69 74 75 64 65 22 2c 20 31 2c 0a 09  Longitude", 1,..
1267c 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1267d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1267e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
1267f 09 09 66 6e 63 74 5f 53 68 69 66 74 4c 6f 6e 67  ..fnct_ShiftLong
12680 69 74 75 64 65 2c 20 30 2c 20 30 2c 20 30 29 3b  itude, 0, 0, 0);
12681 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12682 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12683 28 64 62 2c 20 22 4e 6f 72 6d 61 6c 69 7a 65 4c  (db, "NormalizeL
12684 6f 6e 4c 61 74 22 2c 20 31 2c 0a 09 09 09 09 53  onLat", 1,.....S
12685 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12686 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12687 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
12688 63 74 5f 4e 6f 72 6d 61 6c 69 7a 65 4c 6f 6e 4c  ct_NormalizeLonL
12689 61 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  at, 0, 0, 0);.  
1268a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1268b 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1268c 2c 20 22 53 63 61 6c 65 43 6f 6f 72 64 73 22 2c  , "ScaleCoords",
1268d 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
1268e 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1268f 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12690 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 63 61 6c  e,.....fnct_Scal
12691 65 43 6f 6f 72 64 73 2c 20 30 2c 20 30 2c 20 30  eCoords, 0, 0, 0
12692 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12693 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12694 32 20 28 64 62 2c 20 22 53 63 61 6c 65 43 6f 6f  2 (db, "ScaleCoo
12695 72 64 69 6e 61 74 65 73 22 2c 20 32 2c 0a 09 09  rdinates", 2,...
12696 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12697 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12698 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12699 09 66 6e 63 74 5f 53 63 61 6c 65 43 6f 6f 72 64  .fnct_ScaleCoord
1269a 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
1269b 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1269c 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1269d 20 22 53 63 61 6c 65 43 6f 6f 72 64 73 22 2c 20   "ScaleCoords", 
1269e 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  3,.....SQLITE_UT
1269f 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
126a0 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
126a1 2c 0a 09 09 09 09 66 6e 63 74 5f 53 63 61 6c 65  ,.....fnct_Scale
126a2 43 6f 6f 72 64 73 2c 20 30 2c 20 30 2c 20 30 29  Coords, 0, 0, 0)
126a3 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
126a4 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
126a5 20 28 64 62 2c 20 22 53 63 61 6c 65 43 6f 6f 72   (db, "ScaleCoor
126a6 64 69 6e 61 74 65 73 22 2c 20 33 2c 0a 09 09 09  dinates", 3,....
126a7 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
126a8 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
126a9 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
126aa 66 6e 63 74 5f 53 63 61 6c 65 43 6f 6f 72 64 73  fnct_ScaleCoords
126ab 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
126ac 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
126ad 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
126ae 22 52 6f 74 61 74 65 43 6f 6f 72 64 73 22 2c 20  "RotateCoords", 
126af 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
126b0 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
126b1 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
126b2 2c 0a 09 09 09 09 66 6e 63 74 5f 52 6f 74 61 74  ,.....fnct_Rotat
126b3 65 43 6f 6f 72 64 73 2c 20 30 2c 20 30 2c 20 30  eCoords, 0, 0, 0
126b4 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
126b5 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
126b6 32 20 28 64 62 2c 20 22 52 6f 74 61 74 65 43 6f  2 (db, "RotateCo
126b7 6f 72 64 69 6e 61 74 65 73 22 2c 20 32 2c 0a 09  ordinates", 2,..
126b8 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
126b9 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
126ba 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
126bb 09 09 66 6e 63 74 5f 52 6f 74 61 74 65 43 6f 6f  ..fnct_RotateCoo
126bc 72 64 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  rds, 0, 0, 0);. 
126bd 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
126be 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
126bf 62 2c 20 22 52 65 66 6c 65 63 74 43 6f 6f 72 64  b, "ReflectCoord
126c0 73 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54  s", 3,.....SQLIT
126c1 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
126c2 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
126c3 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 52  ache,.....fnct_R
126c4 65 66 6c 65 63 74 43 6f 6f 72 64 73 2c 20 30 2c  eflectCoords, 0,
126c5 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
126c6 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
126c7 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 52 65 66  ion_v2 (db, "Ref
126c8 6c 65 63 74 43 6f 6f 72 64 69 6e 61 74 65 73 22  lectCoordinates"
126c9 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
126ca 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
126cb 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
126cc 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65 66  he,.....fnct_Ref
126cd 6c 65 63 74 43 6f 6f 72 64 73 2c 20 30 2c 20 30  lectCoords, 0, 0
126ce 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
126cf 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
126d0 6e 5f 76 32 20 28 64 62 2c 20 22 53 77 61 70 43  n_v2 (db, "SwapC
126d1 6f 6f 72 64 73 22 2c 20 31 2c 0a 09 09 09 09 53  oords", 1,.....S
126d2 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
126d3 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
126d4 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
126d5 63 74 5f 53 77 61 70 43 6f 6f 72 64 73 2c 20 30  ct_SwapCoords, 0
126d6 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
126d7 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
126d8 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 77  tion_v2 (db, "Sw
126d9 61 70 43 6f 6f 72 64 69 6e 61 74 65 73 22 2c 20  apCoordinates", 
126da 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
126db 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
126dc 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
126dd 2c 0a 09 09 09 09 66 6e 63 74 5f 53 77 61 70 43  ,.....fnct_SwapC
126de 6f 6f 72 64 73 2c 20 30 2c 20 30 2c 20 30 29 3b  oords, 0, 0, 0);
126df 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
126e0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
126e1 28 64 62 2c 20 22 42 75 69 6c 64 4d 62 72 22 2c  (db, "BuildMbr",
126e2 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   4,.....SQLITE_U
126e3 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
126e4 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
126e5 09 09 09 66 6e 63 74 5f 42 75 69 6c 64 4d 62 72  ...fnct_BuildMbr
126e6 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
126e7 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
126e8 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
126e9 20 22 42 75 69 6c 64 4d 62 72 22 2c 20 35 2c 0a   "BuildMbr", 5,.
126ea 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
126eb 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
126ec 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
126ed 6e 63 74 5f 42 75 69 6c 64 4d 62 72 32 2c 20 30  nct_BuildMbr2, 0
126ee 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
126ef 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
126f0 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 42 75  tion_v2 (db, "Bu
126f1 69 6c 64 43 69 72 63 6c 65 4d 62 72 22 2c 20 33  ildCircleMbr", 3
126f2 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
126f3 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
126f4 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
126f5 09 66 6e 63 74 5f 42 75 69 6c 64 43 69 72 63 6c  .fnct_BuildCircl
126f6 65 4d 62 72 31 2c 20 30 2c 20 30 2c 20 30 29 3b  eMbr1, 0, 0, 0);
126f7 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
126f8 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
126f9 28 64 62 2c 20 22 42 75 69 6c 64 43 69 72 63 6c  (db, "BuildCircl
126fa 65 4d 62 72 22 2c 20 34 2c 0a 09 09 09 09 53 51  eMbr", 4,.....SQ
126fb 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
126fc 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
126fd 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 42 75  , 0,.....fnct_Bu
126fe 69 6c 64 43 69 72 63 6c 65 4d 62 72 32 2c 20 30  ildCircleMbr2, 0
126ff 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12700 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12701 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78  tion_v2 (db, "Ex
12702 74 65 6e 74 22 2c 20 31 2c 0a 09 09 09 09 53 51  tent", 1,.....SQ
12703 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12704 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12705 2c 20 63 61 63 68 65 2c 20 30 2c 0a 09 09 09 09  , cache, 0,.....
12706 66 6e 63 74 5f 45 78 74 65 6e 74 5f 73 74 65 70  fnct_Extent_step
12707 2c 20 66 6e 63 74 5f 45 78 74 65 6e 74 5f 66 69  , fnct_Extent_fi
12708 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  nal, 0);.    sql
12709 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1270a 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 62  tion_v2 (db, "Mb
1270b 72 4d 69 6e 58 22 2c 20 31 2c 0a 09 09 09 09 53  rMinX", 1,.....S
1270c 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1270d 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1270e 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 4d  C, 0,.....fnct_M
1270f 62 72 4d 69 6e 58 2c 20 30 2c 20 30 2c 20 30 29  brMinX, 0, 0, 0)
12710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12711 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12712 20 28 64 62 2c 20 22 4d 62 72 4d 61 78 58 22 2c   (db, "MbrMaxX",
12713 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12714 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12715 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12716 09 09 09 66 6e 63 74 5f 4d 62 72 4d 61 78 58 2c  ...fnct_MbrMaxX,
12717 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12718 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12719 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1271a 4d 62 72 4d 69 6e 59 22 2c 20 31 2c 0a 09 09 09  MbrMinY", 1,....
1271b 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1271c 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1271d 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1271e 5f 4d 62 72 4d 69 6e 59 2c 20 30 2c 20 30 2c 20  _MbrMinY, 0, 0, 
1271f 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12720 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12721 76 32 20 28 64 62 2c 20 22 4d 62 72 4d 61 78 59  v2 (db, "MbrMaxY
12722 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
12723 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12724 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
12725 0a 09 09 09 09 66 6e 63 74 5f 4d 62 72 4d 61 78  .....fnct_MbrMax
12726 59 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Y, 0, 0, 0);.   
12727 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12728 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12729 20 22 54 69 6e 79 50 6f 69 6e 74 45 6e 63 6f 64   "TinyPointEncod
1272a 65 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  e", 1,.....SQLIT
1272b 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1272c 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
1272d 2c 0a 09 09 09 09 66 6e 63 74 5f 74 69 6e 79 5f  ,.....fnct_tiny_
1272e 70 6f 69 6e 74 5f 65 6e 63 6f 64 65 2c 20 30 2c  point_encode, 0,
1272f 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12730 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12731 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 6f  ion_v2 (db, "Geo
12732 6d 65 74 72 79 50 6f 69 6e 74 45 6e 63 6f 64 65  metryPointEncode
12733 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
12734 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12735 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
12736 0a 09 09 09 09 66 6e 63 74 5f 67 65 6f 6d 65 74  .....fnct_geomet
12737 72 79 5f 70 6f 69 6e 74 5f 65 6e 63 6f 64 65 2c  ry_point_encode,
12738 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12739 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1273a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1273b 53 54 5f 50 6f 69 6e 74 22 2c 20 32 2c 0a 09 09  ST_Point", 2,...
1273c 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1273d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1273e 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
1273f 09 66 6e 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 31  .fnct_MakePoint1
12740 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12741 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12742 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12743 22 4d 61 6b 65 50 6f 69 6e 74 22 2c 20 32 2c 0a  "MakePoint", 2,.
12744 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12745 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12746 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12747 09 09 09 66 6e 63 74 5f 4d 61 6b 65 50 6f 69 6e  ...fnct_MakePoin
12748 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t1, 0, 0, 0);.  
12749 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1274a 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1274b 2c 20 22 4d 61 6b 65 50 6f 69 6e 74 22 2c 20 33  , "MakePoint", 3
1274c 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1274d 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1274e 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1274f 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65 50 6f  .....fnct_MakePo
12750 69 6e 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  int2, 0, 0, 0);.
12751 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12752 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12753 64 62 2c 20 22 4d 61 6b 65 50 6f 69 6e 74 5a 22  db, "MakePointZ"
12754 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
12755 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12756 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
12757 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b  he,.....fnct_Mak
12758 65 50 6f 69 6e 74 5a 31 2c 20 30 2c 20 30 2c 20  ePointZ1, 0, 0, 
12759 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1275a 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1275b 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 50 6f 69  v2 (db, "MakePoi
1275c 6e 74 5a 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c  ntZ", 4,.....SQL
1275d 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1275e 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1275f 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
12760 5f 4d 61 6b 65 50 6f 69 6e 74 5a 32 2c 20 30 2c  _MakePointZ2, 0,
12761 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12762 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12763 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b  ion_v2 (db, "Mak
12764 65 50 6f 69 6e 74 4d 22 2c 20 33 2c 0a 09 09 09  ePointM", 3,....
12765 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12766 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12767 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
12768 66 6e 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 4d 31  fnct_MakePointM1
12769 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1276a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1276b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1276c 22 4d 61 6b 65 50 6f 69 6e 74 4d 22 2c 20 34 2c  "MakePointM", 4,
1276d 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1276e 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1276f 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12770 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65 50 6f 69  ....fnct_MakePoi
12771 6e 74 4d 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ntM2, 0, 0, 0);.
12772 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12773 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12774 64 62 2c 20 22 4d 61 6b 65 50 6f 69 6e 74 5a 4d  db, "MakePointZM
12775 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 4,.....SQLITE
12776 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12777 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12778 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61  che,.....fnct_Ma
12779 6b 65 50 6f 69 6e 74 5a 4d 31 2c 20 30 2c 20 30  kePointZM1, 0, 0
1277a 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1277b 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1277c 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 50  n_v2 (db, "MakeP
1277d 6f 69 6e 74 5a 4d 22 2c 20 35 2c 0a 09 09 09 09  ointZM", 5,.....
1277e 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1277f 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12780 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
12781 6e 63 74 5f 4d 61 6b 65 50 6f 69 6e 74 5a 4d 32  nct_MakePointZM2
12782 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12783 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12784 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12785 22 4d 61 6b 65 4c 69 6e 65 22 2c 20 31 2c 0a 09  "MakeLine", 1,..
12786 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12787 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12788 49 53 54 49 43 2c 20 63 61 63 68 65 2c 20 30 2c  ISTIC, cache, 0,
12789 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65 4c 69  .....fnct_MakeLi
1278a 6e 65 5f 73 74 65 70 2c 20 66 6e 63 74 5f 4d 61  ne_step, fnct_Ma
1278b 6b 65 4c 69 6e 65 5f 66 69 6e 61 6c 2c 20 30 29  keLine_final, 0)
1278c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1278d 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1278e 20 28 64 62 2c 20 22 4d 61 6b 65 4c 69 6e 65 22   (db, "MakeLine"
1278f 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
12790 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12791 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
12792 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b  he,.....fnct_Mak
12793 65 4c 69 6e 65 2c 20 30 2c 20 30 2c 20 30 29 3b  eLine, 0, 0, 0);
12794 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12795 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12796 28 64 62 2c 20 22 4d 61 6b 65 43 69 72 63 6c 65  (db, "MakeCircle
12797 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
12798 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12799 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1279a 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61  che,.....fnct_Ma
1279b 6b 65 43 69 72 63 6c 65 2c 20 30 2c 20 30 2c 20  keCircle, 0, 0, 
1279c 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1279d 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1279e 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 43 69 72  v2 (db, "MakeCir
1279f 63 6c 65 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c  cle", 4,.....SQL
127a0 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
127a1 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
127a2 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
127a3 5f 4d 61 6b 65 43 69 72 63 6c 65 2c 20 30 2c 20  _MakeCircle, 0, 
127a4 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
127a5 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
127a6 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b 65  on_v2 (db, "Make
127a7 43 69 72 63 6c 65 22 2c 20 35 2c 0a 09 09 09 09  Circle", 5,.....
127a8 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
127a9 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
127aa 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
127ab 6e 63 74 5f 4d 61 6b 65 43 69 72 63 6c 65 2c 20  nct_MakeCircle, 
127ac 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
127ad 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
127ae 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d  ction_v2 (db, "M
127af 61 6b 65 45 6c 6c 69 70 73 65 22 2c 20 34 2c 0a  akeEllipse", 4,.
127b0 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
127b1 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
127b2 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
127b3 09 09 09 66 6e 63 74 5f 4d 61 6b 65 45 6c 6c 69  ...fnct_MakeElli
127b4 70 73 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  pse, 0, 0, 0);. 
127b5 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
127b6 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
127b7 62 2c 20 22 4d 61 6b 65 45 6c 6c 69 70 73 65 22  b, "MakeEllipse"
127b8 2c 20 35 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 5,.....SQLITE_
127b9 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
127ba 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
127bb 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b  he,.....fnct_Mak
127bc 65 45 6c 6c 69 70 73 65 2c 20 30 2c 20 30 2c 20  eEllipse, 0, 0, 
127bd 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
127be 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
127bf 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 45 6c 6c  v2 (db, "MakeEll
127c0 69 70 73 65 22 2c 20 36 2c 0a 09 09 09 09 53 51  ipse", 6,.....SQ
127c1 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
127c2 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
127c3 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
127c4 74 5f 4d 61 6b 65 45 6c 6c 69 70 73 65 2c 20 30  t_MakeEllipse, 0
127c5 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
127c6 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
127c7 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61  tion_v2 (db, "Ma
127c8 6b 65 41 72 63 22 2c 20 35 2c 0a 09 09 09 09 53  keArc", 5,.....S
127c9 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
127ca 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
127cb 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
127cc 63 74 5f 4d 61 6b 65 41 72 63 2c 20 30 2c 20 30  ct_MakeArc, 0, 0
127cd 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
127ce 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
127cf 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 41  n_v2 (db, "MakeA
127d0 72 63 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c 49  rc", 6,.....SQLI
127d1 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
127d2 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
127d3 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
127d4 4d 61 6b 65 41 72 63 2c 20 30 2c 20 30 2c 20 30  MakeArc, 0, 0, 0
127d5 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
127d6 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
127d7 32 20 28 64 62 2c 20 22 4d 61 6b 65 41 72 63 22  2 (db, "MakeArc"
127d8 2c 20 37 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 7,.....SQLITE_
127d9 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
127da 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
127db 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b  he,.....fnct_Mak
127dc 65 41 72 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eArc, 0, 0, 0);.
127dd 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
127de 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
127df 64 62 2c 20 22 4d 61 6b 65 45 6c 6c 69 70 74 69  db, "MakeEllipti
127e0 63 41 72 63 22 2c 20 36 2c 0a 09 09 09 09 53 51  cArc", 6,.....SQ
127e1 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
127e2 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
127e3 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
127e4 74 5f 4d 61 6b 65 45 6c 6c 69 70 74 69 63 41 72  t_MakeEllipticAr
127e5 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  c, 0, 0, 0);.   
127e6 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
127e7 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
127e8 20 22 4d 61 6b 65 45 6c 6c 69 70 74 69 63 41 72   "MakeEllipticAr
127e9 63 22 2c 20 37 2c 0a 09 09 09 09 53 51 4c 49 54  c", 7,.....SQLIT
127ea 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
127eb 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
127ec 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d  ache,.....fnct_M
127ed 61 6b 65 45 6c 6c 69 70 74 69 63 41 72 63 2c 20  akeEllipticArc, 
127ee 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
127ef 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
127f0 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d  ction_v2 (db, "M
127f1 61 6b 65 45 6c 6c 69 70 74 69 63 41 72 63 22 2c  akeEllipticArc",
127f2 20 38 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   8,.....SQLITE_U
127f3 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
127f4 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
127f5 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65  e,.....fnct_Make
127f6 45 6c 6c 69 70 74 69 63 41 72 63 2c 20 30 2c 20  EllipticArc, 0, 
127f7 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
127f8 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
127f9 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b 65  on_v2 (db, "Make
127fa 43 69 72 63 75 6c 61 72 53 65 63 74 6f 72 22 2c  CircularSector",
127fb 20 35 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   5,.....SQLITE_U
127fc 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
127fd 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
127fe 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65  e,.....fnct_Make
127ff 43 69 72 63 75 6c 61 72 53 65 63 74 6f 72 2c 20  CircularSector, 
12800 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12801 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12802 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d  ction_v2 (db, "M
12803 61 6b 65 43 69 72 63 75 6c 61 72 53 65 63 74 6f  akeCircularSecto
12804 72 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c 49 54  r", 6,.....SQLIT
12805 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12806 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12807 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d  ache,.....fnct_M
12808 61 6b 65 43 69 72 63 75 6c 61 72 53 65 63 74 6f  akeCircularSecto
12809 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r, 0, 0, 0);.   
1280a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1280b 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1280c 20 22 4d 61 6b 65 43 69 72 63 75 6c 61 72 53 65   "MakeCircularSe
1280d 63 74 6f 72 22 2c 20 37 2c 0a 09 09 09 09 53 51  ctor", 7,.....SQ
1280e 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
1280f 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12810 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
12811 74 5f 4d 61 6b 65 43 69 72 63 75 6c 61 72 53 65  t_MakeCircularSe
12812 63 74 6f 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ctor, 0, 0, 0);.
12813 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12814 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12815 64 62 2c 20 22 4d 61 6b 65 43 69 72 63 75 6c 61  db, "MakeCircula
12816 72 53 74 72 69 70 65 22 2c 20 36 2c 0a 09 09 09  rStripe", 6,....
12817 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12818 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12819 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
1281a 66 6e 63 74 5f 4d 61 6b 65 43 69 72 63 75 6c 61  fnct_MakeCircula
1281b 72 53 74 72 69 70 65 2c 20 30 2c 20 30 2c 20 30  rStripe, 0, 0, 0
1281c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1281d 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1281e 32 20 28 64 62 2c 20 22 4d 61 6b 65 43 69 72 63  2 (db, "MakeCirc
1281f 75 6c 61 72 53 74 72 69 70 65 22 2c 20 37 2c 0a  ularStripe", 7,.
12820 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12821 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12822 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12823 09 09 09 66 6e 63 74 5f 4d 61 6b 65 43 69 72 63  ...fnct_MakeCirc
12824 75 6c 61 72 53 74 72 69 70 65 2c 20 30 2c 20 30  ularStripe, 0, 0
12825 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12826 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12827 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 43  n_v2 (db, "MakeC
12828 69 72 63 75 6c 61 72 53 74 72 69 70 65 22 2c 20  ircularStripe", 
12829 38 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  8,.....SQLITE_UT
1282a 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1282b 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
1282c 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65 43  ,.....fnct_MakeC
1282d 69 72 63 75 6c 61 72 53 74 72 69 70 65 2c 20 30  ircularStripe, 0
1282e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1282f 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12830 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61  tion_v2 (db, "Ma
12831 6b 65 45 6c 6c 69 70 74 69 63 53 65 63 74 6f 72  keEllipticSector
12832 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 6,.....SQLITE
12833 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12834 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12835 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61  che,.....fnct_Ma
12836 6b 65 45 6c 6c 69 70 74 69 63 53 65 63 74 6f 72  keEllipticSector
12837 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12838 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12839 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1283a 22 4d 61 6b 65 45 6c 6c 69 70 74 69 63 53 65 63  "MakeEllipticSec
1283b 74 6f 72 22 2c 20 37 2c 0a 09 09 09 09 53 51 4c  tor", 7,.....SQL
1283c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1283d 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1283e 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1283f 5f 4d 61 6b 65 45 6c 6c 69 70 74 69 63 53 65 63  _MakeEllipticSec
12840 74 6f 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  tor, 0, 0, 0);. 
12841 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12842 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12843 62 2c 20 22 4d 61 6b 65 45 6c 6c 69 70 74 69 63  b, "MakeElliptic
12844 53 65 63 74 6f 72 22 2c 20 38 2c 0a 09 09 09 09  Sector", 8,.....
12845 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12846 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12847 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
12848 6e 63 74 5f 4d 61 6b 65 45 6c 6c 69 70 74 69 63  nct_MakeElliptic
12849 53 65 63 74 6f 72 2c 20 30 2c 20 30 2c 20 30 29  Sector, 0, 0, 0)
1284a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1284b 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1284c 20 28 64 62 2c 20 22 43 6f 6c 6c 65 63 74 22 2c   (db, "Collect",
1284d 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
1284e 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1284f 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12850 65 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 43  e, 0,.....fnct_C
12851 6f 6c 6c 65 63 74 5f 73 74 65 70 2c 20 66 6e 63  ollect_step, fnc
12852 74 5f 43 6f 6c 6c 65 63 74 5f 66 69 6e 61 6c 2c  t_Collect_final,
12853 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12854 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12855 5f 76 32 20 28 64 62 2c 20 22 43 6f 6c 6c 65 63  _v2 (db, "Collec
12856 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  t", 2,.....SQLIT
12857 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12858 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12859 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43  ache,.....fnct_C
1285a 6f 6c 6c 65 63 74 2c 20 30 2c 20 30 2c 20 30 29  ollect, 0, 0, 0)
1285b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1285c 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1285d 20 28 64 62 2c 20 22 53 54 5f 43 6f 6c 6c 65 63   (db, "ST_Collec
1285e 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  t", 1,.....SQLIT
1285f 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12860 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12861 61 63 68 65 2c 20 30 2c 0a 09 09 09 09 66 6e 63  ache, 0,.....fnc
12862 74 5f 43 6f 6c 6c 65 63 74 5f 73 74 65 70 2c 20  t_Collect_step, 
12863 66 6e 63 74 5f 43 6f 6c 6c 65 63 74 5f 66 69 6e  fnct_Collect_fin
12864 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  al, 0);.    sqli
12865 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12866 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12867 43 6f 6c 6c 65 63 74 22 2c 20 32 2c 0a 09 09 09  Collect", 2,....
12868 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12869 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1286a 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
1286b 66 6e 63 74 5f 43 6f 6c 6c 65 63 74 2c 20 30 2c  fnct_Collect, 0,
1286c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1286d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1286e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 42 75 69  ion_v2 (db, "Bui
1286f 6c 64 4d 62 72 46 69 6c 74 65 72 22 2c 20 34 2c  ldMbrFilter", 4,
12870 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12871 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12872 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12873 66 6e 63 74 5f 42 75 69 6c 64 4d 62 72 46 69 6c  fnct_BuildMbrFil
12874 74 65 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ter, 0, 0, 0);. 
12875 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12876 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12877 62 2c 20 22 46 69 6c 74 65 72 4d 62 72 57 69 74  b, "FilterMbrWit
12878 68 69 6e 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c  hin", 4,.....SQL
12879 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1287a 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1287b 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 46 69 6c   0,.....fnct_Fil
1287c 74 65 72 4d 62 72 57 69 74 68 69 6e 2c 20 30 2c  terMbrWithin, 0,
1287d 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1287e 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1287f 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 46 69 6c  ion_v2 (db, "Fil
12880 74 65 72 4d 62 72 43 6f 6e 74 61 69 6e 73 22 2c  terMbrContains",
12881 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   4,.....SQLITE_U
12882 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12883 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12884 09 09 09 66 6e 63 74 5f 46 69 6c 74 65 72 4d 62  ...fnct_FilterMb
12885 72 43 6f 6e 74 61 69 6e 73 2c 20 30 2c 20 30 2c  rContains, 0, 0,
12886 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12887 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12888 5f 76 32 20 28 64 62 2c 20 22 46 69 6c 74 65 72  _v2 (db, "Filter
12889 4d 62 72 49 6e 74 65 72 73 65 63 74 73 22 2c 20  MbrIntersects", 
1288a 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  4,.....SQLITE_UT
1288b 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1288c 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
1288d 09 09 66 6e 63 74 5f 46 69 6c 74 65 72 4d 62 72  ..fnct_FilterMbr
1288e 49 6e 74 65 72 73 65 63 74 73 2c 20 30 2c 20 30  Intersects, 0, 0
1288f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12890 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12891 6e 5f 76 32 20 28 64 62 2c 20 22 4c 69 6e 65 73  n_v2 (db, "Lines
12892 46 72 6f 6d 52 69 6e 67 73 22 2c 20 31 2c 0a 09  FromRings", 1,..
12893 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12894 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12895 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
12896 09 09 66 6e 63 74 5f 4c 69 6e 65 73 46 72 6f 6d  ..fnct_LinesFrom
12897 52 69 6e 67 73 2c 20 30 2c 20 30 2c 20 30 29 3b  Rings, 0, 0, 0);
12898 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12899 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1289a 28 64 62 2c 20 22 53 54 5f 4c 69 6e 65 73 46 72  (db, "ST_LinesFr
1289b 6f 6d 52 69 6e 67 73 22 2c 20 31 2c 0a 09 09 09  omRings", 1,....
1289c 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1289d 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1289e 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
1289f 66 6e 63 74 5f 4c 69 6e 65 73 46 72 6f 6d 52 69  fnct_LinesFromRi
128a0 6e 67 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ngs, 0, 0, 0);. 
128a1 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
128a2 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
128a3 62 2c 20 22 4c 69 6e 65 73 46 72 6f 6d 52 69 6e  b, "LinesFromRin
128a4 67 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  gs", 2,.....SQLI
128a5 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
128a6 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
128a7 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
128a8 4c 69 6e 65 73 46 72 6f 6d 52 69 6e 67 73 2c 20  LinesFromRings, 
128a9 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
128aa 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
128ab 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
128ac 54 5f 4c 69 6e 65 73 46 72 6f 6d 52 69 6e 67 73  T_LinesFromRings
128ad 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
128ae 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
128af 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
128b0 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 69  che,.....fnct_Li
128b1 6e 65 73 46 72 6f 6d 52 69 6e 67 73 2c 20 30 2c  nesFromRings, 0,
128b2 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
128b3 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
128b4 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
128b5 4e 50 6f 69 6e 74 73 22 2c 20 31 2c 0a 09 09 09  NPoints", 1,....
128b6 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
128b7 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
128b8 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
128b9 66 6e 63 74 5f 4e 50 6f 69 6e 74 73 2c 20 30 2c  fnct_NPoints, 0,
128ba 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
128bb 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
128bc 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
128bd 6e 72 69 6e 67 73 22 2c 20 31 2c 0a 09 09 09 09  nrings", 1,.....
128be 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
128bf 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
128c0 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
128c1 6e 63 74 5f 4e 52 69 6e 67 73 2c 20 30 2c 20 30  nct_NRings, 0, 0
128c2 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
128c3 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
128c4 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 47 41 52  n_v2 (db, "ToGAR
128c5 53 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  S", 1,.....SQLIT
128c6 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
128c7 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
128c8 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54  ache,.....fnct_T
128c9 6f 47 41 52 53 2c 20 30 2c 20 30 2c 20 30 29 3b  oGARS, 0, 0, 0);
128ca 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
128cb 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
128cc 28 64 62 2c 20 22 47 41 52 53 4d 62 72 22 2c 20  (db, "GARSMbr", 
128cd 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
128ce 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
128cf 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
128d0 09 09 66 6e 63 74 5f 47 41 52 53 4d 62 72 2c 20  ..fnct_GARSMbr, 
128d1 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
128d2 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
128d3 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
128d4 6e 61 70 54 6f 47 72 69 64 22 2c 20 32 2c 0a 09  napToGrid", 2,..
128d5 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
128d6 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
128d7 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
128d8 09 09 66 6e 63 74 5f 53 6e 61 70 54 6f 47 72 69  ..fnct_SnapToGri
128d9 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
128da 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
128db 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
128dc 20 22 53 54 5f 53 6e 61 70 54 6f 47 72 69 64 22   "ST_SnapToGrid"
128dd 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
128de 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
128df 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
128e0 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 6e 61  he,.....fnct_Sna
128e1 70 54 6f 47 72 69 64 2c 20 30 2c 20 30 2c 20 30  pToGrid, 0, 0, 0
128e2 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
128e3 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
128e4 32 20 28 64 62 2c 20 22 53 6e 61 70 54 6f 47 72  2 (db, "SnapToGr
128e5 69 64 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49  id", 3,.....SQLI
128e6 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
128e7 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
128e8 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
128e9 53 6e 61 70 54 6f 47 72 69 64 2c 20 30 2c 20 30  SnapToGrid, 0, 0
128ea 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
128eb 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
128ec 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53 6e  n_v2 (db, "ST_Sn
128ed 61 70 54 6f 47 72 69 64 22 2c 20 33 2c 0a 09 09  apToGrid", 3,...
128ee 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
128ef 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
128f0 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
128f1 09 66 6e 63 74 5f 53 6e 61 70 54 6f 47 72 69 64  .fnct_SnapToGrid
128f2 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
128f3 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
128f4 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
128f5 22 53 6e 61 70 54 6f 47 72 69 64 22 2c 20 35 2c  "SnapToGrid", 5,
128f6 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
128f7 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
128f8 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
128f9 09 09 09 09 66 6e 63 74 5f 53 6e 61 70 54 6f 47  ....fnct_SnapToG
128fa 72 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  rid, 0, 0, 0);. 
128fb 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
128fc 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
128fd 62 2c 20 22 53 54 5f 53 6e 61 70 54 6f 47 72 69  b, "ST_SnapToGri
128fe 64 22 2c 20 35 2c 0a 09 09 09 09 53 51 4c 49 54  d", 5,.....SQLIT
128ff 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12900 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12901 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53  ache,.....fnct_S
12902 6e 61 70 54 6f 47 72 69 64 2c 20 30 2c 20 30 2c  napToGrid, 0, 0,
12903 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12904 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12905 5f 76 32 20 28 64 62 2c 20 22 53 6e 61 70 54 6f  _v2 (db, "SnapTo
12906 47 72 69 64 22 2c 20 36 2c 0a 09 09 09 09 53 51  Grid", 6,.....SQ
12907 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12908 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12909 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
1290a 74 5f 53 6e 61 70 54 6f 47 72 69 64 2c 20 30 2c  t_SnapToGrid, 0,
1290b 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1290c 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1290d 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
1290e 53 6e 61 70 54 6f 47 72 69 64 22 2c 20 36 2c 0a  SnapToGrid", 6,.
1290f 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12910 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12911 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12912 09 09 09 66 6e 63 74 5f 53 6e 61 70 54 6f 47 72  ...fnct_SnapToGr
12913 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  id, 0, 0, 0);.  
12914 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12915 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12916 2c 20 22 41 64 64 50 6f 69 6e 74 22 2c 20 32 2c  , "AddPoint", 2,
12917 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12918 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12919 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
1291a 09 09 09 09 66 6e 63 74 5f 41 64 64 50 6f 69 6e  ....fnct_AddPoin
1291b 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
1291c 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1291d 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1291e 20 22 53 54 5f 41 64 64 50 6f 69 6e 74 22 2c 20   "ST_AddPoint", 
1291f 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
12920 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12921 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12922 2c 0a 09 09 09 09 66 6e 63 74 5f 41 64 64 50 6f  ,.....fnct_AddPo
12923 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  int, 0, 0, 0);. 
12924 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12925 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12926 62 2c 20 22 41 64 64 50 6f 69 6e 74 22 2c 20 33  b, "AddPoint", 3
12927 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12928 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12929 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1292a 0a 09 09 09 09 66 6e 63 74 5f 41 64 64 50 6f 69  .....fnct_AddPoi
1292b 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
1292c 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1292d 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1292e 2c 20 22 53 54 5f 41 64 64 50 6f 69 6e 74 22 2c  , "ST_AddPoint",
1292f 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
12930 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12931 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12932 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 64 64 50  e,.....fnct_AddP
12933 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oint, 0, 0, 0);.
12934 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12935 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12936 64 62 2c 20 22 52 65 6d 6f 76 65 50 6f 69 6e 74  db, "RemovePoint
12937 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
12938 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12939 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1293a 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65  che,.....fnct_Re
1293b 6d 6f 76 65 50 6f 69 6e 74 2c 20 30 2c 20 30 2c  movePoint, 0, 0,
1293c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1293d 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1293e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 52 65 6d  _v2 (db, "ST_Rem
1293f 6f 76 65 50 6f 69 6e 74 22 2c 20 32 2c 0a 09 09  ovePoint", 2,...
12940 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12941 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12942 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12943 09 66 6e 63 74 5f 52 65 6d 6f 76 65 50 6f 69 6e  .fnct_RemovePoin
12944 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
12945 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12946 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12947 20 22 53 65 74 50 6f 69 6e 74 22 2c 20 33 2c 0a   "SetPoint", 3,.
12948 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12949 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1294a 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1294b 09 09 09 66 6e 63 74 5f 53 65 74 50 6f 69 6e 74  ...fnct_SetPoint
1294c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1294d 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1294e 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1294f 22 53 54 5f 53 65 74 50 6f 69 6e 74 22 2c 20 33  "ST_SetPoint", 3
12950 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12951 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12952 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12953 0a 09 09 09 09 66 6e 63 74 5f 53 65 74 50 6f 69  .....fnct_SetPoi
12954 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
12955 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12956 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12957 2c 20 22 53 65 74 53 74 61 72 74 50 6f 69 6e 74  , "SetStartPoint
12958 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
12959 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1295a 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1295b 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 65  che,.....fnct_Se
1295c 74 53 74 61 72 74 50 6f 69 6e 74 2c 20 30 2c 20  tStartPoint, 0, 
1295d 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1295e 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1295f 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53  on_v2 (db, "ST_S
12960 65 74 53 74 61 72 74 50 6f 69 6e 74 22 2c 20 32  etStartPoint", 2
12961 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12962 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12963 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12964 0a 09 09 09 09 66 6e 63 74 5f 53 65 74 53 74 61  .....fnct_SetSta
12965 72 74 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30  rtPoint, 0, 0, 0
12966 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12967 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12968 32 20 28 64 62 2c 20 22 53 65 74 45 6e 64 50 6f  2 (db, "SetEndPo
12969 69 6e 74 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  int", 2,.....SQL
1296a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1296b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1296c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1296d 5f 53 65 74 45 6e 64 50 6f 69 6e 74 2c 20 30 2c  _SetEndPoint, 0,
1296e 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1296f 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12970 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12971 53 65 74 45 6e 64 50 6f 69 6e 74 22 2c 20 32 2c  SetEndPoint", 2,
12972 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12973 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12974 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12975 09 09 09 09 66 6e 63 74 5f 53 65 74 45 6e 64 50  ....fnct_SetEndP
12976 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oint, 0, 0, 0);.
12977 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12978 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12979 64 62 2c 20 22 4d 61 6b 65 50 6f 6c 79 67 6f 6e  db, "MakePolygon
1297a 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
1297b 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1297c 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1297d 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61  che,.....fnct_Ma
1297e 6b 65 50 6f 6c 79 67 6f 6e 2c 20 30 2c 20 30 2c  kePolygon, 0, 0,
1297f 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12980 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12981 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 61 6b  _v2 (db, "ST_Mak
12982 65 50 6f 6c 79 67 6f 6e 22 2c 20 31 2c 0a 09 09  ePolygon", 1,...
12983 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12984 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12985 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12986 09 66 6e 63 74 5f 4d 61 6b 65 50 6f 6c 79 67 6f  .fnct_MakePolygo
12987 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
12988 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12989 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1298a 20 22 4d 61 6b 65 50 6f 6c 79 67 6f 6e 22 2c 20   "MakePolygon", 
1298b 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
1298c 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1298d 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
1298e 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65 50  ,.....fnct_MakeP
1298f 6f 6c 79 67 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  olygon, 0, 0, 0)
12990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12991 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12992 20 28 64 62 2c 20 22 53 54 5f 4d 61 6b 65 50 6f   (db, "ST_MakePo
12993 6c 79 67 6f 6e 22 2c 20 32 2c 0a 09 09 09 09 53  lygon", 2,.....S
12994 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12995 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12996 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
12997 63 74 5f 4d 61 6b 65 50 6f 6c 79 67 6f 6e 2c 20  ct_MakePolygon, 
12998 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 73  0, 0, 0);..    s
12999 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1299a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1299b 41 54 4d 5f 43 72 65 61 74 65 22 2c 20 30 2c 0a  ATM_Create", 0,.
1299c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1299d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1299e 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
1299f 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66  nct_AffineTransf
129a0 6f 72 6d 4d 61 74 72 69 78 5f 43 72 65 61 74 65  ormMatrix_Create
129a1 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
129a2 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
129a3 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
129a4 22 41 54 4d 5f 43 72 65 61 74 65 22 2c 20 36 2c  "ATM_Create", 6,
129a5 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
129a6 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
129a7 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
129a8 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73  fnct_AffineTrans
129a9 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72 65 61 74  formMatrix_Creat
129aa 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
129ab 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
129ac 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
129ad 20 22 41 54 4d 5f 43 72 65 61 74 65 22 2c 20 31   "ATM_Create", 1
129ae 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
129af 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
129b0 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
129b1 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61  ..fnct_AffineTra
129b2 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72 65  nsformMatrix_Cre
129b3 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ate, 0, 0, 0);. 
129b4 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
129b5 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
129b6 62 2c 20 22 41 54 4d 5f 43 72 65 61 74 65 54 72  b, "ATM_CreateTr
129b7 61 6e 73 6c 61 74 65 22 2c 20 32 2c 0a 09 09 09  anslate", 2,....
129b8 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
129b9 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
129ba 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
129bb 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f 72 6d  _AffineTransform
129bc 4d 61 74 72 69 78 5f 43 72 65 61 74 65 54 72 61  Matrix_CreateTra
129bd 6e 73 6c 61 74 65 2c 20 30 2c 0a 09 09 09 09 30  nslate, 0,.....0
129be 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
129bf 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
129c0 6e 5f 76 32 20 28 64 62 2c 20 22 41 54 4d 5f 43  n_v2 (db, "ATM_C
129c1 72 65 61 74 65 54 72 61 6e 73 6c 61 74 65 22 2c  reateTranslate",
129c2 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
129c3 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
129c4 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
129c5 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72  ...fnct_AffineTr
129c6 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72  ansformMatrix_Cr
129c7 65 61 74 65 54 72 61 6e 73 6c 61 74 65 2c 20 30  eateTranslate, 0
129c8 2c 0a 09 09 09 09 30 2c 20 30 29 3b 0a 20 20 20  ,.....0, 0);.   
129c9 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
129ca 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
129cb 20 22 41 54 4d 5f 43 72 65 61 74 65 53 63 61 6c   "ATM_CreateScal
129cc 65 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  e", 2,.....SQLIT
129cd 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
129ce 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
129cf 2c 0a 09 09 09 09 66 6e 63 74 5f 41 66 66 69 6e  ,.....fnct_Affin
129d0 65 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78  eTransformMatrix
129d1 5f 43 72 65 61 74 65 53 63 61 6c 65 2c 20 30 2c  _CreateScale, 0,
129d2 20 30 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20   0,.....0);.    
129d3 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
129d4 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
129d5 22 41 54 4d 5f 43 72 65 61 74 65 53 63 61 6c 65  "ATM_CreateScale
129d6 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
129d7 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
129d8 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
129d9 0a 09 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65  .....fnct_Affine
129da 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f  TransformMatrix_
129db 43 72 65 61 74 65 53 63 61 6c 65 2c 20 30 2c 20  CreateScale, 0, 
129dc 30 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20 73  0,.....0);.    s
129dd 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
129de 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
129df 41 54 4d 5f 43 72 65 61 74 65 52 6f 74 61 74 65  ATM_CreateRotate
129e0 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
129e1 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
129e2 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
129e3 0a 09 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65  .....fnct_Affine
129e4 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f  TransformMatrix_
129e5 43 72 65 61 74 65 52 6f 74 61 74 65 2c 20 30 2c  CreateRotate, 0,
129e6 20 30 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20   0,.....0);.    
129e7 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
129e8 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
129e9 22 41 54 4d 5f 43 72 65 61 74 65 58 52 6f 6c 6c  "ATM_CreateXRoll
129ea 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
129eb 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
129ec 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
129ed 0a 09 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65  .....fnct_Affine
129ee 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f  TransformMatrix_
129ef 43 72 65 61 74 65 58 52 6f 6c 6c 2c 20 30 2c 20  CreateXRoll, 0, 
129f0 30 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20 73  0,.....0);.    s
129f1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
129f2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
129f3 41 54 4d 5f 43 72 65 61 74 65 59 52 6f 6c 6c 22  ATM_CreateYRoll"
129f4 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
129f5 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
129f6 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
129f7 09 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54  ....fnct_AffineT
129f8 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 43  ransformMatrix_C
129f9 72 65 61 74 65 59 52 6f 6c 6c 2c 20 30 2c 20 30  reateYRoll, 0, 0
129fa 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20 73 71  ,.....0);.    sq
129fb 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
129fc 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41  ction_v2 (db, "A
129fd 54 4d 5f 43 72 65 61 74 65 5a 52 6f 6c 6c 22 2c  TM_CreateZRoll",
129fe 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
129ff 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12a00 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12a01 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72  ...fnct_AffineTr
12a02 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 43 72  ansformMatrix_Cr
12a03 65 61 74 65 52 6f 74 61 74 65 2c 20 30 2c 20 30  eateRotate, 0, 0
12a04 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20 73 71  ,.....0);.    sq
12a05 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12a06 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41  ction_v2 (db, "A
12a07 54 4d 5f 4d 75 6c 74 69 70 6c 79 22 2c 20 32 2c  TM_Multiply", 2,
12a08 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12a09 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12a0a 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12a0b 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73  fnct_AffineTrans
12a0c 66 6f 72 6d 4d 61 74 72 69 78 5f 4d 75 6c 74 69  formMatrix_Multi
12a0d 70 6c 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ply, 0, 0, 0);. 
12a0e 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12a0f 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12a10 62 2c 20 22 41 54 4d 5f 54 72 61 6e 73 6c 61 74  b, "ATM_Translat
12a11 65 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54  e", 3,.....SQLIT
12a12 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12a13 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12a14 2c 0a 09 09 09 09 66 6e 63 74 5f 41 66 66 69 6e  ,.....fnct_Affin
12a15 65 54 72 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78  eTransformMatrix
12a16 5f 54 72 61 6e 73 6c 61 74 65 2c 20 30 2c 20 30  _Translate, 0, 0
12a17 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12a18 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12a19 6e 5f 76 32 20 28 64 62 2c 20 22 41 54 4d 5f 54  n_v2 (db, "ATM_T
12a1a 72 61 6e 73 6c 61 74 65 22 2c 20 34 2c 0a 09 09  ranslate", 4,...
12a1b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12a1c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12a1d 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
12a1e 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f 72  t_AffineTransfor
12a1f 6d 4d 61 74 72 69 78 5f 54 72 61 6e 73 6c 61 74  mMatrix_Translat
12a20 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
12a21 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12a22 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12a23 20 22 41 54 4d 5f 53 63 61 6c 65 22 2c 20 33 2c   "ATM_Scale", 3,
12a24 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12a25 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12a26 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12a27 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73  fnct_AffineTrans
12a28 66 6f 72 6d 4d 61 74 72 69 78 5f 53 63 61 6c 65  formMatrix_Scale
12a29 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12a2a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12a2b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12a2c 22 41 54 4d 5f 53 63 61 6c 65 22 2c 20 34 2c 0a  "ATM_Scale", 4,.
12a2d 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12a2e 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12a2f 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
12a30 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66  nct_AffineTransf
12a31 6f 72 6d 4d 61 74 72 69 78 5f 53 63 61 6c 65 2c  ormMatrix_Scale,
12a32 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12a33 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12a34 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12a35 41 54 4d 5f 52 6f 74 61 74 65 22 2c 20 32 2c 0a  ATM_Rotate", 2,.
12a36 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12a37 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12a38 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
12a39 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66  nct_AffineTransf
12a3a 6f 72 6d 4d 61 74 72 69 78 5f 52 6f 74 61 74 65  ormMatrix_Rotate
12a3b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12a3c 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12a3d 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12a3e 22 41 54 4d 5f 58 52 6f 6c 6c 22 2c 20 32 2c 0a  "ATM_XRoll", 2,.
12a3f 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12a40 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12a41 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
12a42 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66  nct_AffineTransf
12a43 6f 72 6d 4d 61 74 72 69 78 5f 58 52 6f 6c 6c 2c  ormMatrix_XRoll,
12a44 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12a45 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12a46 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12a47 41 54 4d 5f 59 52 6f 6c 6c 22 2c 20 32 2c 0a 09  ATM_YRoll", 2,..
12a48 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12a49 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12a4a 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
12a4b 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f  ct_AffineTransfo
12a4c 72 6d 4d 61 74 72 69 78 5f 59 52 6f 6c 6c 2c 20  rmMatrix_YRoll, 
12a4d 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12a4e 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12a4f 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41  ction_v2 (db, "A
12a50 54 4d 5f 5a 52 6f 6c 6c 22 2c 20 32 2c 0a 09 09  TM_ZRoll", 2,...
12a51 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12a52 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12a53 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
12a54 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f 72  t_AffineTransfor
12a55 6d 4d 61 74 72 69 78 5f 52 6f 74 61 74 65 2c 20  mMatrix_Rotate, 
12a56 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12a57 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12a58 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41  ction_v2 (db, "A
12a59 54 4d 5f 44 65 74 65 72 6d 69 6e 61 6e 74 22 2c  TM_Determinant",
12a5a 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12a5b 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12a5c 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12a5d 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72  ...fnct_AffineTr
12a5e 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 44 65  ansformMatrix_De
12a5f 74 65 72 6d 69 6e 61 6e 74 2c 20 30 2c 20 30 2c  terminant, 0, 0,
12a60 0a 09 09 09 09 30 29 3b 0a 20 20 20 20 73 71 6c  .....0);.    sql
12a61 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12a62 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41 54  tion_v2 (db, "AT
12a63 4d 5f 49 73 49 6e 76 65 72 74 69 62 6c 65 22 2c  M_IsInvertible",
12a64 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12a65 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12a66 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12a67 09 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72  ...fnct_AffineTr
12a68 61 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 49 73  ansformMatrix_Is
12a69 49 6e 76 65 72 74 69 62 6c 65 2c 20 30 2c 20 30  Invertible, 0, 0
12a6a 2c 0a 09 09 09 09 30 29 3b 0a 20 20 20 20 73 71  ,.....0);.    sq
12a6b 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12a6c 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41  ction_v2 (db, "A
12a6d 54 4d 5f 49 6e 76 65 72 74 22 2c 20 31 2c 0a 09  TM_Invert", 1,..
12a6e 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12a6f 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12a70 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
12a71 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73 66 6f  ct_AffineTransfo
12a72 72 6d 4d 61 74 72 69 78 5f 49 6e 76 65 72 74 2c  rmMatrix_Invert,
12a73 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12a74 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12a75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12a76 41 54 4d 5f 49 73 56 61 6c 69 64 22 2c 20 31 2c  ATM_IsValid", 1,
12a77 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12a78 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12a79 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12a7a 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e 73  fnct_AffineTrans
12a7b 66 6f 72 6d 4d 61 74 72 69 78 5f 49 73 56 61 6c  formMatrix_IsVal
12a7c 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  id, 0, 0, 0);.  
12a7d 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12a7e 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12a7f 2c 20 22 41 54 4d 5f 41 73 54 65 78 74 22 2c 20  , "ATM_AsText", 
12a80 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12a81 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12a82 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
12a83 09 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61  ..fnct_AffineTra
12a84 6e 73 66 6f 72 6d 4d 61 74 72 69 78 5f 41 73 54  nsformMatrix_AsT
12a85 65 78 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ext, 0, 0, 0);. 
12a86 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12a87 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12a88 62 2c 20 22 41 54 4d 5f 54 72 61 6e 73 66 6f 72  b, "ATM_Transfor
12a89 6d 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  m", 2,.....SQLIT
12a8a 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12a8b 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
12a8c 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41  ache,.....fnct_A
12a8d 66 66 69 6e 65 54 72 61 6e 73 66 6f 72 6d 4d 61  ffineTransformMa
12a8e 74 72 69 78 5f 47 65 6f 6d 65 74 72 79 54 72 61  trix_GeometryTra
12a8f 6e 73 66 6f 72 6d 2c 0a 09 09 09 09 30 2c 20 30  nsform,.....0, 0
12a90 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12a91 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12a92 6e 5f 76 32 20 28 64 62 2c 20 22 41 54 4d 5f 54  n_v2 (db, "ATM_T
12a93 72 61 6e 73 66 6f 72 6d 22 2c 20 33 2c 0a 09 09  ransform", 3,...
12a94 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12a95 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12a96 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12a97 09 66 6e 63 74 5f 41 66 66 69 6e 65 54 72 61 6e  .fnct_AffineTran
12a98 73 66 6f 72 6d 4d 61 74 72 69 78 5f 47 65 6f 6d  sformMatrix_Geom
12a99 65 74 72 79 54 72 61 6e 73 66 6f 72 6d 2c 0a 09  etryTransform,..
12a9a 09 09 09 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 69  ...0, 0, 0);..#i
12a9b 66 64 65 66 20 45 4e 41 42 4c 45 5f 47 43 50 09  fdef ENABLE_GCP.
12a9c 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 43 6f 6e 74  ./* only if Cont
12a9d 72 6f 6c 50 6f 69 6e 74 73 20 65 6e 61 62 6c 65  rolPoints enable
12a9e 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
12a9f 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12aa0 5f 76 32 20 28 64 62 2c 20 22 47 43 50 5f 43 6f  _v2 (db, "GCP_Co
12aa1 6d 70 75 74 65 22 2c 20 32 2c 0a 09 09 09 09 53  mpute", 2,.....S
12aa2 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12aa3 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12aa4 43 2c 20 63 61 63 68 65 2c 20 30 2c 0a 09 09 09  C, cache, 0,....
12aa5 09 66 6e 63 74 5f 47 72 6f 75 6e 64 43 6f 6e 74  .fnct_GroundCont
12aa6 72 6f 6c 50 6f 69 6e 74 73 5f 43 6f 6d 70 75 74  rolPoints_Comput
12aa7 65 5f 73 74 65 70 2c 0a 09 09 09 09 66 6e 63 74  e_step,.....fnct
12aa8 5f 47 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f  _GroundControlPo
12aa9 69 6e 74 73 5f 43 6f 6d 70 75 74 65 5f 66 69 6e  ints_Compute_fin
12aaa 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  al, 0);.    sqli
12aab 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12aac 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 43 50  ion_v2 (db, "GCP
12aad 5f 43 6f 6d 70 75 74 65 22 2c 20 33 2c 0a 09 09  _Compute", 3,...
12aae 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12aaf 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12ab0 53 54 49 43 2c 20 63 61 63 68 65 2c 20 30 2c 0a  STIC, cache, 0,.
12ab1 09 09 09 09 66 6e 63 74 5f 47 72 6f 75 6e 64 43  ....fnct_GroundC
12ab2 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 5f 43 6f 6d  ontrolPoints_Com
12ab3 70 75 74 65 5f 73 74 65 70 2c 0a 09 09 09 09 66  pute_step,.....f
12ab4 6e 63 74 5f 47 72 6f 75 6e 64 43 6f 6e 74 72 6f  nct_GroundContro
12ab5 6c 50 6f 69 6e 74 73 5f 43 6f 6d 70 75 74 65 5f  lPoints_Compute_
12ab6 66 69 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73  final, 0);.    s
12ab7 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12ab8 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12ab9 47 43 50 5f 54 72 61 6e 73 66 6f 72 6d 22 2c 20  GCP_Transform", 
12aba 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
12abb 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12abc 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12abd 2c 0a 09 09 09 09 66 6e 63 74 5f 47 72 6f 75 6e  ,.....fnct_Groun
12abe 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 5f 47  dControlPoints_G
12abf 65 6f 6d 65 74 72 79 54 72 61 6e 73 66 6f 72 6d  eometryTransform
12ac0 2c 20 30 2c 0a 09 09 09 09 30 2c 20 30 29 3b 0a  , 0,.....0, 0);.
12ac1 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12ac2 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12ac3 64 62 2c 20 22 47 43 50 5f 54 72 61 6e 73 66 6f  db, "GCP_Transfo
12ac4 72 6d 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49  rm", 3,.....SQLI
12ac5 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12ac6 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12ac7 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12ac8 47 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69  GroundControlPoi
12ac9 6e 74 73 5f 47 65 6f 6d 65 74 72 79 54 72 61 6e  nts_GeometryTran
12aca 73 66 6f 72 6d 2c 20 30 2c 0a 09 09 09 09 30 2c  sform, 0,.....0,
12acb 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12acc 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12acd 5f 76 32 20 28 64 62 2c 20 22 47 43 50 5f 49 73  _v2 (db, "GCP_Is
12ace 56 61 6c 69 64 22 2c 20 31 2c 0a 09 09 09 09 53  Valid", 1,.....S
12acf 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12ad0 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12ad1 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 47  C, 0,.....fnct_G
12ad2 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e  roundControlPoin
12ad3 74 73 5f 49 73 56 61 6c 69 64 2c 20 30 2c 20 30  ts_IsValid, 0, 0
12ad4 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12ad5 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12ad6 6e 5f 76 32 20 28 64 62 2c 20 22 47 43 50 5f 41  n_v2 (db, "GCP_A
12ad7 73 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53  sText", 1,.....S
12ad8 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12ad9 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12ada 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 47  C, 0,.....fnct_G
12adb 72 6f 75 6e 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e  roundControlPoin
12adc 74 73 5f 41 73 54 65 78 74 2c 20 30 2c 20 30 2c  ts_AsText, 0, 0,
12add 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12ade 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12adf 5f 76 32 20 28 64 62 2c 20 22 47 43 50 32 41 54  _v2 (db, "GCP2AT
12ae0 4d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  M", 1,.....SQLIT
12ae1 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12ae2 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12ae3 2c 0a 09 09 09 09 66 6e 63 74 5f 47 72 6f 75 6e  ,.....fnct_Groun
12ae4 64 43 6f 6e 74 72 6f 6c 50 6f 69 6e 74 73 5f 54  dControlPoints_T
12ae5 6f 41 54 4d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oATM, 0, 0, 0);.
12ae6 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 69 6e  #endif /* end in
12ae7 63 6c 75 64 69 6e 67 20 47 43 50 20 2a 2f 0a 0a  cluding GCP */..
12ae8 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 47 45 4f  #ifndef OMIT_GEO
12ae9 53 09 09 2f 2a 20 69 6e 63 6c 75 64 69 6e 67 20  S../* including 
12aea 47 45 4f 53 20 2a 2f 0a 20 20 20 20 73 71 6c 69  GEOS */.    sqli
12aeb 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12aec 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 42 75 69  ion_v2 (db, "Bui
12aed 6c 64 41 72 65 61 22 2c 20 31 2c 0a 09 09 09 09  ldArea", 1,.....
12aee 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12aef 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12af0 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
12af1 6e 63 74 5f 42 75 69 6c 64 41 72 65 61 2c 20 30  nct_BuildArea, 0
12af2 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12af3 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12af4 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
12af5 5f 42 75 69 6c 64 41 72 65 61 22 2c 20 31 2c 0a  _BuildArea", 1,.
12af6 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12af7 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12af8 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
12af9 09 09 09 66 6e 63 74 5f 42 75 69 6c 64 41 72 65  ...fnct_BuildAre
12afa 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  a, 0, 0, 0);.   
12afb 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12afc 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12afd 20 22 50 6f 6c 79 67 6f 6e 69 7a 65 22 2c 20 31   "Polygonize", 1
12afe 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12aff 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12b00 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12b01 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 6c   0,.....fnct_Pol
12b02 79 67 6f 6e 69 7a 65 5f 73 74 65 70 2c 20 66 6e  ygonize_step, fn
12b03 63 74 5f 50 6f 6c 79 67 6f 6e 69 7a 65 5f 66 69  ct_Polygonize_fi
12b04 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  nal, 0);.    sql
12b05 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12b06 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
12b07 5f 50 6f 6c 79 67 6f 6e 69 7a 65 22 2c 20 31 2c  _Polygonize", 1,
12b08 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12b09 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12b0a 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 20  INISTIC, cache, 
12b0b 30 2c 0a 09 09 09 09 66 6e 63 74 5f 50 6f 6c 79  0,.....fnct_Poly
12b0c 67 6f 6e 69 7a 65 5f 73 74 65 70 2c 20 66 6e 63  gonize_step, fnc
12b0d 74 5f 50 6f 6c 79 67 6f 6e 69 7a 65 5f 66 69 6e  t_Polygonize_fin
12b0e 61 6c 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  al, 0);.#endif /
12b0f 2a 20 65 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  * end including 
12b10 47 45 4f 53 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  GEOS */..    sql
12b11 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12b12 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44 69  tion_v2 (db, "Di
12b13 73 73 6f 6c 76 65 53 65 67 6d 65 6e 74 73 22 2c  ssolveSegments",
12b14 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12b15 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12b16 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12b17 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 73 73  e,.....fnct_Diss
12b18 6f 6c 76 65 53 65 67 6d 65 6e 74 73 2c 20 30 2c  olveSegments, 0,
12b19 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12b1a 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12b1b 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12b1c 44 69 73 73 6f 6c 76 65 53 65 67 6d 65 6e 74 73  DissolveSegments
12b1d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
12b1e 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12b1f 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12b20 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69  che,.....fnct_Di
12b21 73 73 6f 6c 76 65 53 65 67 6d 65 6e 74 73 2c 20  ssolveSegments, 
12b22 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12b23 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12b24 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44  ction_v2 (db, "D
12b25 69 73 73 6f 6c 76 65 50 6f 69 6e 74 73 22 2c 20  issolvePoints", 
12b26 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12b27 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12b28 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12b29 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 73 73 6f  ,.....fnct_Disso
12b2a 6c 76 65 50 6f 69 6e 74 73 2c 20 30 2c 20 30 2c  lvePoints, 0, 0,
12b2b 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12b2c 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12b2d 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 44 69 73  _v2 (db, "ST_Dis
12b2e 73 6f 6c 76 65 50 6f 69 6e 74 73 22 2c 20 31 2c  solvePoints", 1,
12b2f 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12b30 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12b31 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
12b32 09 09 09 09 66 6e 63 74 5f 44 69 73 73 6f 6c 76  ....fnct_Dissolv
12b33 65 50 6f 69 6e 74 73 2c 20 30 2c 20 30 2c 20 30  ePoints, 0, 0, 0
12b34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12b35 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12b36 32 20 28 64 62 2c 20 22 43 6f 6c 6c 65 63 74 69  2 (db, "Collecti
12b37 6f 6e 45 78 74 72 61 63 74 22 2c 20 32 2c 0a 09  onExtract", 2,..
12b38 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
12b39 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12b3a 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
12b3b 09 09 66 6e 63 74 5f 43 6f 6c 6c 65 63 74 69 6f  ..fnct_Collectio
12b3c 6e 45 78 74 72 61 63 74 2c 20 30 2c 20 30 2c 20  nExtract, 0, 0, 
12b3d 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12b3e 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12b3f 76 32 20 28 64 62 2c 20 22 53 54 5f 43 6f 6c 6c  v2 (db, "ST_Coll
12b40 65 63 74 69 6f 6e 45 78 74 72 61 63 74 22 2c 20  ectionExtract", 
12b41 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
12b42 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12b43 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
12b44 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6c 6c 65  ,.....fnct_Colle
12b45 63 74 69 6f 6e 45 78 74 72 61 63 74 2c 20 30 2c  ctionExtract, 0,
12b46 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12b47 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12b48 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
12b49 49 6e 74 65 72 70 6f 6c 61 74 65 50 6f 69 6e 74  InterpolatePoint
12b4a 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
12b4b 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12b4c 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12b4d 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 49 6e  che,.....fnct_In
12b4e 74 65 72 70 6f 6c 61 74 65 50 6f 69 6e 74 2c 20  terpolatePoint, 
12b4f 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12b50 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12b51 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12b52 54 5f 41 64 64 4d 65 61 73 75 72 65 22 2c 20 33  T_AddMeasure", 3
12b53 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12b54 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12b55 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12b56 0a 09 09 09 09 66 6e 63 74 5f 41 64 64 4d 65 61  .....fnct_AddMea
12b57 73 75 72 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  sure, 0, 0, 0);.
12b58 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12b59 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12b5a 64 62 2c 20 22 53 54 5f 4c 6f 63 61 74 65 5f 41  db, "ST_Locate_A
12b5b 6c 6f 6e 67 5f 4d 65 61 73 75 72 65 22 2c 20 32  long_Measure", 2
12b5c 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12b5d 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12b5e 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12b5f 0a 09 09 09 09 66 6e 63 74 5f 4c 6f 63 61 74 65  .....fnct_Locate
12b60 42 65 74 77 65 65 6e 4d 65 61 73 75 72 65 73 2c  BetweenMeasures,
12b61 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12b62 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12b63 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12b64 53 54 5f 4c 6f 63 61 74 65 41 6c 6f 6e 67 22 2c  ST_LocateAlong",
12b65 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
12b66 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12b67 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
12b68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 6f 63 61  e,.....fnct_Loca
12b69 74 65 42 65 74 77 65 65 6e 4d 65 61 73 75 72 65  teBetweenMeasure
12b6a 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
12b6b 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12b6c 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12b6d 20 22 53 54 5f 4c 6f 63 61 74 65 5f 42 65 74 77   "ST_Locate_Betw
12b6e 65 65 6e 5f 4d 65 61 73 75 72 65 73 22 2c 20 33  een_Measures", 3
12b6f 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12b70 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12b71 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
12b72 0a 09 09 09 09 66 6e 63 74 5f 4c 6f 63 61 74 65  .....fnct_Locate
12b73 42 65 74 77 65 65 6e 4d 65 61 73 75 72 65 73 2c  BetweenMeasures,
12b74 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12b75 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12b76 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12b77 53 54 5f 4c 6f 63 61 74 65 42 65 74 77 65 65 6e  ST_LocateBetween
12b78 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
12b79 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12b7a 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
12b7b 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 6f  che,.....fnct_Lo
12b7c 63 61 74 65 42 65 74 77 65 65 6e 4d 65 61 73 75  cateBetweenMeasu
12b7d 72 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  res, 0, 0, 0);. 
12b7e 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12b7f 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12b80 62 2c 20 22 53 54 5f 49 73 56 61 6c 69 64 54 72  b, "ST_IsValidTr
12b81 61 6a 65 63 74 6f 72 79 22 2c 20 31 2c 0a 09 09  ajectory", 1,...
12b82 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12b83 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12b84 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
12b85 09 66 6e 63 74 5f 49 73 56 61 6c 69 64 54 72 61  .fnct_IsValidTra
12b86 6a 65 63 74 6f 72 79 2c 20 30 2c 20 30 2c 20 30  jectory, 0, 0, 0
12b87 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12b88 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12b89 32 20 28 64 62 2c 20 22 53 54 5f 54 72 61 6a 65  2 (db, "ST_Traje
12b8a 63 74 6f 72 79 49 6e 74 65 72 70 6f 6c 61 74 65  ctoryInterpolate
12b8b 50 6f 69 6e 74 22 2c 20 32 2c 0a 09 09 09 09 53  Point", 2,.....S
12b8c 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12b8d 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12b8e 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
12b8f 63 74 5f 54 72 61 6a 65 63 74 6f 72 79 49 6e 74  ct_TrajectoryInt
12b90 65 72 70 6f 6c 61 74 65 50 6f 69 6e 74 2c 20 30  erpolatePoint, 0
12b91 2c 20 30 2c 20 30 29 3b 0a 0a 23 69 66 6e 64 65  , 0, 0);..#ifnde
12b92 66 20 4f 4d 49 54 5f 47 45 4f 43 41 4c 4c 42 41  f OMIT_GEOCALLBA
12b93 43 4b 53 09 2f 2a 20 73 75 70 70 6f 72 74 69 6e  CKS./* supportin
12b94 67 20 52 54 72 65 65 20 67 65 6f 6d 65 74 72 79  g RTree geometry
12b95 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20   callbacks */.  
12b96 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f    sqlite3_rtree_
12b97 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63  geometry_callbac
12b98 6b 20 28 64 62 2c 20 22 52 54 72 65 65 57 69 74  k (db, "RTreeWit
12b99 68 69 6e 22 2c 20 66 6e 63 74 5f 52 54 72 65 65  hin", fnct_RTree
12b9a 49 6e 74 65 72 73 65 63 74 73 2c 0a 09 09 09 09  Intersects,.....
12b9b 20 20 20 20 20 30 29 3b 0a 20 20 20 20 73 71 6c       0);.    sql
12b9c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
12b9d 74 72 79 5f 63 61 6c 6c 62 61 63 6b 20 28 64 62  try_callback (db
12b9e 2c 20 22 52 54 72 65 65 43 6f 6e 74 61 69 6e 73  , "RTreeContains
12b9f 22 2c 0a 09 09 09 09 20 20 20 20 20 66 6e 63 74  ",.....     fnct
12ba0 5f 52 54 72 65 65 49 6e 74 65 72 73 65 63 74 73  _RTreeIntersects
12ba1 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12ba2 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79  3_rtree_geometry
12ba3 5f 63 61 6c 6c 62 61 63 6b 20 28 64 62 2c 20 22  _callback (db, "
12ba4 52 54 72 65 65 49 6e 74 65 72 73 65 63 74 73 22  RTreeIntersects"
12ba5 2c 0a 09 09 09 09 20 20 20 20 20 66 6e 63 74 5f  ,.....     fnct_
12ba6 52 54 72 65 65 49 6e 74 65 72 73 65 63 74 73 2c  RTreeIntersects,
12ba7 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12ba8 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f  _rtree_geometry_
12ba9 63 61 6c 6c 62 61 63 6b 20 28 64 62 2c 20 22 52  callback (db, "R
12baa 54 72 65 65 44 69 73 74 57 69 74 68 69 6e 22 2c  TreeDistWithin",
12bab 0a 09 09 09 09 20 20 20 20 20 66 6e 63 74 5f 52  .....     fnct_R
12bac 54 72 65 65 44 69 73 74 57 69 74 68 69 6e 2c 20  TreeDistWithin, 
12bad 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e  0);.#endif /* en
12bae 64 20 52 54 72 65 65 20 67 65 6f 6d 65 74 72 79  d RTree geometry
12baf 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 0a 2f   callbacks */../
12bb0 2a 20 73 6f 6d 65 20 42 4c 4f 42 2f 4a 50 45 47  * some BLOB/JPEG
12bb1 2f 45 58 49 46 20 66 75 6e 63 74 69 6f 6e 73 20  /EXIF functions 
12bb2 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  */.    sqlite3_c
12bb3 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12bb4 32 20 28 64 62 2c 20 22 49 73 47 65 6f 6d 65 74  2 (db, "IsGeomet
12bb5 72 79 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09 09  ryBlob", 1,.....
12bb6 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12bb7 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12bb8 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12bb9 49 73 47 65 6f 6d 65 74 72 79 42 6c 6f 62 2c 20  IsGeometryBlob, 
12bba 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12bbb 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12bbc 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
12bbd 73 54 69 6e 79 50 6f 69 6e 74 42 6c 6f 62 22 2c  sTinyPointBlob",
12bbe 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12bbf 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12bc0 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12bc1 09 09 09 66 6e 63 74 5f 49 73 54 69 6e 79 50 6f  ...fnct_IsTinyPo
12bc2 69 6e 74 42 6c 6f 62 2c 20 30 2c 20 30 2c 20 30  intBlob, 0, 0, 0
12bc3 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12bc4 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12bc5 32 20 28 64 62 2c 20 22 49 73 5a 69 70 42 6c 6f  2 (db, "IsZipBlo
12bc6 62 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  b", 1,.....SQLIT
12bc7 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12bc8 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12bc9 2c 0a 09 09 09 09 66 6e 63 74 5f 49 73 5a 69 70  ,.....fnct_IsZip
12bca 42 6c 6f 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Blob, 0, 0, 0);.
12bcb 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12bcc 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12bcd 64 62 2c 20 22 49 73 50 64 66 42 6c 6f 62 22 2c  db, "IsPdfBlob",
12bce 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
12bcf 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12bd0 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12bd1 09 09 09 66 6e 63 74 5f 49 73 50 64 66 42 6c 6f  ...fnct_IsPdfBlo
12bd2 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
12bd3 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12bd4 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12bd5 20 22 49 73 54 69 66 66 42 6c 6f 62 22 2c 20 31   "IsTiffBlob", 1
12bd6 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
12bd7 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
12bd8 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
12bd9 09 66 6e 63 74 5f 49 73 54 69 66 66 42 6c 6f 62  .fnct_IsTiffBlob
12bda 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12bdb 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12bdc 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12bdd 22 49 73 47 69 66 42 6c 6f 62 22 2c 20 31 2c 0a  "IsGifBlob", 1,.
12bde 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12bdf 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12be0 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
12be1 6e 63 74 5f 49 73 47 69 66 42 6c 6f 62 2c 20 30  nct_IsGifBlob, 0
12be2 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12be3 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12be4 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73  tion_v2 (db, "Is
12be5 50 6e 67 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09  PngBlob", 1,....
12be6 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
12be7 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
12be8 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
12be9 5f 49 73 50 6e 67 42 6c 6f 62 2c 20 30 2c 20 30  _IsPngBlob, 0, 0
12bea 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12beb 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12bec 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 4a 70 65  n_v2 (db, "IsJpe
12bed 67 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09 09 53  gBlob", 1,.....S
12bee 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12bef 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12bf0 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 49  C, 0,.....fnct_I
12bf1 73 4a 70 65 67 42 6c 6f 62 2c 20 30 2c 20 30 2c  sJpegBlob, 0, 0,
12bf2 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12bf3 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12bf4 5f 76 32 20 28 64 62 2c 20 22 49 73 45 78 69 66  _v2 (db, "IsExif
12bf5 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09 09 53 51  Blob", 1,.....SQ
12bf6 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
12bf7 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
12bf8 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 49 73  , 0,.....fnct_Is
12bf9 45 78 69 66 42 6c 6f 62 2c 20 30 2c 20 30 2c 20  ExifBlob, 0, 0, 
12bfa 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12bfb 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12bfc 76 32 20 28 64 62 2c 20 22 49 73 45 78 69 66 47  v2 (db, "IsExifG
12bfd 70 73 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09 09  psBlob", 1,.....
12bfe 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12bff 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12c00 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12c01 49 73 45 78 69 66 47 70 73 42 6c 6f 62 2c 20 30  IsExifGpsBlob, 0
12c02 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12c03 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12c04 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73  tion_v2 (db, "Is
12c05 57 65 62 70 42 6c 6f 62 22 2c 20 31 2c 0a 09 09  WebpBlob", 1,...
12c06 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12c07 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12c08 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
12c09 74 5f 49 73 57 65 62 50 42 6c 6f 62 2c 20 30 2c  t_IsWebPBlob, 0,
12c0a 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12c0b 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12c0c 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 4a  ion_v2 (db, "IsJ
12c0d 50 32 42 6c 6f 62 22 2c 20 31 2c 0a 09 09 09 09  P2Blob", 1,.....
12c0e 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12c0f 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12c10 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12c11 49 73 4a 50 32 42 6c 6f 62 2c 20 30 2c 20 30 2c  IsJP2Blob, 0, 0,
12c12 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12c13 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12c14 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 6d 46 72  _v2 (db, "GeomFr
12c15 6f 6d 45 78 69 66 47 70 73 42 6c 6f 62 22 2c 20  omExifGpsBlob", 
12c16 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
12c17 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12c18 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
12c19 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72 6f 6d 45  ..fnct_GeomFromE
12c1a 78 69 66 47 70 73 42 6c 6f 62 2c 20 30 2c 20 30  xifGpsBlob, 0, 0
12c1b 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12c1c 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12c1d 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 74 4d 69  n_v2 (db, "GetMi
12c1e 6d 65 54 79 70 65 22 2c 20 31 2c 0a 09 09 09 09  meType", 1,.....
12c1f 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12c20 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12c21 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12c22 47 65 74 4d 69 6d 65 54 79 70 65 2c 20 30 2c 20  GetMimeType, 0, 
12c23 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12c24 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12c25 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 6f 75 6e  on_v2 (db, "Coun
12c26 74 55 6e 73 61 66 65 54 72 69 67 67 65 72 73 22  tUnsafeTriggers"
12c27 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
12c28 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12c29 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
12c2a 09 09 09 09 66 6e 63 74 5f 43 6f 75 6e 74 55 6e  ....fnct_CountUn
12c2b 73 61 66 65 54 72 69 67 67 65 72 73 2c 20 30 2c  safeTriggers, 0,
12c2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12c2d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12c2e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 68 65  ion_v2 (db, "Che
12c2f 63 6b 44 75 70 6c 69 63 61 74 65 52 6f 77 73 22  ckDuplicateRows"
12c30 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12c31 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12c32 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
12c33 09 09 09 09 66 6e 63 74 5f 43 68 65 63 6b 44 75  ....fnct_CheckDu
12c34 70 6c 69 63 61 74 65 52 6f 77 73 2c 20 30 2c 20  plicateRows, 0, 
12c35 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12c36 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12c37 6f 6e 5f 76 32 20 28 64 62 2c 20 22 52 65 6d 6f  on_v2 (db, "Remo
12c38 76 65 44 75 70 6c 69 63 61 74 65 52 6f 77 73 22  veDuplicateRows"
12c39 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
12c3a 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
12c3b 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
12c3c 09 09 09 09 66 6e 63 74 5f 52 65 6d 6f 76 65 44  ....fnct_RemoveD
12c3d 75 70 6c 69 63 61 74 65 52 6f 77 73 2c 20 30 2c  uplicateRows, 0,
12c3e 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12c3f 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12c40 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 52 65 6d  ion_v2 (db, "Rem
12c41 6f 76 65 44 75 70 6c 69 63 61 74 65 52 6f 77 73  oveDuplicateRows
12c42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
12c43 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12c44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
12c45 0a 09 09 09 09 66 6e 63 74 5f 52 65 6d 6f 76 65  .....fnct_Remove
12c46 44 75 70 6c 69 63 61 74 65 52 6f 77 73 2c 20 30  DuplicateRows, 0
12c47 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12c48 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12c49 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 6c  tion_v2 (db, "El
12c4a 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69  ementaryGeometri
12c4b 65 73 22 2c 20 35 2c 0a 09 09 09 09 53 51 4c 49  es", 5,.....SQLI
12c4c 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12c4d 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12c4e 30 2c 0a 09 09 09 09 66 6e 63 74 5f 45 6c 65 6d  0,.....fnct_Elem
12c4f 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73  entaryGeometries
12c50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12c51 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12c52 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12c53 22 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65  "ElementaryGeome
12c54 74 72 69 65 73 22 2c 20 36 2c 0a 09 09 09 09 53  tries", 6,.....S
12c55 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12c56 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12c57 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 45  C, 0,.....fnct_E
12c58 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72  lementaryGeometr
12c59 69 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ies, 0, 0, 0);. 
12c5a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12c5b 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12c5c 62 2c 20 22 45 6c 65 6d 65 6e 74 61 72 79 47 65  b, "ElementaryGe
12c5d 6f 6d 65 74 72 69 65 73 22 2c 20 37 2c 0a 09 09  ometries", 7,...
12c5e 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12c5f 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12c60 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
12c61 74 5f 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d  t_ElementaryGeom
12c62 65 74 72 69 65 73 2c 20 30 2c 20 30 2c 20 30 29  etries, 0, 0, 0)
12c63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12c64 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12c65 20 28 64 62 2c 20 22 45 6c 65 6d 65 6e 74 61 72   (db, "Elementar
12c66 79 47 65 6f 6d 65 74 72 69 65 73 22 2c 20 38 2c  yGeometries", 8,
12c67 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12c68 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12c69 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12c6a 66 6e 63 74 5f 45 6c 65 6d 65 6e 74 61 72 79 47  fnct_ElementaryG
12c6b 65 6f 6d 65 74 72 69 65 73 2c 20 30 2c 20 30 2c  eometries, 0, 0,
12c6c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12c6d 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12c6e 5f 76 32 20 28 64 62 2c 20 22 45 6c 65 6d 65 6e  _v2 (db, "Elemen
12c6f 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73 22 2c  taryGeometries",
12c70 20 39 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   9,.....SQLITE_U
12c71 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12c72 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12c73 09 09 09 66 6e 63 74 5f 45 6c 65 6d 65 6e 74 61  ...fnct_Elementa
12c74 72 79 47 65 6f 6d 65 74 72 69 65 73 2c 20 30 2c  ryGeometries, 0,
12c75 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12c76 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12c77 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 6c 65  ion_v2 (db, "Ele
12c78 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65  mentaryGeometrie
12c79 73 22 2c 20 31 30 2c 0a 09 09 09 09 53 51 4c 49  s", 10,.....SQLI
12c7a 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12c7b 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12c7c 30 2c 0a 09 09 09 09 66 6e 63 74 5f 45 6c 65 6d  0,.....fnct_Elem
12c7d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73  entaryGeometries
12c7e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12c7f 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12c80 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12c81 22 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65  "ElementaryGeome
12c82 74 72 69 65 73 22 2c 20 31 31 2c 0a 09 09 09 09  tries", 11,.....
12c83 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12c84 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12c85 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12c86 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74  ElementaryGeomet
12c87 72 69 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ries, 0, 0, 0);.
12c88 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12c89 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12c8a 64 62 2c 20 22 45 6c 65 6d 65 6e 74 61 72 79 47  db, "ElementaryG
12c8b 65 6f 6d 65 74 72 69 65 73 22 2c 20 31 32 2c 0a  eometries", 12,.
12c8c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12c8d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12c8e 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
12c8f 6e 63 74 5f 45 6c 65 6d 65 6e 74 61 72 79 47 65  nct_ElementaryGe
12c90 6f 6d 65 74 72 69 65 73 2c 20 30 2c 20 30 2c 20  ometries, 0, 0, 
12c91 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12c92 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12c93 76 32 20 28 64 62 2c 20 22 45 6c 65 6d 65 6e 74  v2 (db, "Element
12c94 61 72 79 47 65 6f 6d 65 74 72 69 65 73 22 2c 20  aryGeometries", 
12c95 31 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55  13,.....SQLITE_U
12c96 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12c97 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
12c98 09 09 09 66 6e 63 74 5f 45 6c 65 6d 65 6e 74 61  ...fnct_Elementa
12c99 72 79 47 65 6f 6d 65 74 72 69 65 73 2c 20 30 2c  ryGeometries, 0,
12c9a 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12c9b 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12c9c 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 6c 65  ion_v2 (db, "Ele
12c9d 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65  mentaryGeometrie
12c9e 73 22 2c 20 31 34 2c 0a 09 09 09 09 53 51 4c 49  s", 14,.....SQLI
12c9f 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
12ca0 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
12ca1 30 2c 0a 09 09 09 09 66 6e 63 74 5f 45 6c 65 6d  0,.....fnct_Elem
12ca2 65 6e 74 61 72 79 47 65 6f 6d 65 74 72 69 65 73  entaryGeometries
12ca3 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12ca4 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12ca5 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12ca6 22 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65  "ElementaryGeome
12ca7 74 72 69 65 73 22 2c 20 31 35 2c 0a 09 09 09 09  tries", 15,.....
12ca8 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12ca9 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12caa 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
12cab 45 6c 65 6d 65 6e 74 61 72 79 47 65 6f 6d 65 74  ElementaryGeomet
12cac 72 69 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ries, 0, 0, 0);.
12cad 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12cae 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12caf 64 62 2c 20 22 45 6c 65 6d 65 6e 74 61 72 79 47  db, "ElementaryG
12cb0 65 6f 6d 65 74 72 69 65 73 22 2c 20 31 36 2c 0a  eometries", 16,.
12cb1 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
12cb2 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12cb3 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
12cb4 6e 63 74 5f 45 6c 65 6d 65 6e 74 61 72 79 47 65  nct_ElementaryGe
12cb5 6f 6d 65 74 72 69 65 73 2c 20 30 2c 20 30 2c 20  ometries, 0, 0, 
12cb6 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12cb7 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12cb8 76 32 20 28 64 62 2c 20 22 44 72 6f 70 47 65 6f  v2 (db, "DropGeo
12cb9 54 61 62 6c 65 22 2c 20 31 2c 0a 09 09 09 09 53  Table", 1,.....S
12cba 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12cbb 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12cbc 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 44  C, 0,.....fnct_D
12cbd 72 6f 70 47 65 6f 54 61 62 6c 65 2c 20 30 2c 20  ropGeoTable, 0, 
12cbe 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12cbf 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12cc0 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44 72 6f 70  on_v2 (db, "Drop
12cc1 47 65 6f 54 61 62 6c 65 22 2c 20 32 2c 0a 09 09  GeoTable", 2,...
12cc2 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
12cc3 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12cc4 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
12cc5 74 5f 44 72 6f 70 47 65 6f 54 61 62 6c 65 2c 20  t_DropGeoTable, 
12cc6 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12cc7 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12cc8 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44  ction_v2 (db, "D
12cc9 72 6f 70 47 65 6f 54 61 62 6c 65 22 2c 20 33 2c  ropGeoTable", 3,
12cca 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
12ccb 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
12ccc 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
12ccd 66 6e 63 74 5f 44 72 6f 70 47 65 6f 54 61 62 6c  fnct_DropGeoTabl
12cce 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  e, 0, 0, 0);..  
12ccf 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12cd0 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12cd1 2c 20 22 53 71 6c 50 72 6f 63 5f 47 65 74 4c 61  , "SqlProc_GetLa
12cd2 73 74 45 72 72 6f 72 22 2c 20 30 2c 20 53 51 4c  stError", 0, SQL
12cd3 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61  ITE_UTF8,.....ca
12cd4 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 67 65 74  che, fnct_sp_get
12cd5 5f 6c 61 73 74 5f 65 72 72 6f 72 2c 20 30 2c 20  _last_error, 0, 
12cd6 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12cd7 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12cd8 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50  on_v2 (db, "SqlP
12cd9 72 6f 63 5f 47 65 74 4c 6f 67 66 69 6c 65 22 2c  roc_GetLogfile",
12cda 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
12cdb 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74  .....cache, fnct
12cdc 5f 73 70 5f 67 65 74 5f 6c 6f 67 66 69 6c 65 2c  _sp_get_logfile,
12cdd 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12cde 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12cdf 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12ce0 53 71 6c 50 72 6f 63 5f 46 72 6f 6d 54 65 78 74  SqlProc_FromText
12ce1 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
12ce2 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e  8,.....cache, fn
12ce3 63 74 5f 73 70 5f 66 72 6f 6d 5f 74 65 78 74 2c  ct_sp_from_text,
12ce4 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12ce5 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12ce6 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12ce7 53 71 6c 50 72 6f 63 5f 46 72 6f 6d 54 65 78 74  SqlProc_FromText
12ce8 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
12ce9 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e  8,.....cache, fn
12cea 63 74 5f 73 70 5f 66 72 6f 6d 5f 74 65 78 74 2c  ct_sp_from_text,
12ceb 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12cec 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12ced 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12cee 53 71 6c 50 72 6f 63 5f 49 73 56 61 6c 69 64 22  SqlProc_IsValid"
12cef 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
12cf0 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70  , 0,.....fnct_sp
12cf1 5f 69 73 5f 76 61 6c 69 64 2c 20 30 2c 20 30 2c  _is_valid, 0, 0,
12cf2 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12cf3 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12cf4 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12cf5 63 5f 4e 75 6d 56 61 72 69 61 62 6c 65 73 22 2c  c_NumVariables",
12cf6 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
12cf7 0a 09 09 09 09 30 2c 20 66 6e 63 74 5f 73 70 5f  .....0, fnct_sp_
12cf8 76 61 72 5f 63 6f 75 6e 74 2c 20 30 2c 20 30 2c  var_count, 0, 0,
12cf9 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12cfa 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12cfb 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12cfc 63 5f 56 61 72 69 61 62 6c 65 4e 22 2c 20 32 2c  c_VariableN", 2,
12cfd 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
12cfe 0a 09 09 09 09 66 6e 63 74 5f 73 70 5f 76 61 72  .....fnct_sp_var
12cff 69 61 62 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b  iable, 0, 0, 0);
12d00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12d01 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12d02 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 41 6c  (db, "SqlProc_Al
12d03 6c 56 61 72 69 61 62 6c 65 73 22 2c 20 31 2c 20  lVariables", 1, 
12d04 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09  SQLITE_UTF8,....
12d05 09 30 2c 20 66 6e 63 74 5f 73 70 5f 61 6c 6c 5f  .0, fnct_sp_all_
12d06 76 61 72 69 61 62 6c 65 73 2c 20 30 2c 20 30 2c  variables, 0, 0,
12d07 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12d08 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12d09 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12d0a 63 5f 56 61 72 56 61 6c 75 65 22 2c 20 32 2c 20  c_VarValue", 2, 
12d0b 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
12d0c 09 09 09 09 66 6e 63 74 5f 73 70 5f 76 61 72 5f  ....fnct_sp_var_
12d0d 61 72 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  arg, 0, 0, 0);. 
12d0e 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12d0f 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12d10 62 2c 20 22 53 71 6c 50 72 6f 63 5f 49 73 56 61  b, "SqlProc_IsVa
12d11 6c 69 64 56 61 72 56 61 6c 75 65 22 2c 20 31 2c  lidVarValue", 1,
12d12 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09   SQLITE_UTF8,...
12d13 09 09 30 2c 20 66 6e 63 74 5f 73 70 5f 69 73 5f  ..0, fnct_sp_is_
12d14 76 61 6c 69 64 5f 76 61 72 2c 20 30 2c 20 30 2c  valid_var, 0, 0,
12d15 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12d16 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12d17 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12d18 63 5f 52 61 77 53 51 4c 22 2c 20 31 2c 20 53 51  c_RawSQL", 1, SQ
12d19 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 09 09  LITE_UTF8, 0,...
12d1a 09 09 66 6e 63 74 5f 73 70 5f 72 61 77 5f 73 71  ..fnct_sp_raw_sq
12d1b 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
12d1c 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12d1d 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12d1e 20 22 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b 65 64   "SqlProc_Cooked
12d1f 53 51 4c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  SQL", 1, SQLITE_
12d20 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c  UTF8,.....cache,
12d21 20 66 6e 63 74 5f 73 70 5f 63 6f 6f 6b 65 64 5f   fnct_sp_cooked_
12d22 73 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  sql, 0, 0, 0);. 
12d23 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12d24 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12d25 62 2c 20 22 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b  b, "SqlProc_Cook
12d26 65 64 53 51 4c 22 2c 20 32 2c 20 53 51 4c 49 54  edSQL", 2, SQLIT
12d27 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68  E_UTF8,.....cach
12d28 65 2c 20 66 6e 63 74 5f 73 70 5f 63 6f 6f 6b 65  e, fnct_sp_cooke
12d29 64 5f 73 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  d_sql, 0, 0, 0);
12d2a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12d2b 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12d2c 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 43 6f  (db, "SqlProc_Co
12d2d 6f 6b 65 64 53 51 4c 22 2c 20 33 2c 20 53 51 4c  okedSQL", 3, SQL
12d2e 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61  ITE_UTF8,.....ca
12d2f 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 63 6f 6f  che, fnct_sp_coo
12d30 6b 65 64 5f 73 71 6c 2c 20 30 2c 20 30 2c 20 30  ked_sql, 0, 0, 0
12d31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12d32 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12d33 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f  2 (db, "SqlProc_
12d34 43 6f 6f 6b 65 64 53 51 4c 22 2c 20 34 2c 20 53  CookedSQL", 4, S
12d35 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09  QLITE_UTF8,.....
12d36 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 63  cache, fnct_sp_c
12d37 6f 6f 6b 65 64 5f 73 71 6c 2c 20 30 2c 20 30 2c  ooked_sql, 0, 0,
12d38 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12d39 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12d3a 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12d3b 63 5f 43 6f 6f 6b 65 64 53 51 4c 22 2c 20 35 2c  c_CookedSQL", 5,
12d3c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09   SQLITE_UTF8,...
12d3d 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70  ..cache, fnct_sp
12d3e 5f 63 6f 6f 6b 65 64 5f 73 71 6c 2c 20 30 2c 20  _cooked_sql, 0, 
12d3f 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12d40 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12d41 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50  on_v2 (db, "SqlP
12d42 72 6f 63 5f 43 6f 6f 6b 65 64 53 51 4c 22 2c 20  roc_CookedSQL", 
12d43 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  6, SQLITE_UTF8,.
12d44 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f  ....cache, fnct_
12d45 73 70 5f 63 6f 6f 6b 65 64 5f 73 71 6c 2c 20 30  sp_cooked_sql, 0
12d46 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12d47 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12d48 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71  tion_v2 (db, "Sq
12d49 6c 50 72 6f 63 5f 43 6f 6f 6b 65 64 53 51 4c 22  lProc_CookedSQL"
12d4a 2c 20 37 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 7, SQLITE_UTF8
12d4b 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63  ,.....cache, fnc
12d4c 74 5f 73 70 5f 63 6f 6f 6b 65 64 5f 73 71 6c 2c  t_sp_cooked_sql,
12d4d 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12d4e 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12d4f 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12d50 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b 65 64 53 51  SqlProc_CookedSQ
12d51 4c 22 2c 20 38 2c 20 53 51 4c 49 54 45 5f 55 54  L", 8, SQLITE_UT
12d52 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66  F8,.....cache, f
12d53 6e 63 74 5f 73 70 5f 63 6f 6f 6b 65 64 5f 73 71  nct_sp_cooked_sq
12d54 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
12d55 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12d56 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12d57 20 22 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b 65 64   "SqlProc_Cooked
12d58 53 51 4c 22 2c 20 39 2c 20 53 51 4c 49 54 45 5f  SQL", 9, SQLITE_
12d59 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c  UTF8,.....cache,
12d5a 20 66 6e 63 74 5f 73 70 5f 63 6f 6f 6b 65 64 5f   fnct_sp_cooked_
12d5b 73 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  sql, 0, 0, 0);. 
12d5c 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12d5d 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12d5e 62 2c 20 22 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b  b, "SqlProc_Cook
12d5f 65 64 53 51 4c 22 2c 20 31 30 2c 20 53 51 4c 49  edSQL", 10, SQLI
12d60 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63  TE_UTF8,.....cac
12d61 68 65 2c 20 66 6e 63 74 5f 73 70 5f 63 6f 6f 6b  he, fnct_sp_cook
12d62 65 64 5f 73 71 6c 2c 20 30 2c 20 30 2c 20 30 29  ed_sql, 0, 0, 0)
12d63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12d64 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12d65 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 43   (db, "SqlProc_C
12d66 6f 6f 6b 65 64 53 51 4c 22 2c 20 31 31 2c 20 53  ookedSQL", 11, S
12d67 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09  QLITE_UTF8,.....
12d68 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 63  cache, fnct_sp_c
12d69 6f 6f 6b 65 64 5f 73 71 6c 2c 20 30 2c 20 30 2c  ooked_sql, 0, 0,
12d6a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12d6b 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12d6c 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12d6d 63 5f 43 6f 6f 6b 65 64 53 51 4c 22 2c 20 31 32  c_CookedSQL", 12
12d6e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12d6f 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73  ...cache, fnct_s
12d70 70 5f 63 6f 6f 6b 65 64 5f 73 71 6c 2c 20 30 2c  p_cooked_sql, 0,
12d71 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12d72 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12d73 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c  ion_v2 (db, "Sql
12d74 50 72 6f 63 5f 43 6f 6f 6b 65 64 53 51 4c 22 2c  Proc_CookedSQL",
12d75 20 31 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   13, SQLITE_UTF8
12d76 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63  ,.....cache, fnc
12d77 74 5f 73 70 5f 63 6f 6f 6b 65 64 5f 73 71 6c 2c  t_sp_cooked_sql,
12d78 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12d79 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12d7a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12d7b 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b 65 64 53 51  SqlProc_CookedSQ
12d7c 4c 22 2c 20 31 34 2c 20 53 51 4c 49 54 45 5f 55  L", 14, SQLITE_U
12d7d 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20  TF8,.....cache, 
12d7e 66 6e 63 74 5f 73 70 5f 63 6f 6f 6b 65 64 5f 73  fnct_sp_cooked_s
12d7f 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
12d80 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12d81 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12d82 2c 20 22 53 71 6c 50 72 6f 63 5f 43 6f 6f 6b 65  , "SqlProc_Cooke
12d83 64 53 51 4c 22 2c 20 31 35 2c 20 53 51 4c 49 54  dSQL", 15, SQLIT
12d84 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68  E_UTF8,.....cach
12d85 65 2c 20 66 6e 63 74 5f 73 70 5f 63 6f 6f 6b 65  e, fnct_sp_cooke
12d86 64 5f 73 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  d_sql, 0, 0, 0);
12d87 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12d88 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12d89 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 43 6f  (db, "SqlProc_Co
12d8a 6f 6b 65 64 53 51 4c 22 2c 20 31 36 2c 20 53 51  okedSQL", 16, SQ
12d8b 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63  LITE_UTF8,.....c
12d8c 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 63 6f  ache, fnct_sp_co
12d8d 6f 6b 65 64 5f 73 71 6c 2c 20 30 2c 20 30 2c 20  oked_sql, 0, 0, 
12d8e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12d8f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12d90 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63  v2 (db, "SqlProc
12d91 5f 43 6f 6f 6b 65 64 53 51 4c 22 2c 20 31 37 2c  _CookedSQL", 17,
12d92 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09   SQLITE_UTF8,...
12d93 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70  ..cache, fnct_sp
12d94 5f 63 6f 6f 6b 65 64 5f 73 71 6c 2c 20 30 2c 20  _cooked_sql, 0, 
12d95 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12d96 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12d97 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50  on_v2 (db, "SqlP
12d98 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31 2c  roc_Execute", 1,
12d99 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61   SQLITE_UTF8, ca
12d9a 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70  che,.....fnct_sp
12d9b 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12d9c 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12d9d 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12d9e 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63  v2 (db, "SqlProc
12d9f 5f 45 78 65 63 75 74 65 22 2c 20 32 2c 20 53 51  _Execute", 2, SQ
12da0 4c 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68 65  LITE_UTF8, cache
12da1 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70 5f 65 78  ,.....fnct_sp_ex
12da2 65 63 75 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b  ecute, 0, 0, 0);
12da3 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12da4 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12da5 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 45 78  (db, "SqlProc_Ex
12da6 65 63 75 74 65 22 2c 20 33 2c 20 53 51 4c 49 54  ecute", 3, SQLIT
12da7 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09  E_UTF8, cache,..
12da8 09 09 09 66 6e 63 74 5f 73 70 5f 65 78 65 63 75  ...fnct_sp_execu
12da9 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  te, 0, 0, 0);.  
12daa 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12dab 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12dac 2c 20 22 53 71 6c 50 72 6f 63 5f 45 78 65 63 75  , "SqlProc_Execu
12dad 74 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55  te", 4, SQLITE_U
12dae 54 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TF8, cache,.....
12daf 66 6e 63 74 5f 73 70 5f 65 78 65 63 75 74 65 2c  fnct_sp_execute,
12db0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12db1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12db2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12db3 53 71 6c 50 72 6f 63 5f 45 78 65 63 75 74 65 22  SqlProc_Execute"
12db4 2c 20 35 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 5, SQLITE_UTF8
12db5 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
12db6 74 5f 73 70 5f 65 78 65 63 75 74 65 2c 20 30 2c  t_sp_execute, 0,
12db7 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12db8 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12db9 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c  ion_v2 (db, "Sql
12dba 50 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 36  Proc_Execute", 6
12dbb 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63  , SQLITE_UTF8, c
12dbc 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 73  ache,.....fnct_s
12dbd 70 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c  p_execute, 0, 0,
12dbe 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12dbf 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12dc0 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
12dc1 63 5f 45 78 65 63 75 74 65 22 2c 20 37 2c 20 53  c_Execute", 7, S
12dc2 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68  QLITE_UTF8, cach
12dc3 65 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70 5f 65  e,.....fnct_sp_e
12dc4 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20 30 29  xecute, 0, 0, 0)
12dc5 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12dc6 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12dc7 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 45   (db, "SqlProc_E
12dc8 78 65 63 75 74 65 22 2c 20 38 2c 20 53 51 4c 49  xecute", 8, SQLI
12dc9 54 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 0a  TE_UTF8, cache,.
12dca 09 09 09 09 66 6e 63 74 5f 73 70 5f 65 78 65 63  ....fnct_sp_exec
12dcb 75 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ute, 0, 0, 0);. 
12dcc 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12dcd 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12dce 62 2c 20 22 53 71 6c 50 72 6f 63 5f 45 78 65 63  b, "SqlProc_Exec
12dcf 75 74 65 22 2c 20 39 2c 20 53 51 4c 49 54 45 5f  ute", 9, SQLITE_
12dd0 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09  UTF8, cache,....
12dd1 09 66 6e 63 74 5f 73 70 5f 65 78 65 63 75 74 65  .fnct_sp_execute
12dd2 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12dd3 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12dd4 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12dd5 22 53 71 6c 50 72 6f 63 5f 45 78 65 63 75 74 65  "SqlProc_Execute
12dd6 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 55 54  ", 10, SQLITE_UT
12dd7 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  F8, cache,.....f
12dd8 6e 63 74 5f 73 70 5f 65 78 65 63 75 74 65 2c 20  nct_sp_execute, 
12dd9 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12dda 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12ddb 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12ddc 71 6c 50 72 6f 63 5f 45 78 65 63 75 74 65 22 2c  qlProc_Execute",
12ddd 20 31 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   11, SQLITE_UTF8
12dde 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
12ddf 74 5f 73 70 5f 65 78 65 63 75 74 65 2c 20 30 2c  t_sp_execute, 0,
12de0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12de1 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12de2 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c  ion_v2 (db, "Sql
12de3 50 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31  Proc_Execute", 1
12de4 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
12de5 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12de6 73 70 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30  sp_execute, 0, 0
12de7 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12de8 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12de9 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72  n_v2 (db, "SqlPr
12dea 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31 33 2c  oc_Execute", 13,
12deb 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61   SQLITE_UTF8, ca
12dec 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70  che,.....fnct_sp
12ded 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12dee 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12def 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12df0 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63  v2 (db, "SqlProc
12df1 5f 45 78 65 63 75 74 65 22 2c 20 31 34 2c 20 53  _Execute", 14, S
12df2 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68  QLITE_UTF8, cach
12df3 65 2c 0a 09 09 09 09 66 6e 63 74 5f 73 70 5f 65  e,.....fnct_sp_e
12df4 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20 30 29  xecute, 0, 0, 0)
12df5 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12df6 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12df7 20 28 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 45   (db, "SqlProc_E
12df8 78 65 63 75 74 65 22 2c 20 31 35 2c 20 53 51 4c  xecute", 15, SQL
12df9 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c  ITE_UTF8, cache,
12dfa 0a 09 09 09 09 66 6e 63 74 5f 73 70 5f 65 78 65  .....fnct_sp_exe
12dfb 63 75 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  cute, 0, 0, 0);.
12dfc 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12dfd 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12dfe 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 45 78 65  db, "SqlProc_Exe
12dff 63 75 74 65 22 2c 20 31 36 2c 20 53 51 4c 49 54  cute", 16, SQLIT
12e00 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09  E_UTF8, cache,..
12e01 09 09 09 66 6e 63 74 5f 73 70 5f 65 78 65 63 75  ...fnct_sp_execu
12e02 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  te, 0, 0, 0);.  
12e03 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12e04 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12e05 2c 20 22 53 71 6c 50 72 6f 63 5f 45 78 65 63 75  , "SqlProc_Execu
12e06 74 65 22 2c 20 31 37 2c 20 53 51 4c 49 54 45 5f  te", 17, SQLITE_
12e07 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09  UTF8, cache,....
12e08 09 66 6e 63 74 5f 73 70 5f 65 78 65 63 75 74 65  .fnct_sp_execute
12e09 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12e0a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12e0b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12e0c 22 53 71 6c 50 72 6f 63 5f 45 78 69 74 22 2c 20  "SqlProc_Exit", 
12e0d 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
12e0e 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12e0f 73 70 5f 65 78 69 74 2c 20 30 2c 20 30 2c 20 30  sp_exit, 0, 0, 0
12e10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12e11 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12e12 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50 72  2 (db, "StoredPr
12e13 6f 63 5f 45 78 69 74 22 2c 20 30 2c 20 53 51 4c  oc_Exit", 0, SQL
12e14 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c  ITE_UTF8, cache,
12e15 0a 09 09 09 09 66 6e 63 74 5f 73 70 5f 65 78 69  .....fnct_sp_exi
12e16 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
12e17 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12e18 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12e19 20 22 53 74 6f 72 65 64 50 72 6f 63 5f 43 72 65   "StoredProc_Cre
12e1a 61 74 65 54 61 62 6c 65 73 22 2c 20 30 2c 20 53  ateTables", 0, S
12e1b 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09  QLITE_UTF8,.....
12e1c 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 63  cache, fnct_sp_c
12e1d 72 65 61 74 65 5f 74 61 62 6c 65 73 2c 20 30 2c  reate_tables, 0,
12e1e 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12e1f 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12e20 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 74 6f  ion_v2 (db, "Sto
12e21 72 65 64 50 72 6f 63 5f 52 65 67 69 73 74 65 72  redProc_Register
12e22 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
12e23 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e  8,.....cache, fn
12e24 63 74 5f 73 70 5f 72 65 67 69 73 74 65 72 2c 20  ct_sp_register, 
12e25 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12e26 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12e27 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12e28 74 6f 72 65 64 50 72 6f 63 5f 47 65 74 22 2c 20  toredProc_Get", 
12e29 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
12e2a 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12e2b 73 70 5f 67 65 74 2c 20 30 2c 20 30 2c 20 30 29  sp_get, 0, 0, 0)
12e2c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
12e2d 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12e2e 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50 72 6f   (db, "StoredPro
12e2f 63 5f 44 65 6c 65 74 65 22 2c 20 31 2c 20 53 51  c_Delete", 1, SQ
12e30 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63  LITE_UTF8,.....c
12e31 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 64 65  ache, fnct_sp_de
12e32 6c 65 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  lete, 0, 0, 0);.
12e33 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
12e34 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12e35 64 62 2c 20 22 53 74 6f 72 65 64 50 72 6f 63 5f  db, "StoredProc_
12e36 55 70 64 61 74 65 54 69 74 6c 65 22 2c 20 32 2c  UpdateTitle", 2,
12e37 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09   SQLITE_UTF8,...
12e38 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70  ..cache, fnct_sp
12e39 5f 75 70 64 61 74 65 5f 74 69 74 6c 65 2c 20 30  _update_title, 0
12e3a 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12e3b 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12e3c 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 74  tion_v2 (db, "St
12e3d 6f 72 65 64 50 72 6f 63 5f 55 70 64 61 74 65 53  oredProc_UpdateS
12e3e 71 6c 42 6f 64 79 22 2c 20 32 2c 0a 09 09 09 09  qlBody", 2,.....
12e3f 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61 63  SQLITE_UTF8, cac
12e40 68 65 2c 20 66 6e 63 74 5f 73 70 5f 75 70 64 61  he, fnct_sp_upda
12e41 74 65 5f 73 71 6c 2c 20 30 2c 20 30 2c 0a 09 09  te_sql, 0, 0,...
12e42 09 09 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ..0);.    sqlite
12e43 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12e44 6e 5f 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65  n_v2 (db, "Store
12e45 64 56 61 72 5f 52 65 67 69 73 74 65 72 22 2c 20  dVar_Register", 
12e46 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  3, SQLITE_UTF8,.
12e47 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f  ....cache, fnct_
12e48 73 70 5f 76 61 72 5f 72 65 67 69 73 74 65 72 2c  sp_var_register,
12e49 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
12e4a 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12e4b 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
12e4c 53 74 6f 72 65 64 56 61 72 5f 47 65 74 22 2c 20  StoredVar_Get", 
12e4d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
12e4e 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
12e4f 73 70 5f 76 61 72 5f 67 65 74 2c 20 30 2c 20 30  sp_var_get, 0, 0
12e50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12e51 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12e52 6e 5f 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65  n_v2 (db, "Store
12e53 64 56 61 72 5f 47 65 74 56 61 6c 75 65 22 2c 20  dVar_GetValue", 
12e54 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  1, SQLITE_UTF8,.
12e55 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f  ....cache, fnct_
12e56 73 70 5f 76 61 72 5f 67 65 74 5f 76 61 6c 75 65  sp_var_get_value
12e57 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12e58 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12e59 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12e5a 22 53 74 6f 72 65 64 56 61 72 5f 44 65 6c 65 74  "StoredVar_Delet
12e5b 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  e", 1, SQLITE_UT
12e5c 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  F8, cache,.....f
12e5d 6e 63 74 5f 73 70 5f 76 61 72 5f 64 65 6c 65 74  nct_sp_var_delet
12e5e 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
12e5f 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12e60 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12e61 20 22 53 74 6f 72 65 64 56 61 72 5f 55 70 64 61   "StoredVar_Upda
12e62 74 65 54 69 74 6c 65 22 2c 20 32 2c 20 53 51 4c  teTitle", 2, SQL
12e63 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61  ITE_UTF8,.....ca
12e64 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 76 61 72  che, fnct_sp_var
12e65 5f 75 70 64 61 74 65 5f 74 69 74 6c 65 2c 20 30  _update_title, 0
12e66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
12e67 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12e68 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 74  tion_v2 (db, "St
12e69 6f 72 65 64 56 61 72 5f 55 70 64 61 74 65 56 61  oredVar_UpdateVa
12e6a 6c 75 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  lue", 2, SQLITE_
12e6b 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c  UTF8,.....cache,
12e6c 20 66 6e 63 74 5f 73 70 5f 76 61 72 5f 75 70 64   fnct_sp_var_upd
12e6d 61 74 65 5f 76 61 6c 75 65 2c 20 30 2c 20 30 2c  ate_value, 0, 0,
12e6e 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12e6f 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12e70 5f 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64  _v2 (db, "Stored
12e71 50 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31  Proc_Execute", 1
12e72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12e73 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73  ...cache, fnct_s
12e74 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65  p_stored_execute
12e75 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12e76 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12e77 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12e78 22 53 74 6f 72 65 64 50 72 6f 63 5f 45 78 65 63  "StoredProc_Exec
12e79 75 74 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ute", 2, SQLITE_
12e7a 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c  UTF8,.....cache,
12e7b 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64 5f   fnct_sp_stored_
12e7c 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20 30  execute, 0, 0, 0
12e7d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
12e7e 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
12e7f 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50 72  2 (db, "StoredPr
12e80 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 33 2c 20  oc_Execute", 3, 
12e81 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09  SQLITE_UTF8,....
12e82 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f  .cache, fnct_sp_
12e83 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65 2c 20  stored_execute, 
12e84 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12e85 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
12e86 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
12e87 74 6f 72 65 64 50 72 6f 63 5f 45 78 65 63 75 74  toredProc_Execut
12e88 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54  e", 4, SQLITE_UT
12e89 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66  F8,.....cache, f
12e8a 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64 5f 65 78  nct_sp_stored_ex
12e8b 65 63 75 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b  ecute, 0, 0, 0);
12e8c 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
12e8d 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12e8e 28 64 62 2c 20 22 53 74 6f 72 65 64 50 72 6f 63  (db, "StoredProc
12e8f 5f 45 78 65 63 75 74 65 22 2c 20 35 2c 20 53 51  _Execute", 5, SQ
12e90 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63  LITE_UTF8,.....c
12e91 61 63 68 65 2c 20 66 6e 63 74 5f 73 70 5f 73 74  ache, fnct_sp_st
12e92 6f 72 65 64 5f 65 78 65 63 75 74 65 2c 20 30 2c  ored_execute, 0,
12e93 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12e94 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12e95 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 74 6f  ion_v2 (db, "Sto
12e96 72 65 64 50 72 6f 63 5f 45 78 65 63 75 74 65 22  redProc_Execute"
12e97 2c 20 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 6, SQLITE_UTF8
12e98 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63  ,.....cache, fnc
12e99 74 5f 73 70 5f 73 74 6f 72 65 64 5f 65 78 65 63  t_sp_stored_exec
12e9a 75 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ute, 0, 0, 0);. 
12e9b 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12e9c 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12e9d 62 2c 20 22 53 74 6f 72 65 64 50 72 6f 63 5f 45  b, "StoredProc_E
12e9e 78 65 63 75 74 65 22 2c 20 37 2c 20 53 51 4c 49  xecute", 7, SQLI
12e9f 54 45 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63  TE_UTF8,.....cac
12ea0 68 65 2c 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72  he, fnct_sp_stor
12ea1 65 64 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30  ed_execute, 0, 0
12ea2 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12ea3 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
12ea4 6e 5f 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65  n_v2 (db, "Store
12ea5 64 50 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20  dProc_Execute", 
12ea6 38 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  8, SQLITE_UTF8,.
12ea7 09 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f  ....cache, fnct_
12ea8 73 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74  sp_stored_execut
12ea9 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
12eaa 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12eab 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12eac 20 22 53 74 6f 72 65 64 50 72 6f 63 5f 45 78 65   "StoredProc_Exe
12ead 63 75 74 65 22 2c 20 39 2c 20 53 51 4c 49 54 45  cute", 9, SQLITE
12eae 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65  _UTF8,.....cache
12eaf 2c 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64  , fnct_sp_stored
12eb0 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12eb1 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12eb2 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12eb3 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50  v2 (db, "StoredP
12eb4 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31 30  roc_Execute", 10
12eb5 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12eb6 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73  ...cache, fnct_s
12eb7 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65  p_stored_execute
12eb8 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12eb9 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12eba 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12ebb 22 53 74 6f 72 65 64 50 72 6f 63 5f 45 78 65 63  "StoredProc_Exec
12ebc 75 74 65 22 2c 20 31 31 2c 20 53 51 4c 49 54 45  ute", 11, SQLITE
12ebd 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65  _UTF8,.....cache
12ebe 2c 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64  , fnct_sp_stored
12ebf 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12ec0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12ec1 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12ec2 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50  v2 (db, "StoredP
12ec3 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31 32  roc_Execute", 12
12ec4 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12ec5 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73  ...cache, fnct_s
12ec6 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65  p_stored_execute
12ec7 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12ec8 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12ec9 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12eca 22 53 74 6f 72 65 64 50 72 6f 63 5f 45 78 65 63  "StoredProc_Exec
12ecb 75 74 65 22 2c 20 31 33 2c 20 53 51 4c 49 54 45  ute", 13, SQLITE
12ecc 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65  _UTF8,.....cache
12ecd 2c 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64  , fnct_sp_stored
12ece 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12ecf 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12ed0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12ed1 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50  v2 (db, "StoredP
12ed2 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31 34  roc_Execute", 14
12ed3 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12ed4 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73  ...cache, fnct_s
12ed5 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65  p_stored_execute
12ed6 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12ed7 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12ed8 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12ed9 22 53 74 6f 72 65 64 50 72 6f 63 5f 45 78 65 63  "StoredProc_Exec
12eda 75 74 65 22 2c 20 31 35 2c 20 53 51 4c 49 54 45  ute", 15, SQLITE
12edb 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65  _UTF8,.....cache
12edc 2c 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64  , fnct_sp_stored
12edd 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12ede 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
12edf 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
12ee0 76 32 20 28 64 62 2c 20 22 53 74 6f 72 65 64 50  v2 (db, "StoredP
12ee1 72 6f 63 5f 45 78 65 63 75 74 65 22 2c 20 31 36  roc_Execute", 16
12ee2 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12ee3 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 73  ...cache, fnct_s
12ee4 70 5f 73 74 6f 72 65 64 5f 65 78 65 63 75 74 65  p_stored_execute
12ee5 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12ee6 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
12ee7 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
12ee8 22 53 74 6f 72 65 64 50 72 6f 63 5f 45 78 65 63  "StoredProc_Exec
12ee9 75 74 65 22 2c 20 31 37 2c 20 53 51 4c 49 54 45  ute", 17, SQLITE
12eea 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65  _UTF8,.....cache
12eeb 2c 20 66 6e 63 74 5f 73 70 5f 73 74 6f 72 65 64  , fnct_sp_stored
12eec 5f 65 78 65 63 75 74 65 2c 20 30 2c 20 30 2c 20  _execute, 0, 0, 
12eed 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  0);..    sqlite3
12eee 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12eef 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61 74 65  _v2 (db, "Create
12ef0 52 6f 75 74 69 6e 67 4e 6f 64 65 73 22 2c 20 35  RoutingNodes", 5
12ef1 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
12ef2 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 63  ...cache, fnct_c
12ef3 72 65 61 74 65 5f 72 6f 75 74 69 6e 67 5f 6e 6f  reate_routing_no
12ef4 64 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  des, 0, 0, 0);. 
12ef5 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
12ef6 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12ef7 62 2c 20 22 43 72 65 61 74 65 52 6f 75 74 69 6e  b, "CreateRoutin
12ef8 67 22 2c 20 37 2c 20 53 51 4c 49 54 45 5f 55 54  g", 7, SQLITE_UT
12ef9 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66  F8,.....cache, f
12efa 6e 63 74 5f 63 72 65 61 74 65 5f 72 6f 75 74 69  nct_create_routi
12efb 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ng, 0, 0, 0);.  
12efc 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12efd 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12efe 2c 20 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67  , "CreateRouting
12eff 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 55 54  ", 10, SQLITE_UT
12f00 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66  F8,.....cache, f
12f01 6e 63 74 5f 63 72 65 61 74 65 5f 72 6f 75 74 69  nct_create_routi
12f02 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ng, 0, 0, 0);.  
12f03 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12f04 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12f05 2c 20 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67  , "CreateRouting
12f06 22 2c 20 31 32 2c 20 53 51 4c 49 54 45 5f 55 54  ", 12, SQLITE_UT
12f07 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66  F8,.....cache, f
12f08 6e 63 74 5f 63 72 65 61 74 65 5f 72 6f 75 74 69  nct_create_routi
12f09 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ng, 0, 0, 0);.  
12f0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12f0b 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12f0c 2c 20 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67  , "CreateRouting
12f0d 22 2c 20 31 33 2c 20 53 51 4c 49 54 45 5f 55 54  ", 13, SQLITE_UT
12f0e 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c 20 66  F8,.....cache, f
12f0f 6e 63 74 5f 63 72 65 61 74 65 5f 72 6f 75 74 69  nct_create_routi
12f10 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ng, 0, 0, 0);.  
12f11 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
12f12 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
12f13 2c 20 22 43 72 65 61 74 65 52 6f 75 74 69 6e 67  , "CreateRouting
12f14 5f 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20  _GetLastError", 
12f15 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  0,.....SQLITE_UT
12f16 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  F8, cache,.....f
12f17 6e 63 74 5f 63 72 65 61 74 65 5f 72 6f 75 74 69  nct_create_routi
12f18 6e 67 5f 67 65 74 5f 6c 61 73 74 5f 65 72 72 6f  ng_get_last_erro
12f19 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 2f 2a  r, 0, 0, 0);../*
12f1a 0a 2f 2f 20 65 6e 61 62 6c 69 6e 67 20 42 6c 6f  .// enabling Blo
12f1b 62 46 72 6f 6d 46 69 6c 65 2c 20 42 6c 6f 62 54  bFromFile, BlobT
12f1c 6f 46 69 6c 65 20 61 6e 64 20 58 42 5f 4c 6f 61  oFile and XB_Loa
12f1d 64 58 4d 4c 2c 20 58 42 5f 53 74 6f 72 65 58 4d  dXML, XB_StoreXM
12f1e 4c 2c 20 0a 2f 2f 20 45 78 70 6f 72 74 44 58 46  L, .// ExportDXF
12f1f 20 61 6e 64 20 6f 74 68 65 72 20 69 6d 70 6f 72   and other impor
12f20 74 2f 65 78 70 6f 72 74 20 66 75 6e 63 74 69 6f  t/export functio
12f21 6e 73 0a 2f 2f 0a 2f 2f 20 74 68 65 73 65 20 66  ns.//.// these f
12f22 75 6e 63 74 69 6f 6e 73 20 63 6f 75 6c 64 20 70  unctions could p
12f23 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6e 74 72 6f  otentially intro
12f24 64 75 63 65 20 73 65 72 69 6f 75 73 20 73 65 63  duce serious sec
12f25 75 72 69 74 79 20 69 73 73 75 65 73 2c 0a 2f 2f  urity issues,.//
12f26 20 6d 6f 73 74 20 6e 6f 74 61 62 6c 79 20 77 68   most notably wh
12f27 65 6e 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20  en invoked from 
12f28 77 69 74 68 69 6e 20 73 6f 6d 65 20 54 72 69 67  within some Trig
12f29 67 65 72 0a 2f 2f 20 2d 20 42 6c 6f 62 54 6f 46  ger.// - BlobToF
12f2a 69 6c 65 3a 20 73 6f 6d 65 20 61 72 62 69 74 72  ile: some arbitr
12f2b 61 72 79 20 63 6f 64 65 2c 20 70 6f 73 73 69 62  ary code, possib
12f2c 6c 79 20 68 61 72 6d 66 75 6c 6c 20 28 65 2e 67  ly harmfull (e.g
12f2d 2e 20 76 69 72 75 73 20 6f 72 20 0a 2f 2f 20 20  . virus or .//  
12f2e 20 74 72 6f 6a 61 6e 29 20 63 6f 75 6c 64 20 62   trojan) could b
12f2f 65 20 69 6e 73 74 61 6c 6c 65 64 20 6f 6e 20 74  e installed on t
12f30 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 2d 73 79  he local file-sy
12f31 73 74 65 6d 2c 20 74 68 65 20 75 73 65 72 20 62  stem, the user b
12f32 65 69 6e 67 0a 2f 2f 20 20 20 63 6f 6d 70 6c 65  eing.//   comple
12f33 74 65 6c 79 20 75 6e 61 77 61 72 65 20 6f 66 20  tely unaware of 
12f34 74 68 69 73 0a 2f 2f 20 2d 20 42 6c 6f 62 46 72  this.// - BlobFr
12f35 6f 6d 46 69 6c 65 3a 20 73 6f 6d 65 20 66 69 6c  omFile: some fil
12f36 65 20 63 6f 75 6c 64 20 62 65 20 6d 61 6c 69 63  e could be malic
12f37 69 6f 75 73 6c 79 20 22 73 74 6f 6c 65 6e 22 20  iously "stolen" 
12f38 66 72 6f 6d 20 74 68 65 20 6c 6f 63 61 6c 0a 2f  from the local./
12f39 2f 20 20 20 66 69 6c 65 20 73 79 73 74 65 6d 20  /   file system 
12f3a 61 6e 64 20 74 68 65 6e 20 69 6e 73 65 74 65 64  and then inseted
12f3b 20 69 6e 74 6f 20 74 68 65 20 44 42 0a 2f 2f 20   into the DB.// 
12f3c 2d 20 74 68 65 20 73 61 6d 65 20 69 73 20 66 6f  - the same is fo
12f3d 72 20 58 42 5f 4c 6f 61 64 58 4d 4c 20 61 6e 64  r XB_LoadXML and
12f3e 20 58 42 5f 53 74 6f 72 65 58 4d 4c 0a 2f 2f 20   XB_StoreXML.// 
12f3f 2d 20 45 78 70 6f 72 74 44 58 46 20 63 6f 75 6c  - ExportDXF coul
12f40 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 66 6c  d potentially fl
12f41 6f 6f 64 20 74 68 65 20 6c 6f 63 61 6c 20 66 69  ood the local fi
12f42 6c 65 2d 73 79 73 74 65 6d 20 62 79 0a 2f 2f 20  le-system by.// 
12f43 20 20 6f 75 74 70 75 74 74 69 6e 67 20 61 20 68    outputting a h
12f44 75 67 65 20 73 69 7a 65 20 6f 66 20 64 61 74 61  uge size of data
12f45 0a 2f 2f 0a 2f 2f 20 73 6f 20 62 79 20 64 65 66  .//.// so by def
12f46 61 75 6c 74 20 73 75 63 68 20 66 75 6e 63 74 69  ault such functi
12f47 6f 6e 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ons are disabled
12f48 2e 0a 2f 2f 20 69 66 20 66 6f 72 20 61 6e 79 20  ..// if for any 
12f49 67 6f 6f 64 2f 6c 65 67 69 74 69 6d 61 74 65 20  good/legitimate 
12f4a 72 65 61 73 6f 6e 20 74 68 65 20 75 73 65 72 20  reason the user 
12f4b 72 65 61 6c 6c 79 20 77 61 6e 74 73 20 74 6f 20  really wants to 
12f4c 65 6e 61 62 6c 65 20 74 68 65 6d 0a 2f 2f 20 74  enable them.// t
12f4d 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 6e 76  he following env
12f4e 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
12f4f 65 20 68 61 73 20 74 6f 20 62 65 20 65 78 70 6c  e has to be expl
12f50 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 3a  icitly declared:
12f51 0a 2f 2f 0a 2f 2f 20 53 50 41 54 49 41 4c 49 54  .//.// SPATIALIT
12f52 45 5f 53 45 43 55 52 49 54 59 3d 72 65 6c 61 78  E_SECURITY=relax
12f53 65 64 0a 2f 2f 0a 2a 2f 0a 20 20 20 20 73 65 63  ed.//.*/.    sec
12f54 75 72 69 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65  urity_level = ge
12f55 74 65 6e 76 20 28 22 53 50 41 54 49 41 4c 49 54  tenv ("SPATIALIT
12f56 45 5f 53 45 43 55 52 49 54 59 22 29 3b 0a 20 20  E_SECURITY");.  
12f57 20 20 69 66 20 28 73 65 63 75 72 69 74 79 5f 6c    if (security_l
12f58 65 76 65 6c 20 3d 3d 20 4e 55 4c 4c 29 0a 09 3b  evel == NULL)..;
12f59 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 74  .    else if (st
12f5a 72 63 61 73 65 63 6d 70 20 28 73 65 63 75 72 69  rcasecmp (securi
12f5b 74 79 5f 6c 65 76 65 6c 2c 20 22 72 65 6c 61 78  ty_level, "relax
12f5c 65 64 22 29 20 3d 3d 20 30 29 0a 20 20 20 20 20  ed") == 0).     
12f5d 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72   {..  sqlite3_cr
12f5e 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
12f5f 20 28 64 62 2c 20 22 42 6c 6f 62 46 72 6f 6d 46   (db, "BlobFromF
12f60 69 6c 65 22 2c 20 31 2c 0a 09 09 09 09 20 20 20  ile", 1,.....   
12f61 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12f62 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12f63 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
12f64 20 20 20 20 66 6e 63 74 5f 42 6c 6f 62 46 72 6f      fnct_BlobFro
12f65 6d 46 69 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b  mFile, 0, 0, 0);
12f66 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
12f67 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
12f68 64 62 2c 20 22 42 6c 6f 62 54 6f 46 69 6c 65 22  db, "BlobToFile"
12f69 2c 20 32 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 2,.....      S
12f6a 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
12f6b 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
12f6c 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20  C, 0,.....      
12f6d 66 6e 63 74 5f 42 6c 6f 62 54 6f 46 69 6c 65 2c  fnct_BlobToFile,
12f6e 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 69 66 6e   0, 0, 0);..#ifn
12f6f 64 65 66 20 4f 4d 49 54 5f 47 45 4f 53 09 09 2f  def OMIT_GEOS../
12f70 2a 20 6f 6e 6c 79 20 69 66 20 47 45 4f 53 20 69  * only if GEOS i
12f71 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 0a 09 20  s enabled */... 
12f72 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12f73 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12f74 20 22 49 6d 70 6f 72 74 44 58 46 22 2c 20 31 2c   "ImportDXF", 1,
12f75 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
12f76 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12f77 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09  DETERMINISTIC,..
12f78 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20  ...      cache, 
12f79 66 6e 63 74 5f 49 6d 70 6f 72 74 44 58 46 2c 20  fnct_ImportDXF, 
12f7a 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
12f7b 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12f7c 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6d  tion_v2 (db, "Im
12f7d 70 6f 72 74 44 58 46 22 2c 20 38 2c 0a 09 09 09  portDXF", 8,....
12f7e 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
12f7f 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
12f80 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20  RMINISTIC,..... 
12f81 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74       cache, fnct
12f82 5f 49 6d 70 6f 72 74 44 58 46 2c 20 30 2c 20 30  _ImportDXF, 0, 0
12f83 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
12f84 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12f85 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
12f86 44 58 46 66 72 6f 6d 44 69 72 22 2c 20 31 2c 0a  DXFfromDir", 1,.
12f87 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
12f88 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12f89 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09  ETERMINISTIC,...
12f8a 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66  ..      cache, f
12f8b 6e 63 74 5f 49 6d 70 6f 72 74 44 58 46 66 72 6f  nct_ImportDXFfro
12f8c 6d 44 69 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mDir, 0, 0, 0);.
12f8d 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
12f8e 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
12f8f 62 2c 20 22 49 6d 70 6f 72 74 44 58 46 66 72 6f  b, "ImportDXFfro
12f90 6d 44 69 72 22 2c 20 38 2c 0a 09 09 09 09 20 20  mDir", 8,.....  
12f91 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
12f92 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
12f93 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
12f94 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 49 6d    cache, fnct_Im
12f95 70 6f 72 74 44 58 46 66 72 6f 6d 44 69 72 2c 20  portDXFfromDir, 
12f96 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 65 6e 64 69  0, 0, 0);..#endi
12f97 66 20 2f 2a 20 47 45 4f 53 20 65 6e 61 62 6c 65  f /* GEOS enable
12f98 64 20 2a 2f 0a 0a 09 20 20 73 71 6c 69 74 65 33  d */...  sqlite3
12f99 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12f9a 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f 72 74  _v2 (db, "Export
12f9b 44 58 46 22 2c 20 39 2c 0a 09 09 09 09 20 20 20  DXF", 9,.....   
12f9c 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12f9d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12f9e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
12f9f 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 45 78 70   cache, fnct_Exp
12fa0 6f 72 74 44 58 46 2c 20 30 2c 20 30 2c 20 30 29  ortDXF, 0, 0, 0)
12fa1 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
12fa2 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
12fa3 28 64 62 2c 20 22 45 78 70 6f 72 74 44 58 46 22  (db, "ExportDXF"
12fa4 2c 20 31 30 2c 0a 09 09 09 09 20 20 20 20 20 20  , 10,.....      
12fa5 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
12fa6 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
12fa7 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
12fa8 63 68 65 2c 20 66 6e 63 74 5f 45 78 70 6f 72 74  che, fnct_Export
12fa9 44 58 46 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  DXF, 0, 0, 0);..
12faa 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 49 43 4f  #ifndef OMIT_ICO
12fab 4e 56 09 09 2f 2a 20 49 43 4f 4e 56 20 69 73 20  NV../* ICONV is 
12fac 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 0a 09 20  supported */... 
12fad 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12fae 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12faf 20 22 49 6d 70 6f 72 74 44 42 46 22 2c 20 33 2c   "ImportDBF", 3,
12fb0 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
12fb1 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12fb2 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12fb3 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
12fb4 5f 49 6d 70 6f 72 74 44 42 46 2c 20 30 2c 20 30  _ImportDBF, 0, 0
12fb5 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
12fb6 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12fb7 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
12fb8 44 42 46 22 2c 20 34 2c 0a 09 09 09 09 20 20 20  DBF", 4,.....   
12fb9 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12fba 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12fbb 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
12fbc 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74 44      fnct_ImportD
12fbd 42 46 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  BF, 0, 0, 0);.. 
12fbe 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12fbf 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12fc0 20 22 49 6d 70 6f 72 74 44 42 46 22 2c 20 35 2c   "ImportDBF", 5,
12fc1 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
12fc2 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12fc3 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12fc4 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
12fc5 5f 49 6d 70 6f 72 74 44 42 46 2c 20 30 2c 20 30  _ImportDBF, 0, 0
12fc6 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
12fc7 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12fc8 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
12fc9 44 42 46 22 2c 20 36 2c 0a 09 09 09 09 20 20 20  DBF", 6,.....   
12fca 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12fcb 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12fcc 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
12fcd 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74 44      fnct_ImportD
12fce 42 46 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  BF, 0, 0, 0);.. 
12fcf 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12fd0 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12fd1 20 22 45 78 70 6f 72 74 44 42 46 22 2c 20 33 2c   "ExportDBF", 3,
12fd2 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
12fd3 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12fd4 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12fd5 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
12fd6 5f 45 78 70 6f 72 74 44 42 46 2c 20 30 2c 20 30  _ExportDBF, 0, 0
12fd7 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
12fd8 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12fd9 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f 72 74  _v2 (db, "Export
12fda 44 42 46 22 2c 20 34 2c 0a 09 09 09 09 20 20 20  DBF", 4,.....   
12fdb 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12fdc 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12fdd 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
12fde 20 20 20 20 66 6e 63 74 5f 45 78 70 6f 72 74 44      fnct_ExportD
12fdf 42 46 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  BF, 0, 0, 0);.. 
12fe0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12fe1 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12fe2 20 22 49 6d 70 6f 72 74 53 48 50 22 2c 20 33 2c   "ImportSHP", 3,
12fe3 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
12fe4 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12fe5 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12fe6 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
12fe7 5f 49 6d 70 6f 72 74 53 48 50 2c 20 30 2c 20 30  _ImportSHP, 0, 0
12fe8 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
12fe9 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12fea 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
12feb 53 48 50 22 2c 20 34 2c 0a 09 09 09 09 20 20 20  SHP", 4,.....   
12fec 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12fed 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12fee 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
12fef 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74 53      fnct_ImportS
12ff0 48 50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  HP, 0, 0, 0);.. 
12ff1 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12ff2 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
12ff3 20 22 49 6d 70 6f 72 74 53 48 50 22 2c 20 35 2c   "ImportSHP", 5,
12ff4 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
12ff5 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12ff6 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12ff7 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
12ff8 5f 49 6d 70 6f 72 74 53 48 50 2c 20 30 2c 20 30  _ImportSHP, 0, 0
12ff9 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
12ffa 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12ffb 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
12ffc 53 48 50 22 2c 20 36 2c 0a 09 09 09 09 20 20 20  SHP", 6,.....   
12ffd 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
12ffe 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
12fff 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
13000 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74 53      fnct_ImportS
13001 48 50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  HP, 0, 0, 0);.. 
13002 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13003 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13004 20 22 49 6d 70 6f 72 74 53 48 50 22 2c 20 37 2c   "ImportSHP", 7,
13005 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
13006 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13007 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13008 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
13009 5f 49 6d 70 6f 72 74 53 48 50 2c 20 30 2c 20 30  _ImportSHP, 0, 0
1300a 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
1300b 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1300c 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
1300d 53 48 50 22 2c 20 38 2c 0a 09 09 09 09 20 20 20  SHP", 8,.....   
1300e 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
1300f 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13010 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20  ISTIC, 0,.....  
13011 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74 53      fnct_ImportS
13012 48 50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  HP, 0, 0, 0);.. 
13013 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13014 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13015 20 22 49 6d 70 6f 72 74 53 48 50 22 2c 20 39 2c   "ImportSHP", 9,
13016 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
13017 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13018 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13019 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74  ,.....      fnct
1301a 5f 49 6d 70 6f 72 74 53 48 50 2c 20 30 2c 20 30  _ImportSHP, 0, 0
1301b 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
1301c 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1301d 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74  _v2 (db, "Import
1301e 53 48 50 22 2c 20 31 30 2c 0a 09 09 09 09 20 20  SHP", 10,.....  
1301f 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
13020 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13021 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20  NISTIC, 0,..... 
13022 20 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74       fnct_Import
13023 53 48 50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09  SHP, 0, 0, 0);..
13024 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13025 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13026 2c 20 22 49 6d 70 6f 72 74 53 48 50 22 2c 20 31  , "ImportSHP", 1
13027 31 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c  1,.....      SQL
13028 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13029 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1302a 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e   0,.....      fn
1302b 63 74 5f 49 6d 70 6f 72 74 53 48 50 2c 20 30 2c  ct_ImportSHP, 0,
1302c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1302d 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1302e 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6d 70 6f  on_v2 (db, "Impo
1302f 72 74 53 48 50 22 2c 20 31 32 2c 0a 09 09 09 09  rtSHP", 12,.....
13030 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
13031 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13032 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
13033 09 20 20 20 20 20 20 66 6e 63 74 5f 49 6d 70 6f  .      fnct_Impo
13034 72 74 53 48 50 2c 20 30 2c 20 30 2c 20 30 29 3b  rtSHP, 0, 0, 0);
13035 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
13036 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13037 64 62 2c 20 22 49 6d 70 6f 72 74 53 48 50 22 2c  db, "ImportSHP",
13038 20 31 33 2c 0a 09 09 09 09 20 20 20 20 20 20 53   13,.....      S
13039 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1303a 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1303b 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20  C, 0,.....      
1303c 66 6e 63 74 5f 49 6d 70 6f 72 74 53 48 50 2c 20  fnct_ImportSHP, 
1303d 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
1303e 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1303f 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 6d  tion_v2 (db, "Im
13040 70 6f 72 74 53 48 50 22 2c 20 31 34 2c 0a 09 09  portSHP", 14,...
13041 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
13042 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13043 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
13044 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 49 6d  ...      fnct_Im
13045 70 6f 72 74 53 48 50 2c 20 30 2c 20 30 2c 20 30  portSHP, 0, 0, 0
13046 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
13047 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13048 20 28 64 62 2c 20 22 45 78 70 6f 72 74 53 48 50   (db, "ExportSHP
13049 22 2c 20 34 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 4,.....      
1304a 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1304b 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1304c 49 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  IC, 0,.....     
1304d 20 66 6e 63 74 5f 45 78 70 6f 72 74 53 48 50 2c   fnct_ExportSHP,
1304e 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71   0, 0, 0);..  sq
1304f 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13050 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45  ction_v2 (db, "E
13051 78 70 6f 72 74 53 48 50 22 2c 20 35 2c 0a 09 09  xportSHP", 5,...
13052 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
13053 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13054 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
13055 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 45 78  ...      fnct_Ex
13056 70 6f 72 74 53 48 50 2c 20 30 2c 20 30 2c 20 30  portSHP, 0, 0, 0
13057 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
13058 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13059 20 28 64 62 2c 20 22 45 78 70 6f 72 74 53 48 50   (db, "ExportSHP
1305a 22 2c 20 36 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 6,.....      
1305b 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1305c 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1305d 49 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  IC, 0,.....     
1305e 20 66 6e 63 74 5f 45 78 70 6f 72 74 53 48 50 2c   fnct_ExportSHP,
1305f 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 65 6e 64   0, 0, 0);..#end
13060 69 66 20 2f 2a 20 49 43 4f 4e 56 20 65 6e 61 62  if /* ICONV enab
13061 6c 65 64 20 2a 2f 0a 0a 09 20 20 73 71 6c 69 74  led */...  sqlit
13062 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13063 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f  on_v2 (db, "Expo
13064 72 74 4b 4d 4c 22 2c 20 33 2c 0a 09 09 09 09 20  rtKML", 3,..... 
13065 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
13066 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13067 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
13068 20 20 20 20 20 20 66 6e 63 74 5f 45 78 70 6f 72        fnct_Expor
13069 74 4b 4d 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tKML, 0, 0, 0);.
1306a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
1306b 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1306c 62 2c 20 22 45 78 70 6f 72 74 4b 4d 4c 22 2c 20  b, "ExportKML", 
1306d 34 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c  4,.....      SQL
1306e 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1306f 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13070 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e   0,.....      fn
13071 63 74 5f 45 78 70 6f 72 74 4b 4d 4c 2c 20 30 2c  ct_ExportKML, 0,
13072 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
13073 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13074 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f  on_v2 (db, "Expo
13075 72 74 4b 4d 4c 22 2c 20 35 2c 0a 09 09 09 09 20  rtKML", 5,..... 
13076 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
13077 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13078 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
13079 20 20 20 20 20 20 66 6e 63 74 5f 45 78 70 6f 72        fnct_Expor
1307a 74 4b 4d 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tKML, 0, 0, 0);.
1307b 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
1307c 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1307d 62 2c 20 22 45 78 70 6f 72 74 4b 4d 4c 22 2c 20  b, "ExportKML", 
1307e 36 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c  6,.....      SQL
1307f 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13080 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13081 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e   0,.....      fn
13082 63 74 5f 45 78 70 6f 72 74 4b 4d 4c 2c 20 30 2c  ct_ExportKML, 0,
13083 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
13084 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13085 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f  on_v2 (db, "Expo
13086 72 74 47 65 6f 4a 53 4f 4e 22 2c 20 33 2c 0a 09  rtGeoJSON", 3,..
13087 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
13088 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13089 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
1308a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 45  ....      fnct_E
1308b 78 70 6f 72 74 47 65 6f 4a 53 4f 4e 2c 20 30 2c  xportGeoJSON, 0,
1308c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1308d 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1308e 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f  on_v2 (db, "Expo
1308f 72 74 47 65 6f 4a 53 4f 4e 22 2c 20 34 2c 0a 09  rtGeoJSON", 4,..
13090 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
13091 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13092 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
13093 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 45  ....      fnct_E
13094 78 70 6f 72 74 47 65 6f 4a 53 4f 4e 2c 20 30 2c  xportGeoJSON, 0,
13095 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
13096 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13097 6f 6e 5f 76 32 20 28 64 62 2c 20 22 45 78 70 6f  on_v2 (db, "Expo
13098 72 74 47 65 6f 4a 53 4f 4e 22 2c 20 35 2c 0a 09  rtGeoJSON", 5,..
13099 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
1309a 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1309b 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
1309c 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 45  ....      fnct_E
1309d 78 70 6f 72 74 47 65 6f 4a 53 4f 4e 2c 20 30 2c  xportGeoJSON, 0,
1309e 20 30 2c 20 30 29 3b 0a 0a 09 20 20 73 71 6c 69   0, 0);...  sqli
1309f 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
130a0 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 65 76 61  ion_v2 (db, "eva
130a1 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
130a2 46 38 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  F8, 0,.....     
130a3 20 66 6e 63 74 5f 45 76 61 6c 46 75 6e 63 2c 20   fnct_EvalFunc, 
130a4 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
130a5 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
130a6 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 65 76  tion_v2 (db, "ev
130a7 61 6c 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  al", 2, SQLITE_U
130a8 54 46 38 2c 20 30 2c 0a 09 09 09 09 20 20 20 20  TF8, 0,.....    
130a9 20 20 66 6e 63 74 5f 45 76 61 6c 46 75 6e 63 2c    fnct_EvalFunc,
130aa 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 09 20 20 73   0, 0, 0);...  s
130ab 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
130ac 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
130ad 53 71 6c 50 72 6f 63 5f 46 72 6f 6d 46 69 6c 65  SqlProc_FromFile
130ae 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
130af 38 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63  8,.....      cac
130b0 68 65 2c 20 66 6e 63 74 5f 73 70 5f 66 72 6f 6d  he, fnct_sp_from
130b1 5f 66 69 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b  _file, 0, 0, 0);
130b2 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
130b3 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
130b4 64 62 2c 20 22 53 71 6c 50 72 6f 63 5f 46 72 6f  db, "SqlProc_Fro
130b5 6d 46 69 6c 65 22 2c 20 32 2c 20 53 51 4c 49 54  mFile", 2, SQLIT
130b6 45 5f 55 54 46 38 2c 0a 09 09 09 09 20 20 20 20  E_UTF8,.....    
130b7 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 73 70    cache, fnct_sp
130b8 5f 66 72 6f 6d 5f 66 69 6c 65 2c 20 30 2c 20 30  _from_file, 0, 0
130b9 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
130ba 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
130bb 5f 76 32 20 28 64 62 2c 20 22 53 71 6c 50 72 6f  _v2 (db, "SqlPro
130bc 63 5f 53 65 74 4c 6f 67 66 69 6c 65 22 2c 20 31  c_SetLogfile", 1
130bd 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
130be 54 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 20  TE_UTF8, cache, 
130bf 66 6e 63 74 5f 73 70 5f 73 65 74 5f 6c 6f 67 66  fnct_sp_set_logf
130c0 69 6c 65 2c 0a 09 09 09 09 20 20 20 20 20 20 30  ile,.....      0
130c1 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69  , 0, 0);..  sqli
130c2 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
130c3 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 71 6c  ion_v2 (db, "Sql
130c4 50 72 6f 63 5f 53 65 74 4c 6f 67 66 69 6c 65 22  Proc_SetLogfile"
130c5 2c 20 32 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 2,.....      S
130c6 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68  QLITE_UTF8, cach
130c7 65 2c 20 66 6e 63 74 5f 73 70 5f 73 65 74 5f 6c  e, fnct_sp_set_l
130c8 6f 67 66 69 6c 65 2c 0a 09 09 09 09 20 20 20 20  ogfile,.....    
130c9 20 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 69 66    0, 0, 0);..#if
130ca 64 65 66 20 45 4e 41 42 4c 45 5f 4c 49 42 58 4d  def ENABLE_LIBXM
130cb 4c 32 09 09 2f 2a 20 69 6e 63 6c 75 64 69 6e 67  L2../* including
130cc 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a 0a 09 20 20   LIBXML2 */...  
130cd 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
130ce 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
130cf 22 58 42 5f 4c 6f 61 64 58 4d 4c 22 2c 20 31 2c  "XB_LoadXML", 1,
130d0 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
130d1 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
130d2 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09  DETERMINISTIC,..
130d3 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20  ...      cache, 
130d4 66 6e 63 74 5f 58 42 5f 4c 6f 61 64 58 4d 4c 2c  fnct_XB_LoadXML,
130d5 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71   0, 0, 0);..  sq
130d6 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
130d7 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58  ction_v2 (db, "X
130d8 42 5f 53 74 6f 72 65 58 4d 4c 22 2c 20 32 2c 0a  B_StoreXML", 2,.
130d9 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
130da 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
130db 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
130dc 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f  .....      fnct_
130dd 58 42 5f 53 74 6f 72 65 58 4d 4c 2c 20 30 2c 20  XB_StoreXML, 0, 
130de 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65  0, 0);..  sqlite
130df 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
130e0 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 53 74  n_v2 (db, "XB_St
130e1 6f 72 65 58 4d 4c 22 2c 20 33 2c 0a 09 09 09 09  oreXML", 3,.....
130e2 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
130e3 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
130e4 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
130e5 09 20 20 20 20 20 20 66 6e 63 74 5f 58 42 5f 53  .      fnct_XB_S
130e6 74 6f 72 65 58 4d 4c 2c 20 30 2c 20 30 2c 20 30  toreXML, 0, 0, 0
130e7 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
130e8 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
130e9 20 28 64 62 2c 20 22 49 6d 70 6f 72 74 57 46 53   (db, "ImportWFS
130ea 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 3,.....      
130eb 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
130ec 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
130ed 49 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  IC, 0,.....     
130ee 20 66 6e 63 74 5f 49 6d 70 6f 72 74 57 46 53 2c   fnct_ImportWFS,
130ef 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71   0, 0, 0);..  sq
130f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
130f1 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
130f2 6d 70 6f 72 74 57 46 53 22 2c 20 34 2c 0a 09 09  mportWFS", 4,...
130f3 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
130f4 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
130f5 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
130f6 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 49 6d  ...      fnct_Im
130f7 70 6f 72 74 57 46 53 2c 20 30 2c 20 30 2c 20 30  portWFS, 0, 0, 0
130f8 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
130f9 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
130fa 20 28 64 62 2c 20 22 49 6d 70 6f 72 74 57 46 53   (db, "ImportWFS
130fb 22 2c 20 35 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 5,.....      
130fc 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
130fd 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
130fe 49 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  IC, 0,.....     
130ff 20 66 6e 63 74 5f 49 6d 70 6f 72 74 57 46 53 2c   fnct_ImportWFS,
13100 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71   0, 0, 0);..  sq
13101 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13102 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
13103 6d 70 6f 72 74 57 46 53 22 2c 20 36 2c 0a 09 09  mportWFS", 6,...
13104 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
13105 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13106 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
13107 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 49 6d  ...      fnct_Im
13108 70 6f 72 74 57 46 53 2c 20 30 2c 20 30 2c 20 30  portWFS, 0, 0, 0
13109 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
1310a 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1310b 20 28 64 62 2c 20 22 49 6d 70 6f 72 74 57 46 53   (db, "ImportWFS
1310c 22 2c 20 37 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 7,.....      
1310d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1310e 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1310f 49 43 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  IC, 0,.....     
13110 20 66 6e 63 74 5f 49 6d 70 6f 72 74 57 46 53 2c   fnct_ImportWFS,
13111 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 65 6e 64   0, 0, 0);..#end
13112 69 66 20 2f 2a 20 65 6e 64 20 69 6e 63 6c 75 64  if /* end includ
13113 69 6e 67 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a 0a  ing LIBXML2 */..
13114 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 46 52 45  #ifndef OMIT_FRE
13115 45 58 4c 09 09 2f 2a 20 46 52 45 45 58 4c 20 69  EXL../* FREEXL i
13116 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 20 20  s enabled */..  
13117 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13118 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13119 22 49 6d 70 6f 72 74 58 4c 53 22 2c 20 32 2c 0a  "ImportXLS", 2,.
1311a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
1311b 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1311c 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1311d 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f  .....      fnct_
1311e 49 6d 70 6f 72 74 58 4c 53 2c 20 30 2c 20 30 2c  ImportXLS, 0, 0,
1311f 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f   0);..  sqlite3_
13120 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13121 76 32 20 28 64 62 2c 20 22 49 6d 70 6f 72 74 58  v2 (db, "ImportX
13122 4c 53 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20  LS", 3,.....    
13123 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
13124 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13125 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 20 20 20  STIC, 0,.....   
13126 20 20 20 66 6e 63 74 5f 49 6d 70 6f 72 74 58 4c     fnct_ImportXL
13127 53 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20  S, 0, 0, 0);..  
13128 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13129 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1312a 22 49 6d 70 6f 72 74 58 4c 53 22 2c 20 34 2c 0a  "ImportXLS", 4,.
1312b 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
1312c 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1312d 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1312e 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f  .....      fnct_
1312f 49 6d 70 6f 72 74 58 4c 53 2c 20 30 2c 20 30 2c  ImportXLS, 0, 0,
13130 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65   0);.#endif /* e
13131 6e 64 20 46 52 45 45 58 4c 20 73 75 70 70 6f 72  nd FREEXL suppor
13132 74 20 2a 2f 0a 0a 20 20 20 20 20 20 7d 0a 0a 0a  t */..      }...
13133 2f 2a 20 67 6c 6f 62 61 6c 20 73 65 74 74 69 6e  /* global settin
13134 67 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20 45 4e  gs */..#ifdef EN
13135 41 42 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45 09  ABLE_GEOPACKAGE.
13136 2f 2a 20 47 45 4f 50 41 43 4b 41 47 45 20 65 6e  /* GEOPACKAGE en
13137 61 62 6c 65 64 3a 20 73 75 70 70 6f 72 74 69 6e  abled: supportin
13138 67 20 47 50 4b 47 20 67 65 6f 6d 65 74 72 69 65  g GPKG geometrie
13139 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
1313a 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1313b 5f 76 32 20 28 64 62 2c 20 22 45 6e 61 62 6c 65  _v2 (db, "Enable
1313c 47 70 6b 67 4d 6f 64 65 22 2c 20 30 2c 0a 09 09  GpkgMode", 0,...
1313d 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1313e 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1313f 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13140 09 66 6e 63 74 5f 65 6e 61 62 6c 65 47 70 6b 67  .fnct_enableGpkg
13141 4d 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Mode, 0, 0, 0);.
13142 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13143 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13144 64 62 2c 20 22 44 69 73 61 62 6c 65 47 70 6b 67  db, "DisableGpkg
13145 4d 6f 64 65 22 2c 20 30 2c 0a 09 09 09 09 53 51  Mode", 0,.....SQ
13146 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13147 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13148 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13149 74 5f 64 69 73 61 62 6c 65 47 70 6b 67 4d 6f 64  t_disableGpkgMod
1314a 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
1314b 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1314c 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1314d 20 22 47 65 74 47 70 6b 67 4d 6f 64 65 22 2c 20   "GetGpkgMode", 
1314e 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  0,.....SQLITE_UT
1314f 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13150 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13151 2c 0a 09 09 09 09 66 6e 63 74 5f 67 65 74 47 70  ,.....fnct_getGp
13152 6b 67 4d 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29  kgMode, 0, 0, 0)
13153 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13154 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13155 20 28 64 62 2c 20 22 45 6e 61 62 6c 65 47 70 6b   (db, "EnableGpk
13156 67 41 6d 70 68 69 62 69 6f 75 73 4d 6f 64 65 22  gAmphibiousMode"
13157 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
13158 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13159 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1315a 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 65 6e 61  he,.....fnct_ena
1315b 62 6c 65 47 70 6b 67 41 6d 70 68 69 62 69 6f 75  bleGpkgAmphibiou
1315c 73 4d 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29 3b  sMode, 0, 0, 0);
1315d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1315e 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1315f 28 64 62 2c 20 22 44 69 73 61 62 6c 65 47 70 6b  (db, "DisableGpk
13160 67 41 6d 70 68 69 62 69 6f 75 73 4d 6f 64 65 22  gAmphibiousMode"
13161 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 0,.....SQLITE_
13162 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13163 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13164 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 64 69 73  he,.....fnct_dis
13165 61 62 6c 65 47 70 6b 67 41 6d 70 68 69 62 69 6f  ableGpkgAmphibio
13166 75 73 4d 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29  usMode, 0, 0, 0)
13167 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13168 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13169 20 28 64 62 2c 20 22 47 65 74 47 70 6b 67 41 6d   (db, "GetGpkgAm
1316a 70 68 69 62 69 6f 75 73 4d 6f 64 65 22 2c 20 30  phibiousMode", 0
1316b 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1316c 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1316d 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1316e 0a 09 09 09 09 66 6e 63 74 5f 67 65 74 47 70 6b  .....fnct_getGpk
1316f 67 41 6d 70 68 69 62 69 6f 75 73 4d 6f 64 65 2c  gAmphibiousMode,
13170 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
13171 66 20 2f 2a 20 65 6e 64 20 47 50 4b 47 20 63 6f  f /* end GPKG co
13172 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a 0a 20 20  nditional */..  
13173 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13174 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13175 2c 20 22 53 65 74 44 65 63 69 6d 61 6c 50 72 65  , "SetDecimalPre
13176 63 69 73 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09  cision", 1,.....
13177 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13178 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13179 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
1317a 6e 63 74 5f 73 65 74 44 65 63 69 6d 61 6c 50 72  nct_setDecimalPr
1317b 65 63 69 73 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  ecision, 0, 0, 0
1317c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1317d 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1317e 32 20 28 64 62 2c 20 22 47 65 74 44 65 63 69 6d  2 (db, "GetDecim
1317f 61 6c 50 72 65 63 69 73 69 6f 6e 22 2c 20 30 2c  alPrecision", 0,
13180 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13181 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13182 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13183 09 09 09 09 66 6e 63 74 5f 67 65 74 44 65 63 69  ....fnct_getDeci
13184 6d 61 6c 50 72 65 63 69 73 69 6f 6e 2c 20 30 2c  malPrecision, 0,
13185 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c   0, 0);..    sql
13186 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13187 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 2a 41  tion_v2 (db, "*A
13188 64 64 2d 53 68 61 70 65 66 69 6c 65 2b 45 78 74  dd-Shapefile+Ext
13189 65 6e 74 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c  ent", 6,.....SQL
1318a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1318b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1318c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1318d 5f 61 64 64 53 68 61 70 65 66 69 6c 65 45 78 74  _addShapefileExt
1318e 65 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ent, 0, 0, 0);. 
1318f 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13190 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13191 62 2c 20 22 2a 52 65 6d 6f 76 65 2d 53 68 61 70  b, "*Remove-Shap
13192 65 66 69 6c 65 2b 45 78 74 65 6e 74 22 2c 20 31  efile+Extent", 1
13193 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13194 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13195 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13196 0a 09 09 09 09 66 6e 63 74 5f 72 65 6d 6f 76 65  .....fnct_remove
13197 53 68 61 70 65 66 69 6c 65 45 78 74 65 6e 74 2c  ShapefileExtent,
13198 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13199 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1319a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1319b 47 65 74 53 68 61 70 65 66 69 6c 65 45 78 74 65  GetShapefileExte
1319c 6e 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  nt", 1,.....SQLI
1319d 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1319e 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1319f 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
131a0 67 65 74 53 68 61 70 65 66 69 6c 65 45 78 74 65  getShapefileExte
131a1 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20  nt, 0, 0, 0);.. 
131a2 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
131a3 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
131a4 62 2c 20 22 49 73 4c 6f 77 41 53 43 49 49 22 2c  b, "IsLowASCII",
131a5 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
131a6 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
131a7 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
131a8 09 09 09 66 6e 63 74 5f 69 73 4c 6f 77 41 53 43  ...fnct_isLowASC
131a9 49 49 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20  II, 0, 0, 0);.. 
131aa 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
131ab 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
131ac 62 2c 20 22 49 73 54 69 6e 79 50 6f 69 6e 74 45  b, "IsTinyPointE
131ad 6e 61 62 6c 65 64 22 2c 20 30 2c 0a 09 09 09 09  nabled", 0,.....
131ae 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
131af 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
131b0 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
131b1 6e 63 74 5f 69 73 54 69 6e 79 50 6f 69 6e 74 45  nct_isTinyPointE
131b2 6e 61 62 6c 65 64 2c 20 30 2c 20 30 2c 20 30 29  nabled, 0, 0, 0)
131b3 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
131b4 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
131b5 20 28 64 62 2c 20 22 45 6e 61 62 6c 65 54 69 6e   (db, "EnableTin
131b6 79 50 6f 69 6e 74 22 2c 20 30 2c 0a 09 09 09 09  yPoint", 0,.....
131b7 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
131b8 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
131b9 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
131ba 6e 63 74 5f 65 6e 61 62 6c 65 54 69 6e 79 50 6f  nct_enableTinyPo
131bb 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  int, 0, 0, 0);. 
131bc 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
131bd 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
131be 62 2c 20 22 44 69 73 61 62 6c 65 54 69 6e 79 50  b, "DisableTinyP
131bf 6f 69 6e 74 22 2c 20 30 2c 0a 09 09 09 09 53 51  oint", 0,.....SQ
131c0 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
131c1 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
131c2 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
131c3 74 5f 64 69 73 61 62 6c 65 54 69 6e 79 50 6f 69  t_disableTinyPoi
131c4 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20  nt, 0, 0, 0);.. 
131c5 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
131c6 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
131c7 62 2c 20 22 4d 61 6b 65 53 74 72 69 6e 67 4c 69  b, "MakeStringLi
131c8 73 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  st", 1,.....SQLI
131c9 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
131ca 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
131cb 30 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 6d  0, 0,.....fnct_m
131cc 61 6b 65 5f 73 74 72 69 6e 67 5f 6c 69 73 74 5f  ake_string_list_
131cd 73 74 65 70 2c 0a 09 09 09 09 66 6e 63 74 5f 6d  step,.....fnct_m
131ce 61 6b 65 5f 73 74 72 69 6e 67 5f 6c 69 73 74 5f  ake_string_list_
131cf 66 69 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73  final, 0);.    s
131d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
131d1 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
131d2 4d 61 6b 65 53 74 72 69 6e 67 4c 69 73 74 22 2c  MakeStringList",
131d3 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
131d4 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
131d5 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 20 30  ERMINISTIC, 0, 0
131d6 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61 6b 65 5f  ,.....fnct_make_
131d7 73 74 72 69 6e 67 5f 6c 69 73 74 5f 73 74 65 70  string_list_step
131d8 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61 6b 65 5f  ,.....fnct_make_
131d9 73 74 72 69 6e 67 5f 6c 69 73 74 5f 66 69 6e 61  string_list_fina
131da 6c 2c 20 30 29 3b 0a 0a 2f 2a 20 73 6f 6d 65 20  l, 0);../* some 
131db 47 65 6f 64 65 73 69 63 20 66 75 6e 63 74 69 6f  Geodesic functio
131dc 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ns */.    sqlite
131dd 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
131de 6e 5f 76 32 20 28 64 62 2c 20 22 47 72 65 61 74  n_v2 (db, "Great
131df 43 69 72 63 6c 65 4c 65 6e 67 74 68 22 2c 20 31  CircleLength", 1
131e0 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
131e1 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
131e2 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
131e3 0a 09 09 09 09 66 6e 63 74 5f 47 72 65 61 74 43  .....fnct_GreatC
131e4 69 72 63 6c 65 4c 65 6e 67 74 68 2c 20 30 2c 20  ircleLength, 0, 
131e5 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
131e6 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
131e7 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 64  on_v2 (db, "Geod
131e8 65 73 69 63 4c 65 6e 67 74 68 22 2c 20 31 2c 0a  esicLength", 1,.
131e9 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
131ea 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
131eb 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
131ec 09 09 09 66 6e 63 74 5f 47 65 6f 64 65 73 69 63  ...fnct_Geodesic
131ed 4c 65 6e 67 74 68 2c 20 30 2c 20 30 2c 20 30 29  Length, 0, 0, 0)
131ee 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
131ef 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
131f0 20 28 64 62 2c 20 22 47 65 6f 64 65 73 69 63 41   (db, "GeodesicA
131f1 72 63 4c 65 6e 67 74 68 22 2c 20 32 2c 0a 09 09  rcLength", 2,...
131f2 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
131f3 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
131f4 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
131f5 09 66 6e 63 74 5f 47 65 6f 64 65 73 69 63 41 72  .fnct_GeodesicAr
131f6 63 4c 65 6e 67 74 68 2c 20 30 2c 20 30 2c 20 30  cLength, 0, 0, 0
131f7 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
131f8 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
131f9 32 20 28 64 62 2c 20 22 47 65 6f 64 65 73 69 63  2 (db, "Geodesic
131fa 41 72 63 4c 65 6e 67 74 68 22 2c 20 33 2c 0a 09  ArcLength", 3,..
131fb 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
131fc 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
131fd 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
131fe 09 09 66 6e 63 74 5f 47 65 6f 64 65 73 69 63 41  ..fnct_GeodesicA
131ff 72 63 4c 65 6e 67 74 68 2c 20 30 2c 20 30 2c 20  rcLength, 0, 0, 
13200 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13201 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13202 76 32 20 28 64 62 2c 20 22 47 65 6f 64 65 73 69  v2 (db, "Geodesi
13203 63 43 68 6f 72 64 4c 65 6e 67 74 68 22 2c 20 32  cChordLength", 2
13204 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13205 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13206 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13207 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 64 65 73  .....fnct_Geodes
13208 69 63 43 68 6f 72 64 4c 65 6e 67 74 68 2c 20 30  icChordLength, 0
13209 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1320a 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1320b 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65  tion_v2 (db, "Ge
1320c 6f 64 65 73 69 63 43 68 6f 72 64 4c 65 6e 67 74  odesicChordLengt
1320d 68 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54  h", 3,.....SQLIT
1320e 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1320f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13210 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47  ache,.....fnct_G
13211 65 6f 64 65 73 69 63 43 68 6f 72 64 4c 65 6e 67  eodesicChordLeng
13212 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  th, 0, 0, 0);.  
13213 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13214 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13215 2c 20 22 47 65 6f 64 65 73 69 63 43 65 6e 74 72  , "GeodesicCentr
13216 61 6c 41 6e 67 6c 65 22 2c 20 32 2c 0a 09 09 09  alAngle", 2,....
13217 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13218 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13219 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
1321a 66 6e 63 74 5f 47 65 6f 64 65 73 69 63 43 65 6e  fnct_GeodesicCen
1321b 74 72 61 6c 41 6e 67 6c 65 2c 20 30 2c 20 30 2c  tralAngle, 0, 0,
1321c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1321d 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1321e 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 64 65 73  _v2 (db, "Geodes
1321f 69 63 43 65 6e 74 72 61 6c 41 6e 67 6c 65 22 2c  icCentralAngle",
13220 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
13221 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13222 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13223 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 64  e,.....fnct_Geod
13224 65 73 69 63 43 65 6e 74 72 61 6c 41 6e 67 6c 65  esicCentralAngle
13225 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13226 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13227 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13228 22 47 65 6f 64 65 73 69 63 41 72 63 41 72 65 61  "GeodesicArcArea
13229 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
1322a 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1322b 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1322c 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65  che,.....fnct_Ge
1322d 6f 64 65 73 69 63 41 72 63 41 72 65 61 2c 20 30  odesicArcArea, 0
1322e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1322f 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13230 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65  tion_v2 (db, "Ge
13231 6f 64 65 73 69 63 41 72 63 48 65 69 67 68 74 22  odesicArcHeight"
13232 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
13233 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13234 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13235 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f  he,.....fnct_Geo
13236 64 65 73 69 63 41 72 63 48 65 69 67 68 74 2c 20  desicArcHeight, 
13237 30 2c 20 30 2c 20 30 29 3b 0a 0a 2f 2a 20 73 6f  0, 0, 0);../* so
13238 6d 65 20 4c 65 6e 67 74 68 20 55 6e 69 74 20 63  me Length Unit c
13239 6f 6e 76 65 72 73 69 6f 6e 20 66 75 6e 63 74 69  onversion functi
1323a 6f 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ons */.    sqlit
1323b 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1323c 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74 54  on_v2 (db, "CvtT
1323d 6f 4b 6d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  oKm", 1,.....SQL
1323e 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1323f 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13240 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74   0,.....fnct_cvt
13241 54 6f 4b 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ToKm, 0, 0, 0);.
13242 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13243 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13244 64 62 2c 20 22 43 76 74 54 6f 44 6d 22 2c 20 31  db, "CvtToDm", 1
13245 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13246 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13247 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
13248 09 66 6e 63 74 5f 63 76 74 54 6f 44 6d 2c 20 30  .fnct_cvtToDm, 0
13249 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1324a 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1324b 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76  tion_v2 (db, "Cv
1324c 74 54 6f 43 6d 22 2c 20 31 2c 0a 09 09 09 09 53  tToCm", 1,.....S
1324d 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1324e 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1324f 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63  C, 0,.....fnct_c
13250 76 74 54 6f 43 6d 2c 20 30 2c 20 30 2c 20 30 29  vtToCm, 0, 0, 0)
13251 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13252 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13253 20 28 64 62 2c 20 22 43 76 74 54 6f 4d 6d 22 2c   (db, "CvtToMm",
13254 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
13255 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13256 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
13257 09 09 09 66 6e 63 74 5f 63 76 74 54 6f 4d 6d 2c  ...fnct_cvtToMm,
13258 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13259 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1325a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1325b 43 76 74 54 6f 4b 6d 69 22 2c 20 31 2c 0a 09 09  CvtToKmi", 1,...
1325c 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1325d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1325e 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
1325f 74 5f 63 76 74 54 6f 4b 6d 69 2c 20 30 2c 20 30  t_cvtToKmi, 0, 0
13260 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13261 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13262 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74 54 6f  n_v2 (db, "CvtTo
13263 49 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  In", 1,.....SQLI
13264 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13265 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13266 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 54  0,.....fnct_cvtT
13267 6f 49 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  oIn, 0, 0, 0);. 
13268 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13269 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1326a 62 2c 20 22 43 76 74 54 6f 46 74 22 2c 20 31 2c  b, "CvtToFt", 1,
1326b 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1326c 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1326d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
1326e 66 6e 63 74 5f 63 76 74 54 6f 46 74 2c 20 30 2c  fnct_cvtToFt, 0,
1326f 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13270 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13271 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74  ion_v2 (db, "Cvt
13272 54 6f 59 64 22 2c 20 31 2c 0a 09 09 09 09 53 51  ToYd", 1,.....SQ
13273 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13274 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13275 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76  , 0,.....fnct_cv
13276 74 54 6f 59 64 2c 20 30 2c 20 30 2c 20 30 29 3b  tToYd, 0, 0, 0);
13277 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13278 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13279 28 64 62 2c 20 22 43 76 74 54 6f 4d 69 22 2c 20  (db, "CvtToMi", 
1327a 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
1327b 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1327c 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
1327d 09 09 66 6e 63 74 5f 63 76 74 54 6f 4d 69 2c 20  ..fnct_cvtToMi, 
1327e 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1327f 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13280 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
13281 76 74 54 6f 46 61 74 68 22 2c 20 31 2c 0a 09 09  vtToFath", 1,...
13282 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13283 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13284 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
13285 74 5f 63 76 74 54 6f 46 61 74 68 2c 20 30 2c 20  t_cvtToFath, 0, 
13286 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13287 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13288 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74 54  on_v2 (db, "CvtT
13289 6f 43 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  oCh", 1,.....SQL
1328a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1328b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1328c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74   0,.....fnct_cvt
1328d 54 6f 43 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ToCh, 0, 0, 0);.
1328e 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1328f 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13290 64 62 2c 20 22 43 76 74 54 6f 4c 69 6e 6b 22 2c  db, "CvtToLink",
13291 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
13292 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13293 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
13294 09 09 09 66 6e 63 74 5f 63 76 74 54 6f 4c 69 6e  ...fnct_cvtToLin
13295 6b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  k, 0, 0, 0);.   
13296 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13297 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13298 20 22 43 76 74 54 6f 55 73 49 6e 22 2c 20 31 2c   "CvtToUsIn", 1,
13299 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1329a 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1329b 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
1329c 66 6e 63 74 5f 63 76 74 54 6f 55 73 49 6e 2c 20  fnct_cvtToUsIn, 
1329d 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1329e 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1329f 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
132a0 76 74 54 6f 55 73 46 74 22 2c 20 31 2c 0a 09 09  vtToUsFt", 1,...
132a1 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
132a2 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
132a3 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
132a4 74 5f 63 76 74 54 6f 55 73 46 74 2c 20 30 2c 20  t_cvtToUsFt, 0, 
132a5 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
132a6 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
132a7 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74 54  on_v2 (db, "CvtT
132a8 6f 55 73 59 64 22 2c 20 31 2c 0a 09 09 09 09 53  oUsYd", 1,.....S
132a9 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
132aa 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
132ab 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63  C, 0,.....fnct_c
132ac 76 74 54 6f 55 73 59 64 2c 20 30 2c 20 30 2c 20  vtToUsYd, 0, 0, 
132ad 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
132ae 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
132af 76 32 20 28 64 62 2c 20 22 43 76 74 54 6f 55 73  v2 (db, "CvtToUs
132b0 43 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  Ch", 1,.....SQLI
132b1 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
132b2 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
132b3 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 54  0,.....fnct_cvtT
132b4 6f 55 73 43 68 2c 20 30 2c 20 30 2c 20 30 29 3b  oUsCh, 0, 0, 0);
132b5 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
132b6 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
132b7 28 64 62 2c 20 22 43 76 74 54 6f 55 73 4d 69 22  (db, "CvtToUsMi"
132b8 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
132b9 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
132ba 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
132bb 09 09 09 09 66 6e 63 74 5f 63 76 74 54 6f 55 73  ....fnct_cvtToUs
132bc 4d 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  Mi, 0, 0, 0);.  
132bd 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
132be 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
132bf 2c 20 22 43 76 74 54 6f 49 6e 64 46 74 22 2c 20  , "CvtToIndFt", 
132c0 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
132c1 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
132c2 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
132c3 09 09 66 6e 63 74 5f 63 76 74 54 6f 49 6e 64 46  ..fnct_cvtToIndF
132c4 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
132c5 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
132c6 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
132c7 20 22 43 76 74 54 6f 49 6e 64 59 64 22 2c 20 31   "CvtToIndYd", 1
132c8 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
132c9 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
132ca 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
132cb 09 66 6e 63 74 5f 63 76 74 54 6f 49 6e 64 59 64  .fnct_cvtToIndYd
132cc 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
132cd 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
132ce 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
132cf 22 43 76 74 54 6f 49 6e 64 43 68 22 2c 20 31 2c  "CvtToIndCh", 1,
132d0 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
132d1 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
132d2 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
132d3 66 6e 63 74 5f 63 76 74 54 6f 49 6e 64 43 68 2c  fnct_cvtToIndCh,
132d4 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
132d5 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
132d6 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
132d7 43 76 74 46 72 6f 6d 4b 6d 22 2c 20 31 2c 0a 09  CvtFromKm", 1,..
132d8 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
132d9 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
132da 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
132db 63 74 5f 63 76 74 46 72 6f 6d 4b 6d 2c 20 30 2c  ct_cvtFromKm, 0,
132dc 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
132dd 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
132de 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74  ion_v2 (db, "Cvt
132df 46 72 6f 6d 44 6d 22 2c 20 31 2c 0a 09 09 09 09  FromDm", 1,.....
132e0 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
132e1 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
132e2 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
132e3 63 76 74 46 72 6f 6d 44 6d 2c 20 30 2c 20 30 2c  cvtFromDm, 0, 0,
132e4 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
132e5 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
132e6 5f 76 32 20 28 64 62 2c 20 22 43 76 74 46 72 6f  _v2 (db, "CvtFro
132e7 6d 43 6d 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  mCm", 1,.....SQL
132e8 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
132e9 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
132ea 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74   0,.....fnct_cvt
132eb 46 72 6f 6d 43 6d 2c 20 30 2c 20 30 2c 20 30 29  FromCm, 0, 0, 0)
132ec 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
132ed 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
132ee 20 28 64 62 2c 20 22 43 76 74 46 72 6f 6d 4d 6d   (db, "CvtFromMm
132ef 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
132f0 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
132f1 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
132f2 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 46 72 6f  .....fnct_cvtFro
132f3 6d 4d 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  mMm, 0, 0, 0);. 
132f4 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
132f5 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
132f6 62 2c 20 22 43 76 74 46 72 6f 6d 4b 6d 69 22 2c  b, "CvtFromKmi",
132f7 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
132f8 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
132f9 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
132fa 09 09 09 66 6e 63 74 5f 63 76 74 46 72 6f 6d 4b  ...fnct_cvtFromK
132fb 6d 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  mi, 0, 0, 0);.  
132fc 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
132fd 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
132fe 2c 20 22 43 76 74 46 72 6f 6d 49 6e 22 2c 20 31  , "CvtFromIn", 1
132ff 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13300 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13301 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
13302 09 66 6e 63 74 5f 63 76 74 46 72 6f 6d 49 6e 2c  .fnct_cvtFromIn,
13303 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13304 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13305 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13306 43 76 74 46 72 6f 6d 46 74 22 2c 20 31 2c 0a 09  CvtFromFt", 1,..
13307 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13308 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13309 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
1330a 63 74 5f 63 76 74 46 72 6f 6d 46 74 2c 20 30 2c  ct_cvtFromFt, 0,
1330b 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1330c 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1330d 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74  ion_v2 (db, "Cvt
1330e 46 72 6f 6d 59 64 22 2c 20 31 2c 0a 09 09 09 09  FromYd", 1,.....
1330f 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13310 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13311 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
13312 63 76 74 46 72 6f 6d 59 64 2c 20 30 2c 20 30 2c  cvtFromYd, 0, 0,
13313 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13314 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13315 5f 76 32 20 28 64 62 2c 20 22 43 76 74 46 72 6f  _v2 (db, "CvtFro
13316 6d 4d 69 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  mMi", 1,.....SQL
13317 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13318 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13319 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74   0,.....fnct_cvt
1331a 46 72 6f 6d 4d 69 2c 20 30 2c 20 30 2c 20 30 29  FromMi, 0, 0, 0)
1331b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1331c 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1331d 20 28 64 62 2c 20 22 43 76 74 46 72 6f 6d 46 61   (db, "CvtFromFa
1331e 74 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  th", 1,.....SQLI
1331f 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13320 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13321 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 46  0,.....fnct_cvtF
13322 72 6f 6d 46 61 74 68 2c 20 30 2c 20 30 2c 20 30  romFath, 0, 0, 0
13323 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13324 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13325 32 20 28 64 62 2c 20 22 43 76 74 46 72 6f 6d 43  2 (db, "CvtFromC
13326 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  h", 1,.....SQLIT
13327 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13328 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13329 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 46 72  ,.....fnct_cvtFr
1332a 6f 6d 43 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  omCh, 0, 0, 0);.
1332b 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1332c 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1332d 64 62 2c 20 22 43 76 74 46 72 6f 6d 4c 69 6e 6b  db, "CvtFromLink
1332e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
1332f 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13330 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
13331 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 46 72 6f  .....fnct_cvtFro
13332 6d 4c 69 6e 6b 2c 20 30 2c 20 30 2c 20 30 29 3b  mLink, 0, 0, 0);
13333 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13334 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13335 28 64 62 2c 20 22 43 76 74 46 72 6f 6d 55 73 49  (db, "CvtFromUsI
13336 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  n", 1,.....SQLIT
13337 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13338 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13339 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 46 72  ,.....fnct_cvtFr
1333a 6f 6d 55 73 49 6e 2c 20 30 2c 20 30 2c 20 30 29  omUsIn, 0, 0, 0)
1333b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1333c 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1333d 20 28 64 62 2c 20 22 43 76 74 46 72 6f 6d 55 73   (db, "CvtFromUs
1333e 46 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  Ft", 1,.....SQLI
1333f 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13340 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13341 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74 46  0,.....fnct_cvtF
13342 72 6f 6d 55 73 46 74 2c 20 30 2c 20 30 2c 20 30  romUsFt, 0, 0, 0
13343 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13344 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13345 32 20 28 64 62 2c 20 22 43 76 74 46 72 6f 6d 55  2 (db, "CvtFromU
13346 73 59 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  sYd", 1,.....SQL
13347 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13348 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13349 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76 74   0,.....fnct_cvt
1334a 46 72 6f 6d 55 73 59 64 2c 20 30 2c 20 30 2c 20  FromUsYd, 0, 0, 
1334b 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1334c 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1334d 76 32 20 28 64 62 2c 20 22 43 76 74 46 72 6f 6d  v2 (db, "CvtFrom
1334e 55 73 43 68 22 2c 20 31 2c 0a 09 09 09 09 53 51  UsCh", 1,.....SQ
1334f 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13350 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13351 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63 76  , 0,.....fnct_cv
13352 74 46 72 6f 6d 55 73 43 68 2c 20 30 2c 20 30 2c  tFromUsCh, 0, 0,
13353 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13354 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13355 5f 76 32 20 28 64 62 2c 20 22 43 76 74 46 72 6f  _v2 (db, "CvtFro
13356 6d 55 73 4d 69 22 2c 20 31 2c 0a 09 09 09 09 53  mUsMi", 1,.....S
13357 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13358 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13359 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 63  C, 0,.....fnct_c
1335a 76 74 46 72 6f 6d 55 73 4d 69 2c 20 30 2c 20 30  vtFromUsMi, 0, 0
1335b 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1335c 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1335d 6e 5f 76 32 20 28 64 62 2c 20 22 43 76 74 46 72  n_v2 (db, "CvtFr
1335e 6f 6d 49 6e 64 46 74 22 2c 20 31 2c 0a 09 09 09  omIndFt", 1,....
1335f 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13360 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13361 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13362 5f 63 76 74 46 72 6f 6d 49 6e 64 46 74 2c 20 30  _cvtFromIndFt, 0
13363 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13364 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13365 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 76  tion_v2 (db, "Cv
13366 74 46 72 6f 6d 49 6e 64 59 64 22 2c 20 31 2c 0a  tFromIndYd", 1,.
13367 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13368 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13369 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
1336a 6e 63 74 5f 63 76 74 46 72 6f 6d 49 6e 64 59 64  nct_cvtFromIndYd
1336b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1336c 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1336d 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1336e 22 43 76 74 46 72 6f 6d 49 6e 64 43 68 22 2c 20  "CvtFromIndCh", 
1336f 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13370 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13371 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13372 09 09 66 6e 63 74 5f 63 76 74 46 72 6f 6d 49 6e  ..fnct_cvtFromIn
13373 64 43 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  dCh, 0, 0, 0);..
13374 2f 2a 20 44 4d 53 20 28 44 65 67 72 65 65 73 2f  /* DMS (Degrees/
13375 4d 69 6e 75 74 65 73 2f 53 65 63 6f 6e 64 73 29  Minutes/Seconds)
13376 20 74 6f 20 44 44 20 28 64 65 63 69 6d 61 6c 20   to DD (decimal 
13377 64 65 67 72 65 65 73 29 20 2a 2f 0a 20 20 20 20  degrees) */.    
13378 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13379 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1337a 22 4c 6f 6e 67 69 74 75 64 65 46 72 6f 6d 44 4d  "LongitudeFromDM
1337b 53 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  S", 1,.....SQLIT
1337c 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1337d 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
1337e 2c 0a 09 09 09 09 66 6e 63 74 5f 6c 6f 6e 67 46  ,.....fnct_longF
1337f 72 6f 6d 44 4d 53 2c 20 30 2c 20 30 2c 20 30 29  romDMS, 0, 0, 0)
13380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13381 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13382 20 28 64 62 2c 20 22 4c 61 74 69 74 75 64 65 46   (db, "LatitudeF
13383 72 6f 6d 44 4d 53 22 2c 20 31 2c 0a 09 09 09 09  romDMS", 1,.....
13384 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13385 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13386 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
13387 6c 61 74 46 72 6f 6d 44 4d 53 2c 20 30 2c 20 30  latFromDMS, 0, 0
13388 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13389 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1338a 6e 5f 76 32 20 28 64 62 2c 20 22 4c 6f 6e 67 4c  n_v2 (db, "LongL
1338b 61 74 54 6f 44 4d 53 22 2c 20 32 2c 0a 09 09 09  atToDMS", 2,....
1338c 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1338d 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1338e 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1338f 5f 74 6f 44 4d 53 2c 20 30 2c 20 30 2c 20 30 29  _toDMS, 0, 0, 0)
13390 3b 0a 0a 20 20 20 20 69 66 20 28 63 61 63 68 65  ;..    if (cache
13391 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
13392 7b 0a 09 20 20 2f 2a 20 53 65 71 75 65 6e 63 65  {..  /* Sequence
13393 73 20 2a 2f 0a 09 20 20 73 71 6c 69 74 65 33 5f  s */..  sqlite3_
13394 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13395 76 32 20 28 64 62 2c 20 22 73 65 71 75 65 6e 63  v2 (db, "sequenc
13396 65 5f 63 75 72 72 76 61 6c 22 2c 20 31 2c 0a 09  e_currval", 1,..
13397 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
13398 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09 09 09  UTF8, cache,....
13399 09 20 20 20 20 20 20 66 6e 63 74 5f 73 65 71 75  .      fnct_sequ
1339a 65 6e 63 65 5f 63 75 72 72 76 61 6c 2c 20 30 2c  ence_currval, 0,
1339b 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1339c 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1339d 6f 6e 5f 76 32 20 28 64 62 2c 20 22 73 65 71 75  on_v2 (db, "sequ
1339e 65 6e 63 65 5f 6c 61 73 74 76 61 6c 22 2c 20 30  ence_lastval", 0
1339f 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
133a0 54 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 0a  TE_UTF8, cache,.
133a1 09 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 73  ....      fnct_s
133a2 65 71 75 65 6e 63 65 5f 6c 61 73 74 76 61 6c 2c  equence_lastval,
133a3 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71   0, 0, 0);..  sq
133a4 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
133a5 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 73  ction_v2 (db, "s
133a6 65 71 75 65 6e 63 65 5f 6e 65 78 74 76 61 6c 22  equence_nextval"
133a7 2c 20 31 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 1,.....      S
133a8 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61 63 68  QLITE_UTF8, cach
133a9 65 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63  e,.....      fnc
133aa 74 5f 73 65 71 75 65 6e 63 65 5f 6e 65 78 74 76  t_sequence_nextv
133ab 61 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  al, 0, 0, 0);.. 
133ac 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
133ad 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
133ae 20 22 73 65 71 75 65 6e 63 65 5f 73 65 74 76 61   "sequence_setva
133af 6c 22 2c 20 32 2c 0a 09 09 09 09 20 20 20 20 20  l", 2,.....     
133b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61   SQLITE_UTF8, ca
133b1 63 68 65 2c 0a 09 09 09 09 20 20 20 20 20 20 66  che,.....      f
133b2 6e 63 74 5f 73 65 71 75 65 6e 63 65 5f 73 65 74  nct_sequence_set
133b3 76 61 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  val, 0, 0, 0);. 
133b4 20 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20       }..#ifndef 
133b5 4f 4d 49 54 5f 4d 41 54 48 53 51 4c 09 09 2f 2a  OMIT_MATHSQL../*
133b6 20 73 75 70 70 6f 72 74 69 6e 67 20 53 51 4c 20   supporting SQL 
133b7 6d 61 74 68 20 66 75 6e 63 74 69 6f 6e 73 20 2a  math functions *
133b8 2f 0a 0a 2f 2a 20 73 6f 6d 65 20 65 78 74 72 61  /../* some extra
133b9 20 6d 61 74 68 20 66 75 6e 63 74 69 6f 6e 73 20   math functions 
133ba 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  */.    sqlite3_c
133bb 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
133bc 32 20 28 64 62 2c 20 22 61 63 6f 73 22 2c 20 31  2 (db, "acos", 1
133bd 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
133be 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
133bf 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
133c0 09 66 6e 63 74 5f 6d 61 74 68 5f 61 63 6f 73 2c  .fnct_math_acos,
133c1 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
133c2 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
133c3 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
133c4 61 73 69 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51  asin", 1,.....SQ
133c5 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
133c6 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
133c7 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61  , 0,.....fnct_ma
133c8 74 68 5f 61 73 69 6e 2c 20 30 2c 20 30 2c 20 30  th_asin, 0, 0, 0
133c9 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
133ca 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
133cb 32 20 28 64 62 2c 20 22 61 74 61 6e 22 2c 20 31  2 (db, "atan", 1
133cc 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
133cd 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
133ce 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
133cf 09 66 6e 63 74 5f 6d 61 74 68 5f 61 74 61 6e 2c  .fnct_math_atan,
133d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
133d1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
133d2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
133d3 61 74 61 6e 32 22 2c 20 32 2c 0a 09 09 09 09 53  atan2", 2,.....S
133d4 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
133d5 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
133d6 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 6d  C, 0,.....fnct_m
133d7 61 74 68 5f 61 74 61 6e 32 2c 20 30 2c 20 30 2c  ath_atan2, 0, 0,
133d8 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
133d9 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
133da 5f 76 32 20 28 64 62 2c 20 22 63 65 69 6c 22 2c  _v2 (db, "ceil",
133db 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
133dc 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
133dd 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
133de 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 63 65 69  ...fnct_math_cei
133df 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
133e0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
133e1 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
133e2 20 22 63 65 69 6c 69 6e 67 22 2c 20 31 2c 0a 09   "ceiling", 1,..
133e3 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
133e4 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
133e5 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
133e6 63 74 5f 6d 61 74 68 5f 63 65 69 6c 2c 20 30 2c  ct_math_ceil, 0,
133e7 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
133e8 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
133e9 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 63 6f 73  ion_v2 (db, "cos
133ea 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
133eb 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
133ec 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
133ed 0a 09 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 63  .....fnct_math_c
133ee 6f 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  os, 0, 0, 0);.  
133ef 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
133f0 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
133f1 2c 20 22 63 6f 74 22 2c 20 31 2c 0a 09 09 09 09  , "cot", 1,.....
133f2 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
133f3 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
133f4 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
133f5 6d 61 74 68 5f 63 6f 74 2c 20 30 2c 20 30 2c 20  math_cot, 0, 0, 
133f6 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
133f7 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
133f8 76 32 20 28 64 62 2c 20 22 64 65 67 72 65 65 73  v2 (db, "degrees
133f9 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
133fa 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
133fb 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
133fc 0a 09 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 64  .....fnct_math_d
133fd 65 67 72 65 65 73 2c 20 30 2c 20 30 2c 20 30 29  egrees, 0, 0, 0)
133fe 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
133ff 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13400 20 28 64 62 2c 20 22 65 78 70 22 2c 20 31 2c 0a   (db, "exp", 1,.
13401 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13402 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13403 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13404 6e 63 74 5f 6d 61 74 68 5f 65 78 70 2c 20 30 2c  nct_math_exp, 0,
13405 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13406 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13407 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 66 6c 6f  ion_v2 (db, "flo
13408 6f 72 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  or", 1,.....SQLI
13409 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1340a 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1340b 30 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61 74 68  0,.....fnct_math
1340c 5f 66 6c 6f 6f 72 2c 20 30 2c 20 30 2c 20 30 29  _floor, 0, 0, 0)
1340d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1340e 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1340f 20 28 64 62 2c 20 22 6c 6e 22 2c 20 31 2c 0a 09   (db, "ln", 1,..
13410 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13411 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13412 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
13413 63 74 5f 6d 61 74 68 5f 6c 6f 67 6e 2c 20 30 2c  ct_math_logn, 0,
13414 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13415 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13416 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 6c 6f 67  ion_v2 (db, "log
13417 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
13418 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13419 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1341a 0a 09 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 6c  .....fnct_math_l
1341b 6f 67 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ogn, 0, 0, 0);. 
1341c 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1341d 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1341e 62 2c 20 22 6c 6f 67 22 2c 20 32 2c 0a 09 09 09  b, "log", 2,....
1341f 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13420 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13421 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13422 5f 6d 61 74 68 5f 6c 6f 67 6e 32 2c 20 30 2c 20  _math_logn2, 0, 
13423 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13424 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13425 6f 6e 5f 76 32 20 28 64 62 2c 20 22 6c 6f 67 32  on_v2 (db, "log2
13426 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
13427 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13428 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
13429 0a 09 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 6c  .....fnct_math_l
1342a 6f 67 5f 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  og_2, 0, 0, 0);.
1342b 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1342c 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1342d 64 62 2c 20 22 6c 6f 67 31 30 22 2c 20 31 2c 0a  db, "log10", 1,.
1342e 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1342f 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13430 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13431 6e 63 74 5f 6d 61 74 68 5f 6c 6f 67 5f 31 30 2c  nct_math_log_10,
13432 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13433 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13434 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13435 70 69 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49  pi", 0,.....SQLI
13436 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13437 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13438 30 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61 74 68  0,.....fnct_math
13439 5f 70 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _pi, 0, 0, 0);. 
1343a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1343b 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1343c 62 2c 20 22 70 6f 77 22 2c 20 32 2c 0a 09 09 09  b, "pow", 2,....
1343d 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1343e 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1343f 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13440 5f 6d 61 74 68 5f 70 6f 77 2c 20 30 2c 20 30 2c  _math_pow, 0, 0,
13441 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13442 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13443 5f 76 32 20 28 64 62 2c 20 22 70 6f 77 65 72 22  _v2 (db, "power"
13444 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
13445 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13446 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
13447 09 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 70 6f  ....fnct_math_po
13448 77 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  w, 0, 0, 0);.   
13449 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1344a 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1344b 20 22 72 61 64 69 61 6e 73 22 2c 20 31 2c 0a 09   "radians", 1,..
1344c 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1344d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1344e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
1344f 63 74 5f 6d 61 74 68 5f 72 61 64 69 61 6e 73 2c  ct_math_radians,
13450 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13451 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13452 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13453 73 69 67 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51  sign", 1,.....SQ
13454 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13455 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13456 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61  , 0,.....fnct_ma
13457 74 68 5f 73 69 67 6e 2c 20 30 2c 20 30 2c 20 30  th_sign, 0, 0, 0
13458 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13459 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1345a 32 20 28 64 62 2c 20 22 73 69 6e 22 2c 20 31 2c  2 (db, "sin", 1,
1345b 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1345c 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1345d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
1345e 66 6e 63 74 5f 6d 61 74 68 5f 73 69 6e 2c 20 30  fnct_math_sin, 0
1345f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13460 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13461 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 73 74  tion_v2 (db, "st
13462 64 64 65 76 5f 70 6f 70 22 2c 20 31 2c 0a 09 09  ddev_pop", 1,...
13463 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13464 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13465 53 54 49 43 2c 20 30 2c 20 30 2c 0a 09 09 09 09  STIC, 0, 0,.....
13466 66 6e 63 74 5f 6d 61 74 68 5f 73 74 64 64 65 76  fnct_math_stddev
13467 5f 73 74 65 70 2c 0a 09 09 09 09 66 6e 63 74 5f  _step,.....fnct_
13468 6d 61 74 68 5f 73 74 64 64 65 76 5f 70 6f 70 5f  math_stddev_pop_
13469 66 69 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73  final, 0);.    s
1346a 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1346b 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1346c 73 74 64 64 65 76 5f 73 61 6d 70 22 2c 20 31 2c  stddev_samp", 1,
1346d 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1346e 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1346f 49 4e 49 53 54 49 43 2c 20 30 2c 20 30 2c 0a 09  INISTIC, 0, 0,..
13470 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 73 74 64  ...fnct_math_std
13471 64 65 76 5f 73 74 65 70 2c 0a 09 09 09 09 66 6e  dev_step,.....fn
13472 63 74 5f 6d 61 74 68 5f 73 74 64 64 65 76 5f 73  ct_math_stddev_s
13473 61 6d 70 5f 66 69 6e 61 6c 2c 20 30 29 3b 0a 20  amp_final, 0);. 
13474 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13475 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13476 62 2c 20 22 73 71 72 74 22 2c 20 31 2c 0a 09 09  b, "sqrt", 1,...
13477 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13478 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13479 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
1347a 74 5f 6d 61 74 68 5f 73 71 72 74 2c 20 30 2c 20  t_math_sqrt, 0, 
1347b 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1347c 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1347d 6f 6e 5f 76 32 20 28 64 62 2c 20 22 74 61 6e 22  on_v2 (db, "tan"
1347e 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
1347f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13480 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
13481 09 09 09 09 66 6e 63 74 5f 6d 61 74 68 5f 74 61  ....fnct_math_ta
13482 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
13483 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13484 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13485 20 22 76 61 72 5f 70 6f 70 22 2c 20 31 2c 0a 09   "var_pop", 1,..
13486 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13487 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13488 49 53 54 49 43 2c 20 30 2c 20 30 2c 0a 09 09 09  ISTIC, 0, 0,....
13489 09 66 6e 63 74 5f 6d 61 74 68 5f 73 74 64 64 65  .fnct_math_stdde
1348a 76 5f 73 74 65 70 2c 0a 09 09 09 09 66 6e 63 74  v_step,.....fnct
1348b 5f 6d 61 74 68 5f 76 61 72 5f 70 6f 70 5f 66 69  _math_var_pop_fi
1348c 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  nal, 0);.    sql
1348d 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1348e 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 76 61  tion_v2 (db, "va
1348f 72 5f 73 61 6d 70 22 2c 20 31 2c 0a 09 09 09 09  r_samp", 1,.....
13490 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13491 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13492 49 43 2c 20 30 2c 20 30 2c 0a 09 09 09 09 66 6e  IC, 0, 0,.....fn
13493 63 74 5f 6d 61 74 68 5f 73 74 64 64 65 76 5f 73  ct_math_stddev_s
13494 74 65 70 2c 0a 09 09 09 09 66 6e 63 74 5f 6d 61  tep,.....fnct_ma
13495 74 68 5f 76 61 72 5f 73 61 6d 70 5f 66 69 6e 61  th_var_samp_fina
13496 6c 2c 20 30 29 3b 0a 0a 23 65 6e 64 69 66 20 2f  l, 0);..#endif /
13497 2a 20 65 6e 64 20 73 75 70 70 6f 72 74 69 6e 67  * end supporting
13498 20 53 51 4c 20 6d 61 74 68 20 66 75 6e 63 74 69   SQL math functi
13499 6f 6e 73 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ons */..#ifndef 
1349a 4f 4d 49 54 5f 50 52 4f 4a 09 09 2f 2a 20 69 6e  OMIT_PROJ../* in
1349b 63 6c 75 64 69 6e 67 20 50 52 4f 4a 2e 34 20 2a  cluding PROJ.4 *
1349c 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  /..    sqlite3_c
1349d 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1349e 32 20 28 64 62 2c 20 22 54 72 61 6e 73 66 6f 72  2 (db, "Transfor
1349f 6d 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  m", 2,.....SQLIT
134a0 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
134a1 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
134a2 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54  ache,.....fnct_T
134a3 72 61 6e 73 66 6f 72 6d 2c 20 30 2c 20 30 2c 20  ransform, 0, 0, 
134a4 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
134a5 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
134a6 76 32 20 28 64 62 2c 20 22 53 54 5f 54 72 61 6e  v2 (db, "ST_Tran
134a7 73 66 6f 72 6d 22 2c 20 32 2c 0a 09 09 09 09 53  sform", 2,.....S
134a8 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
134a9 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
134aa 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
134ab 63 74 5f 54 72 61 6e 73 66 6f 72 6d 2c 20 30 2c  ct_Transform, 0,
134ac 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
134ad 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
134ae 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 72 61  ion_v2 (db, "Tra
134af 6e 73 66 6f 72 6d 58 59 22 2c 20 32 2c 0a 09 09  nsformXY", 2,...
134b0 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
134b1 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
134b2 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
134b3 09 66 6e 63 74 5f 54 72 61 6e 73 66 6f 72 6d 58  .fnct_TransformX
134b4 59 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Y, 0, 0, 0);.   
134b5 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
134b6 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
134b7 20 22 53 54 5f 54 72 61 6e 73 66 6f 72 6d 58 59   "ST_TransformXY
134b8 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
134b9 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
134ba 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
134bb 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 72  che,.....fnct_Tr
134bc 61 6e 73 66 6f 72 6d 58 59 2c 20 30 2c 20 30 2c  ansformXY, 0, 0,
134bd 20 30 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   0);..#endif /* 
134be 65 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 50 52  end including PR
134bf 4f 4a 2e 34 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  OJ.4 */..#ifndef
134c0 20 4f 4d 49 54 5f 47 45 4f 53 09 09 2f 2a 20 69   OMIT_GEOS../* i
134c1 6e 63 6c 75 64 69 6e 67 20 47 45 4f 53 20 2a 2f  ncluding GEOS */
134c2 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ..    sqlite3_cr
134c3 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
134c4 20 28 64 62 2c 20 22 47 45 4f 53 5f 47 65 74 4c   (db, "GEOS_GetL
134c5 61 73 74 45 72 72 6f 72 4d 73 67 22 2c 20 30 2c  astErrorMsg", 0,
134c6 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09   SQLITE_UTF8,...
134c7 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 47 45  ..cache, fnct_GE
134c8 4f 53 5f 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  OS_GetLastErrorM
134c9 73 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  sg, 0, 0, 0);.  
134ca 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
134cb 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
134cc 2c 20 22 47 45 4f 53 5f 47 65 74 4c 61 73 74 57  , "GEOS_GetLastW
134cd 61 72 6e 69 6e 67 4d 73 67 22 2c 20 30 2c 20 53  arningMsg", 0, S
134ce 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09 09  QLITE_UTF8,.....
134cf 63 61 63 68 65 2c 20 66 6e 63 74 5f 47 45 4f 53  cache, fnct_GEOS
134d0 5f 47 65 74 4c 61 73 74 57 61 72 6e 69 6e 67 4d  _GetLastWarningM
134d1 73 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  sg, 0, 0, 0);.  
134d2 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
134d3 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
134d4 2c 20 22 47 45 4f 53 5f 47 65 74 4c 61 73 74 41  , "GEOS_GetLastA
134d5 75 78 45 72 72 6f 72 4d 73 67 22 2c 20 30 2c 20  uxErrorMsg", 0, 
134d6 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09 09  SQLITE_UTF8,....
134d7 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 47 45 4f  .cache, fnct_GEO
134d8 53 5f 47 65 74 4c 61 73 74 41 75 78 45 72 72 6f  S_GetLastAuxErro
134d9 72 4d 73 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rMsg, 0, 0, 0);.
134da 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
134db 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
134dc 64 62 2c 20 22 47 45 4f 53 5f 47 65 74 43 72 69  db, "GEOS_GetCri
134dd 74 69 63 61 6c 50 6f 69 6e 74 46 72 6f 6d 4d 73  ticalPointFromMs
134de 67 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54  g", 0,.....SQLIT
134df 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09  E_UTF8, cache,..
134e0 09 09 09 66 6e 63 74 5f 47 45 4f 53 5f 47 65 74  ...fnct_GEOS_Get
134e1 43 72 69 74 69 63 61 6c 50 6f 69 6e 74 46 72 6f  CriticalPointFro
134e2 6d 4d 73 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mMsg, 0, 0, 0);.
134e3 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
134e4 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
134e5 64 62 2c 20 22 47 45 4f 53 5f 47 65 74 43 72 69  db, "GEOS_GetCri
134e6 74 69 63 61 6c 50 6f 69 6e 74 46 72 6f 6d 4d 73  ticalPointFromMs
134e7 67 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  g", 1,.....SQLIT
134e8 45 5f 55 54 46 38 2c 20 63 61 63 68 65 2c 0a 09  E_UTF8, cache,..
134e9 09 09 09 66 6e 63 74 5f 47 45 4f 53 5f 47 65 74  ...fnct_GEOS_Get
134ea 43 72 69 74 69 63 61 6c 50 6f 69 6e 74 46 72 6f  CriticalPointFro
134eb 6d 4d 73 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mMsg, 0, 0, 0);.
134ec 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
134ed 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
134ee 64 62 2c 20 22 49 73 56 61 6c 69 64 52 65 61 73  db, "IsValidReas
134ef 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  on", 1,.....SQLI
134f0 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
134f1 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
134f2 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
134f3 49 73 56 61 6c 69 64 52 65 61 73 6f 6e 2c 20 30  IsValidReason, 0
134f4 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
134f5 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
134f6 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73  tion_v2 (db, "Is
134f7 56 61 6c 69 64 52 65 61 73 6f 6e 22 2c 20 32 2c  ValidReason", 2,
134f8 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
134f9 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
134fa 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
134fb 09 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69 64  ....fnct_IsValid
134fc 52 65 61 73 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  Reason, 0, 0, 0)
134fd 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
134fe 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
134ff 20 28 64 62 2c 20 22 53 54 5f 49 73 56 61 6c 69   (db, "ST_IsVali
13500 64 52 65 61 73 6f 6e 22 2c 20 31 2c 0a 09 09 09  dReason", 1,....
13501 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13502 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13503 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13504 66 6e 63 74 5f 49 73 56 61 6c 69 64 52 65 61 73  fnct_IsValidReas
13505 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
13506 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13507 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13508 2c 20 22 53 54 5f 49 73 56 61 6c 69 64 52 65 61  , "ST_IsValidRea
13509 73 6f 6e 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  son", 2,.....SQL
1350a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1350b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1350c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1350d 5f 49 73 56 61 6c 69 64 52 65 61 73 6f 6e 2c 20  _IsValidReason, 
1350e 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1350f 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13510 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
13511 73 56 61 6c 69 64 44 65 74 61 69 6c 22 2c 20 31  sValidDetail", 1
13512 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13513 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13514 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13515 0a 09 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69  .....fnct_IsVali
13516 64 44 65 74 61 69 6c 2c 20 30 2c 20 30 2c 20 30  dDetail, 0, 0, 0
13517 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13518 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13519 32 20 28 64 62 2c 20 22 49 73 56 61 6c 69 64 44  2 (db, "IsValidD
1351a 65 74 61 69 6c 22 2c 20 32 2c 0a 09 09 09 09 53  etail", 2,.....S
1351b 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1351c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1351d 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
1351e 63 74 5f 49 73 56 61 6c 69 64 44 65 74 61 69 6c  ct_IsValidDetail
1351f 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13520 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13521 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13522 22 53 54 5f 49 73 56 61 6c 69 64 44 65 74 61 69  "ST_IsValidDetai
13523 6c 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  l", 1,.....SQLIT
13524 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13525 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13526 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 49  ache,.....fnct_I
13527 73 56 61 6c 69 64 44 65 74 61 69 6c 2c 20 30 2c  sValidDetail, 0,
13528 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13529 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1352a 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
1352b 49 73 56 61 6c 69 64 44 65 74 61 69 6c 22 2c 20  IsValidDetail", 
1352c 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
1352d 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1352e 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
1352f 2c 0a 09 09 09 09 66 6e 63 74 5f 49 73 56 61 6c  ,.....fnct_IsVal
13530 69 64 44 65 74 61 69 6c 2c 20 30 2c 20 30 2c 20  idDetail, 0, 0, 
13531 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  0);..    sqlite3
13532 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13533 5f 76 32 20 28 64 62 2c 20 22 42 6f 75 6e 64 61  _v2 (db, "Bounda
13534 72 79 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  ry", 1,.....SQLI
13535 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13536 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13537 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13538 42 6f 75 6e 64 61 72 79 2c 20 30 2c 20 30 2c 20  Boundary, 0, 0, 
13539 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1353a 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1353b 76 32 20 28 64 62 2c 20 22 53 54 5f 42 6f 75 6e  v2 (db, "ST_Boun
1353c 64 61 72 79 22 2c 20 31 2c 0a 09 09 09 09 53 51  dary", 1,.....SQ
1353d 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
1353e 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1353f 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13540 74 5f 42 6f 75 6e 64 61 72 79 2c 20 30 2c 20 30  t_Boundary, 0, 0
13541 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13542 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13543 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 43 6c 6f  n_v2 (db, "IsClo
13544 73 65 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  sed", 1,.....SQL
13545 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13546 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13547 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13548 5f 49 73 43 6c 6f 73 65 64 2c 20 30 2c 20 30 2c  _IsClosed, 0, 0,
13549 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1354a 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1354b 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 49 73 43  _v2 (db, "ST_IsC
1354c 6c 6f 73 65 64 22 2c 20 31 2c 0a 09 09 09 09 53  losed", 1,.....S
1354d 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1354e 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1354f 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13550 63 74 5f 49 73 43 6c 6f 73 65 64 2c 20 30 2c 20  ct_IsClosed, 0, 
13551 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13552 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13553 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 53 69  on_v2 (db, "IsSi
13554 6d 70 6c 65 22 2c 20 31 2c 0a 09 09 09 09 53 51  mple", 1,.....SQ
13555 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13556 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13557 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13558 74 5f 49 73 53 69 6d 70 6c 65 2c 20 30 2c 20 30  t_IsSimple, 0, 0
13559 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1355a 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1355b 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 49 73  n_v2 (db, "ST_Is
1355c 53 69 6d 70 6c 65 22 2c 20 31 2c 0a 09 09 09 09  Simple", 1,.....
1355d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1355e 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1355f 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13560 6e 63 74 5f 49 73 53 69 6d 70 6c 65 2c 20 30 2c  nct_IsSimple, 0,
13561 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13562 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13563 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49 73 52  ion_v2 (db, "IsR
13564 69 6e 67 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ing", 1,.....SQL
13565 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13566 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13567 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13568 5f 49 73 52 69 6e 67 2c 20 30 2c 20 30 2c 20 30  _IsRing, 0, 0, 0
13569 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1356a 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1356b 32 20 28 64 62 2c 20 22 53 54 5f 49 73 52 69 6e  2 (db, "ST_IsRin
1356c 67 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  g", 1,.....SQLIT
1356d 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1356e 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
1356f 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 49  ache,.....fnct_I
13570 73 52 69 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b  sRing, 0, 0, 0);
13571 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13572 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13573 28 64 62 2c 20 22 49 73 56 61 6c 69 64 22 2c 20  (db, "IsValid", 
13574 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13575 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13576 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13577 2c 0a 09 09 09 09 66 6e 63 74 5f 49 73 56 61 6c  ,.....fnct_IsVal
13578 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  id, 0, 0, 0);.  
13579 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1357a 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1357b 2c 20 22 49 73 56 61 6c 69 64 22 2c 20 32 2c 0a  , "IsValid", 2,.
1357c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1357d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1357e 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1357f 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69 64 2c  ...fnct_IsValid,
13580 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13581 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13582 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13583 53 54 5f 49 73 56 61 6c 69 64 22 2c 20 31 2c 0a  ST_IsValid", 1,.
13584 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13585 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13586 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13587 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69 64 2c  ...fnct_IsValid,
13588 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13589 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1358a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1358b 53 54 5f 49 73 56 61 6c 69 64 22 2c 20 32 2c 0a  ST_IsValid", 2,.
1358c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1358d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1358e 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1358f 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69 64 2c  ...fnct_IsValid,
13590 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13591 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13592 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13593 47 4c 65 6e 67 74 68 22 2c 20 31 2c 0a 09 09 09  GLength", 1,....
13594 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13595 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13596 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13597 66 6e 63 74 5f 4c 65 6e 67 74 68 2c 20 30 2c 20  fnct_Length, 0, 
13598 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13599 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1359a 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 4c 65 6e  on_v2 (db, "GLen
1359b 67 74 68 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  gth", 2,.....SQL
1359c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1359d 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1359e 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1359f 5f 4c 65 6e 67 74 68 2c 20 30 2c 20 30 2c 20 30  _Length, 0, 0, 0
135a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
135a1 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
135a2 32 20 28 64 62 2c 20 22 53 54 5f 4c 65 6e 67 74  2 (db, "ST_Lengt
135a3 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  h", 1,.....SQLIT
135a4 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
135a5 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
135a6 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c  ache,.....fnct_L
135a7 65 6e 67 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b  ength, 0, 0, 0);
135a8 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
135a9 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
135aa 28 64 62 2c 20 22 53 54 5f 4c 65 6e 67 74 68 22  (db, "ST_Length"
135ab 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
135ac 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
135ad 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
135ae 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 65 6e  he,.....fnct_Len
135af 67 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  gth, 0, 0, 0);. 
135b0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
135b1 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
135b2 62 2c 20 22 50 65 72 69 6d 65 74 65 72 22 2c 20  b, "Perimeter", 
135b3 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
135b4 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
135b5 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
135b6 2c 0a 09 09 09 09 66 6e 63 74 5f 50 65 72 69 6d  ,.....fnct_Perim
135b7 65 74 65 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eter, 0, 0, 0);.
135b8 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
135b9 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
135ba 64 62 2c 20 22 50 65 72 69 6d 65 74 65 72 22 2c  db, "Perimeter",
135bb 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
135bc 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
135bd 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
135be 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50 65 72 69  e,.....fnct_Peri
135bf 6d 65 74 65 72 2c 20 30 2c 20 30 2c 20 30 29 3b  meter, 0, 0, 0);
135c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
135c1 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
135c2 28 64 62 2c 20 22 53 54 5f 50 65 72 69 6d 65 74  (db, "ST_Perimet
135c3 65 72 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  er", 1,.....SQLI
135c4 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
135c5 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
135c6 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
135c7 50 65 72 69 6d 65 74 65 72 2c 20 30 2c 20 30 2c  Perimeter, 0, 0,
135c8 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
135c9 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
135ca 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 50 65 72  _v2 (db, "ST_Per
135cb 69 6d 65 74 65 72 22 2c 20 32 2c 0a 09 09 09 09  imeter", 2,.....
135cc 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
135cd 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
135ce 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
135cf 6e 63 74 5f 50 65 72 69 6d 65 74 65 72 2c 20 30  nct_Perimeter, 0
135d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
135d1 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
135d2 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41 72  tion_v2 (db, "Ar
135d3 65 61 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  ea", 1,.....SQLI
135d4 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
135d5 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
135d6 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
135d7 41 72 65 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Area, 0, 0, 0);.
135d8 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
135d9 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
135da 64 62 2c 20 22 53 54 5f 41 72 65 61 22 2c 20 31  db, "ST_Area", 1
135db 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
135dc 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
135dd 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
135de 0a 09 09 09 09 66 6e 63 74 5f 41 72 65 61 2c 20  .....fnct_Area, 
135df 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
135e0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
135e1 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
135e2 69 72 63 75 6c 61 72 69 74 79 22 2c 20 31 2c 0a  ircularity", 1,.
135e3 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
135e4 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
135e5 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
135e6 09 09 09 66 6e 63 74 5f 43 69 72 63 75 6c 61 72  ...fnct_Circular
135e7 69 74 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ity, 0, 0, 0);. 
135e8 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
135e9 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
135ea 62 2c 20 22 53 54 5f 43 65 6e 74 72 6f 69 64 22  b, "ST_Centroid"
135eb 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
135ec 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
135ed 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
135ee 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 65 6e  he,.....fnct_Cen
135ef 74 72 6f 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b  troid, 0, 0, 0);
135f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
135f1 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
135f2 28 64 62 2c 20 22 43 65 6e 74 72 6f 69 64 22 2c  (db, "Centroid",
135f3 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
135f4 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
135f5 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
135f6 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 65 6e 74  e,.....fnct_Cent
135f7 72 6f 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  roid, 0, 0, 0);.
135f8 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
135f9 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
135fa 64 62 2c 20 22 50 6f 69 6e 74 4f 6e 53 75 72 66  db, "PointOnSurf
135fb 61 63 65 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ace", 1,.....SQL
135fc 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
135fd 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
135fe 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
135ff 5f 50 6f 69 6e 74 4f 6e 53 75 72 66 61 63 65 2c  _PointOnSurface,
13600 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13601 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13602 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13603 53 54 5f 50 6f 69 6e 74 4f 6e 53 75 72 66 61 63  ST_PointOnSurfac
13604 65 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  e", 1,.....SQLIT
13605 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13606 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13607 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 50  ache,.....fnct_P
13608 6f 69 6e 74 4f 6e 53 75 72 66 61 63 65 2c 20 30  ointOnSurface, 0
13609 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1360a 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1360b 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 69  tion_v2 (db, "Si
1360c 6d 70 6c 69 66 79 22 2c 20 32 2c 0a 09 09 09 09  mplify", 2,.....
1360d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1360e 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1360f 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13610 6e 63 74 5f 53 69 6d 70 6c 69 66 79 2c 20 30 2c  nct_Simplify, 0,
13611 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13612 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13613 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
13614 53 69 6d 70 6c 69 66 79 22 2c 20 32 2c 0a 09 09  Simplify", 2,...
13615 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13616 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13617 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13618 09 66 6e 63 74 5f 53 69 6d 70 6c 69 66 79 2c 20  .fnct_Simplify, 
13619 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1361a 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1361b 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
1361c 54 5f 47 65 6e 65 72 61 6c 69 7a 65 22 2c 20 32  T_Generalize", 2
1361d 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1361e 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1361f 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13620 0a 09 09 09 09 66 6e 63 74 5f 53 69 6d 70 6c 69  .....fnct_Simpli
13621 66 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  fy, 0, 0, 0);.  
13622 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13623 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13624 2c 20 22 53 69 6d 70 6c 69 66 79 50 72 65 73 65  , "SimplifyPrese
13625 72 76 65 54 6f 70 6f 6c 6f 67 79 22 2c 20 32 2c  rveTopology", 2,
13626 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13627 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13628 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13629 09 09 09 09 66 6e 63 74 5f 53 69 6d 70 6c 69 66  ....fnct_Simplif
1362a 79 50 72 65 73 65 72 76 65 54 6f 70 6f 6c 6f 67  yPreserveTopolog
1362b 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  y, 0, 0, 0);.   
1362c 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1362d 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1362e 20 22 53 54 5f 53 69 6d 70 6c 69 66 79 50 72 65   "ST_SimplifyPre
1362f 73 65 72 76 65 54 6f 70 6f 6c 6f 67 79 22 2c 20  serveTopology", 
13630 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13631 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13632 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13633 2c 0a 09 09 09 09 66 6e 63 74 5f 53 69 6d 70 6c  ,.....fnct_Simpl
13634 69 66 79 50 72 65 73 65 72 76 65 54 6f 70 6f 6c  ifyPreserveTopol
13635 6f 67 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ogy, 0, 0, 0);. 
13636 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13637 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13638 62 2c 20 22 43 6f 6e 76 65 78 48 75 6c 6c 22 2c  b, "ConvexHull",
13639 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
1363a 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1363b 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
1363c 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6e 76  e,.....fnct_Conv
1363d 65 78 48 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 29  exHull, 0, 0, 0)
1363e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1363f 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13640 20 28 64 62 2c 20 22 53 54 5f 43 6f 6e 76 65 78   (db, "ST_Convex
13641 48 75 6c 6c 22 2c 20 31 2c 0a 09 09 09 09 53 51  Hull", 1,.....SQ
13642 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13643 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13644 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13645 74 5f 43 6f 6e 76 65 78 48 75 6c 6c 2c 20 30 2c  t_ConvexHull, 0,
13646 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13647 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13648 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 42 75 66  ion_v2 (db, "Buf
13649 66 65 72 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  fer", 2,.....SQL
1364a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1364b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1364c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1364d 5f 42 75 66 66 65 72 2c 20 30 2c 20 30 2c 20 30  _Buffer, 0, 0, 0
1364e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1364f 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13650 32 20 28 64 62 2c 20 22 53 54 5f 42 75 66 66 65  2 (db, "ST_Buffe
13651 72 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  r", 2,.....SQLIT
13652 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13653 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13654 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 42  ache,.....fnct_B
13655 75 66 66 65 72 2c 20 30 2c 20 30 2c 20 30 29 3b  uffer, 0, 0, 0);
13656 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13657 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13658 28 64 62 2c 20 22 42 75 66 66 65 72 22 2c 20 33  (db, "Buffer", 3
13659 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1365a 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1365b 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1365c 0a 09 09 09 09 66 6e 63 74 5f 42 75 66 66 65 72  .....fnct_Buffer
1365d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1365e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1365f 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13660 22 53 54 5f 42 75 66 66 65 72 22 2c 20 33 2c 0a  "ST_Buffer", 3,.
13661 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13662 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13663 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13664 09 09 09 66 6e 63 74 5f 42 75 66 66 65 72 2c 20  ...fnct_Buffer, 
13665 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13666 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13667 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 49  ction_v2 (db, "I
13668 6e 74 65 72 73 65 63 74 69 6f 6e 22 2c 20 32 2c  ntersection", 2,
13669 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1366a 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1366b 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
1366c 09 09 09 09 66 6e 63 74 5f 49 6e 74 65 72 73 65  ....fnct_Interse
1366d 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
1366e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1366f 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13670 28 64 62 2c 20 22 53 54 5f 49 6e 74 65 72 73 65  (db, "ST_Interse
13671 63 74 69 6f 6e 22 2c 20 32 2c 0a 09 09 09 09 53  ction", 2,.....S
13672 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13673 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13674 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13675 63 74 5f 49 6e 74 65 72 73 65 63 74 69 6f 6e 2c  ct_Intersection,
13676 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13677 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13678 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13679 47 55 6e 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09  GUnion", 1,.....
1367a 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1367b 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1367c 49 43 2c 20 63 61 63 68 65 2c 20 30 2c 0a 09 09  IC, cache, 0,...
1367d 09 09 66 6e 63 74 5f 55 6e 69 6f 6e 5f 73 74 65  ..fnct_Union_ste
1367e 70 2c 20 66 6e 63 74 5f 55 6e 69 6f 6e 5f 66 69  p, fnct_Union_fi
1367f 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  nal, 0);.    sql
13680 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13681 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 55  tion_v2 (db, "GU
13682 6e 69 6f 6e 22 2c 20 32 2c 0a 09 09 09 09 53 51  nion", 2,.....SQ
13683 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13684 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13685 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13686 74 5f 55 6e 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  t_Union, 0, 0, 0
13687 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13688 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13689 32 20 28 64 62 2c 20 22 53 54 5f 55 6e 69 6f 6e  2 (db, "ST_Union
1368a 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
1368b 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1368c 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1368d 63 68 65 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  che, 0,.....fnct
1368e 5f 55 6e 69 6f 6e 5f 73 74 65 70 2c 20 66 6e 63  _Union_step, fnc
1368f 74 5f 55 6e 69 6f 6e 5f 66 69 6e 61 6c 2c 20 30  t_Union_final, 0
13690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13691 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13692 32 20 28 64 62 2c 20 22 53 54 5f 55 6e 69 6f 6e  2 (db, "ST_Union
13693 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
13694 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13695 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13696 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 55 6e  che,.....fnct_Un
13697 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ion, 0, 0, 0);. 
13698 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13699 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1369a 62 2c 20 22 44 69 66 66 65 72 65 6e 63 65 22 2c  b, "Difference",
1369b 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
1369c 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1369d 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
1369e 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 66 66  e,.....fnct_Diff
1369f 65 72 65 6e 63 65 2c 20 30 2c 20 30 2c 20 30 29  erence, 0, 0, 0)
136a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
136a1 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
136a2 20 28 64 62 2c 20 22 53 54 5f 44 69 66 66 65 72   (db, "ST_Differ
136a3 65 6e 63 65 22 2c 20 32 2c 0a 09 09 09 09 53 51  ence", 2,.....SQ
136a4 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
136a5 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
136a6 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
136a7 74 5f 44 69 66 66 65 72 65 6e 63 65 2c 20 30 2c  t_Difference, 0,
136a8 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
136a9 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
136aa 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 79 6d  ion_v2 (db, "Sym
136ab 44 69 66 66 65 72 65 6e 63 65 22 2c 20 32 2c 0a  Difference", 2,.
136ac 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
136ad 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
136ae 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
136af 09 09 09 66 6e 63 74 5f 53 79 6d 44 69 66 66 65  ...fnct_SymDiffe
136b0 72 65 6e 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b  rence, 0, 0, 0);
136b1 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
136b2 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
136b3 28 64 62 2c 20 22 53 54 5f 53 79 6d 44 69 66 66  (db, "ST_SymDiff
136b4 65 72 65 6e 63 65 22 2c 20 32 2c 0a 09 09 09 09  erence", 2,.....
136b5 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
136b6 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
136b7 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
136b8 6e 63 74 5f 53 79 6d 44 69 66 66 65 72 65 6e 63  nct_SymDifferenc
136b9 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
136ba 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
136bb 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
136bc 20 22 45 71 75 61 6c 73 22 2c 20 32 2c 0a 09 09   "Equals", 2,...
136bd 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
136be 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
136bf 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
136c0 09 66 6e 63 74 5f 45 71 75 61 6c 73 2c 20 30 2c  .fnct_Equals, 0,
136c1 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
136c2 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
136c3 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
136c4 45 71 75 61 6c 73 22 2c 20 32 2c 0a 09 09 09 09  Equals", 2,.....
136c5 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
136c6 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
136c7 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
136c8 6e 63 74 5f 45 71 75 61 6c 73 2c 20 30 2c 20 30  nct_Equals, 0, 0
136c9 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
136ca 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
136cb 6e 5f 76 32 20 28 64 62 2c 20 22 49 6e 74 65 72  n_v2 (db, "Inter
136cc 73 65 63 74 73 22 2c 20 32 2c 0a 09 09 09 09 53  sects", 2,.....S
136cd 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
136ce 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
136cf 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
136d0 63 74 5f 49 6e 74 65 72 73 65 63 74 73 2c 20 30  ct_Intersects, 0
136d1 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
136d2 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
136d3 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
136d4 5f 49 6e 74 65 72 73 65 63 74 73 22 2c 20 32 2c  _Intersects", 2,
136d5 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
136d6 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
136d7 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
136d8 09 09 09 09 66 6e 63 74 5f 49 6e 74 65 72 73 65  ....fnct_Interse
136d9 63 74 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  cts, 0, 0, 0);. 
136da 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
136db 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
136dc 62 2c 20 22 44 69 73 6a 6f 69 6e 74 22 2c 20 32  b, "Disjoint", 2
136dd 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
136de 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
136df 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
136e0 0a 09 09 09 09 66 6e 63 74 5f 44 69 73 6a 6f 69  .....fnct_Disjoi
136e1 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
136e2 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
136e3 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
136e4 2c 20 22 53 54 5f 44 69 73 6a 6f 69 6e 74 22 2c  , "ST_Disjoint",
136e5 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
136e6 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
136e7 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
136e8 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 73 6a  e,.....fnct_Disj
136e9 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oint, 0, 0, 0);.
136ea 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
136eb 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
136ec 64 62 2c 20 22 4f 76 65 72 6c 61 70 73 22 2c 20  db, "Overlaps", 
136ed 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
136ee 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
136ef 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
136f0 2c 0a 09 09 09 09 66 6e 63 74 5f 4f 76 65 72 6c  ,.....fnct_Overl
136f1 61 70 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  aps, 0, 0, 0);. 
136f2 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
136f3 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
136f4 62 2c 20 22 53 54 5f 4f 76 65 72 6c 61 70 73 22  b, "ST_Overlaps"
136f5 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
136f6 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
136f7 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
136f8 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4f 76 65  he,.....fnct_Ove
136f9 72 6c 61 70 73 2c 20 30 2c 20 30 2c 20 30 29 3b  rlaps, 0, 0, 0);
136fa 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
136fb 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
136fc 28 64 62 2c 20 22 43 72 6f 73 73 65 73 22 2c 20  (db, "Crosses", 
136fd 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
136fe 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
136ff 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13700 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72 6f 73 73  ,.....fnct_Cross
13701 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  es, 0, 0, 0);.  
13702 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13703 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13704 2c 20 22 53 54 5f 43 72 6f 73 73 65 73 22 2c 20  , "ST_Crosses", 
13705 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13706 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13707 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13708 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72 6f 73 73  ,.....fnct_Cross
13709 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  es, 0, 0, 0);.  
1370a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1370b 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1370c 2c 20 22 54 6f 75 63 68 65 73 22 2c 20 32 2c 0a  , "Touches", 2,.
1370d 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1370e 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1370f 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13710 09 09 09 66 6e 63 74 5f 54 6f 75 63 68 65 73 2c  ...fnct_Touches,
13711 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13712 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13713 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13714 53 54 5f 54 6f 75 63 68 65 73 22 2c 20 32 2c 0a  ST_Touches", 2,.
13715 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13716 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13717 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13718 09 09 09 66 6e 63 74 5f 54 6f 75 63 68 65 73 2c  ...fnct_Touches,
13719 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1371a 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1371b 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1371c 57 69 74 68 69 6e 22 2c 20 32 2c 0a 09 09 09 09  Within", 2,.....
1371d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1371e 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1371f 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13720 6e 63 74 5f 57 69 74 68 69 6e 2c 20 30 2c 20 30  nct_Within, 0, 0
13721 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13722 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13723 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 57 69  n_v2 (db, "ST_Wi
13724 74 68 69 6e 22 2c 20 32 2c 0a 09 09 09 09 53 51  thin", 2,.....SQ
13725 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13726 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13727 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13728 74 5f 57 69 74 68 69 6e 2c 20 30 2c 20 30 2c 20  t_Within, 0, 0, 
13729 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1372a 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1372b 76 32 20 28 64 62 2c 20 22 43 6f 6e 74 61 69 6e  v2 (db, "Contain
1372c 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  s", 2,.....SQLIT
1372d 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1372e 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
1372f 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43  ache,.....fnct_C
13730 6f 6e 74 61 69 6e 73 2c 20 30 2c 20 30 2c 20 30  ontains, 0, 0, 0
13731 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13732 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13733 32 20 28 64 62 2c 20 22 53 54 5f 43 6f 6e 74 61  2 (db, "ST_Conta
13734 69 6e 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  ins", 2,.....SQL
13735 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13736 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13737 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13738 5f 43 6f 6e 74 61 69 6e 73 2c 20 30 2c 20 30 2c  _Contains, 0, 0,
13739 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1373a 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1373b 5f 76 32 20 28 64 62 2c 20 22 52 65 6c 61 74 65  _v2 (db, "Relate
1373c 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
1373d 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1373e 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1373f 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65  che,.....fnct_Re
13740 6c 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  late, 0, 0, 0);.
13741 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13742 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13743 64 62 2c 20 22 52 65 6c 61 74 65 22 2c 20 33 2c  db, "Relate", 3,
13744 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13745 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13746 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13747 09 09 09 09 66 6e 63 74 5f 52 65 6c 61 74 65 2c  ....fnct_Relate,
13748 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13749 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1374a 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1374b 53 54 5f 52 65 6c 61 74 65 22 2c 20 32 2c 0a 09  ST_Relate", 2,..
1374c 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1374d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1374e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
1374f 09 09 66 6e 63 74 5f 52 65 6c 61 74 65 2c 20 30  ..fnct_Relate, 0
13750 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13751 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13752 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13753 5f 52 65 6c 61 74 65 22 2c 20 33 2c 0a 09 09 09  _Relate", 3,....
13754 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13755 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13756 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13757 66 6e 63 74 5f 52 65 6c 61 74 65 2c 20 30 2c 20  fnct_Relate, 0, 
13758 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13759 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1375a 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 52  on_v2 (db, "ST_R
1375b 65 6c 61 74 65 4d 61 74 63 68 22 2c 20 32 2c 0a  elateMatch", 2,.
1375c 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
1375d 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
1375e 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
1375f 09 09 09 66 6e 63 74 5f 52 65 6c 61 74 65 4d 61  ...fnct_RelateMa
13760 74 63 68 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  tch, 0, 0, 0);. 
13761 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13762 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13763 62 2c 20 22 44 69 73 74 61 6e 63 65 22 2c 20 32  b, "Distance", 2
13764 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13765 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13766 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13767 0a 09 09 09 09 66 6e 63 74 5f 44 69 73 74 61 6e  .....fnct_Distan
13768 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ce, 0, 0, 0);.  
13769 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1376a 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1376b 2c 20 22 44 69 73 74 61 6e 63 65 22 2c 20 33 2c  , "Distance", 3,
1376c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1376d 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1376e 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
1376f 09 09 09 09 66 6e 63 74 5f 44 69 73 74 61 6e 63  ....fnct_Distanc
13770 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
13771 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13772 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13773 20 22 53 54 5f 44 69 73 74 61 6e 63 65 22 2c 20   "ST_Distance", 
13774 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13775 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13776 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13777 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 73 74 61  ,.....fnct_Dista
13778 6e 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  nce, 0, 0, 0);. 
13779 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1377a 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1377b 62 2c 20 22 53 54 5f 44 69 73 74 61 6e 63 65 22  b, "ST_Distance"
1377c 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
1377d 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1377e 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1377f 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 69 73  he,.....fnct_Dis
13780 74 61 6e 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b  tance, 0, 0, 0);
13781 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13782 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13783 28 64 62 2c 20 22 50 74 44 69 73 74 57 69 74 68  (db, "PtDistWith
13784 69 6e 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49  in", 3,.....SQLI
13785 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13786 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13787 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13788 50 74 44 69 73 74 57 69 74 68 69 6e 2c 20 30 2c  PtDistWithin, 0,
13789 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1378a 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1378b 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 50 74 44  ion_v2 (db, "PtD
1378c 69 73 74 57 69 74 68 69 6e 22 2c 20 34 2c 0a 09  istWithin", 4,..
1378d 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1378e 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1378f 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
13790 09 09 66 6e 63 74 5f 50 74 44 69 73 74 57 69 74  ..fnct_PtDistWit
13791 68 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  hin, 0, 0, 0);. 
13792 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13793 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13794 62 2c 20 22 42 64 50 6f 6c 79 46 72 6f 6d 54 65  b, "BdPolyFromTe
13795 78 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  xt", 1,.....SQLI
13796 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13797 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13798 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13799 42 64 50 6f 6c 79 46 72 6f 6d 54 65 78 74 31 2c  BdPolyFromText1,
1379a 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1379b 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1379c 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1379d 42 64 50 6f 6c 79 46 72 6f 6d 54 65 78 74 22 2c  BdPolyFromText",
1379e 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
1379f 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
137a0 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
137a1 65 2c 0a 09 09 09 09 66 6e 63 74 5f 42 64 50 6f  e,.....fnct_BdPo
137a2 6c 79 46 72 6f 6d 54 65 78 74 32 2c 20 30 2c 20  lyFromText2, 0, 
137a3 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
137a4 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
137a5 6f 6e 5f 76 32 20 28 64 62 2c 20 22 42 64 4d 50  on_v2 (db, "BdMP
137a6 6f 6c 79 46 72 6f 6d 54 65 78 74 22 2c 20 31 2c  olyFromText", 1,
137a7 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
137a8 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
137a9 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
137aa 09 09 09 09 66 6e 63 74 5f 42 64 4d 50 6f 6c 79  ....fnct_BdMPoly
137ab 46 72 6f 6d 54 65 78 74 31 2c 20 30 2c 20 30 2c  FromText1, 0, 0,
137ac 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
137ad 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
137ae 5f 76 32 20 28 64 62 2c 20 22 42 64 4d 50 6f 6c  _v2 (db, "BdMPol
137af 79 46 72 6f 6d 54 65 78 74 22 2c 20 32 2c 0a 09  yFromText", 2,..
137b0 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
137b1 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
137b2 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
137b3 09 09 66 6e 63 74 5f 42 64 4d 50 6f 6c 79 46 72  ..fnct_BdMPolyFr
137b4 6f 6d 54 65 78 74 32 2c 20 30 2c 20 30 2c 20 30  omText2, 0, 0, 0
137b5 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
137b6 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
137b7 32 20 28 64 62 2c 20 22 42 64 50 6f 6c 79 46 72  2 (db, "BdPolyFr
137b8 6f 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53  omWKB", 1,.....S
137b9 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
137ba 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
137bb 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
137bc 63 74 5f 42 64 50 6f 6c 79 46 72 6f 6d 57 4b 42  ct_BdPolyFromWKB
137bd 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
137be 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
137bf 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
137c0 20 22 42 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 22   "BdPolyFromWKB"
137c1 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
137c2 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
137c3 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
137c4 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 42 64 50  he,.....fnct_BdP
137c5 6f 6c 79 46 72 6f 6d 57 4b 42 32 2c 20 30 2c 20  olyFromWKB2, 0, 
137c6 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
137c7 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
137c8 6f 6e 5f 76 32 20 28 64 62 2c 20 22 42 64 4d 50  on_v2 (db, "BdMP
137c9 6f 6c 79 46 72 6f 6d 57 4b 42 22 2c 20 31 2c 0a  olyFromWKB", 1,.
137ca 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
137cb 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
137cc 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
137cd 09 09 09 66 6e 63 74 5f 42 64 4d 50 6f 6c 79 46  ...fnct_BdMPolyF
137ce 72 6f 6d 57 4b 42 31 2c 20 30 2c 20 30 2c 20 30  romWKB1, 0, 0, 0
137cf 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
137d0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
137d1 32 20 28 64 62 2c 20 22 42 64 4d 50 6f 6c 79 46  2 (db, "BdMPolyF
137d2 72 6f 6d 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09  romWKB", 2,.....
137d3 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
137d4 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
137d5 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
137d6 6e 63 74 5f 42 64 4d 50 6f 6c 79 46 72 6f 6d 57  nct_BdMPolyFromW
137d7 4b 42 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  KB2, 0, 0, 0);. 
137d8 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
137d9 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
137da 62 2c 20 22 53 54 5f 42 64 50 6f 6c 79 46 72 6f  b, "ST_BdPolyFro
137db 6d 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53  mText", 1,.....S
137dc 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
137dd 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
137de 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
137df 63 74 5f 42 64 50 6f 6c 79 46 72 6f 6d 54 65 78  ct_BdPolyFromTex
137e0 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t1, 0, 0, 0);.  
137e1 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
137e2 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
137e3 2c 20 22 53 54 5f 42 64 50 6f 6c 79 46 72 6f 6d  , "ST_BdPolyFrom
137e4 54 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53 51  Text", 2,.....SQ
137e5 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
137e6 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
137e7 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
137e8 74 5f 42 64 50 6f 6c 79 46 72 6f 6d 54 65 78 74  t_BdPolyFromText
137e9 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  2, 0, 0, 0);.   
137ea 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
137eb 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
137ec 20 22 53 54 5f 42 64 4d 50 6f 6c 79 46 72 6f 6d   "ST_BdMPolyFrom
137ed 54 65 78 74 22 2c 20 31 2c 0a 09 09 09 09 53 51  Text", 1,.....SQ
137ee 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
137ef 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
137f0 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
137f1 74 5f 42 64 4d 50 6f 6c 79 46 72 6f 6d 54 65 78  t_BdMPolyFromTex
137f2 74 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  t1, 0, 0, 0);.  
137f3 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
137f4 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
137f5 2c 20 22 53 54 5f 42 64 4d 50 6f 6c 79 46 72 6f  , "ST_BdMPolyFro
137f6 6d 54 65 78 74 22 2c 20 32 2c 0a 09 09 09 09 53  mText", 2,.....S
137f7 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
137f8 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
137f9 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
137fa 63 74 5f 42 64 4d 50 6f 6c 79 46 72 6f 6d 54 65  ct_BdMPolyFromTe
137fb 78 74 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  xt2, 0, 0, 0);. 
137fc 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
137fd 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
137fe 62 2c 20 22 53 54 5f 42 64 50 6f 6c 79 46 72 6f  b, "ST_BdPolyFro
137ff 6d 57 4b 42 22 2c 20 31 2c 0a 09 09 09 09 53 51  mWKB", 1,.....SQ
13800 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13801 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13802 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13803 74 5f 42 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 31  t_BdPolyFromWKB1
13804 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13805 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13806 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13807 22 53 54 5f 42 64 50 6f 6c 79 46 72 6f 6d 57 4b  "ST_BdPolyFromWK
13808 42 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  B", 2,.....SQLIT
13809 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
1380a 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
1380b 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 42  ache,.....fnct_B
1380c 64 50 6f 6c 79 46 72 6f 6d 57 4b 42 32 2c 20 30  dPolyFromWKB2, 0
1380d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1380e 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1380f 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13810 5f 42 64 4d 50 6f 6c 79 46 72 6f 6d 57 4b 42 22  _BdMPolyFromWKB"
13811 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
13812 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13813 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13814 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 42 64 4d  he,.....fnct_BdM
13815 50 6f 6c 79 46 72 6f 6d 57 4b 42 31 2c 20 30 2c  PolyFromWKB1, 0,
13816 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13817 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13818 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
13819 42 64 4d 50 6f 6c 79 46 72 6f 6d 57 4b 42 22 2c  BdMPolyFromWKB",
1381a 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
1381b 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1381c 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
1381d 65 2c 0a 09 09 09 09 66 6e 63 74 5f 42 64 4d 50  e,.....fnct_BdMP
1381e 6f 6c 79 46 72 6f 6d 57 4b 42 32 2c 20 30 2c 20  olyFromWKB2, 0, 
1381f 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13820 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13821 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4f 66 66 73  on_v2 (db, "Offs
13822 65 74 43 75 72 76 65 22 2c 20 32 2c 0a 09 09 09  etCurve", 2,....
13823 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13824 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13825 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13826 66 6e 63 74 5f 4f 66 66 73 65 74 43 75 72 76 65  fnct_OffsetCurve
13827 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13828 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13829 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1382a 22 53 54 5f 4f 66 66 73 65 74 43 75 72 76 65 22  "ST_OffsetCurve"
1382b 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
1382c 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1382d 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1382e 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4f 66 66  he,.....fnct_Off
1382f 73 65 74 43 75 72 76 65 2c 20 30 2c 20 30 2c 20  setCurve, 0, 0, 
13830 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13831 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13832 76 32 20 28 64 62 2c 20 22 53 69 6e 67 6c 65 53  v2 (db, "SingleS
13833 69 64 65 64 42 75 66 66 65 72 22 2c 20 33 2c 0a  idedBuffer", 3,.
13834 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13835 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13836 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13837 09 09 09 66 6e 63 74 5f 53 69 6e 67 6c 65 53 69  ...fnct_SingleSi
13838 64 65 64 42 75 66 66 65 72 2c 20 30 2c 20 30 2c  dedBuffer, 0, 0,
13839 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1383a 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1383b 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53 69 6e  _v2 (db, "ST_Sin
1383c 67 6c 65 53 69 64 65 64 42 75 66 66 65 72 22 2c  gleSidedBuffer",
1383d 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
1383e 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1383f 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13840 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 69 6e 67  e,.....fnct_Sing
13841 6c 65 53 69 64 65 64 42 75 66 66 65 72 2c 20 30  leSidedBuffer, 0
13842 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13843 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13844 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 48 61  tion_v2 (db, "Ha
13845 75 73 64 6f 72 66 66 44 69 73 74 61 6e 63 65 22  usdorffDistance"
13846 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
13847 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13848 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13849 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 48 61 75  he,.....fnct_Hau
1384a 73 64 6f 72 66 66 44 69 73 74 61 6e 63 65 2c 20  sdorffDistance, 
1384b 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1384c 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1384d 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
1384e 54 5f 48 61 75 73 64 6f 72 66 66 44 69 73 74 61  T_HausdorffDista
1384f 6e 63 65 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  nce", 2,.....SQL
13850 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13851 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13852 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13853 5f 48 61 75 73 64 6f 72 66 66 44 69 73 74 61 6e  _HausdorffDistan
13854 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ce, 0, 0, 0);.  
13855 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13856 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13857 2c 20 22 53 68 61 72 65 64 50 61 74 68 73 22 2c  , "SharedPaths",
13858 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
13859 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1385a 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
1385b 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 68 61 72  e,.....fnct_Shar
1385c 65 64 50 61 74 68 73 2c 20 30 2c 20 30 2c 20 30  edPaths, 0, 0, 0
1385d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1385e 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1385f 32 20 28 64 62 2c 20 22 53 54 5f 53 68 61 72 65  2 (db, "ST_Share
13860 64 50 61 74 68 73 22 2c 20 32 2c 0a 09 09 09 09  dPaths", 2,.....
13861 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13862 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13863 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13864 6e 63 74 5f 53 68 61 72 65 64 50 61 74 68 73 2c  nct_SharedPaths,
13865 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13866 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13867 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13868 43 6f 76 65 72 73 22 2c 20 32 2c 0a 09 09 09 09  Covers", 2,.....
13869 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1386a 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1386b 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
1386c 6e 63 74 5f 43 6f 76 65 72 73 2c 20 30 2c 20 30  nct_Covers, 0, 0
1386d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1386e 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1386f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 43 6f  n_v2 (db, "ST_Co
13870 76 65 72 73 22 2c 20 32 2c 0a 09 09 09 09 53 51  vers", 2,.....SQ
13871 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13872 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13873 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13874 74 5f 43 6f 76 65 72 73 2c 20 30 2c 20 30 2c 20  t_Covers, 0, 0, 
13875 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13876 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13877 76 32 20 28 64 62 2c 20 22 43 6f 76 65 72 65 64  v2 (db, "Covered
13878 42 79 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  By", 2,.....SQLI
13879 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1387a 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1387b 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
1387c 43 6f 76 65 72 65 64 42 79 2c 20 30 2c 20 30 2c  CoveredBy, 0, 0,
1387d 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1387e 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1387f 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 43 6f 76  _v2 (db, "ST_Cov
13880 65 72 65 64 42 79 22 2c 20 32 2c 0a 09 09 09 09  eredBy", 2,.....
13881 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13882 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13883 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13884 6e 63 74 5f 43 6f 76 65 72 65 64 42 79 2c 20 30  nct_CoveredBy, 0
13885 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13886 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13887 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 4c 69  tion_v2 (db, "Li
13888 6e 65 5f 49 6e 74 65 72 70 6f 6c 61 74 65 5f 50  ne_Interpolate_P
13889 6f 69 6e 74 22 2c 20 32 2c 0a 09 09 09 09 53 51  oint", 2,.....SQ
1388a 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
1388b 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1388c 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
1388d 74 5f 4c 69 6e 65 49 6e 74 65 72 70 6f 6c 61 74  t_LineInterpolat
1388e 65 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29  ePoint, 0, 0, 0)
1388f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13890 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13891 20 28 64 62 2c 20 22 53 54 5f 4c 69 6e 65 5f 49   (db, "ST_Line_I
13892 6e 74 65 72 70 6f 6c 61 74 65 5f 50 6f 69 6e 74  nterpolate_Point
13893 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
13894 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13895 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13896 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 69  che,.....fnct_Li
13897 6e 65 49 6e 74 65 72 70 6f 6c 61 74 65 50 6f 69  neInterpolatePoi
13898 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
13899 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1389a 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1389b 2c 20 22 4c 69 6e 65 5f 49 6e 74 65 72 70 6f 6c  , "Line_Interpol
1389c 61 74 65 5f 45 71 75 69 64 69 73 74 61 6e 74 5f  ate_Equidistant_
1389d 50 6f 69 6e 74 73 22 2c 20 32 2c 0a 09 09 09 09  Points", 2,.....
1389e 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1389f 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
138a0 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
138a1 6e 63 74 5f 4c 69 6e 65 49 6e 74 65 72 70 6f 6c  nct_LineInterpol
138a2 61 74 65 45 71 75 69 64 69 73 74 61 6e 74 50 6f  ateEquidistantPo
138a3 69 6e 74 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ints, 0, 0, 0);.
138a4 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
138a5 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
138a6 64 62 2c 20 22 53 54 5f 4c 69 6e 65 5f 49 6e 74  db, "ST_Line_Int
138a7 65 72 70 6f 6c 61 74 65 5f 45 71 75 69 64 69 73  erpolate_Equidis
138a8 74 61 6e 74 5f 50 6f 69 6e 74 73 22 2c 0a 09 09  tant_Points",...
138a9 09 09 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ..2, SQLITE_UTF8
138aa 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
138ab 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
138ac 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65 49 6e 74  ....fnct_LineInt
138ad 65 72 70 6f 6c 61 74 65 45 71 75 69 64 69 73 74  erpolateEquidist
138ae 61 6e 74 50 6f 69 6e 74 73 2c 20 30 2c 20 30 2c  antPoints, 0, 0,
138af 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
138b0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
138b1 5f 76 32 20 28 64 62 2c 20 22 4c 69 6e 65 5f 4c  _v2 (db, "Line_L
138b2 6f 63 61 74 65 5f 50 6f 69 6e 74 22 2c 20 32 2c  ocate_Point", 2,
138b3 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
138b4 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
138b5 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
138b6 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65 4c 6f 63  ....fnct_LineLoc
138b7 61 74 65 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20  atePoint, 0, 0, 
138b8 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
138b9 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
138ba 76 32 20 28 64 62 2c 20 22 53 54 5f 4c 69 6e 65  v2 (db, "ST_Line
138bb 5f 4c 6f 63 61 74 65 5f 50 6f 69 6e 74 22 2c 20  _Locate_Point", 
138bc 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
138bd 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
138be 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
138bf 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65 4c  ,.....fnct_LineL
138c0 6f 63 61 74 65 50 6f 69 6e 74 2c 20 30 2c 20 30  ocatePoint, 0, 0
138c1 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
138c2 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
138c3 6e 5f 76 32 20 28 64 62 2c 20 22 4c 69 6e 65 5f  n_v2 (db, "Line_
138c4 53 75 62 73 74 72 69 6e 67 22 2c 20 33 2c 0a 09  Substring", 3,..
138c5 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
138c6 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
138c7 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
138c8 09 09 66 6e 63 74 5f 4c 69 6e 65 53 75 62 73 74  ..fnct_LineSubst
138c9 72 69 6e 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ring, 0, 0, 0);.
138ca 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
138cb 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
138cc 64 62 2c 20 22 53 54 5f 4c 69 6e 65 5f 53 75 62  db, "ST_Line_Sub
138cd 73 74 72 69 6e 67 22 2c 20 33 2c 0a 09 09 09 09  string", 3,.....
138ce 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
138cf 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
138d0 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
138d1 6e 63 74 5f 4c 69 6e 65 53 75 62 73 74 72 69 6e  nct_LineSubstrin
138d2 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  g, 0, 0, 0);.   
138d3 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
138d4 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
138d5 20 22 43 6c 6f 73 65 73 74 50 6f 69 6e 74 22 2c   "ClosestPoint",
138d6 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
138d7 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
138d8 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
138d9 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6c 6f 73  e,.....fnct_Clos
138da 65 73 74 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20  estPoint, 0, 0, 
138db 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
138dc 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
138dd 76 32 20 28 64 62 2c 20 22 53 54 5f 43 6c 6f 73  v2 (db, "ST_Clos
138de 65 73 74 50 6f 69 6e 74 22 2c 20 32 2c 0a 09 09  estPoint", 2,...
138df 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
138e0 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
138e1 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
138e2 09 66 6e 63 74 5f 43 6c 6f 73 65 73 74 50 6f 69  .fnct_ClosestPoi
138e3 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
138e4 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
138e5 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
138e6 2c 20 22 53 68 6f 72 74 65 73 74 4c 69 6e 65 22  , "ShortestLine"
138e7 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
138e8 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
138e9 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
138ea 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 68 6f  he,.....fnct_Sho
138eb 72 74 65 73 74 4c 69 6e 65 2c 20 30 2c 20 30 2c  rtestLine, 0, 0,
138ec 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
138ed 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
138ee 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53 68 6f  _v2 (db, "ST_Sho
138ef 72 74 65 73 74 4c 69 6e 65 22 2c 20 32 2c 0a 09  rtestLine", 2,..
138f0 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
138f1 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
138f2 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
138f3 09 09 66 6e 63 74 5f 53 68 6f 72 74 65 73 74 4c  ..fnct_ShortestL
138f4 69 6e 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ine, 0, 0, 0);. 
138f5 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
138f6 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
138f7 62 2c 20 22 53 6e 61 70 22 2c 20 33 2c 0a 09 09  b, "Snap", 3,...
138f8 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
138f9 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
138fa 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
138fb 09 66 6e 63 74 5f 53 6e 61 70 2c 20 30 2c 20 30  .fnct_Snap, 0, 0
138fc 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
138fd 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
138fe 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53 6e  n_v2 (db, "ST_Sn
138ff 61 70 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49  ap", 3,.....SQLI
13900 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13901 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13902 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13903 53 6e 61 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Snap, 0, 0, 0);.
13904 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13905 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13906 64 62 2c 20 22 4c 69 6e 65 4d 65 72 67 65 22 2c  db, "LineMerge",
13907 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
13908 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13909 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
1390a 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 69 6e 65  e,.....fnct_Line
1390b 4d 65 72 67 65 2c 20 30 2c 20 30 2c 20 30 29 3b  Merge, 0, 0, 0);
1390c 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1390d 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1390e 28 64 62 2c 20 22 53 54 5f 4c 69 6e 65 4d 65 72  (db, "ST_LineMer
1390f 67 65 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  ge", 1,.....SQLI
13910 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13911 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13912 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13913 4c 69 6e 65 4d 65 72 67 65 2c 20 30 2c 20 30 2c  LineMerge, 0, 0,
13914 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13915 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13916 5f 76 32 20 28 64 62 2c 20 22 55 6e 61 72 79 55  _v2 (db, "UnaryU
13917 6e 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51  nion", 1,.....SQ
13918 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13919 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1391a 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
1391b 74 5f 55 6e 61 72 79 55 6e 69 6f 6e 2c 20 30 2c  t_UnaryUnion, 0,
1391c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1391d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1391e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
1391f 55 6e 61 72 79 55 6e 69 6f 6e 22 2c 20 31 2c 0a  UnaryUnion", 1,.
13920 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13921 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13922 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13923 09 09 09 66 6e 63 74 5f 55 6e 61 72 79 55 6e 69  ...fnct_UnaryUni
13924 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
13925 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13926 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13927 2c 20 22 53 71 75 61 72 65 47 72 69 64 22 2c 20  , "SquareGrid", 
13928 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13929 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1392a 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
1392b 2c 0a 09 09 09 09 66 6e 63 74 5f 53 71 75 61 72  ,.....fnct_Squar
1392c 65 47 72 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b  eGrid, 0, 0, 0);
1392d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1392e 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1392f 28 64 62 2c 20 22 53 71 75 61 72 65 47 72 69 64  (db, "SquareGrid
13930 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
13931 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13932 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13933 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 71  che,.....fnct_Sq
13934 75 61 72 65 47 72 69 64 2c 20 30 2c 20 30 2c 20  uareGrid, 0, 0, 
13935 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13936 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13937 76 32 20 28 64 62 2c 20 22 53 71 75 61 72 65 47  v2 (db, "SquareG
13938 72 69 64 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c  rid", 4,.....SQL
13939 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1393a 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1393b 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
1393c 5f 53 71 75 61 72 65 47 72 69 64 2c 20 30 2c 20  _SquareGrid, 0, 
1393d 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1393e 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1393f 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53  on_v2 (db, "ST_S
13940 71 75 61 72 65 47 72 69 64 22 2c 20 32 2c 0a 09  quareGrid", 2,..
13941 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13942 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13943 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
13944 09 09 66 6e 63 74 5f 53 71 75 61 72 65 47 72 69  ..fnct_SquareGri
13945 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
13946 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13947 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13948 20 22 53 54 5f 53 71 75 61 72 65 47 72 69 64 22   "ST_SquareGrid"
13949 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
1394a 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1394b 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1394c 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 71 75  he,.....fnct_Squ
1394d 61 72 65 47 72 69 64 2c 20 30 2c 20 30 2c 20 30  areGrid, 0, 0, 0
1394e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1394f 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13950 32 20 28 64 62 2c 20 22 53 54 5f 53 71 75 61 72  2 (db, "ST_Squar
13951 65 47 72 69 64 22 2c 20 34 2c 0a 09 09 09 09 53  eGrid", 4,.....S
13952 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13953 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13954 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13955 63 74 5f 53 71 75 61 72 65 47 72 69 64 2c 20 30  ct_SquareGrid, 0
13956 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13957 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13958 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 72  tion_v2 (db, "Tr
13959 69 61 6e 67 75 6c 61 72 47 72 69 64 22 2c 20 32  iangularGrid", 2
1395a 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1395b 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1395c 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1395d 0a 09 09 09 09 66 6e 63 74 5f 54 72 69 61 6e 67  .....fnct_Triang
1395e 75 6c 61 72 47 72 69 64 2c 20 30 2c 20 30 2c 20  ularGrid, 0, 0, 
1395f 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13960 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13961 76 32 20 28 64 62 2c 20 22 54 72 69 61 6e 67 75  v2 (db, "Triangu
13962 6c 61 72 47 72 69 64 22 2c 20 33 2c 0a 09 09 09  larGrid", 3,....
13963 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13964 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13965 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13966 66 6e 63 74 5f 54 72 69 61 6e 67 75 6c 61 72 47  fnct_TriangularG
13967 72 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  rid, 0, 0, 0);. 
13968 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13969 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1396a 62 2c 20 22 54 72 69 61 6e 67 75 6c 61 72 47 72  b, "TriangularGr
1396b 69 64 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49  id", 4,.....SQLI
1396c 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1396d 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1396e 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
1396f 54 72 69 61 6e 67 75 6c 61 72 47 72 69 64 2c 20  TriangularGrid, 
13970 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13971 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13972 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
13973 54 5f 54 72 69 61 6e 67 75 6c 61 72 47 72 69 64  T_TriangularGrid
13974 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
13975 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13976 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13977 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 72  che,.....fnct_Tr
13978 69 61 6e 67 75 6c 61 72 47 72 69 64 2c 20 30 2c  iangularGrid, 0,
13979 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1397a 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1397b 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
1397c 54 72 69 61 6e 67 75 6c 61 72 47 72 69 64 22 2c  TriangularGrid",
1397d 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
1397e 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1397f 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13980 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 72 69 61  e,.....fnct_Tria
13981 6e 67 75 6c 61 72 47 72 69 64 2c 20 30 2c 20 30  ngularGrid, 0, 0
13982 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13983 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13984 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 54 72  n_v2 (db, "ST_Tr
13985 69 61 6e 67 75 6c 61 72 47 72 69 64 22 2c 20 34  iangularGrid", 4
13986 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13987 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13988 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13989 0a 09 09 09 09 66 6e 63 74 5f 54 72 69 61 6e 67  .....fnct_Triang
1398a 75 6c 61 72 47 72 69 64 2c 20 30 2c 20 30 2c 20  ularGrid, 0, 0, 
1398b 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1398c 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1398d 76 32 20 28 64 62 2c 20 22 48 65 78 61 67 6f 6e  v2 (db, "Hexagon
1398e 61 6c 47 72 69 64 22 2c 20 32 2c 0a 09 09 09 09  alGrid", 2,.....
1398f 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13990 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13991 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13992 6e 63 74 5f 48 65 78 61 67 6f 6e 61 6c 47 72 69  nct_HexagonalGri
13993 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
13994 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13995 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13996 20 22 48 65 78 61 67 6f 6e 61 6c 47 72 69 64 22   "HexagonalGrid"
13997 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 3,.....SQLITE_
13998 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13999 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
1399a 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 48 65 78  he,.....fnct_Hex
1399b 61 67 6f 6e 61 6c 47 72 69 64 2c 20 30 2c 20 30  agonalGrid, 0, 0
1399c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1399d 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1399e 6e 5f 76 32 20 28 64 62 2c 20 22 48 65 78 61 67  n_v2 (db, "Hexag
1399f 6f 6e 61 6c 47 72 69 64 22 2c 20 34 2c 0a 09 09  onalGrid", 4,...
139a0 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
139a1 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
139a2 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
139a3 09 66 6e 63 74 5f 48 65 78 61 67 6f 6e 61 6c 47  .fnct_HexagonalG
139a4 72 69 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  rid, 0, 0, 0);. 
139a5 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
139a6 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
139a7 62 2c 20 22 53 54 5f 48 65 78 61 67 6f 6e 61 6c  b, "ST_Hexagonal
139a8 47 72 69 64 22 2c 20 32 2c 0a 09 09 09 09 53 51  Grid", 2,.....SQ
139a9 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
139aa 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
139ab 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
139ac 74 5f 48 65 78 61 67 6f 6e 61 6c 47 72 69 64 2c  t_HexagonalGrid,
139ad 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
139ae 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
139af 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
139b0 53 54 5f 48 65 78 61 67 6f 6e 61 6c 47 72 69 64  ST_HexagonalGrid
139b1 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
139b2 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
139b3 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
139b4 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 48 65  che,.....fnct_He
139b5 78 61 67 6f 6e 61 6c 47 72 69 64 2c 20 30 2c 20  xagonalGrid, 0, 
139b6 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
139b7 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
139b8 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 48  on_v2 (db, "ST_H
139b9 65 78 61 67 6f 6e 61 6c 47 72 69 64 22 2c 20 34  exagonalGrid", 4
139ba 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
139bb 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
139bc 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
139bd 0a 09 09 09 09 66 6e 63 74 5f 48 65 78 61 67 6f  .....fnct_Hexago
139be 6e 61 6c 47 72 69 64 2c 20 30 2c 20 30 2c 20 30  nalGrid, 0, 0, 0
139bf 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
139c0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
139c1 32 20 28 64 62 2c 20 22 4c 69 6e 65 73 43 75 74  2 (db, "LinesCut
139c2 41 74 4e 6f 64 65 73 22 2c 20 32 2c 0a 09 09 09  AtNodes", 2,....
139c3 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
139c4 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
139c5 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
139c6 66 6e 63 74 5f 4c 69 6e 65 73 43 75 74 41 74 4e  fnct_LinesCutAtN
139c7 6f 64 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  odes, 0, 0, 0);.
139c8 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
139c9 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
139ca 64 62 2c 20 22 53 54 5f 4c 69 6e 65 73 43 75 74  db, "ST_LinesCut
139cb 41 74 4e 6f 64 65 73 22 2c 20 32 2c 0a 09 09 09  AtNodes", 2,....
139cc 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
139cd 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
139ce 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
139cf 66 6e 63 74 5f 4c 69 6e 65 73 43 75 74 41 74 4e  fnct_LinesCutAtN
139d0 6f 64 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  odes, 0, 0, 0);.
139d1 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
139d2 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
139d3 64 62 2c 20 22 52 69 6e 67 73 43 75 74 41 74 4e  db, "RingsCutAtN
139d4 6f 64 65 73 22 2c 20 31 2c 0a 09 09 09 09 53 51  odes", 1,.....SQ
139d5 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
139d6 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
139d7 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
139d8 74 5f 52 69 6e 67 73 43 75 74 41 74 4e 6f 64 65  t_RingsCutAtNode
139d9 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
139da 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
139db 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
139dc 20 22 53 54 5f 52 69 6e 67 73 43 75 74 41 74 4e   "ST_RingsCutAtN
139dd 6f 64 65 73 22 2c 20 31 2c 0a 09 09 09 09 53 51  odes", 1,.....SQ
139de 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
139df 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
139e0 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
139e1 74 5f 52 69 6e 67 73 43 75 74 41 74 4e 6f 64 65  t_RingsCutAtNode
139e2 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 69  s, 0, 0, 0);..#i
139e3 66 64 65 66 20 47 45 4f 53 5f 41 44 56 41 4e 43  fdef GEOS_ADVANC
139e4 45 44 09 09 2f 2a 20 47 45 4f 53 20 61 64 76 61  ED../* GEOS adva
139e5 6e 63 65 64 20 66 65 61 74 75 72 65 73 20 2d 20  nced features - 
139e6 33 2e 34 2e 30 20 2a 2f 0a 0a 20 20 20 20 73 71  3.4.0 */..    sq
139e7 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
139e8 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44  ction_v2 (db, "D
139e9 65 6c 61 75 6e 61 79 54 72 69 61 6e 67 75 6c 61  elaunayTriangula
139ea 74 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51  tion", 1,.....SQ
139eb 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
139ec 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
139ed 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
139ee 74 5f 44 65 6c 61 75 6e 61 79 54 72 69 61 6e 67  t_DelaunayTriang
139ef 75 6c 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  ulation, 0, 0, 0
139f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
139f1 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
139f2 32 20 28 64 62 2c 20 22 44 65 6c 61 75 6e 61 79  2 (db, "Delaunay
139f3 54 72 69 61 6e 67 75 6c 61 74 69 6f 6e 22 2c 20  Triangulation", 
139f4 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
139f5 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
139f6 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
139f7 2c 0a 09 09 09 09 66 6e 63 74 5f 44 65 6c 61 75  ,.....fnct_Delau
139f8 6e 61 79 54 72 69 61 6e 67 75 6c 61 74 69 6f 6e  nayTriangulation
139f9 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
139fa 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
139fb 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
139fc 22 44 65 6c 61 75 6e 61 79 54 72 69 61 6e 67 75  "DelaunayTriangu
139fd 6c 61 74 69 6f 6e 22 2c 20 33 2c 0a 09 09 09 09  lation", 3,.....
139fe 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
139ff 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13a00 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13a01 6e 63 74 5f 44 65 6c 61 75 6e 61 79 54 72 69 61  nct_DelaunayTria
13a02 6e 67 75 6c 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  ngulation, 0, 0,
13a03 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13a04 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13a05 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 44 65 6c  _v2 (db, "ST_Del
13a06 61 75 6e 61 79 54 72 69 61 6e 67 75 6c 61 74 69  aunayTriangulati
13a07 6f 6e 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  on", 1,.....SQLI
13a08 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13a09 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13a0a 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13a0b 44 65 6c 61 75 6e 61 79 54 72 69 61 6e 67 75 6c  DelaunayTriangul
13a0c 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ation, 0, 0, 0);
13a0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13a0e 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13a0f 28 64 62 2c 20 22 53 54 5f 44 65 6c 61 75 6e 61  (db, "ST_Delauna
13a10 79 54 72 69 61 6e 67 75 6c 61 74 69 6f 6e 22 2c  yTriangulation",
13a11 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
13a12 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13a13 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13a14 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 65 6c 61  e,.....fnct_Dela
13a15 75 6e 61 79 54 72 69 61 6e 67 75 6c 61 74 69 6f  unayTriangulatio
13a16 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
13a17 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13a18 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13a19 20 22 53 54 5f 44 65 6c 61 75 6e 61 79 54 72 69   "ST_DelaunayTri
13a1a 61 6e 67 75 6c 61 74 69 6f 6e 22 2c 20 33 2c 0a  angulation", 3,.
13a1b 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13a1c 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13a1d 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13a1e 09 09 09 66 6e 63 74 5f 44 65 6c 61 75 6e 61 79  ...fnct_Delaunay
13a1f 54 72 69 61 6e 67 75 6c 61 74 69 6f 6e 2c 20 30  Triangulation, 0
13a20 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13a21 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13a22 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 56 6f  tion_v2 (db, "Vo
13a23 72 6f 6e 6f 6a 44 69 61 67 72 61 6d 22 2c 20 31  ronojDiagram", 1
13a24 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13a25 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13a26 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13a27 0a 09 09 09 09 66 6e 63 74 5f 56 6f 72 6f 6e 6f  .....fnct_Vorono
13a28 6a 44 69 61 67 72 61 6d 2c 20 30 2c 20 30 2c 20  jDiagram, 0, 0, 
13a29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13a2a 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13a2b 76 32 20 28 64 62 2c 20 22 56 6f 72 6f 6e 6f 6a  v2 (db, "Voronoj
13a2c 44 69 61 67 72 61 6d 22 2c 20 32 2c 0a 09 09 09  Diagram", 2,....
13a2d 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13a2e 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13a2f 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13a30 66 6e 63 74 5f 56 6f 72 6f 6e 6f 6a 44 69 61 67  fnct_VoronojDiag
13a31 72 61 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ram, 0, 0, 0);. 
13a32 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13a33 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13a34 62 2c 20 22 56 6f 72 6f 6e 6f 6a 44 69 61 67 72  b, "VoronojDiagr
13a35 61 6d 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49  am", 3,.....SQLI
13a36 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13a37 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13a38 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13a39 56 6f 72 6f 6e 6f 6a 44 69 61 67 72 61 6d 2c 20  VoronojDiagram, 
13a3a 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13a3b 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13a3c 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 56  ction_v2 (db, "V
13a3d 6f 72 6f 6e 6f 6a 44 69 61 67 72 61 6d 22 2c 20  oronojDiagram", 
13a3e 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  4,.....SQLITE_UT
13a3f 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13a40 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13a41 2c 0a 09 09 09 09 66 6e 63 74 5f 56 6f 72 6f 6e  ,.....fnct_Voron
13a42 6f 6a 44 69 61 67 72 61 6d 2c 20 30 2c 20 30 2c  ojDiagram, 0, 0,
13a43 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13a44 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13a45 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 56 6f 72  _v2 (db, "ST_Vor
13a46 6f 6e 6f 6a 44 69 61 67 72 61 6d 22 2c 20 31 2c  onojDiagram", 1,
13a47 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13a48 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13a49 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13a4a 09 09 09 09 66 6e 63 74 5f 56 6f 72 6f 6e 6f 6a  ....fnct_Voronoj
13a4b 44 69 61 67 72 61 6d 2c 20 30 2c 20 30 2c 20 30  Diagram, 0, 0, 0
13a4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13a4d 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13a4e 32 20 28 64 62 2c 20 22 53 54 5f 56 6f 72 6f 6e  2 (db, "ST_Voron
13a4f 6f 6a 44 69 61 67 72 61 6d 22 2c 20 32 2c 0a 09  ojDiagram", 2,..
13a50 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13a51 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13a52 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
13a53 09 09 66 6e 63 74 5f 56 6f 72 6f 6e 6f 6a 44 69  ..fnct_VoronojDi
13a54 61 67 72 61 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  agram, 0, 0, 0);
13a55 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13a56 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13a57 28 64 62 2c 20 22 53 54 5f 56 6f 72 6f 6e 6f 6a  (db, "ST_Voronoj
13a58 44 69 61 67 72 61 6d 22 2c 20 33 2c 0a 09 09 09  Diagram", 3,....
13a59 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13a5a 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13a5b 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13a5c 66 6e 63 74 5f 56 6f 72 6f 6e 6f 6a 44 69 61 67  fnct_VoronojDiag
13a5d 72 61 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ram, 0, 0, 0);. 
13a5e 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13a5f 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13a60 62 2c 20 22 53 54 5f 56 6f 72 6f 6e 6f 6a 44 69  b, "ST_VoronojDi
13a61 61 67 72 61 6d 22 2c 20 34 2c 0a 09 09 09 09 53  agram", 4,.....S
13a62 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13a63 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13a64 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13a65 63 74 5f 56 6f 72 6f 6e 6f 6a 44 69 61 67 72 61  ct_VoronojDiagra
13a66 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  m, 0, 0, 0);.   
13a67 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13a68 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13a69 20 22 43 6f 6e 63 61 76 65 48 75 6c 6c 22 2c 20   "ConcaveHull", 
13a6a 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13a6b 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13a6c 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13a6d 2c 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6e 63 61  ,.....fnct_Conca
13a6e 76 65 48 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 29  veHull, 0, 0, 0)
13a6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13a70 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13a71 20 28 64 62 2c 20 22 43 6f 6e 63 61 76 65 48 75   (db, "ConcaveHu
13a72 6c 6c 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  ll", 2,.....SQLI
13a73 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13a74 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13a75 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13a76 43 6f 6e 63 61 76 65 48 75 6c 6c 2c 20 30 2c 20  ConcaveHull, 0, 
13a77 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13a78 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13a79 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 6f 6e 63  on_v2 (db, "Conc
13a7a 61 76 65 48 75 6c 6c 22 2c 20 33 2c 0a 09 09 09  aveHull", 3,....
13a7b 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13a7c 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13a7d 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13a7e 66 6e 63 74 5f 43 6f 6e 63 61 76 65 48 75 6c 6c  fnct_ConcaveHull
13a7f 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13a80 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13a81 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13a82 22 43 6f 6e 63 61 76 65 48 75 6c 6c 22 2c 20 34  "ConcaveHull", 4
13a83 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13a84 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13a85 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13a86 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6e 63 61 76  .....fnct_Concav
13a87 65 48 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  eHull, 0, 0, 0);
13a88 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13a89 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13a8a 28 64 62 2c 20 22 53 54 5f 43 6f 6e 63 61 76 65  (db, "ST_Concave
13a8b 48 75 6c 6c 22 2c 20 31 2c 0a 09 09 09 09 53 51  Hull", 1,.....SQ
13a8c 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13a8d 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13a8e 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13a8f 74 5f 43 6f 6e 63 61 76 65 48 75 6c 6c 2c 20 30  t_ConcaveHull, 0
13a90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13a91 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13a92 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13a93 5f 43 6f 6e 63 61 76 65 48 75 6c 6c 22 2c 20 32  _ConcaveHull", 2
13a94 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13a95 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13a96 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13a97 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6e 63 61 76  .....fnct_Concav
13a98 65 48 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  eHull, 0, 0, 0);
13a99 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13a9a 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13a9b 28 64 62 2c 20 22 53 54 5f 43 6f 6e 63 61 76 65  (db, "ST_Concave
13a9c 48 75 6c 6c 22 2c 20 33 2c 0a 09 09 09 09 53 51  Hull", 3,.....SQ
13a9d 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13a9e 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13a9f 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13aa0 74 5f 43 6f 6e 63 61 76 65 48 75 6c 6c 2c 20 30  t_ConcaveHull, 0
13aa1 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13aa2 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13aa3 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13aa4 5f 43 6f 6e 63 61 76 65 48 75 6c 6c 22 2c 20 34  _ConcaveHull", 4
13aa5 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13aa6 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13aa7 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13aa8 0a 09 09 09 09 66 6e 63 74 5f 43 6f 6e 63 61 76  .....fnct_Concav
13aa9 65 48 75 6c 6c 2c 20 30 2c 20 30 2c 20 30 29 3b  eHull, 0, 0, 0);
13aaa 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ..#endif /* end 
13aab 47 45 4f 53 20 61 64 76 61 6e 63 65 64 20 66 65  GEOS advanced fe
13aac 61 74 75 72 65 73 20 2a 2f 0a 0a 23 69 66 64 65  atures */..#ifde
13aad 66 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09  f ENABLE_RTTOPO.
13aae 09 2f 2a 20 65 6e 61 62 6c 69 6e 67 20 52 54 54  ./* enabling RTT
13aaf 4f 50 4f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 0a  OPO support */..
13ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13ab1 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13ab2 64 62 2c 20 22 52 54 54 4f 50 4f 5f 47 65 74 4c  db, "RTTOPO_GetL
13ab3 61 73 74 45 72 72 6f 72 4d 73 67 22 2c 20 30 2c  astErrorMsg", 0,
13ab4 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09 09   SQLITE_UTF8,...
13ab5 09 09 30 2c 20 66 6e 63 74 5f 52 54 54 4f 50 4f  ..0, fnct_RTTOPO
13ab6 5f 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  _GetLastErrorMsg
13ab7 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13ab8 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13ab9 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13aba 22 52 54 54 4f 50 4f 5f 47 65 74 4c 61 73 74 57  "RTTOPO_GetLastW
13abb 61 72 6e 69 6e 67 4d 73 67 22 2c 20 30 2c 0a 09  arningMsg", 0,..
13abc 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ...SQLITE_UTF8, 
13abd 30 2c 20 66 6e 63 74 5f 52 54 54 4f 50 4f 5f 47  0, fnct_RTTOPO_G
13abe 65 74 4c 61 73 74 57 61 72 6e 69 6e 67 4d 73 67  etLastWarningMsg
13abf 2c 0a 09 09 09 09 30 2c 20 30 2c 20 30 29 3b 0a  ,.....0, 0, 0);.
13ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13ac1 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13ac2 28 64 62 2c 20 22 4d 61 6b 65 56 61 6c 69 64 22  (db, "MakeValid"
13ac3 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
13ac4 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13ac5 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13ac6 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b  he,.....fnct_Mak
13ac7 65 56 61 6c 69 64 2c 20 30 2c 20 30 2c 20 30 29  eValid, 0, 0, 0)
13ac8 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13ac9 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13aca 20 28 64 62 2c 20 22 53 54 5f 4d 61 6b 65 56 61   (db, "ST_MakeVa
13acb 6c 69 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  lid", 1,.....SQL
13acc 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13acd 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13ace 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13acf 5f 4d 61 6b 65 56 61 6c 69 64 2c 20 30 2c 20 30  _MakeValid, 0, 0
13ad0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13ad1 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13ad2 6e 5f 76 32 20 28 64 62 2c 20 22 4d 61 6b 65 56  n_v2 (db, "MakeV
13ad3 61 6c 69 64 44 69 73 63 61 72 64 65 64 22 2c 20  alidDiscarded", 
13ad4 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13ad5 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13ad6 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13ad7 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 61 6b 65 56  ,.....fnct_MakeV
13ad8 61 6c 69 64 44 69 73 63 61 72 64 65 64 2c 20 30  alidDiscarded, 0
13ad9 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13ada 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13adb 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13adc 5f 4d 61 6b 65 56 61 6c 69 64 44 69 73 63 61 72  _MakeValidDiscar
13add 64 65 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ded", 1,.....SQL
13ade 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13adf 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13ae0 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13ae1 5f 4d 61 6b 65 56 61 6c 69 64 44 69 73 63 61 72  _MakeValidDiscar
13ae2 64 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ded, 0, 0, 0);. 
13ae3 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13ae4 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13ae5 62 2c 20 22 41 72 65 61 22 2c 20 32 2c 0a 09 09  b, "Area", 2,...
13ae6 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13ae7 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13ae8 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13ae9 09 66 6e 63 74 5f 41 72 65 61 2c 20 30 2c 20 30  .fnct_Area, 0, 0
13aea 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13aeb 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13aec 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 41 72  n_v2 (db, "ST_Ar
13aed 65 61 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  ea", 2,.....SQLI
13aee 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13aef 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13af0 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13af1 41 72 65 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Area, 0, 0, 0);.
13af2 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13af3 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13af4 64 62 2c 20 22 43 69 72 63 75 6c 61 72 69 74 79  db, "Circularity
13af5 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
13af6 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13af7 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13af8 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 69  che,.....fnct_Ci
13af9 72 63 75 6c 61 72 69 74 79 2c 20 30 2c 20 30 2c  rcularity, 0, 0,
13afa 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13afb 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13afc 5f 76 32 20 28 64 62 2c 20 22 53 65 67 6d 65 6e  _v2 (db, "Segmen
13afd 74 69 7a 65 22 2c 20 32 2c 0a 09 09 09 09 53 51  tize", 2,.....SQ
13afe 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13aff 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13b00 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13b01 74 5f 53 65 67 6d 65 6e 74 69 7a 65 2c 20 30 2c  t_Segmentize, 0,
13b02 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13b03 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13b04 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
13b05 53 65 67 6d 65 6e 74 69 7a 65 22 2c 20 32 2c 0a  Segmentize", 2,.
13b06 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13b07 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13b08 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13b09 09 09 09 66 6e 63 74 5f 53 65 67 6d 65 6e 74 69  ...fnct_Segmenti
13b0a 7a 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ze, 0, 0, 0);.  
13b0b 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13b0c 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13b0d 2c 20 22 41 7a 69 6d 75 74 68 22 2c 20 32 2c 0a  , "Azimuth", 2,.
13b0e 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13b0f 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13b10 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13b11 09 09 09 66 6e 63 74 5f 41 7a 69 6d 75 74 68 2c  ...fnct_Azimuth,
13b12 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13b13 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13b14 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13b15 53 54 5f 41 7a 69 6d 75 74 68 22 2c 20 32 2c 0a  ST_Azimuth", 2,.
13b16 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13b17 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13b18 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13b19 09 09 09 66 6e 63 74 5f 41 7a 69 6d 75 74 68 2c  ...fnct_Azimuth,
13b1a 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13b1b 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13b1c 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13b1d 50 72 6f 6a 65 63 74 22 2c 20 33 2c 0a 09 09 09  Project", 3,....
13b1e 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13b1f 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13b20 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13b21 66 6e 63 74 5f 50 72 6f 6a 65 63 74 2c 20 30 2c  fnct_Project, 0,
13b22 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13b23 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13b24 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
13b25 50 72 6f 6a 65 63 74 22 2c 20 33 2c 0a 09 09 09  Project", 3,....
13b26 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13b27 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13b28 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13b29 66 6e 63 74 5f 50 72 6f 6a 65 63 74 2c 20 30 2c  fnct_Project, 0,
13b2a 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13b2b 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13b2c 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 6f  ion_v2 (db, "Geo
13b2d 48 61 73 68 22 2c 20 31 2c 0a 09 09 09 09 53 51  Hash", 1,.....SQ
13b2e 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13b2f 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13b30 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13b31 74 5f 47 65 6f 48 61 73 68 2c 20 30 2c 20 30 2c  t_GeoHash, 0, 0,
13b32 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13b33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13b34 5f 76 32 20 28 64 62 2c 20 22 47 65 6f 48 61 73  _v2 (db, "GeoHas
13b35 68 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  h", 2,.....SQLIT
13b36 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13b37 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13b38 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47  ache,.....fnct_G
13b39 65 6f 48 61 73 68 2c 20 30 2c 20 30 2c 20 30 29  eoHash, 0, 0, 0)
13b3a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13b3b 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13b3c 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 48 61 73   (db, "ST_GeoHas
13b3d 68 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  h", 1,.....SQLIT
13b3e 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13b3f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13b40 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47  ache,.....fnct_G
13b41 65 6f 48 61 73 68 2c 20 30 2c 20 30 2c 20 30 29  eoHash, 0, 0, 0)
13b42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13b43 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13b44 20 28 64 62 2c 20 22 53 54 5f 47 65 6f 48 61 73   (db, "ST_GeoHas
13b45 68 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  h", 2,.....SQLIT
13b46 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13b47 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13b48 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 47  ache,.....fnct_G
13b49 65 6f 48 61 73 68 2c 20 30 2c 20 30 2c 20 30 29  eoHash, 0, 0, 0)
13b4a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13b4b 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13b4c 20 28 64 62 2c 20 22 41 73 58 33 44 22 2c 20 31   (db, "AsX3D", 1
13b4d 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13b4e 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13b4f 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13b50 0a 09 09 09 09 66 6e 63 74 5f 41 73 58 33 44 2c  .....fnct_AsX3D,
13b51 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13b52 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13b53 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13b54 41 73 58 33 44 22 2c 20 32 2c 0a 09 09 09 09 53  AsX3D", 2,.....S
13b55 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13b56 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13b57 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13b58 63 74 5f 41 73 58 33 44 2c 20 30 2c 20 30 2c 20  ct_AsX3D, 0, 0, 
13b59 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13b5a 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13b5b 76 32 20 28 64 62 2c 20 22 41 73 58 33 44 22 2c  v2 (db, "AsX3D",
13b5c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
13b5d 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13b5e 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13b5f 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 58 33  e,.....fnct_AsX3
13b60 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
13b61 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13b62 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13b63 20 22 41 73 58 33 44 22 2c 20 34 2c 0a 09 09 09   "AsX3D", 4,....
13b64 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13b65 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13b66 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13b67 66 6e 63 74 5f 41 73 58 33 44 2c 20 30 2c 20 30  fnct_AsX3D, 0, 0
13b68 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13b69 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13b6a 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 41 73  n_v2 (db, "ST_As
13b6b 58 33 44 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  X3D", 1,.....SQL
13b6c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13b6d 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13b6e 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13b6f 5f 41 73 58 33 44 2c 20 30 2c 20 30 2c 20 30 29  _AsX3D, 0, 0, 0)
13b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13b71 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13b72 20 28 64 62 2c 20 22 53 54 5f 41 73 58 33 44 22   (db, "ST_AsX3D"
13b73 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
13b74 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13b75 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13b76 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 58  he,.....fnct_AsX
13b77 33 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3D, 0, 0, 0);.  
13b78 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13b79 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13b7a 2c 20 22 53 54 5f 41 73 58 33 44 22 2c 20 33 2c  , "ST_AsX3D", 3,
13b7b 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13b7c 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13b7d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13b7e 09 09 09 09 66 6e 63 74 5f 41 73 58 33 44 2c 20  ....fnct_AsX3D, 
13b7f 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13b80 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13b81 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
13b82 54 5f 41 73 58 33 44 22 2c 20 34 2c 0a 09 09 09  T_AsX3D", 4,....
13b83 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13b84 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13b85 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13b86 66 6e 63 74 5f 41 73 58 33 44 2c 20 30 2c 20 30  fnct_AsX3D, 0, 0
13b87 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13b88 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13b89 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 33 44  n_v2 (db, "ST_3D
13b8a 44 69 73 74 61 6e 63 65 22 2c 20 32 2c 0a 09 09  Distance", 2,...
13b8b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13b8c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13b8d 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13b8e 09 66 6e 63 74 5f 33 44 44 69 73 74 61 6e 63 65  .fnct_3DDistance
13b8f 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13b90 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13b91 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13b92 22 4d 61 78 44 69 73 74 61 6e 63 65 22 2c 20 32  "MaxDistance", 2
13b93 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13b94 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13b95 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13b96 0a 09 09 09 09 66 6e 63 74 5f 4d 61 78 44 69 73  .....fnct_MaxDis
13b97 74 61 6e 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b  tance, 0, 0, 0);
13b98 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13b99 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13b9a 28 64 62 2c 20 22 53 54 5f 4d 61 78 44 69 73 74  (db, "ST_MaxDist
13b9b 61 6e 63 65 22 2c 20 32 2c 0a 09 09 09 09 53 51  ance", 2,.....SQ
13b9c 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13b9d 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13b9e 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13b9f 74 5f 4d 61 78 44 69 73 74 61 6e 63 65 2c 20 30  t_MaxDistance, 0
13ba0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13ba1 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13ba2 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13ba3 5f 33 44 4d 61 78 44 69 73 74 61 6e 63 65 22 2c  _3DMaxDistance",
13ba4 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
13ba5 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13ba6 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13ba7 65 2c 0a 09 09 09 09 66 6e 63 74 5f 33 44 4d 61  e,.....fnct_3DMa
13ba8 78 44 69 73 74 61 6e 63 65 2c 20 30 2c 20 30 2c  xDistance, 0, 0,
13ba9 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13baa 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13bab 5f 76 32 20 28 64 62 2c 20 22 53 70 6c 69 74 22  _v2 (db, "Split"
13bac 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
13bad 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13bae 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
13baf 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 70 6c  he,.....fnct_Spl
13bb0 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  it, 0, 0, 0);.  
13bb1 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13bb2 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13bb3 2c 20 22 53 54 5f 53 70 6c 69 74 22 2c 20 32 2c  , "ST_Split", 2,
13bb4 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13bb5 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13bb6 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13bb7 09 09 09 09 66 6e 63 74 5f 53 70 6c 69 74 2c 20  ....fnct_Split, 
13bb8 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13bb9 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13bba 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
13bbb 70 6c 69 74 4c 65 66 74 22 2c 20 32 2c 0a 09 09  plitLeft", 2,...
13bbc 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13bbd 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13bbe 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13bbf 09 66 6e 63 74 5f 53 70 6c 69 74 4c 65 66 74 2c  .fnct_SplitLeft,
13bc0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13bc1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13bc2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13bc3 53 54 5f 53 70 6c 69 74 4c 65 66 74 22 2c 20 32  ST_SplitLeft", 2
13bc4 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13bc5 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13bc6 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13bc7 0a 09 09 09 09 66 6e 63 74 5f 53 70 6c 69 74 4c  .....fnct_SplitL
13bc8 65 66 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  eft, 0, 0, 0);. 
13bc9 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13bca 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13bcb 62 2c 20 22 53 70 6c 69 74 52 69 67 68 74 22 2c  b, "SplitRight",
13bcc 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
13bcd 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13bce 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13bcf 65 2c 0a 09 09 09 09 66 6e 63 74 5f 53 70 6c 69  e,.....fnct_Spli
13bd0 74 52 69 67 68 74 2c 20 30 2c 20 30 2c 20 30 29  tRight, 0, 0, 0)
13bd1 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13bd2 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13bd3 20 28 64 62 2c 20 22 53 54 5f 53 70 6c 69 74 52   (db, "ST_SplitR
13bd4 69 67 68 74 22 2c 20 32 2c 0a 09 09 09 09 53 51  ight", 2,.....SQ
13bd5 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13bd6 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13bd7 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13bd8 74 5f 53 70 6c 69 74 52 69 67 68 74 2c 20 30 2c  t_SplitRight, 0,
13bd9 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13bda 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13bdb 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
13bdc 4e 6f 64 65 22 2c 20 31 2c 0a 09 09 09 09 53 51  Node", 1,.....SQ
13bdd 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13bde 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13bdf 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63  , cache,.....fnc
13be0 74 5f 4e 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29  t_Node, 0, 0, 0)
13be1 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13be2 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13be3 20 28 64 62 2c 20 22 53 65 6c 66 49 6e 74 65 72   (db, "SelfInter
13be4 73 65 63 74 69 6f 6e 73 22 2c 20 31 2c 0a 09 09  sections", 1,...
13be5 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13be6 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13be7 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13be8 09 66 6e 63 74 5f 53 65 6c 66 49 6e 74 65 72 73  .fnct_SelfInters
13be9 65 63 74 69 6f 6e 73 2c 20 30 2c 20 30 2c 20 30  ections, 0, 0, 0
13bea 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13beb 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13bec 32 20 28 64 62 2c 20 22 53 54 5f 53 65 6c 66 49  2 (db, "ST_SelfI
13bed 6e 74 65 72 73 65 63 74 69 6f 6e 73 22 2c 20 31  ntersections", 1
13bee 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13bef 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13bf0 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
13bf1 0a 09 09 09 09 66 6e 63 74 5f 53 65 6c 66 49 6e  .....fnct_SelfIn
13bf2 74 65 72 73 65 63 74 69 6f 6e 73 2c 20 30 2c 20  tersections, 0, 
13bf3 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13bf4 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13bf5 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 33  on_v2 (db, "ST_3
13bf6 64 4c 65 6e 67 74 68 22 2c 20 31 2c 0a 09 09 09  dLength", 1,....
13bf7 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13bf8 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13bf9 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13bfa 66 6e 63 74 5f 33 64 4c 65 6e 67 74 68 2c 20 30  fnct_3dLength, 0
13bfb 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13bfc 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13bfd 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65  tion_v2 (db, "Ge
13bfe 6f 6d 46 72 6f 6d 54 57 4b 42 22 2c 20 31 2c 0a  omFromTWKB", 1,.
13bff 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13c00 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13c01 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13c02 09 09 09 66 6e 63 74 5f 46 72 6f 6d 54 57 4b 42  ...fnct_FromTWKB
13c03 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13c04 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13c05 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13c06 22 47 65 6f 6d 46 72 6f 6d 54 57 4b 42 22 2c 20  "GeomFromTWKB", 
13c07 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13c08 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13c09 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
13c0a 2c 0a 09 09 09 09 66 6e 63 74 5f 46 72 6f 6d 54  ,.....fnct_FromT
13c0b 57 4b 42 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  WKB, 0, 0, 0);. 
13c0c 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13c0d 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13c0e 62 2c 20 22 41 73 54 57 4b 42 22 2c 20 31 2c 0a  b, "AsTWKB", 1,.
13c0f 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13c10 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13c11 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13c12 09 09 09 66 6e 63 74 5f 54 6f 54 57 4b 42 2c 20  ...fnct_ToTWKB, 
13c13 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13c14 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13c15 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41  ction_v2 (db, "A
13c16 73 54 57 4b 42 22 2c 20 32 2c 0a 09 09 09 09 53  sTWKB", 2,.....S
13c17 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13c18 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13c19 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13c1a 63 74 5f 54 6f 54 57 4b 42 2c 20 30 2c 20 30 2c  ct_ToTWKB, 0, 0,
13c1b 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13c1c 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13c1d 5f 76 32 20 28 64 62 2c 20 22 41 73 54 57 4b 42  _v2 (db, "AsTWKB
13c1e 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
13c1f 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13c20 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13c21 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 6f  che,.....fnct_To
13c22 54 57 4b 42 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  TWKB, 0, 0, 0);.
13c23 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13c24 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13c25 64 62 2c 20 22 41 73 54 57 4b 42 22 2c 20 34 2c  db, "AsTWKB", 4,
13c26 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13c27 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13c28 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13c29 09 09 09 09 66 6e 63 74 5f 54 6f 54 57 4b 42 2c  ....fnct_ToTWKB,
13c2a 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13c2b 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13c2c 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13c2d 41 73 54 57 4b 42 22 2c 20 35 2c 0a 09 09 09 09  AsTWKB", 5,.....
13c2e 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13c2f 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13c30 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
13c31 6e 63 74 5f 54 6f 54 57 4b 42 2c 20 30 2c 20 30  nct_ToTWKB, 0, 0
13c32 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13c33 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13c34 6e 5f 76 32 20 28 64 62 2c 20 22 41 73 54 57 4b  n_v2 (db, "AsTWK
13c35 42 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c 49 54  B", 6,.....SQLIT
13c36 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13c37 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
13c38 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54  ache,.....fnct_T
13c39 6f 54 57 4b 42 2c 20 30 2c 20 30 2c 20 30 29 3b  oTWKB, 0, 0, 0);
13c3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13c3b 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13c3c 28 64 62 2c 20 22 53 54 5f 41 73 45 6e 63 6f 64  (db, "ST_AsEncod
13c3d 65 64 50 6f 6c 79 6c 69 6e 65 22 2c 20 31 2c 0a  edPolyline", 1,.
13c3e 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13c3f 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13c40 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13c41 09 09 09 66 6e 63 74 5f 41 73 45 6e 63 6f 64 65  ...fnct_AsEncode
13c42 64 50 6f 6c 79 6c 69 6e 65 2c 20 30 2c 20 30 2c  dPolyline, 0, 0,
13c43 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13c44 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13c45 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 41 73 45  _v2 (db, "ST_AsE
13c46 6e 63 6f 64 65 64 50 6f 6c 79 6c 69 6e 65 22 2c  ncodedPolyline",
13c47 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
13c48 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13c49 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13c4a 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41 73 45 6e  e,.....fnct_AsEn
13c4b 63 6f 64 65 64 50 6f 6c 79 6c 69 6e 65 2c 20 30  codedPolyline, 0
13c4c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13c4d 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13c4e 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13c4f 5f 4c 69 6e 65 46 72 6f 6d 45 6e 63 6f 64 65 64  _LineFromEncoded
13c50 50 6f 6c 79 6c 69 6e 65 22 2c 20 31 2c 0a 09 09  Polyline", 1,...
13c51 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13c52 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13c53 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13c54 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 45 6e  .fnct_LineFromEn
13c55 63 6f 64 65 64 50 6f 6c 79 6c 69 6e 65 2c 20 30  codedPolyline, 0
13c56 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13c57 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13c58 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13c59 5f 4c 69 6e 65 46 72 6f 6d 45 6e 63 6f 64 65 64  _LineFromEncoded
13c5a 50 6f 6c 79 6c 69 6e 65 22 2c 20 32 2c 0a 09 09  Polyline", 2,...
13c5b 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13c5c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13c5d 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13c5e 09 66 6e 63 74 5f 4c 69 6e 65 46 72 6f 6d 45 6e  .fnct_LineFromEn
13c5f 63 6f 64 65 64 50 6f 6c 79 6c 69 6e 65 2c 20 30  codedPolyline, 0
13c60 2c 20 30 2c 20 30 29 3b 0a 0a 23 65 6e 64 69 66  , 0, 0);..#endif
13c61 20 2f 2a 20 65 6e 64 20 52 54 54 4f 50 4f 20 73   /* end RTTOPO s
13c62 75 70 70 6f 72 74 20 2a 2f 0a 0a 20 20 20 20 73  upport */..    s
13c63 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13c64 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13c65 53 54 5f 43 75 74 74 65 72 22 2c 20 37 2c 0a 09  ST_Cutter", 7,..
13c66 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13c67 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13c68 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
13c69 09 09 66 6e 63 74 5f 43 75 74 74 65 72 2c 20 30  ..fnct_Cutter, 0
13c6a 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13c6b 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13c6c 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
13c6d 5f 43 75 74 74 65 72 22 2c 20 38 2c 0a 09 09 09  _Cutter", 8,....
13c6e 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13c6f 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13c70 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13c71 66 6e 63 74 5f 43 75 74 74 65 72 2c 20 30 2c 20  fnct_Cutter, 0, 
13c72 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13c73 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13c74 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 43  on_v2 (db, "ST_C
13c75 75 74 74 65 72 22 2c 20 39 2c 0a 09 09 09 09 53  utter", 9,.....S
13c76 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13c77 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13c78 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
13c79 63 74 5f 43 75 74 74 65 72 2c 20 30 2c 20 30 2c  ct_Cutter, 0, 0,
13c7a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13c7b 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13c7c 5f 76 32 20 28 64 62 2c 20 22 47 65 74 43 75 74  _v2 (db, "GetCut
13c7d 74 65 72 4d 65 73 73 61 67 65 22 2c 20 30 2c 0a  terMessage", 0,.
13c7e 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 2c  ....SQLITE_UTF8,
13c7f 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
13c80 5f 47 65 74 43 75 74 74 65 72 4d 65 73 73 61 67  _GetCutterMessag
13c81 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
13c82 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13c83 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13c84 20 22 53 54 5f 44 72 61 70 65 4c 69 6e 65 22 2c   "ST_DrapeLine",
13c85 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
13c86 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13c87 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
13c88 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 72 61 70  e,.....fnct_Drap
13c89 65 4c 69 6e 65 2c 20 30 2c 20 30 2c 20 30 29 3b  eLine, 0, 0, 0);
13c8a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13c8b 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13c8c 28 64 62 2c 20 22 53 54 5f 44 72 61 70 65 4c 69  (db, "ST_DrapeLi
13c8d 6e 65 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49  ne", 3,.....SQLI
13c8e 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13c8f 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13c90 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
13c91 44 72 61 70 65 4c 69 6e 65 2c 20 30 2c 20 30 2c  DrapeLine, 0, 0,
13c92 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13c93 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13c94 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 44 72 61  _v2 (db, "ST_Dra
13c95 70 65 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e 73  peLineExceptions
13c96 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
13c97 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13c98 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13c99 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 72  che,.....fnct_Dr
13c9a 61 70 65 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e  apeLineException
13c9b 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
13c9c 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13c9d 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13c9e 20 22 53 54 5f 44 72 61 70 65 4c 69 6e 65 45 78   "ST_DrapeLineEx
13c9f 63 65 70 74 69 6f 6e 73 22 2c 20 33 2c 0a 09 09  ceptions", 3,...
13ca0 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13ca1 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13ca2 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13ca3 09 66 6e 63 74 5f 44 72 61 70 65 4c 69 6e 65 45  .fnct_DrapeLineE
13ca4 78 63 65 70 74 69 6f 6e 73 2c 20 30 2c 20 30 2c  xceptions, 0, 0,
13ca5 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13ca6 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13ca7 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 44 72 61  _v2 (db, "ST_Dra
13ca8 70 65 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e 73  peLineExceptions
13ca9 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 4,.....SQLITE
13caa 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13cab 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
13cac 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 44 72  che,.....fnct_Dr
13cad 61 70 65 4c 69 6e 65 45 78 63 65 70 74 69 6f 6e  apeLineException
13cae 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 23 65  s, 0, 0, 0);..#e
13caf 6e 64 69 66 20 2f 2a 20 65 6e 64 20 69 6e 63 6c  ndif /* end incl
13cb0 75 64 69 6e 67 20 47 45 4f 53 20 2a 2f 0a 0a 23  uding GEOS */..#
13cb1 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 4c 49 42  ifdef ENABLE_LIB
13cb2 58 4d 4c 32 09 09 2f 2a 20 69 6e 63 6c 75 64 69  XML2../* includi
13cb3 6e 67 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a 0a 20  ng LIBXML2 */.. 
13cb4 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13cb5 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13cb6 62 2c 20 22 43 72 65 61 74 65 53 74 79 6c 69 6e  b, "CreateStylin
13cb7 67 54 61 62 6c 65 73 22 2c 20 30 2c 0a 09 09 09  gTables", 0,....
13cb8 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13cb9 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13cba 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13cbb 5f 43 72 65 61 74 65 53 74 79 6c 69 6e 67 54 61  _CreateStylingTa
13cbc 62 6c 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  bles, 0, 0, 0);.
13cbd 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13cbe 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13cbf 64 62 2c 20 22 43 72 65 61 74 65 53 74 79 6c 69  db, "CreateStyli
13cc0 6e 67 54 61 62 6c 65 73 22 2c 20 31 2c 0a 09 09  ngTables", 1,...
13cc1 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13cc2 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13cc3 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
13cc4 74 5f 43 72 65 61 74 65 53 74 79 6c 69 6e 67 54  t_CreateStylingT
13cc5 61 62 6c 65 73 2c 20 30 2c 20 30 2c 20 30 29 3b  ables, 0, 0, 0);
13cc6 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13cc7 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13cc8 28 64 62 2c 20 22 43 72 65 61 74 65 53 74 79 6c  (db, "CreateStyl
13cc9 69 6e 67 54 61 62 6c 65 73 22 2c 20 32 2c 0a 09  ingTables", 2,..
13cca 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13ccb 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13ccc 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
13ccd 63 74 5f 43 72 65 61 74 65 53 74 79 6c 69 6e 67  ct_CreateStyling
13cce 54 61 62 6c 65 73 2c 20 30 2c 20 30 2c 20 30 29  Tables, 0, 0, 0)
13ccf 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13cd0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64  eate_function (d
13cd1 62 2c 20 22 53 45 5f 52 65 67 69 73 74 65 72 56  b, "SE_RegisterV
13cd2 65 63 74 6f 72 43 6f 76 65 72 61 67 65 22 2c 20  ectorCoverage", 
13cd3 33 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 0a 09  3, SQLITE_ANY,..
13cd4 09 09 20 20 20 20 20 30 2c 20 66 6e 63 74 5f 52  ..     0, fnct_R
13cd5 65 67 69 73 74 65 72 56 65 63 74 6f 72 43 6f 76  egisterVectorCov
13cd6 65 72 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20  erage, 0, 0);.  
13cd7 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13cd8 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22  _function (db, "
13cd9 53 45 5f 52 65 67 69 73 74 65 72 56 65 63 74 6f  SE_RegisterVecto
13cda 72 43 6f 76 65 72 61 67 65 22 2c 20 35 2c 20 53  rCoverage", 5, S
13cdb 51 4c 49 54 45 5f 41 4e 59 2c 0a 09 09 09 20 20  QLITE_ANY,....  
13cdc 20 20 20 30 2c 20 66 6e 63 74 5f 52 65 67 69 73     0, fnct_Regis
13cdd 74 65 72 56 65 63 74 6f 72 43 6f 76 65 72 61 67  terVectorCoverag
13cde 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
13cdf 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13ce0 63 74 69 6f 6e 20 28 64 62 2c 20 22 53 45 5f 52  ction (db, "SE_R
13ce1 65 67 69 73 74 65 72 56 65 63 74 6f 72 43 6f 76  egisterVectorCov
13ce2 65 72 61 67 65 22 2c 20 37 2c 20 53 51 4c 49 54  erage", 7, SQLIT
13ce3 45 5f 41 4e 59 2c 0a 09 09 09 20 20 20 20 20 30  E_ANY,....     0
13ce4 2c 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72 56  , fnct_RegisterV
13ce5 65 63 74 6f 72 43 6f 76 65 72 61 67 65 2c 20 30  ectorCoverage, 0
13ce6 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13ce7 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13ce8 6e 20 28 64 62 2c 20 22 53 45 5f 52 65 67 69 73  n (db, "SE_Regis
13ce9 74 65 72 53 70 61 74 69 61 6c 56 69 65 77 43 6f  terSpatialViewCo
13cea 76 65 72 61 67 65 22 2c 20 33 2c 0a 09 09 09 20  verage", 3,.... 
13ceb 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20      SQLITE_ANY, 
13cec 30 2c 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72  0, fnct_Register
13ced 53 70 61 74 69 61 6c 56 69 65 77 43 6f 76 65 72  SpatialViewCover
13cee 61 67 65 2c 0a 09 09 09 20 20 20 20 20 30 2c 20  age,....     0, 
13cef 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13cf0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13cf1 28 64 62 2c 20 22 53 45 5f 52 65 67 69 73 74 65  (db, "SE_Registe
13cf2 72 53 70 61 74 69 61 6c 56 69 65 77 43 6f 76 65  rSpatialViewCove
13cf3 72 61 67 65 22 2c 20 35 2c 0a 09 09 09 20 20 20  rage", 5,....   
13cf4 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c    SQLITE_ANY, 0,
13cf5 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72 53 70   fnct_RegisterSp
13cf6 61 74 69 61 6c 56 69 65 77 43 6f 76 65 72 61 67  atialViewCoverag
13cf7 65 2c 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29  e,....     0, 0)
13cf8 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13cf9 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64  eate_function (d
13cfa 62 2c 20 22 53 45 5f 52 65 67 69 73 74 65 72 53  b, "SE_RegisterS
13cfb 70 61 74 69 61 6c 56 69 65 77 43 6f 76 65 72 61  patialViewCovera
13cfc 67 65 22 2c 20 37 2c 0a 09 09 09 20 20 20 20 20  ge", 7,....     
13cfd 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66  SQLITE_ANY, 0, f
13cfe 6e 63 74 5f 52 65 67 69 73 74 65 72 53 70 61 74  nct_RegisterSpat
13cff 69 61 6c 56 69 65 77 43 6f 76 65 72 61 67 65 2c  ialViewCoverage,
13d00 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13d01 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d02 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d03 20 22 53 45 5f 52 65 67 69 73 74 65 72 56 69 72   "SE_RegisterVir
13d04 74 75 61 6c 53 68 61 70 65 43 6f 76 65 72 61 67  tualShapeCoverag
13d05 65 22 2c 20 33 2c 0a 09 09 09 20 20 20 20 20 53  e", 3,....     S
13d06 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e  QLITE_ANY, 0, fn
13d07 63 74 5f 52 65 67 69 73 74 65 72 56 69 72 74 75  ct_RegisterVirtu
13d08 61 6c 53 68 61 70 65 43 6f 76 65 72 61 67 65 2c  alShapeCoverage,
13d09 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13d0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d0b 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d0c 20 22 53 45 5f 52 65 67 69 73 74 65 72 56 69 72   "SE_RegisterVir
13d0d 74 75 61 6c 53 68 61 70 65 43 6f 76 65 72 61 67  tualShapeCoverag
13d0e 65 22 2c 20 35 2c 0a 09 09 09 20 20 20 20 20 53  e", 5,....     S
13d0f 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e  QLITE_ANY, 0, fn
13d10 63 74 5f 52 65 67 69 73 74 65 72 56 69 72 74 75  ct_RegisterVirtu
13d11 61 6c 53 68 61 70 65 43 6f 76 65 72 61 67 65 2c  alShapeCoverage,
13d12 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13d13 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d14 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d15 20 22 53 45 5f 52 65 67 69 73 74 65 72 56 69 72   "SE_RegisterVir
13d16 74 75 61 6c 53 68 61 70 65 43 6f 76 65 72 61 67  tualShapeCoverag
13d17 65 22 2c 20 36 2c 0a 09 09 09 20 20 20 20 20 53  e", 6,....     S
13d18 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e  QLITE_ANY, 0, fn
13d19 63 74 5f 52 65 67 69 73 74 65 72 56 69 72 74 75  ct_RegisterVirtu
13d1a 61 6c 53 68 61 70 65 43 6f 76 65 72 61 67 65 2c  alShapeCoverage,
13d1b 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13d1c 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d1d 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d1e 20 22 53 45 5f 52 65 67 69 73 74 65 72 54 6f 70   "SE_RegisterTop
13d1f 6f 47 65 6f 43 6f 76 65 72 61 67 65 22 2c 20 32  oGeoCoverage", 2
13d20 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 0a 09 09  , SQLITE_ANY,...
13d21 09 20 20 20 20 20 30 2c 20 66 6e 63 74 5f 52 65  .     0, fnct_Re
13d22 67 69 73 74 65 72 54 6f 70 6f 47 65 6f 43 6f 76  gisterTopoGeoCov
13d23 65 72 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20  erage, 0, 0);.  
13d24 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13d25 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22  _function (db, "
13d26 53 45 5f 52 65 67 69 73 74 65 72 54 6f 70 6f 47  SE_RegisterTopoG
13d27 65 6f 43 6f 76 65 72 61 67 65 22 2c 20 34 2c 20  eoCoverage", 4, 
13d28 53 51 4c 49 54 45 5f 41 4e 59 2c 0a 09 09 09 20  SQLITE_ANY,.... 
13d29 20 20 20 20 30 2c 20 66 6e 63 74 5f 52 65 67 69      0, fnct_Regi
13d2a 73 74 65 72 54 6f 70 6f 47 65 6f 43 6f 76 65 72  sterTopoGeoCover
13d2b 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  age, 0, 0);.    
13d2c 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13d2d 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 53 45  unction (db, "SE
13d2e 5f 52 65 67 69 73 74 65 72 54 6f 70 6f 47 65 6f  _RegisterTopoGeo
13d2f 43 6f 76 65 72 61 67 65 22 2c 20 36 2c 20 53 51  Coverage", 6, SQ
13d30 4c 49 54 45 5f 41 4e 59 2c 0a 09 09 09 20 20 20  LITE_ANY,....   
13d31 20 20 30 2c 20 66 6e 63 74 5f 52 65 67 69 73 74    0, fnct_Regist
13d32 65 72 54 6f 70 6f 47 65 6f 43 6f 76 65 72 61 67  erTopoGeoCoverag
13d33 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
13d34 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13d35 63 74 69 6f 6e 20 28 64 62 2c 20 22 53 45 5f 52  ction (db, "SE_R
13d36 65 67 69 73 74 65 72 54 6f 70 6f 4e 65 74 43 6f  egisterTopoNetCo
13d37 76 65 72 61 67 65 22 2c 20 32 2c 20 53 51 4c 49  verage", 2, SQLI
13d38 54 45 5f 41 4e 59 2c 0a 09 09 09 20 20 20 20 20  TE_ANY,....     
13d39 30 2c 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72  0, fnct_Register
13d3a 54 6f 70 6f 4e 65 74 43 6f 76 65 72 61 67 65 2c  TopoNetCoverage,
13d3b 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13d3c 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13d3d 69 6f 6e 20 28 64 62 2c 20 22 53 45 5f 52 65 67  ion (db, "SE_Reg
13d3e 69 73 74 65 72 54 6f 70 6f 4e 65 74 43 6f 76 65  isterTopoNetCove
13d3f 72 61 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  rage", 4, SQLITE
13d40 5f 41 4e 59 2c 0a 09 09 09 20 20 20 20 20 30 2c  _ANY,....     0,
13d41 20 66 6e 63 74 5f 52 65 67 69 73 74 65 72 54 6f   fnct_RegisterTo
13d42 70 6f 4e 65 74 43 6f 76 65 72 61 67 65 2c 20 30  poNetCoverage, 0
13d43 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13d44 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13d45 6e 20 28 64 62 2c 20 22 53 45 5f 52 65 67 69 73  n (db, "SE_Regis
13d46 74 65 72 54 6f 70 6f 4e 65 74 43 6f 76 65 72 61  terTopoNetCovera
13d47 67 65 22 2c 20 36 2c 20 53 51 4c 49 54 45 5f 41  ge", 6, SQLITE_A
13d48 4e 59 2c 0a 09 09 09 20 20 20 20 20 30 2c 20 66  NY,....     0, f
13d49 6e 63 74 5f 52 65 67 69 73 74 65 72 54 6f 70 6f  nct_RegisterTopo
13d4a 4e 65 74 43 6f 76 65 72 61 67 65 2c 20 30 2c 20  NetCoverage, 0, 
13d4b 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13d4c 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13d4d 28 64 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73  (db, "SE_UnRegis
13d4e 74 65 72 56 65 63 74 6f 72 43 6f 76 65 72 61 67  terVectorCoverag
13d4f 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 1, SQLITE_AN
13d50 59 2c 0a 09 09 09 20 20 20 20 20 30 2c 20 66 6e  Y,....     0, fn
13d51 63 74 5f 55 6e 72 65 67 69 73 74 65 72 56 65 63  ct_UnregisterVec
13d52 74 6f 72 43 6f 76 65 72 61 67 65 2c 20 30 2c 20  torCoverage, 0, 
13d53 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13d54 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13d55 28 64 62 2c 20 22 53 45 5f 53 65 74 56 65 63 74  (db, "SE_SetVect
13d56 6f 72 43 6f 76 65 72 61 67 65 49 6e 66 6f 73 22  orCoverageInfos"
13d57 2c 20 33 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 3, SQLITE_ANY,
13d58 0a 09 09 09 20 20 20 20 20 30 2c 20 66 6e 63 74  ....     0, fnct
13d59 5f 53 65 74 56 65 63 74 6f 72 43 6f 76 65 72 61  _SetVectorCovera
13d5a 67 65 49 6e 66 6f 73 2c 20 30 2c 20 30 29 3b 0a  geInfos, 0, 0);.
13d5b 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d5c 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d5d 20 22 53 45 5f 53 65 74 56 65 63 74 6f 72 43 6f   "SE_SetVectorCo
13d5e 76 65 72 61 67 65 49 6e 66 6f 73 22 2c 20 35 2c  verageInfos", 5,
13d5f 20 53 51 4c 49 54 45 5f 41 4e 59 2c 0a 09 09 09   SQLITE_ANY,....
13d60 20 20 20 20 20 30 2c 20 66 6e 63 74 5f 53 65 74       0, fnct_Set
13d61 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 49 6e  VectorCoverageIn
13d62 66 6f 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  fos, 0, 0);.    
13d63 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13d64 75 6e 63 74 69 6f 6e 20 28 64 62 2c 20 22 53 45  unction (db, "SE
13d65 5f 53 65 74 56 65 63 74 6f 72 43 6f 76 65 72 61  _SetVectorCovera
13d66 67 65 43 6f 70 79 72 69 67 68 74 22 2c 20 32 2c  geCopyright", 2,
13d67 0a 09 09 09 20 20 20 20 20 53 51 4c 49 54 45 5f  ....     SQLITE_
13d68 41 4e 59 2c 20 30 2c 20 66 6e 63 74 5f 53 65 74  ANY, 0, fnct_Set
13d69 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 43 6f  VectorCoverageCo
13d6a 70 79 72 69 67 68 74 2c 0a 09 09 09 20 20 20 20  pyright,....    
13d6b 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13d6c 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13d6d 69 6f 6e 20 28 64 62 2c 20 22 53 45 5f 53 65 74  ion (db, "SE_Set
13d6e 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 43 6f  VectorCoverageCo
13d6f 70 79 72 69 67 68 74 22 2c 20 33 2c 0a 09 09 09  pyright", 3,....
13d70 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c       SQLITE_ANY,
13d71 20 30 2c 20 66 6e 63 74 5f 53 65 74 56 65 63 74   0, fnct_SetVect
13d72 6f 72 43 6f 76 65 72 61 67 65 43 6f 70 79 72 69  orCoverageCopyri
13d73 67 68 74 2c 0a 09 09 09 20 20 20 20 20 30 2c 20  ght,....     0, 
13d74 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13d75 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13d76 28 64 62 2c 20 22 53 45 5f 52 65 67 69 73 74 65  (db, "SE_Registe
13d77 72 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 53  rVectorCoverageS
13d78 72 69 64 22 2c 20 32 2c 0a 09 09 09 20 20 20 20  rid", 2,....    
13d79 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
13d7a 66 6e 63 74 5f 52 65 67 69 73 74 65 72 56 65 63  fnct_RegisterVec
13d7b 74 6f 72 43 6f 76 65 72 61 67 65 53 72 69 64 2c  torCoverageSrid,
13d7c 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13d7d 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d7e 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d7f 20 22 53 45 5f 55 6e 52 65 67 69 73 74 65 72 56   "SE_UnRegisterV
13d80 65 63 74 6f 72 43 6f 76 65 72 61 67 65 53 72 69  ectorCoverageSri
13d81 64 22 2c 20 32 2c 0a 09 09 09 20 20 20 20 20 53  d", 2,....     S
13d82 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e  QLITE_ANY, 0, fn
13d83 63 74 5f 55 6e 72 65 67 69 73 74 65 72 56 65 63  ct_UnregisterVec
13d84 74 6f 72 43 6f 76 65 72 61 67 65 53 72 69 64 2c  torCoverageSrid,
13d85 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13d86 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13d87 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13d88 20 22 53 45 5f 52 65 67 69 73 74 65 72 56 65 63   "SE_RegisterVec
13d89 74 6f 72 43 6f 76 65 72 61 67 65 4b 65 79 77 6f  torCoverageKeywo
13d8a 72 64 22 2c 20 32 2c 0a 09 09 09 20 20 20 20 20  rd", 2,....     
13d8b 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09  SQLITE_ANY, 0,..
13d8c 09 09 20 20 20 20 20 66 6e 63 74 5f 52 65 67 69  ..     fnct_Regi
13d8d 73 74 65 72 56 65 63 74 6f 72 43 6f 76 65 72 61  sterVectorCovera
13d8e 67 65 4b 65 79 77 6f 72 64 2c 20 30 2c 20 30 29  geKeyword, 0, 0)
13d8f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13d90 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64  eate_function (d
13d91 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74 65  b, "SE_UnRegiste
13d92 72 56 65 63 74 6f 72 43 6f 76 65 72 61 67 65 4b  rVectorCoverageK
13d93 65 79 77 6f 72 64 22 2c 20 32 2c 0a 09 09 09 20  eyword", 2,.... 
13d94 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20      SQLITE_ANY, 
13d95 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f  0,....     fnct_
13d96 55 6e 72 65 67 69 73 74 65 72 56 65 63 74 6f 72  UnregisterVector
13d97 43 6f 76 65 72 61 67 65 4b 65 79 77 6f 72 64 2c  CoverageKeyword,
13d98 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13d99 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13d9a 69 6f 6e 20 28 64 62 2c 20 22 53 45 5f 55 70 64  ion (db, "SE_Upd
13d9b 61 74 65 56 65 63 74 6f 72 43 6f 76 65 72 61 67  ateVectorCoverag
13d9c 65 45 78 74 65 6e 74 22 2c 20 30 2c 0a 09 09 09  eExtent", 0,....
13d9d 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c       SQLITE_ANY,
13d9e 20 30 2c 20 66 6e 63 74 5f 55 70 64 61 74 65 56   0, fnct_UpdateV
13d9f 65 63 74 6f 72 43 6f 76 65 72 61 67 65 45 78 74  ectorCoverageExt
13da0 65 6e 74 2c 0a 09 09 09 20 20 20 20 20 30 2c 20  ent,....     0, 
13da1 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13da2 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13da3 28 64 62 2c 20 22 53 45 5f 55 70 64 61 74 65 56  (db, "SE_UpdateV
13da4 65 63 74 6f 72 43 6f 76 65 72 61 67 65 45 78 74  ectorCoverageExt
13da5 65 6e 74 22 2c 20 31 2c 0a 09 09 09 20 20 20 20  ent", 1,....    
13da6 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
13da7 66 6e 63 74 5f 55 70 64 61 74 65 56 65 63 74 6f  fnct_UpdateVecto
13da8 72 43 6f 76 65 72 61 67 65 45 78 74 65 6e 74 2c  rCoverageExtent,
13da9 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13daa 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13dab 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13dac 20 22 53 45 5f 55 70 64 61 74 65 56 65 63 74 6f   "SE_UpdateVecto
13dad 72 43 6f 76 65 72 61 67 65 45 78 74 65 6e 74 22  rCoverageExtent"
13dae 2c 20 32 2c 0a 09 09 09 20 20 20 20 20 53 51 4c  , 2,....     SQL
13daf 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e 63 74  ITE_ANY, 0, fnct
13db0 5f 55 70 64 61 74 65 56 65 63 74 6f 72 43 6f 76  _UpdateVectorCov
13db1 65 72 61 67 65 45 78 74 65 6e 74 2c 0a 09 09 09  erageExtent,....
13db2 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20       0, 0);.    
13db3 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13db4 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13db5 22 53 45 5f 52 65 67 69 73 74 65 72 45 78 74 65  "SE_RegisterExte
13db6 72 6e 61 6c 47 72 61 70 68 69 63 22 2c 20 32 2c  rnalGraphic", 2,
13db7 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13db8 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13db9 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
13dba 66 6e 63 74 5f 52 65 67 69 73 74 65 72 45 78 74  fnct_RegisterExt
13dbb 65 72 6e 61 6c 47 72 61 70 68 69 63 2c 20 30 2c  ernalGraphic, 0,
13dbc 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13dbd 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13dbe 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13dbf 52 65 67 69 73 74 65 72 45 78 74 65 72 6e 61 6c  RegisterExternal
13dc0 47 72 61 70 68 69 63 22 2c 20 35 2c 0a 09 09 09  Graphic", 5,....
13dc1 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13dc2 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13dc3 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13dc4 5f 52 65 67 69 73 74 65 72 45 78 74 65 72 6e 61  _RegisterExterna
13dc5 6c 47 72 61 70 68 69 63 2c 20 30 2c 20 30 2c 20  lGraphic, 0, 0, 
13dc6 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13dc7 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13dc8 76 32 20 28 64 62 2c 20 22 53 45 5f 55 6e 72 65  v2 (db, "SE_Unre
13dc9 67 69 73 74 65 72 45 78 74 65 72 6e 61 6c 47 72  gisterExternalGr
13dca 61 70 68 69 63 22 2c 20 31 2c 0a 09 09 09 09 53  aphic", 1,.....S
13dcb 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13dcc 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13dcd 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55  C, 0,.....fnct_U
13dce 6e 72 65 67 69 73 74 65 72 45 78 74 65 72 6e 61  nregisterExterna
13dcf 6c 47 72 61 70 68 69 63 2c 20 30 2c 20 30 2c 20  lGraphic, 0, 0, 
13dd0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13dd1 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13dd2 76 32 20 28 64 62 2c 20 22 53 45 5f 52 65 67 69  v2 (db, "SE_Regi
13dd3 73 74 65 72 56 65 63 74 6f 72 53 74 79 6c 65 22  sterVectorStyle"
13dd4 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
13dd5 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13dd6 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
13dd7 09 09 09 09 66 6e 63 74 5f 52 65 67 69 73 74 65  ....fnct_Registe
13dd8 72 56 65 63 74 6f 72 53 74 79 6c 65 2c 20 30 2c  rVectorStyle, 0,
13dd9 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13dda 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13ddb 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13ddc 55 6e 52 65 67 69 73 74 65 72 56 65 63 74 6f 72  UnRegisterVector
13ddd 53 74 79 6c 65 22 2c 20 31 2c 0a 09 09 09 09 53  Style", 1,.....S
13dde 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13ddf 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13de0 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55  C, 0,.....fnct_U
13de1 6e 52 65 67 69 73 74 65 72 56 65 63 74 6f 72 53  nRegisterVectorS
13de2 74 79 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tyle, 0, 0, 0);.
13de3 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13de4 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13de5 64 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74  db, "SE_UnRegist
13de6 65 72 56 65 63 74 6f 72 53 74 79 6c 65 22 2c 20  erVectorStyle", 
13de7 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13de8 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13de9 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13dea 09 09 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65  ..fnct_UnRegiste
13deb 72 56 65 63 74 6f 72 53 74 79 6c 65 2c 20 30 2c  rVectorStyle, 0,
13dec 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13ded 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13dee 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13def 52 65 6c 6f 61 64 56 65 63 74 6f 72 53 74 79 6c  ReloadVectorStyl
13df0 65 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  e", 2,.....SQLIT
13df1 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13df2 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13df3 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65 6c 6f 61  ,.....fnct_Reloa
13df4 64 56 65 63 74 6f 72 53 74 79 6c 65 2c 20 30 2c  dVectorStyle, 0,
13df5 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13df6 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13df7 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13df8 52 65 67 69 73 74 65 72 56 65 63 74 6f 72 53 74  RegisterVectorSt
13df9 79 6c 65 64 4c 61 79 65 72 22 2c 20 32 2c 0a 09  yledLayer", 2,..
13dfa 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13dfb 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13dfc 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
13dfd 63 74 5f 52 65 67 69 73 74 65 72 56 65 63 74 6f  ct_RegisterVecto
13dfe 72 53 74 79 6c 65 64 4c 61 79 65 72 2c 20 30 2c  rStyledLayer, 0,
13dff 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13e00 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13e01 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13e02 55 6e 52 65 67 69 73 74 65 72 56 65 63 74 6f 72  UnRegisterVector
13e03 53 74 79 6c 65 64 4c 61 79 65 72 22 2c 20 32 2c  StyledLayer", 2,
13e04 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13e05 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13e06 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
13e07 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65 72 56  fnct_UnRegisterV
13e08 65 63 74 6f 72 53 74 79 6c 65 64 4c 61 79 65 72  ectorStyledLayer
13e09 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13e0a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13e0b 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13e0c 22 53 45 5f 52 65 67 69 73 74 65 72 52 61 73 74  "SE_RegisterRast
13e0d 65 72 53 74 79 6c 65 22 2c 20 31 2c 0a 09 09 09  erStyle", 1,....
13e0e 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13e0f 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13e10 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13e11 5f 52 65 67 69 73 74 65 72 52 61 73 74 65 72 53  _RegisterRasterS
13e12 74 79 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tyle, 0, 0, 0);.
13e13 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e14 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13e15 64 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74  db, "SE_UnRegist
13e16 65 72 52 61 73 74 65 72 53 74 79 6c 65 22 2c 20  erRasterStyle", 
13e17 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13e18 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13e19 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13e1a 09 09 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65  ..fnct_UnRegiste
13e1b 72 52 61 73 74 65 72 53 74 79 6c 65 2c 20 30 2c  rRasterStyle, 0,
13e1c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13e1d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13e1e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13e1f 55 6e 52 65 67 69 73 74 65 72 52 61 73 74 65 72  UnRegisterRaster
13e20 53 74 79 6c 65 22 2c 20 32 2c 0a 09 09 09 09 53  Style", 2,.....S
13e21 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13e22 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13e23 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55  C, 0,.....fnct_U
13e24 6e 52 65 67 69 73 74 65 72 52 61 73 74 65 72 53  nRegisterRasterS
13e25 74 79 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tyle, 0, 0, 0);.
13e26 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e27 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13e28 64 62 2c 20 22 53 45 5f 52 65 6c 6f 61 64 52 61  db, "SE_ReloadRa
13e29 73 74 65 72 53 74 79 6c 65 22 2c 20 32 2c 0a 09  sterStyle", 2,..
13e2a 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13e2b 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13e2c 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
13e2d 63 74 5f 52 65 6c 6f 61 64 52 61 73 74 65 72 53  ct_ReloadRasterS
13e2e 74 79 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tyle, 0, 0, 0);.
13e2f 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e30 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13e31 64 62 2c 20 22 53 45 5f 52 65 67 69 73 74 65 72  db, "SE_Register
13e32 52 61 73 74 65 72 53 74 79 6c 65 64 4c 61 79 65  RasterStyledLaye
13e33 72 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  r", 2,.....SQLIT
13e34 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13e35 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13e36 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65 67 69 73  ,.....fnct_Regis
13e37 74 65 72 52 61 73 74 65 72 53 74 79 6c 65 64 4c  terRasterStyledL
13e38 61 79 65 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ayer, 0, 0, 0);.
13e39 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e3a 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13e3b 64 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74  db, "SE_UnRegist
13e3c 65 72 52 61 73 74 65 72 53 74 79 6c 65 64 4c 61  erRasterStyledLa
13e3d 79 65 72 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  yer", 2,.....SQL
13e3e 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13e3f 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13e40 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55 6e 52   0,.....fnct_UnR
13e41 65 67 69 73 74 65 72 52 61 73 74 65 72 53 74 79  egisterRasterSty
13e42 6c 65 64 4c 61 79 65 72 2c 20 30 2c 20 30 2c 20  ledLayer, 0, 0, 
13e43 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13e44 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13e45 28 64 62 2c 20 22 53 45 5f 52 65 67 69 73 74 65  (db, "SE_Registe
13e46 72 52 61 73 74 65 72 43 6f 76 65 72 61 67 65 53  rRasterCoverageS
13e47 72 69 64 22 2c 20 32 2c 0a 09 09 09 20 20 20 20  rid", 2,....    
13e48 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
13e49 66 6e 63 74 5f 52 65 67 69 73 74 65 72 52 61 73  fnct_RegisterRas
13e4a 74 65 72 43 6f 76 65 72 61 67 65 53 72 69 64 2c  terCoverageSrid,
13e4b 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13e4c 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e4d 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13e4e 20 22 53 45 5f 55 6e 52 65 67 69 73 74 65 72 52   "SE_UnRegisterR
13e4f 61 73 74 65 72 43 6f 76 65 72 61 67 65 53 72 69  asterCoverageSri
13e50 64 22 2c 20 32 2c 0a 09 09 09 20 20 20 20 20 53  d", 2,....     S
13e51 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e  QLITE_ANY, 0, fn
13e52 63 74 5f 55 6e 72 65 67 69 73 74 65 72 52 61 73  ct_UnregisterRas
13e53 74 65 72 43 6f 76 65 72 61 67 65 53 72 69 64 2c  terCoverageSrid,
13e54 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13e55 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e56 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13e57 20 22 53 45 5f 52 65 67 69 73 74 65 72 52 61 73   "SE_RegisterRas
13e58 74 65 72 43 6f 76 65 72 61 67 65 4b 65 79 77 6f  terCoverageKeywo
13e59 72 64 22 2c 20 32 2c 0a 09 09 09 20 20 20 20 20  rd", 2,....     
13e5a 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0a 09  SQLITE_ANY, 0,..
13e5b 09 09 20 20 20 20 20 66 6e 63 74 5f 52 65 67 69  ..     fnct_Regi
13e5c 73 74 65 72 52 61 73 74 65 72 43 6f 76 65 72 61  sterRasterCovera
13e5d 67 65 4b 65 79 77 6f 72 64 2c 20 30 2c 20 30 29  geKeyword, 0, 0)
13e5e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13e5f 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64  eate_function (d
13e60 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74 65  b, "SE_UnRegiste
13e61 72 52 61 73 74 65 72 43 6f 76 65 72 61 67 65 4b  rRasterCoverageK
13e62 65 79 77 6f 72 64 22 2c 20 32 2c 0a 09 09 09 20  eyword", 2,.... 
13e63 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20      SQLITE_ANY, 
13e64 30 2c 0a 09 09 09 20 20 20 20 20 66 6e 63 74 5f  0,....     fnct_
13e65 55 6e 72 65 67 69 73 74 65 72 52 61 73 74 65 72  UnregisterRaster
13e66 43 6f 76 65 72 61 67 65 4b 65 79 77 6f 72 64 2c  CoverageKeyword,
13e67 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13e68 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13e69 69 6f 6e 20 28 64 62 2c 20 22 53 45 5f 55 70 64  ion (db, "SE_Upd
13e6a 61 74 65 52 61 73 74 65 72 43 6f 76 65 72 61 67  ateRasterCoverag
13e6b 65 45 78 74 65 6e 74 22 2c 20 30 2c 0a 09 09 09  eExtent", 0,....
13e6c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 2c       SQLITE_ANY,
13e6d 20 30 2c 20 66 6e 63 74 5f 55 70 64 61 74 65 52   0, fnct_UpdateR
13e6e 61 73 74 65 72 43 6f 76 65 72 61 67 65 45 78 74  asterCoverageExt
13e6f 65 6e 74 2c 0a 09 09 09 20 20 20 20 20 30 2c 20  ent,....     0, 
13e70 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13e71 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
13e72 28 64 62 2c 20 22 53 45 5f 55 70 64 61 74 65 52  (db, "SE_UpdateR
13e73 61 73 74 65 72 43 6f 76 65 72 61 67 65 45 78 74  asterCoverageExt
13e74 65 6e 74 22 2c 20 31 2c 0a 09 09 09 20 20 20 20  ent", 1,....    
13e75 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
13e76 66 6e 63 74 5f 55 70 64 61 74 65 52 61 73 74 65  fnct_UpdateRaste
13e77 72 43 6f 76 65 72 61 67 65 45 78 74 65 6e 74 2c  rCoverageExtent,
13e78 0a 09 09 09 20 20 20 20 20 30 2c 20 30 29 3b 0a  ....     0, 0);.
13e79 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13e7a 74 65 5f 66 75 6e 63 74 69 6f 6e 20 28 64 62 2c  te_function (db,
13e7b 20 22 53 45 5f 55 70 64 61 74 65 52 61 73 74 65   "SE_UpdateRaste
13e7c 72 43 6f 76 65 72 61 67 65 45 78 74 65 6e 74 22  rCoverageExtent"
13e7d 2c 20 32 2c 0a 09 09 09 20 20 20 20 20 53 51 4c  , 2,....     SQL
13e7e 49 54 45 5f 41 4e 59 2c 20 30 2c 20 66 6e 63 74  ITE_ANY, 0, fnct
13e7f 5f 55 70 64 61 74 65 52 61 73 74 65 72 43 6f 76  _UpdateRasterCov
13e80 65 72 61 67 65 45 78 74 65 6e 74 2c 0a 09 09 09  erageExtent,....
13e81 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20       0, 0);.    
13e82 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13e83 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13e84 22 53 45 5f 52 65 67 69 73 74 65 72 53 74 79 6c  "SE_RegisterStyl
13e85 65 64 47 72 6f 75 70 52 61 73 74 65 72 22 2c 20  edGroupRaster", 
13e86 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13e87 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13e88 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13e89 09 09 66 6e 63 74 5f 52 65 67 69 73 74 65 72 53  ..fnct_RegisterS
13e8a 74 79 6c 65 64 47 72 6f 75 70 52 61 73 74 65 72  tyledGroupRaster
13e8b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13e8c 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13e8d 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13e8e 22 53 45 5f 52 65 67 69 73 74 65 72 53 74 79 6c  "SE_RegisterStyl
13e8f 65 64 47 72 6f 75 70 56 65 63 74 6f 72 22 2c 20  edGroupVector", 
13e90 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13e91 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13e92 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13e93 09 09 66 6e 63 74 5f 52 65 67 69 73 74 65 72 53  ..fnct_RegisterS
13e94 74 79 6c 65 64 47 72 6f 75 70 56 65 63 74 6f 72  tyledGroupVector
13e95 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13e96 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13e97 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13e98 22 53 45 5f 53 65 74 53 74 79 6c 65 64 47 72 6f  "SE_SetStyledGro
13e99 75 70 49 6e 66 6f 73 22 2c 20 33 2c 0a 09 09 09  upInfos", 3,....
13e9a 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13e9b 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13e9c 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13e9d 5f 53 65 74 53 74 79 6c 65 64 47 72 6f 75 70 49  _SetStyledGroupI
13e9e 6e 66 6f 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nfos, 0, 0, 0);.
13e9f 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13ea0 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13ea1 64 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74  db, "SE_UnRegist
13ea2 65 72 53 74 79 6c 65 64 47 72 6f 75 70 22 2c 20  erStyledGroup", 
13ea3 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13ea4 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13ea5 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13ea6 09 09 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65  ..fnct_UnRegiste
13ea7 72 53 74 79 6c 65 64 47 72 6f 75 70 2c 20 30 2c  rStyledGroup, 0,
13ea8 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13ea9 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13eaa 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13eab 55 6e 52 65 67 69 73 74 65 72 53 74 79 6c 65 64  UnRegisterStyled
13eac 47 72 6f 75 70 4c 61 79 65 72 22 2c 20 31 2c 0a  GroupLayer", 1,.
13ead 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13eae 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13eaf 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13eb0 6e 63 74 5f 55 6e 52 65 67 69 73 74 65 72 53 74  nct_UnRegisterSt
13eb1 79 6c 65 64 47 72 6f 75 70 4c 61 79 65 72 2c 20  yledGroupLayer, 
13eb2 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13eb3 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13eb4 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
13eb5 45 5f 55 6e 52 65 67 69 73 74 65 72 53 74 79 6c  E_UnRegisterStyl
13eb6 65 64 47 72 6f 75 70 56 65 63 74 6f 72 22 2c 20  edGroupVector", 
13eb7 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
13eb8 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13eb9 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13eba 09 09 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65  ..fnct_UnRegiste
13ebb 72 53 74 79 6c 65 64 47 72 6f 75 70 56 65 63 74  rStyledGroupVect
13ebc 6f 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  or, 0, 0, 0);.  
13ebd 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13ebe 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13ebf 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74 65 72  , "SE_UnRegister
13ec0 53 74 79 6c 65 64 47 72 6f 75 70 52 61 73 74 65  StyledGroupRaste
13ec1 72 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  r", 2,.....SQLIT
13ec2 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13ec3 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13ec4 2c 0a 09 09 09 09 66 6e 63 74 5f 55 6e 52 65 67  ,.....fnct_UnReg
13ec5 69 73 74 65 72 53 74 79 6c 65 64 47 72 6f 75 70  isterStyledGroup
13ec6 52 61 73 74 65 72 2c 20 30 2c 20 30 2c 20 30 29  Raster, 0, 0, 0)
13ec7 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
13ec8 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
13ec9 20 28 64 62 2c 20 22 53 45 5f 53 65 74 53 74 79   (db, "SE_SetSty
13eca 6c 65 64 47 72 6f 75 70 4c 61 79 65 72 50 61 69  ledGroupLayerPai
13ecb 6e 74 4f 72 64 65 72 22 2c 20 32 2c 0a 09 09 09  ntOrder", 2,....
13ecc 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13ecd 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13ece 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
13ecf 5f 53 65 74 53 74 79 6c 65 64 47 72 6f 75 70 4c  _SetStyledGroupL
13ed0 61 79 65 72 50 61 69 6e 74 4f 72 64 65 72 2c 20  ayerPaintOrder, 
13ed1 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13ed2 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13ed3 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
13ed4 45 5f 53 65 74 53 74 79 6c 65 64 47 72 6f 75 70  E_SetStyledGroup
13ed5 56 65 63 74 6f 72 50 61 69 6e 74 4f 72 64 65 72  VectorPaintOrder
13ed6 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
13ed7 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13ed8 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
13ed9 0a 09 09 09 09 66 6e 63 74 5f 53 65 74 53 74 79  .....fnct_SetSty
13eda 6c 65 64 47 72 6f 75 70 56 65 63 74 6f 72 50 61  ledGroupVectorPa
13edb 69 6e 74 4f 72 64 65 72 2c 20 30 2c 20 30 2c 20  intOrder, 0, 0, 
13edc 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13edd 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13ede 76 32 20 28 64 62 2c 20 22 53 45 5f 53 65 74 53  v2 (db, "SE_SetS
13edf 74 79 6c 65 64 47 72 6f 75 70 52 61 73 74 65 72  tyledGroupRaster
13ee0 50 61 69 6e 74 4f 72 64 65 72 22 2c 20 33 2c 0a  PaintOrder", 3,.
13ee1 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13ee2 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13ee3 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13ee4 6e 63 74 5f 53 65 74 53 74 79 6c 65 64 47 72 6f  nct_SetStyledGro
13ee5 75 70 52 61 73 74 65 72 50 61 69 6e 74 4f 72 64  upRasterPaintOrd
13ee6 65 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  er, 0, 0, 0);.  
13ee7 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13ee8 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
13ee9 2c 20 22 53 45 5f 52 65 67 69 73 74 65 72 47 72  , "SE_RegisterGr
13eea 6f 75 70 53 74 79 6c 65 22 2c 20 31 2c 0a 09 09  oupStyle", 1,...
13eeb 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13eec 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13eed 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
13eee 74 5f 52 65 67 69 73 74 65 72 47 72 6f 75 70 53  t_RegisterGroupS
13eef 74 79 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tyle, 0, 0, 0);.
13ef0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13ef1 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13ef2 64 62 2c 20 22 53 45 5f 55 6e 52 65 67 69 73 74  db, "SE_UnRegist
13ef3 65 72 47 72 6f 75 70 53 74 79 6c 65 22 2c 20 31  erGroupStyle", 1
13ef4 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
13ef5 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
13ef6 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
13ef7 09 66 6e 63 74 5f 55 6e 52 65 67 69 73 74 65 72  .fnct_UnRegister
13ef8 47 72 6f 75 70 53 74 79 6c 65 2c 20 30 2c 20 30  GroupStyle, 0, 0
13ef9 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13efa 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13efb 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f 55 6e  n_v2 (db, "SE_Un
13efc 52 65 67 69 73 74 65 72 47 72 6f 75 70 53 74 79  RegisterGroupSty
13efd 6c 65 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  le", 2,.....SQLI
13efe 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
13eff 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
13f00 30 2c 0a 09 09 09 09 66 6e 63 74 5f 55 6e 52 65  0,.....fnct_UnRe
13f01 67 69 73 74 65 72 47 72 6f 75 70 53 74 79 6c 65  gisterGroupStyle
13f02 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13f03 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13f04 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13f05 22 53 45 5f 52 65 6c 6f 61 64 47 72 6f 75 70 53  "SE_ReloadGroupS
13f06 74 79 6c 65 22 2c 20 32 2c 0a 09 09 09 09 53 51  tyle", 2,.....SQ
13f07 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
13f08 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
13f09 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 52 65  , 0,.....fnct_Re
13f0a 6c 6f 61 64 47 72 6f 75 70 53 74 79 6c 65 2c 20  loadGroupStyle, 
13f0b 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13f0c 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13f0d 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53  ction_v2 (db, "S
13f0e 45 5f 52 65 67 69 73 74 65 72 53 74 79 6c 65 64  E_RegisterStyled
13f0f 47 72 6f 75 70 53 74 79 6c 65 22 2c 20 32 2c 0a  GroupStyle", 2,.
13f10 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13f11 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13f12 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13f13 6e 63 74 5f 52 65 67 69 73 74 65 72 53 74 79 6c  nct_RegisterStyl
13f14 65 64 47 72 6f 75 70 53 74 79 6c 65 2c 20 30 2c  edGroupStyle, 0,
13f15 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13f16 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13f17 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 45 5f  ion_v2 (db, "SE_
13f18 55 6e 52 65 67 69 73 74 65 72 53 74 79 6c 65 64  UnRegisterStyled
13f19 47 72 6f 75 70 53 74 79 6c 65 22 2c 20 32 2c 0a  GroupStyle", 2,.
13f1a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13f1b 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13f1c 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13f1d 6e 63 74 5f 55 6e 52 65 67 69 73 74 65 72 53 74  nct_UnRegisterSt
13f1e 79 6c 65 64 47 72 6f 75 70 53 74 79 6c 65 2c 20  yledGroupStyle, 
13f1f 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13f20 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13f21 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43  ction_v2 (db, "C
13f22 72 65 61 74 65 49 73 6f 4d 65 74 61 64 61 74 61  reateIsoMetadata
13f23 54 61 62 6c 65 73 22 2c 20 30 2c 0a 09 09 09 09  Tables", 0,.....
13f24 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
13f25 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
13f26 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
13f27 43 72 65 61 74 65 49 73 6f 4d 65 74 61 64 61 74  CreateIsoMetadat
13f28 61 54 61 62 6c 65 73 2c 20 30 2c 20 30 2c 20 30  aTables, 0, 0, 0
13f29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
13f2a 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
13f2b 32 20 28 64 62 2c 20 22 43 72 65 61 74 65 49 73  2 (db, "CreateIs
13f2c 6f 4d 65 74 61 64 61 74 61 54 61 62 6c 65 73 22  oMetadataTables"
13f2d 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
13f2e 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13f2f 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
13f30 09 09 09 09 66 6e 63 74 5f 43 72 65 61 74 65 49  ....fnct_CreateI
13f31 73 6f 4d 65 74 61 64 61 74 61 54 61 62 6c 65 73  soMetadataTables
13f32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13f33 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13f34 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13f35 22 47 65 74 49 73 6f 4d 65 74 61 64 61 74 61 49  "GetIsoMetadataI
13f36 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  d", 1,.....SQLIT
13f37 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13f38 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13f39 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 74 49 73  ,.....fnct_GetIs
13f3a 6f 4d 65 74 61 64 61 74 61 49 64 2c 20 30 2c 20  oMetadataId, 0, 
13f3b 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
13f3c 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13f3d 6f 6e 5f 76 32 20 28 64 62 2c 20 22 52 65 67 69  on_v2 (db, "Regi
13f3e 73 74 65 72 49 73 6f 4d 65 74 61 64 61 74 61 22  sterIsoMetadata"
13f3f 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 2,.....SQLITE_
13f40 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
13f41 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
13f42 09 09 09 09 66 6e 63 74 5f 52 65 67 69 73 74 65  ....fnct_Registe
13f43 72 49 73 6f 4d 65 74 61 64 61 74 61 2c 20 30 2c  rIsoMetadata, 0,
13f44 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
13f45 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13f46 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 52 65 67  ion_v2 (db, "Reg
13f47 69 73 74 65 72 49 73 6f 4d 65 74 61 64 61 74 61  isterIsoMetadata
13f48 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 3,.....SQLITE
13f49 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13f4a 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
13f4b 0a 09 09 09 09 66 6e 63 74 5f 52 65 67 69 73 74  .....fnct_Regist
13f4c 65 72 49 73 6f 4d 65 74 61 64 61 74 61 2c 20 30  erIsoMetadata, 0
13f4d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
13f4e 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13f4f 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58 42  tion_v2 (db, "XB
13f50 5f 43 72 65 61 74 65 22 2c 20 31 2c 0a 09 09 09  _Create", 1,....
13f51 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
13f52 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
13f53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
13f54 66 6e 63 74 5f 58 42 5f 43 72 65 61 74 65 2c 20  fnct_XB_Create, 
13f55 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13f56 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13f57 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58  ction_v2 (db, "X
13f58 42 5f 43 72 65 61 74 65 22 2c 20 32 2c 0a 09 09  B_Create", 2,...
13f59 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13f5a 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13f5b 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
13f5c 09 66 6e 63 74 5f 58 42 5f 43 72 65 61 74 65 2c  .fnct_XB_Create,
13f5d 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13f5e 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13f5f 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13f60 58 42 5f 43 72 65 61 74 65 22 2c 20 33 2c 0a 09  XB_Create", 3,..
13f61 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13f62 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13f63 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
13f64 09 09 66 6e 63 74 5f 58 42 5f 43 72 65 61 74 65  ..fnct_XB_Create
13f65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13f66 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
13f67 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
13f68 22 58 42 5f 47 65 74 50 61 79 6c 6f 61 64 22 2c  "XB_GetPayload",
13f69 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
13f6a 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
13f6b 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
13f6c 09 09 09 66 6e 63 74 5f 58 42 5f 47 65 74 50 61  ...fnct_XB_GetPa
13f6d 79 6c 6f 61 64 2c 20 30 2c 20 30 2c 20 30 29 3b  yload, 0, 0, 0);
13f6e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13f6f 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13f70 28 64 62 2c 20 22 58 42 5f 47 65 74 50 61 79 6c  (db, "XB_GetPayl
13f71 6f 61 64 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  oad", 2,.....SQL
13f72 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13f73 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13f74 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f   0,.....fnct_XB_
13f75 47 65 74 50 61 79 6c 6f 61 64 2c 20 30 2c 20 30  GetPayload, 0, 0
13f76 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13f77 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13f78 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 47 65  n_v2 (db, "XB_Ge
13f79 74 44 6f 63 75 6d 65 6e 74 22 2c 20 31 2c 0a 09  tDocument", 1,..
13f7a 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
13f7b 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
13f7c 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
13f7d 63 74 5f 58 42 5f 47 65 74 44 6f 63 75 6d 65 6e  ct_XB_GetDocumen
13f7e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
13f7f 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13f80 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13f81 20 22 58 42 5f 47 65 74 44 6f 63 75 6d 65 6e 74   "XB_GetDocument
13f82 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
13f83 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13f84 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
13f85 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f 47 65 74  .....fnct_XB_Get
13f86 44 6f 63 75 6d 65 6e 74 2c 20 30 2c 20 30 2c 20  Document, 0, 0, 
13f87 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
13f88 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
13f89 76 32 20 28 64 62 2c 20 22 58 42 5f 53 63 68 65  v2 (db, "XB_Sche
13f8a 6d 61 56 61 6c 69 64 61 74 65 22 2c 20 32 2c 0a  maValidate", 2,.
13f8b 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13f8c 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13f8d 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
13f8e 09 09 09 66 6e 63 74 5f 58 42 5f 53 63 68 65 6d  ...fnct_XB_Schem
13f8f 61 56 61 6c 69 64 61 74 65 2c 20 30 2c 20 30 2c  aValidate, 0, 0,
13f90 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13f91 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
13f92 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 43 6f 6d  _v2 (db, "XB_Com
13f93 70 72 65 73 73 22 2c 20 31 2c 0a 09 09 09 09 53  press", 1,.....S
13f94 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
13f95 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
13f96 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 58  C, 0,.....fnct_X
13f97 42 5f 43 6f 6d 70 72 65 73 73 2c 20 30 2c 20 30  B_Compress, 0, 0
13f98 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13f99 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13f9a 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 55 6e  n_v2 (db, "XB_Un
13f9b 63 6f 6d 70 72 65 73 73 22 2c 20 31 2c 0a 09 09  compress", 1,...
13f9c 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13f9d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13f9e 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
13f9f 74 5f 58 42 5f 55 6e 63 6f 6d 70 72 65 73 73 2c  t_XB_Uncompress,
13fa0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13fa1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13fa2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13fa3 58 42 5f 49 73 56 61 6c 69 64 22 2c 20 31 2c 0a  XB_IsValid", 1,.
13fa4 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13fa5 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13fa6 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13fa7 6e 63 74 5f 58 42 5f 49 73 56 61 6c 69 64 2c 20  nct_XB_IsValid, 
13fa8 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
13fa9 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
13faa 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58  ction_v2 (db, "X
13fab 42 5f 49 73 53 63 68 65 6d 61 56 61 6c 69 64 61  B_IsSchemaValida
13fac 74 65 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  ted", 1,.....SQL
13fad 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
13fae 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
13faf 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f   0,.....fnct_XB_
13fb0 49 73 53 63 68 65 6d 61 56 61 6c 69 64 61 74 65  IsSchemaValidate
13fb1 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
13fb2 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13fb3 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
13fb4 20 22 58 42 5f 49 73 43 6f 6d 70 72 65 73 73 65   "XB_IsCompresse
13fb5 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54  d", 1,.....SQLIT
13fb6 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
13fb7 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
13fb8 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f 49 73  ,.....fnct_XB_Is
13fb9 43 6f 6d 70 72 65 73 73 65 64 2c 20 30 2c 20 30  Compressed, 0, 0
13fba 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13fbb 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13fbc 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 49 73  n_v2 (db, "XB_Is
13fbd 49 73 6f 4d 65 74 61 64 61 74 61 22 2c 20 31 2c  IsoMetadata", 1,
13fbe 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13fbf 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13fc0 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
13fc1 66 6e 63 74 5f 58 42 5f 49 73 49 73 6f 4d 65 74  fnct_XB_IsIsoMet
13fc2 61 64 61 74 61 2c 20 30 2c 20 30 2c 20 30 29 3b  adata, 0, 0, 0);
13fc3 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
13fc4 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
13fc5 28 64 62 2c 20 22 58 42 5f 49 73 53 6c 64 53 65  (db, "XB_IsSldSe
13fc6 56 65 63 74 6f 72 53 74 79 6c 65 22 2c 20 31 2c  VectorStyle", 1,
13fc7 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13fc8 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13fc9 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
13fca 66 6e 63 74 5f 58 42 5f 49 73 53 6c 64 53 65 56  fnct_XB_IsSldSeV
13fcb 65 63 74 6f 72 53 74 79 6c 65 2c 20 30 2c 20 30  ectorStyle, 0, 0
13fcc 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13fcd 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13fce 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 49 73  n_v2 (db, "XB_Is
13fcf 53 6c 64 53 65 52 61 73 74 65 72 53 74 79 6c 65  SldSeRasterStyle
13fd0 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
13fd1 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
13fd2 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
13fd3 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f 49 73 53  .....fnct_XB_IsS
13fd4 6c 64 53 65 52 61 73 74 65 72 53 74 79 6c 65 2c  ldSeRasterStyle,
13fd5 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13fd6 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13fd7 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13fd8 58 42 5f 49 73 53 6c 64 53 74 79 6c 65 22 2c 20  XB_IsSldStyle", 
13fd9 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13fda 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13fdb 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13fdc 09 09 66 6e 63 74 5f 58 42 5f 49 73 53 6c 64 53  ..fnct_XB_IsSldS
13fdd 74 79 6c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tyle, 0, 0, 0);.
13fde 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13fdf 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
13fe0 64 62 2c 20 22 58 42 5f 49 73 53 76 67 22 2c 20  db, "XB_IsSvg", 
13fe1 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
13fe2 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
13fe3 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
13fe4 09 09 66 6e 63 74 5f 58 42 5f 49 73 53 76 67 2c  ..fnct_XB_IsSvg,
13fe5 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
13fe6 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13fe7 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
13fe8 58 42 5f 49 73 47 70 78 22 2c 20 31 2c 0a 09 09  XB_IsGpx", 1,...
13fe9 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
13fea 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
13feb 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
13fec 74 5f 58 42 5f 49 73 47 70 78 2c 20 30 2c 20 30  t_XB_IsGpx, 0, 0
13fed 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13fee 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13fef 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 47 65  n_v2 (db, "XB_Ge
13ff0 74 53 63 68 65 6d 61 55 52 49 22 2c 20 31 2c 0a  tSchemaURI", 1,.
13ff1 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
13ff2 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
13ff3 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
13ff4 6e 63 74 5f 58 42 5f 47 65 74 53 63 68 65 6d 61  nct_XB_GetSchema
13ff5 55 52 49 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  URI, 0, 0, 0);. 
13ff6 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
13ff7 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
13ff8 62 2c 20 22 58 42 5f 47 65 74 49 6e 74 65 72 6e  b, "XB_GetIntern
13ff9 61 6c 53 63 68 65 6d 61 55 52 49 22 2c 20 31 2c  alSchemaURI", 1,
13ffa 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
13ffb 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
13ffc 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
13ffd 09 09 09 09 66 6e 63 74 5f 58 42 5f 47 65 74 49  ....fnct_XB_GetI
13ffe 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 55 52 49  nternalSchemaURI
13fff 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
14000 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14001 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
14002 22 58 42 5f 47 65 74 46 69 6c 65 49 64 22 2c 20  "XB_GetFileId", 
14003 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
14004 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14005 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
14006 09 09 66 6e 63 74 5f 58 42 5f 47 65 74 46 69 6c  ..fnct_XB_GetFil
14007 65 49 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  eId, 0, 0, 0);. 
14008 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
14009 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1400a 62 2c 20 22 58 42 5f 47 65 74 50 61 72 65 6e 74  b, "XB_GetParent
1400b 49 64 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49  Id", 1,.....SQLI
1400c 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1400d 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
1400e 30 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f 47  0,.....fnct_XB_G
1400f 65 74 50 61 72 65 6e 74 49 64 2c 20 30 2c 20 30  etParentId, 0, 0
14010 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14011 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14012 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 53 65  n_v2 (db, "XB_Se
14013 74 46 69 6c 65 49 64 22 2c 20 32 2c 0a 09 09 09  tFileId", 2,....
14014 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
14015 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14016 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
14017 66 6e 63 74 5f 58 42 5f 53 65 74 46 69 6c 65 49  fnct_XB_SetFileI
14018 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
14019 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1401a 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1401b 20 22 58 42 5f 53 65 74 50 61 72 65 6e 74 49 64   "XB_SetParentId
1401c 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 2,.....SQLITE
1401d 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1401e 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1401f 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42  che,.....fnct_XB
14020 5f 53 65 74 50 61 72 65 6e 74 49 64 2c 20 30 2c  _SetParentId, 0,
14021 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
14022 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
14023 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f  ion_v2 (db, "XB_
14024 41 64 64 46 69 6c 65 49 64 22 2c 20 36 2c 0a 09  AddFileId", 6,..
14025 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
14026 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14027 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
14028 09 09 66 6e 63 74 5f 58 42 5f 41 64 64 46 69 6c  ..fnct_XB_AddFil
14029 65 49 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  eId, 0, 0, 0);. 
1402a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1402b 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1402c 62 2c 20 22 58 42 5f 41 64 64 50 61 72 65 6e 74  b, "XB_AddParent
1402d 49 64 22 2c 20 36 2c 0a 09 09 09 09 53 51 4c 49  Id", 6,.....SQLI
1402e 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1402f 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
14030 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
14031 58 42 5f 41 64 64 50 61 72 65 6e 74 49 64 2c 20  XB_AddParentId, 
14032 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
14033 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14034 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58  ction_v2 (db, "X
14035 42 5f 47 65 74 4e 61 6d 65 22 2c 20 31 2c 0a 09  B_GetName", 1,..
14036 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
14037 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14038 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
14039 63 74 5f 58 42 5f 47 65 74 4e 61 6d 65 2c 20 30  ct_XB_GetName, 0
1403a 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1403b 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1403c 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58 42  tion_v2 (db, "XB
1403d 5f 47 65 74 54 69 74 6c 65 22 2c 20 31 2c 0a 09  _GetTitle", 1,..
1403e 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1403f 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14040 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
14041 63 74 5f 58 42 5f 47 65 74 54 69 74 6c 65 2c 20  ct_XB_GetTitle, 
14042 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
14043 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14044 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58  ction_v2 (db, "X
14045 42 5f 47 65 74 41 62 73 74 72 61 63 74 22 2c 20  B_GetAbstract", 
14046 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
14047 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14048 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09  RMINISTIC, 0,...
14049 09 09 66 6e 63 74 5f 58 42 5f 47 65 74 41 62 73  ..fnct_XB_GetAbs
1404a 74 72 61 63 74 2c 20 30 2c 20 30 2c 20 30 29 3b  tract, 0, 0, 0);
1404b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1404c 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1404d 28 64 62 2c 20 22 58 42 5f 47 65 74 47 65 6f 6d  (db, "XB_GetGeom
1404e 65 74 72 79 22 2c 20 31 2c 0a 09 09 09 09 53 51  etry", 1,.....SQ
1404f 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
14050 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
14051 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42  , 0,.....fnct_XB
14052 5f 47 65 74 47 65 6f 6d 65 74 72 79 2c 20 30 2c  _GetGeometry, 0,
14053 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
14054 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
14055 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f  ion_v2 (db, "XB_
14056 4d 4c 69 6e 65 46 72 6f 6d 47 50 58 22 2c 20 31  MLineFromGPX", 1
14057 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
14058 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
14059 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1405a 0a 09 09 09 09 66 6e 63 74 5f 58 42 5f 4d 4c 69  .....fnct_XB_MLi
1405b 6e 65 46 72 6f 6d 47 50 58 2c 20 30 2c 20 30 2c  neFromGPX, 0, 0,
1405c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1405d 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1405e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 47 65 74  _v2 (db, "XB_Get
1405f 44 6f 63 75 6d 65 6e 74 53 69 7a 65 22 2c 20 31  DocumentSize", 1
14060 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
14061 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
14062 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09  MINISTIC, 0,....
14063 09 66 6e 63 74 5f 58 42 5f 47 65 74 44 6f 63 75  .fnct_XB_GetDocu
14064 6d 65 6e 74 53 69 7a 65 2c 20 30 2c 20 30 2c 20  mentSize, 0, 0, 
14065 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
14066 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
14067 76 32 20 28 64 62 2c 20 22 58 42 5f 47 65 74 45  v2 (db, "XB_GetE
14068 6e 63 6f 64 69 6e 67 22 2c 20 31 2c 0a 09 09 09  ncoding", 1,....
14069 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1406a 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1406b 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
1406c 5f 58 42 5f 47 65 74 45 6e 63 6f 64 69 6e 67 2c  _XB_GetEncoding,
1406d 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1406e 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1406f 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
14070 58 42 5f 47 65 74 4c 61 73 74 50 61 72 73 65 45  XB_GetLastParseE
14071 72 72 6f 72 22 2c 20 30 2c 20 53 51 4c 49 54 45  rror", 0, SQLITE
14072 5f 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65  _UTF8,.....cache
14073 2c 20 66 6e 63 74 5f 58 42 5f 47 65 74 4c 61 73  , fnct_XB_GetLas
14074 74 50 61 72 73 65 45 72 72 6f 72 2c 20 30 2c 20  tParseError, 0, 
14075 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
14076 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14077 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58 42 5f 47  on_v2 (db, "XB_G
14078 65 74 4c 61 73 74 56 61 6c 69 64 61 74 65 45 72  etLastValidateEr
14079 72 6f 72 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  ror", 0, SQLITE_
1407a 55 54 46 38 2c 0a 09 09 09 09 63 61 63 68 65 2c  UTF8,.....cache,
1407b 20 66 6e 63 74 5f 58 42 5f 47 65 74 4c 61 73 74   fnct_XB_GetLast
1407c 56 61 6c 69 64 61 74 65 45 72 72 6f 72 2c 20 30  ValidateError, 0
1407d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1407e 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1407f 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 58 42  tion_v2 (db, "XB
14080 5f 49 73 56 61 6c 69 64 58 50 61 74 68 45 78 70  _IsValidXPathExp
14081 72 65 73 73 69 6f 6e 22 2c 20 31 2c 0a 09 09 09  ression", 1,....
14082 09 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 61  .SQLITE_UTF8, ca
14083 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 58 42  che,.....fnct_XB
14084 5f 49 73 56 61 6c 69 64 58 50 61 74 68 45 78 70  _IsValidXPathExp
14085 72 65 73 73 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  ression, 0, 0, 0
14086 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
14087 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14088 32 20 28 64 62 2c 20 22 58 42 5f 47 65 74 4c 61  2 (db, "XB_GetLa
14089 73 74 58 50 61 74 68 45 72 72 6f 72 22 2c 20 30  stXPathError", 0
1408a 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 09  , SQLITE_UTF8,..
1408b 09 09 09 63 61 63 68 65 2c 20 66 6e 63 74 5f 58  ...cache, fnct_X
1408c 42 5f 47 65 74 4c 61 73 74 58 50 61 74 68 45 72  B_GetLastXPathEr
1408d 72 6f 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ror, 0, 0, 0);. 
1408e 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1408f 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
14090 62 2c 20 22 58 42 5f 43 61 63 68 65 46 6c 75 73  b, "XB_CacheFlus
14091 68 22 2c 20 30 2c 0a 09 09 09 09 53 51 4c 49 54  h", 0,.....SQLIT
14092 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
14093 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
14094 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 58  ache,.....fnct_X
14095 42 5f 43 61 63 68 65 46 6c 75 73 68 2c 20 30 2c  B_CacheFlush, 0,
14096 20 30 2c 20 30 29 3b 0a 0a 23 65 6e 64 69 66 20   0, 0);..#endif 
14097 2f 2a 20 65 6e 64 20 69 6e 63 6c 75 64 69 6e 67  /* end including
14098 20 4c 49 42 58 4d 4c 32 20 2a 2f 0a 0a 23 69 66   LIBXML2 */..#if
14099 64 65 66 20 45 4e 41 42 4c 45 5f 47 45 4f 50 41  def ENABLE_GEOPA
1409a 43 4b 41 47 45 09 2f 2a 20 65 6e 61 62 6c 69 6e  CKAGE./* enablin
1409b 67 20 47 65 6f 50 61 63 6b 61 67 65 20 65 78 74  g GeoPackage ext
1409c 65 6e 73 69 6f 6e 73 20 2a 2f 0a 0a 20 20 20 20  ensions */..    
1409d 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1409e 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
1409f 22 41 75 74 6f 47 50 4b 47 53 74 61 72 74 22 2c  "AutoGPKGStart",
140a0 20 30 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   0,.....SQLITE_U
140a1 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
140a2 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
140a3 09 09 09 66 6e 63 74 5f 41 75 74 6f 47 50 4b 47  ...fnct_AutoGPKG
140a4 53 74 61 72 74 2c 20 30 2c 20 30 2c 20 30 29 3b  Start, 0, 0, 0);
140a5 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
140a6 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
140a7 28 64 62 2c 20 22 41 75 74 6f 47 50 4b 47 53 74  (db, "AutoGPKGSt
140a8 61 72 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  art", 1,.....SQL
140a9 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
140aa 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
140ab 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 41 75 74   0,.....fnct_Aut
140ac 6f 47 50 4b 47 53 74 61 72 74 2c 20 30 2c 20 30  oGPKGStart, 0, 0
140ad 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
140ae 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
140af 6e 5f 76 32 20 28 64 62 2c 20 22 41 75 74 6f 47  n_v2 (db, "AutoG
140b0 50 4b 47 53 74 6f 70 22 2c 20 30 2c 0a 09 09 09  PKGStop", 0,....
140b1 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
140b2 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
140b3 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
140b4 5f 41 75 74 6f 47 50 4b 47 53 74 6f 70 2c 20 30  _AutoGPKGStop, 0
140b5 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
140b6 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
140b7 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 41 75  tion_v2 (db, "Au
140b8 74 6f 47 50 4b 47 53 74 6f 70 22 2c 20 31 2c 0a  toGPKGStop", 1,.
140b9 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
140ba 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
140bb 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
140bc 6e 63 74 5f 41 75 74 6f 47 50 4b 47 53 74 6f 70  nct_AutoGPKGStop
140bd 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
140be 20 2f 2a 20 6e 6f 74 20 79 65 74 20 66 69 6e 61   /* not yet fina
140bf 6c 69 73 65 64 20 67 65 6f 70 61 63 6b 61 67 65  lised geopackage
140c0 20 72 61 73 74 65 72 20 66 75 6e 63 74 69 6f 6e   raster function
140c1 73 2c 20 70 6c 75 73 20 73 6f 6d 65 20 63 6f 6e  s, plus some con
140c2 76 65 6e 69 65 6e 63 65 20 41 50 49 20 2a 2f 0a  venience API */.
140c3 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
140c4 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
140c5 64 62 2c 20 22 67 70 6b 67 43 72 65 61 74 65 42  db, "gpkgCreateB
140c6 61 73 65 54 61 62 6c 65 73 22 2c 20 30 2c 0a 09  aseTables", 0,..
140c7 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
140c8 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
140c9 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e  ISTIC, 0,.....fn
140ca 63 74 5f 67 70 6b 67 43 72 65 61 74 65 42 61 73  ct_gpkgCreateBas
140cb 65 54 61 62 6c 65 73 2c 20 30 2c 20 30 2c 20 30  eTables, 0, 0, 0
140cc 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
140cd 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
140ce 32 20 28 64 62 2c 20 22 67 70 6b 67 49 6e 73 65  2 (db, "gpkgInse
140cf 72 74 45 70 73 67 53 52 49 44 22 2c 20 31 2c 0a  rtEpsgSRID", 1,.
140d0 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
140d1 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
140d2 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
140d3 6e 63 74 5f 67 70 6b 67 49 6e 73 65 72 74 45 70  nct_gpkgInsertEp
140d4 73 67 53 52 49 44 2c 20 30 2c 20 30 2c 20 30 29  sgSRID, 0, 0, 0)
140d5 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
140d6 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
140d7 20 28 64 62 2c 20 22 67 70 6b 67 43 72 65 61 74   (db, "gpkgCreat
140d8 65 54 69 6c 65 73 54 61 62 6c 65 22 2c 20 36 2c  eTilesTable", 6,
140d9 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
140da 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
140db 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09  INISTIC, 0,.....
140dc 66 6e 63 74 5f 67 70 6b 67 43 72 65 61 74 65 54  fnct_gpkgCreateT
140dd 69 6c 65 73 54 61 62 6c 65 2c 20 30 2c 20 30 2c  ilesTable, 0, 0,
140de 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
140df 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
140e0 5f 76 32 20 28 64 62 2c 20 22 67 70 6b 67 43 72  _v2 (db, "gpkgCr
140e1 65 61 74 65 54 69 6c 65 73 5a 6f 6f 6d 4c 65 76  eateTilesZoomLev
140e2 65 6c 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49  el", 4,.....SQLI
140e3 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
140e4 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
140e5 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67 70 6b 67  0,.....fnct_gpkg
140e6 43 72 65 61 74 65 54 69 6c 65 73 5a 6f 6f 6d 4c  CreateTilesZoomL
140e7 65 76 65 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  evel, 0, 0, 0);.
140e8 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
140e9 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
140ea 64 62 2c 20 22 67 70 6b 67 41 64 64 54 69 6c 65  db, "gpkgAddTile
140eb 54 72 69 67 67 65 72 73 22 2c 20 31 2c 0a 09 09  Triggers", 1,...
140ec 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
140ed 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
140ee 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
140ef 74 5f 67 70 6b 67 41 64 64 54 69 6c 65 54 72 69  t_gpkgAddTileTri
140f0 67 67 65 72 73 2c 20 30 2c 20 30 2c 20 30 29 3b  ggers, 0, 0, 0);
140f1 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
140f2 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
140f3 28 64 62 2c 20 22 67 70 6b 67 47 65 74 4e 6f 72  (db, "gpkgGetNor
140f4 6d 61 6c 5a 6f 6f 6d 22 2c 20 32 2c 0a 09 09 09  malZoom", 2,....
140f5 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
140f6 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
140f7 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74  TIC, 0,.....fnct
140f8 5f 67 70 6b 67 47 65 74 4e 6f 72 6d 61 6c 5a 6f  _gpkgGetNormalZo
140f9 6f 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  om, 0, 0, 0);.  
140fa 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
140fb 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
140fc 2c 20 22 67 70 6b 67 47 65 74 4e 6f 72 6d 61 6c  , "gpkgGetNormal
140fd 52 6f 77 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c  Row", 3,.....SQL
140fe 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
140ff 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
14100 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67 70 6b   0,.....fnct_gpk
14101 67 47 65 74 4e 6f 72 6d 61 6c 52 6f 77 2c 20 30  gGetNormalRow, 0
14102 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
14103 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14104 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 67 70  tion_v2 (db, "gp
14105 6b 67 47 65 74 49 6d 61 67 65 54 79 70 65 22 2c  kgGetImageType",
14106 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
14107 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
14108 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
14109 09 09 09 66 6e 63 74 5f 67 70 6b 67 47 65 74 49  ...fnct_gpkgGetI
1410a 6d 61 67 65 54 79 70 65 2c 20 30 2c 20 30 2c 20  mageType, 0, 0, 
1410b 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1410c 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1410d 76 32 20 28 64 62 2c 20 22 67 70 6b 67 41 64 64  v2 (db, "gpkgAdd
1410e 47 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 22 2c  GeometryColumn",
1410f 20 36 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   6,.....SQLITE_U
14110 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
14111 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
14112 09 09 09 66 6e 63 74 5f 67 70 6b 67 41 64 64 47  ...fnct_gpkgAddG
14113 65 6f 6d 65 74 72 79 43 6f 6c 75 6d 6e 2c 20 30  eometryColumn, 0
14114 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
14115 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14116 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 67 70  tion_v2 (db, "gp
14117 6b 67 41 64 64 47 65 6f 6d 65 74 72 79 54 72 69  kgAddGeometryTri
14118 67 67 65 72 73 22 2c 20 32 2c 0a 09 09 09 09 53  ggers", 2,.....S
14119 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1411a 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1411b 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67  C, 0,.....fnct_g
1411c 70 6b 67 41 64 64 47 65 6f 6d 65 74 72 79 54 72  pkgAddGeometryTr
1411d 69 67 67 65 72 73 2c 20 30 2c 20 30 2c 20 30 29  iggers, 0, 0, 0)
1411e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1411f 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
14120 20 28 64 62 2c 20 22 67 70 6b 67 41 64 64 53 70   (db, "gpkgAddSp
14121 61 74 69 61 6c 49 6e 64 65 78 22 2c 20 32 2c 0a  atialIndex", 2,.
14122 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
14123 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
14124 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
14125 6e 63 74 5f 67 70 6b 67 41 64 64 53 70 61 74 69  nct_gpkgAddSpati
14126 61 6c 49 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30  alIndex, 0, 0, 0
14127 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
14128 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14129 32 20 28 64 62 2c 20 22 67 70 6b 67 4d 61 6b 65  2 (db, "gpkgMake
1412a 50 6f 69 6e 74 22 2c 20 32 2c 0a 09 09 09 09 53  Point", 2,.....S
1412b 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1412c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1412d 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67  C, 0,.....fnct_g
1412e 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 2c 20 30 2c  pkgMakePoint, 0,
1412f 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
14130 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
14131 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 67 70 6b  ion_v2 (db, "gpk
14132 67 4d 61 6b 65 50 6f 69 6e 74 22 2c 20 33 2c 0a  gMakePoint", 3,.
14133 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
14134 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
14135 4e 49 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66  NISTIC, 0,.....f
14136 6e 63 74 5f 67 70 6b 67 4d 61 6b 65 50 6f 69 6e  nct_gpkgMakePoin
14137 74 57 69 74 68 53 52 49 44 2c 20 30 2c 20 30 2c  tWithSRID, 0, 0,
14138 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14139 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1413a 5f 76 32 20 28 64 62 2c 20 22 67 70 6b 67 4d 61  _v2 (db, "gpkgMa
1413b 6b 65 50 6f 69 6e 74 5a 22 2c 20 33 2c 0a 09 09  kePointZ", 3,...
1413c 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
1413d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1413e 53 54 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63  STIC, 0,.....fnc
1413f 74 5f 67 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 5a  t_gpkgMakePointZ
14140 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
14141 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14142 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
14143 22 67 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 5a 22  "gpkgMakePointZ"
14144 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 4,.....SQLITE_
14145 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
14146 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
14147 09 09 09 09 66 6e 63 74 5f 67 70 6b 67 4d 61 6b  ....fnct_gpkgMak
14148 65 50 6f 69 6e 74 5a 57 69 74 68 53 52 49 44 2c  ePointZWithSRID,
14149 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1414a 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1414b 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1414c 67 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 4d 22 2c  gpkgMakePointM",
1414d 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
1414e 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
1414f 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
14150 09 09 09 66 6e 63 74 5f 67 70 6b 67 4d 61 6b 65  ...fnct_gpkgMake
14151 50 6f 69 6e 74 4d 2c 20 30 2c 20 30 2c 20 30 29  PointM, 0, 0, 0)
14152 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
14153 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
14154 20 28 64 62 2c 20 22 67 70 6b 67 4d 61 6b 65 50   (db, "gpkgMakeP
14155 6f 69 6e 74 4d 22 2c 20 34 2c 0a 09 09 09 09 53  ointM", 4,.....S
14156 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
14157 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
14158 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67  C, 0,.....fnct_g
14159 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 4d 57 69 74  pkgMakePointMWit
1415a 68 53 52 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  hSRID, 0, 0, 0);
1415b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1415c 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1415d 28 64 62 2c 20 22 67 70 6b 67 4d 61 6b 65 50 6f  (db, "gpkgMakePo
1415e 69 6e 74 5a 4d 22 2c 20 34 2c 0a 09 09 09 09 53  intZM", 4,.....S
1415f 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
14160 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
14161 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 67  C, 0,.....fnct_g
14162 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 5a 4d 2c 20  pkgMakePointZM, 
14163 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
14164 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14165 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 67  ction_v2 (db, "g
14166 70 6b 67 4d 61 6b 65 50 6f 69 6e 74 5a 4d 22 2c  pkgMakePointZM",
14167 20 35 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   5,.....SQLITE_U
14168 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
14169 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 09  ERMINISTIC, 0,..
1416a 09 09 09 66 6e 63 74 5f 67 70 6b 67 4d 61 6b 65  ...fnct_gpkgMake
1416b 50 6f 69 6e 74 5a 4d 57 69 74 68 53 52 49 44 2c  PointZMWithSRID,
1416c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
1416d 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1416e 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1416f 41 73 47 50 42 22 2c 20 31 2c 0a 09 09 09 09 53  AsGPB", 1,.....S
14170 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
14171 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
14172 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f 54  C, 0,.....fnct_T
14173 6f 47 50 42 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oGPB, 0, 0, 0);.
14174 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
14175 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
14176 64 62 2c 20 22 47 65 6f 6d 46 72 6f 6d 47 50 42  db, "GeomFromGPB
14177 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
14178 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
14179 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
1417a 0a 09 09 09 09 66 6e 63 74 5f 47 65 6f 6d 46 72  .....fnct_GeomFr
1417b 6f 6d 47 50 42 2c 20 30 2c 20 30 2c 20 30 29 3b  omGPB, 0, 0, 0);
1417c 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1417d 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1417e 28 64 62 2c 20 22 49 73 56 61 6c 69 64 47 50 42  (db, "IsValidGPB
1417f 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 1,.....SQLITE
14180 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
14181 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
14182 0a 09 09 09 09 66 6e 63 74 5f 49 73 56 61 6c 69  .....fnct_IsVali
14183 64 47 50 42 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  dGPB, 0, 0, 0);.
14184 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
14185 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
14186 64 62 2c 20 22 47 50 4b 47 5f 49 73 41 73 73 69  db, "GPKG_IsAssi
14187 67 6e 61 62 6c 65 22 2c 20 32 2c 0a 09 09 09 09  gnable", 2,.....
14188 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
14189 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1418a 49 43 2c 20 30 2c 0a 09 09 09 09 66 6e 63 74 5f  IC, 0,.....fnct_
1418b 47 50 4b 47 5f 49 73 41 73 73 69 67 6e 61 62 6c  GPKG_IsAssignabl
1418c 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
1418d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1418e 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1418f 20 22 43 61 73 74 41 75 74 6f 6d 61 67 69 63 22   "CastAutomagic"
14190 2c 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 1,.....SQLITE_
14191 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
14192 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
14193 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 61 73  he,.....fnct_Cas
14194 74 41 75 74 6f 6d 61 67 69 63 2c 20 30 2c 20 30  tAutomagic, 0, 0
14195 2c 20 30 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  , 0);..#endif /*
14196 20 65 6e 64 20 65 6e 61 62 6c 69 6e 67 20 47 65   end enabling Ge
14197 6f 50 61 63 6b 61 67 65 20 65 78 74 65 6e 73 69  oPackage extensi
14198 6f 6e 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20 45  ons */..#ifdef E
14199 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09 09 2f 2a  NABLE_RTTOPO../*
1419a 20 6f 6e 6c 79 20 69 66 20 52 54 54 4f 50 4f 20   only if RTTOPO 
1419b 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
1419c 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 6c 69    if (sqlite3_li
1419d 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 20  bversion_number 
1419e 28 29 20 3e 3d 20 33 30 30 38 30 30 33 29 0a 20  () >= 3008003). 
1419f 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6f 6e 6c       {..  /* onl
141a0 79 20 53 51 4c 69 74 65 20 3e 3d 20 33 2e 38 2e  y SQLite >= 3.8.
141a1 33 20 63 61 6e 20 73 75 70 70 6f 74 79 20 57 49  3 can suppoty WI
141a2 54 48 20 52 45 43 55 52 53 49 56 45 20 2a 2f 0a  TH RECURSIVE */.
141a3 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
141a4 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
141a5 62 2c 20 22 43 72 65 61 74 65 54 6f 70 6f 54 61  b, "CreateTopoTa
141a6 62 6c 65 73 22 2c 20 30 2c 0a 09 09 09 09 20 20  bles", 0,.....  
141a7 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
141a8 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
141a9 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
141aa 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 43 72    cache, fnct_Cr
141ab 65 61 74 65 54 6f 70 6f 54 61 62 6c 65 73 2c 20  eateTopoTables, 
141ac 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
141ad 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
141ae 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72  tion_v2 (db, "Cr
141af 65 61 74 65 54 6f 70 6f 6c 6f 67 79 22 2c 20 31  eateTopology", 1
141b0 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
141b1 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
141b2 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
141b3 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
141b4 20 66 6e 63 74 5f 43 72 65 61 74 65 54 6f 70 6f   fnct_CreateTopo
141b5 6c 6f 67 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  logy, 0, 0, 0);.
141b6 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
141b7 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
141b8 62 2c 20 22 43 72 65 61 74 65 54 6f 70 6f 6c 6f  b, "CreateTopolo
141b9 67 79 22 2c 20 32 2c 0a 09 09 09 09 20 20 20 20  gy", 2,.....    
141ba 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
141bb 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
141bc 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20  STIC,.....      
141bd 63 61 63 68 65 2c 20 66 6e 63 74 5f 43 72 65 61  cache, fnct_Crea
141be 74 65 54 6f 70 6f 6c 6f 67 79 2c 20 30 2c 20 30  teTopology, 0, 0
141bf 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
141c0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
141c1 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61 74 65  _v2 (db, "Create
141c2 54 6f 70 6f 6c 6f 67 79 22 2c 20 33 2c 0a 09 09  Topology", 3,...
141c3 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
141c4 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
141c5 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
141c6 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63        cache, fnc
141c7 74 5f 43 72 65 61 74 65 54 6f 70 6f 6c 6f 67 79  t_CreateTopology
141c8 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73  , 0, 0, 0);..  s
141c9 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
141ca 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
141cb 43 72 65 61 74 65 54 6f 70 6f 6c 6f 67 79 22 2c  CreateTopology",
141cc 20 34 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   4,.....      SQ
141cd 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
141ce 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
141cf 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
141d0 65 2c 20 66 6e 63 74 5f 43 72 65 61 74 65 54 6f  e, fnct_CreateTo
141d1 70 6f 6c 6f 67 79 2c 20 30 2c 20 30 2c 20 30 29  pology, 0, 0, 0)
141d2 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
141d3 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
141d4 28 64 62 2c 20 22 53 54 5f 49 6e 69 74 54 6f 70  (db, "ST_InitTop
141d5 6f 47 65 6f 22 2c 20 31 2c 0a 09 09 09 09 20 20  oGeo", 1,.....  
141d6 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
141d7 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
141d8 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
141d9 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 43 72    cache, fnct_Cr
141da 65 61 74 65 54 6f 70 6f 6c 6f 67 79 2c 20 30 2c  eateTopology, 0,
141db 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
141dc 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
141dd 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44 72 6f 70  on_v2 (db, "Drop
141de 54 6f 70 6f 6c 6f 67 79 22 2c 20 31 2c 0a 09 09  Topology", 1,...
141df 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
141e0 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
141e1 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
141e2 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63        cache, fnc
141e3 74 5f 44 72 6f 70 54 6f 70 6f 6c 6f 67 79 2c 20  t_DropTopology, 
141e4 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
141e5 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
141e6 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65  tion_v2 (db, "Ge
141e7 74 4c 61 73 74 54 6f 70 6f 6c 6f 67 79 45 78 63  tLastTopologyExc
141e8 65 70 74 69 6f 6e 22 2c 20 31 2c 0a 09 09 09 09  eption", 1,.....
141e9 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
141ea 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
141eb 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20  MINISTIC,.....  
141ec 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f      cache, fnct_
141ed 47 65 74 4c 61 73 74 54 6f 70 6f 6c 6f 67 79 45  GetLastTopologyE
141ee 78 63 65 70 74 69 6f 6e 2c 20 30 2c 0a 09 09 09  xception, 0,....
141ef 09 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 09 20  .      0, 0);.. 
141f0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
141f1 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
141f2 20 22 53 54 5f 41 64 64 49 73 6f 4e 6f 64 65 22   "ST_AddIsoNode"
141f3 2c 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 3,.....      S
141f4 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
141f5 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
141f6 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63  C,.....      cac
141f7 68 65 2c 20 66 6e 63 74 5f 41 64 64 49 73 6f 4e  he, fnct_AddIsoN
141f8 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09  ode, 0, 0, 0);..
141f9 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
141fa 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
141fb 2c 20 22 53 54 5f 4d 6f 76 65 49 73 6f 4e 6f 64  , "ST_MoveIsoNod
141fc 65 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20 20  e", 3,.....     
141fd 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
141fe 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
141ff 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
14200 61 63 68 65 2c 20 66 6e 63 74 5f 4d 6f 76 65 49  ache, fnct_MoveI
14201 73 6f 4e 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29  soNode, 0, 0, 0)
14202 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
14203 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
14204 28 64 62 2c 20 22 53 54 5f 52 65 6d 49 73 6f 4e  (db, "ST_RemIsoN
14205 6f 64 65 22 2c 20 32 2c 0a 09 09 09 09 20 20 20  ode", 2,.....   
14206 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
14207 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14208 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
14209 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 52 65 6d   cache, fnct_Rem
1420a 49 73 6f 4e 6f 64 65 2c 20 30 2c 20 30 2c 20 30  IsoNode, 0, 0, 0
1420b 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
1420c 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1420d 20 28 64 62 2c 20 22 53 54 5f 41 64 64 49 73 6f   (db, "ST_AddIso
1420e 45 64 67 65 22 2c 20 34 2c 0a 09 09 09 09 20 20  Edge", 4,.....  
1420f 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
14210 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
14211 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
14212 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 41 64    cache, fnct_Ad
14213 64 49 73 6f 45 64 67 65 2c 20 30 2c 20 30 2c 20  dIsoEdge, 0, 0, 
14214 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14215 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14216 32 20 28 64 62 2c 20 22 53 54 5f 52 65 6d 49 73  2 (db, "ST_RemIs
14217 6f 45 64 67 65 22 2c 20 32 2c 0a 09 09 09 09 20  oEdge", 2,..... 
14218 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14219 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1421a 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
1421b 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 52     cache, fnct_R
1421c 65 6d 49 73 6f 45 64 67 65 2c 20 30 2c 20 30 2c  emIsoEdge, 0, 0,
1421d 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f   0);..  sqlite3_
1421e 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
1421f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 6f 64 45  v2 (db, "ST_ModE
14220 64 67 65 53 70 6c 69 74 22 2c 20 33 2c 0a 09 09  dgeSplit", 3,...
14221 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
14222 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
14223 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
14224 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63        cache, fnc
14225 74 5f 4d 6f 64 45 64 67 65 53 70 6c 69 74 2c 20  t_ModEdgeSplit, 
14226 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
14227 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14228 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
14229 5f 4e 65 77 45 64 67 65 73 53 70 6c 69 74 22 2c  _NewEdgesSplit",
1422a 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   3,.....      SQ
1422b 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
1422c 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1422d 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
1422e 65 2c 20 66 6e 63 74 5f 4e 65 77 45 64 67 65 73  e, fnct_NewEdges
1422f 53 70 6c 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  Split, 0, 0, 0);
14230 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
14231 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
14232 64 62 2c 20 22 53 54 5f 41 64 64 45 64 67 65 4d  db, "ST_AddEdgeM
14233 6f 64 46 61 63 65 22 2c 20 34 2c 0a 09 09 09 09  odFace", 4,.....
14234 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
14235 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
14236 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20  MINISTIC,.....  
14237 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f      cache, fnct_
14238 41 64 64 45 64 67 65 4d 6f 64 46 61 63 65 2c 20  AddEdgeModFace, 
14239 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
1423a 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1423b 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54  tion_v2 (db, "ST
1423c 5f 41 64 64 45 64 67 65 4e 65 77 46 61 63 65 73  _AddEdgeNewFaces
1423d 22 2c 20 34 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 4,.....      
1423e 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1423f 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
14240 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
14241 63 68 65 2c 20 66 6e 63 74 5f 41 64 64 45 64 67  che, fnct_AddEdg
14242 65 4e 65 77 46 61 63 65 73 2c 20 30 2c 20 30 2c  eNewFaces, 0, 0,
14243 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f   0);..  sqlite3_
14244 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
14245 76 32 20 28 64 62 2c 20 22 53 54 5f 43 68 61 6e  v2 (db, "ST_Chan
14246 67 65 45 64 67 65 47 65 6f 6d 22 2c 20 33 2c 0a  geEdgeGeom", 3,.
14247 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
14248 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
14249 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09  ETERMINISTIC,...
1424a 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66  ..      cache, f
1424b 6e 63 74 5f 43 68 61 6e 67 65 45 64 67 65 47 65  nct_ChangeEdgeGe
1424c 6f 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  om, 0, 0, 0);.. 
1424d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1424e 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1424f 20 22 53 54 5f 52 65 6d 45 64 67 65 4e 65 77 46   "ST_RemEdgeNewF
14250 61 63 65 22 2c 20 32 2c 0a 09 09 09 09 20 20 20  ace", 2,.....   
14251 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
14252 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14253 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
14254 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 52 65 6d   cache, fnct_Rem
14255 45 64 67 65 4e 65 77 46 61 63 65 2c 20 30 2c 20  EdgeNewFace, 0, 
14256 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65  0, 0);..  sqlite
14257 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14258 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 52 65  n_v2 (db, "ST_Re
14259 6d 45 64 67 65 4d 6f 64 46 61 63 65 22 2c 20 32  mEdgeModFace", 2
1425a 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
1425b 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1425c 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
1425d 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
1425e 20 66 6e 63 74 5f 52 65 6d 45 64 67 65 4d 6f 64   fnct_RemEdgeMod
1425f 46 61 63 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Face, 0, 0, 0);.
14260 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
14261 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
14262 62 2c 20 22 53 54 5f 4d 6f 64 45 64 67 65 48 65  b, "ST_ModEdgeHe
14263 61 6c 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20  al", 3,.....    
14264 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
14265 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
14266 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20  STIC,.....      
14267 63 61 63 68 65 2c 20 66 6e 63 74 5f 4d 6f 64 45  cache, fnct_ModE
14268 64 67 65 48 65 61 6c 2c 20 30 2c 20 30 2c 20 30  dgeHeal, 0, 0, 0
14269 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72  );..  sqlite3_cr
1426a 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
1426b 20 28 64 62 2c 20 22 53 54 5f 4e 65 77 45 64 67   (db, "ST_NewEdg
1426c 65 48 65 61 6c 22 2c 20 33 2c 0a 09 09 09 09 20  eHeal", 3,..... 
1426d 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
1426e 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1426f 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
14270 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 4e     cache, fnct_N
14271 65 77 45 64 67 65 48 65 61 6c 2c 20 30 2c 20 30  ewEdgeHeal, 0, 0
14272 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
14273 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14274 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 47 65 74  _v2 (db, "ST_Get
14275 46 61 63 65 47 65 6f 6d 65 74 72 79 22 2c 20 32  FaceGeometry", 2
14276 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
14277 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
14278 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
14279 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
1427a 20 66 6e 63 74 5f 47 65 74 46 61 63 65 47 65 6f   fnct_GetFaceGeo
1427b 6d 65 74 72 79 2c 20 30 2c 20 30 2c 20 30 29 3b  metry, 0, 0, 0);
1427c 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
1427d 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
1427e 64 62 2c 20 22 53 54 5f 47 65 74 46 61 63 65 45  db, "ST_GetFaceE
1427f 64 67 65 73 22 2c 20 32 2c 0a 09 09 09 09 20 20  dges", 2,.....  
14280 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
14281 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
14282 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
14283 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 47 65    cache, fnct_Ge
14284 74 46 61 63 65 45 64 67 65 73 2c 20 30 2c 20 30  tFaceEdges, 0, 0
14285 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
14286 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14287 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 56 61 6c  _v2 (db, "ST_Val
14288 69 64 61 74 65 54 6f 70 6f 47 65 6f 22 2c 20 31  idateTopoGeo", 1
14289 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
1428a 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1428b 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
1428c 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
1428d 20 66 6e 63 74 5f 56 61 6c 69 64 61 74 65 54 6f   fnct_ValidateTo
1428e 70 6f 47 65 6f 2c 20 30 2c 20 30 2c 20 30 29 3b  poGeo, 0, 0, 0);
1428f 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
14290 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
14291 64 62 2c 20 22 53 54 5f 43 72 65 61 74 65 54 6f  db, "ST_CreateTo
14292 70 6f 47 65 6f 22 2c 20 32 2c 0a 09 09 09 09 20  poGeo", 2,..... 
14293 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14294 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
14295 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
14296 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 43     cache, fnct_C
14297 72 65 61 74 65 54 6f 70 6f 47 65 6f 2c 20 30 2c  reateTopoGeo, 0,
14298 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
14299 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1429a 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 74 4e  on_v2 (db, "GetN
1429b 6f 64 65 42 79 50 6f 69 6e 74 22 2c 20 32 2c 0a  odeByPoint", 2,.
1429c 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
1429d 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1429e 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09  ETERMINISTIC,...
1429f 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66  ..      cache, f
142a0 6e 63 74 5f 47 65 74 4e 6f 64 65 42 79 50 6f 69  nct_GetNodeByPoi
142a1 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  nt, 0, 0, 0);.. 
142a2 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
142a3 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
142a4 20 22 47 65 74 4e 6f 64 65 42 79 50 6f 69 6e 74   "GetNodeByPoint
142a5 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 3,.....      
142a6 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
142a7 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
142a8 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
142a9 63 68 65 2c 20 66 6e 63 74 5f 47 65 74 4e 6f 64  che, fnct_GetNod
142aa 65 42 79 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20  eByPoint, 0, 0, 
142ab 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
142ac 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
142ad 32 20 28 64 62 2c 20 22 47 65 74 45 64 67 65 42  2 (db, "GetEdgeB
142ae 79 50 6f 69 6e 74 22 2c 20 32 2c 0a 09 09 09 09  yPoint", 2,.....
142af 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
142b0 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
142b1 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20  MINISTIC,.....  
142b2 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f      cache, fnct_
142b3 47 65 74 45 64 67 65 42 79 50 6f 69 6e 74 2c 20  GetEdgeByPoint, 
142b4 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
142b5 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
142b6 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65  tion_v2 (db, "Ge
142b7 74 45 64 67 65 42 79 50 6f 69 6e 74 22 2c 20 33  tEdgeByPoint", 3
142b8 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
142b9 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
142ba 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
142bb 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
142bc 20 66 6e 63 74 5f 47 65 74 45 64 67 65 42 79 50   fnct_GetEdgeByP
142bd 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oint, 0, 0, 0);.
142be 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
142bf 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
142c0 62 2c 20 22 47 65 74 46 61 63 65 42 79 50 6f 69  b, "GetFaceByPoi
142c1 6e 74 22 2c 20 32 2c 0a 09 09 09 09 20 20 20 20  nt", 2,.....    
142c2 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
142c3 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
142c4 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20  STIC,.....      
142c5 63 61 63 68 65 2c 20 66 6e 63 74 5f 47 65 74 46  cache, fnct_GetF
142c6 61 63 65 42 79 50 6f 69 6e 74 2c 20 30 2c 20 30  aceByPoint, 0, 0
142c7 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
142c8 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
142c9 5f 76 32 20 28 64 62 2c 20 22 47 65 74 46 61 63  _v2 (db, "GetFac
142ca 65 42 79 50 6f 69 6e 74 22 2c 20 33 2c 0a 09 09  eByPoint", 3,...
142cb 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
142cc 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
142cd 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
142ce 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63        cache, fnc
142cf 74 5f 47 65 74 46 61 63 65 42 79 50 6f 69 6e 74  t_GetFaceByPoint
142d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73  , 0, 0, 0);..  s
142d1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
142d2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
142d3 54 6f 70 6f 47 65 6f 5f 41 64 64 50 6f 69 6e 74  TopoGeo_AddPoint
142d4 22 2c 20 32 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 2,.....      
142d5 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
142d6 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
142d7 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
142d8 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65  che, fnct_TopoGe
142d9 6f 5f 41 64 64 50 6f 69 6e 74 2c 20 30 2c 20 30  o_AddPoint, 0, 0
142da 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
142db 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
142dc 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
142dd 6f 5f 41 64 64 50 6f 69 6e 74 22 2c 20 33 2c 0a  o_AddPoint", 3,.
142de 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
142df 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
142e0 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09  ETERMINISTIC,...
142e1 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66  ..      cache, f
142e2 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 41 64 64 50  nct_TopoGeo_AddP
142e3 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  oint, 0, 0, 0);.
142e4 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
142e5 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
142e6 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 41 64 64 4c  b, "TopoGeo_AddL
142e7 69 6e 65 53 74 72 69 6e 67 22 2c 20 32 2c 0a 09  ineString", 2,..
142e8 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
142e9 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
142ea 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
142eb 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e  .      cache, fn
142ec 63 74 5f 54 6f 70 6f 47 65 6f 5f 41 64 64 4c 69  ct_TopoGeo_AddLi
142ed 6e 65 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 0a  neString, 0, 0,.
142ee 09 09 09 09 20 20 20 20 20 20 30 29 3b 0a 09 20  ....      0);.. 
142ef 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
142f0 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
142f1 20 22 54 6f 70 6f 47 65 6f 5f 41 64 64 4c 69 6e   "TopoGeo_AddLin
142f2 65 53 74 72 69 6e 67 22 2c 20 33 2c 0a 09 09 09  eString", 3,....
142f3 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
142f4 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
142f5 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20  RMINISTIC,..... 
142f6 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74       cache, fnct
142f7 5f 54 6f 70 6f 47 65 6f 5f 41 64 64 4c 69 6e 65  _TopoGeo_AddLine
142f8 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 0a 09 09  String, 0, 0,...
142f9 09 09 20 20 20 20 20 20 30 29 3b 0a 09 20 20 73  ..      0);..  s
142fa 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
142fb 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
142fc 54 6f 70 6f 47 65 6f 5f 41 64 64 4c 69 6e 65 53  TopoGeo_AddLineS
142fd 74 72 69 6e 67 4e 6f 46 61 63 65 22 2c 20 32 2c  tringNoFace", 2,
142fe 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
142ff 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
14300 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09  DETERMINISTIC,..
14301 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20  ...      cache, 
14302 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 41 64 64  fnct_TopoGeo_Add
14303 4c 69 6e 65 53 74 72 69 6e 67 4e 6f 46 61 63 65  LineStringNoFace
14304 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20 30  ,.....      0, 0
14305 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
14306 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14307 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
14308 6f 5f 41 64 64 4c 69 6e 65 53 74 72 69 6e 67 4e  o_AddLineStringN
14309 6f 46 61 63 65 22 2c 20 33 2c 0a 09 09 09 09 20  oFace", 3,..... 
1430a 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
1430b 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1430c 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
1430d 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54     cache, fnct_T
1430e 6f 70 6f 47 65 6f 5f 41 64 64 4c 69 6e 65 53 74  opoGeo_AddLineSt
1430f 72 69 6e 67 4e 6f 46 61 63 65 2c 0a 09 09 09 09  ringNoFace,.....
14310 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
14311 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
14312 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
14313 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d  b, "TopoGeo_From
14314 47 65 6f 54 61 62 6c 65 22 2c 20 34 2c 0a 09 09  GeoTable", 4,...
14315 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
14316 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
14317 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
14318 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63        cache, fnc
14319 74 5f 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65  t_TopoGeo_FromGe
1431a 6f 54 61 62 6c 65 2c 20 30 2c 20 30 2c 0a 09 09  oTable, 0, 0,...
1431b 09 09 20 20 20 20 20 20 30 29 3b 0a 09 20 20 73  ..      0);..  s
1431c 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1431d 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1431e 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54  TopoGeo_FromGeoT
1431f 61 62 6c 65 22 2c 20 35 2c 0a 09 09 09 09 20 20  able", 5,.....  
14320 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
14321 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
14322 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
14323 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f    cache, fnct_To
14324 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62  poGeo_FromGeoTab
14325 6c 65 2c 20 30 2c 20 30 2c 0a 09 09 09 09 20 20  le, 0, 0,.....  
14326 20 20 20 20 30 29 3b 0a 09 20 20 73 71 6c 69 74      0);..  sqlit
14327 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14328 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
14329 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Geo_FromGeoTable
1432a 22 2c 20 36 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 6,.....      
1432b 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
1432c 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1432d 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
1432e 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65  che, fnct_TopoGe
1432f 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65 2c 20  o_FromGeoTable, 
14330 30 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20  0, 0,.....      
14331 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14332 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14333 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
14334 46 72 6f 6d 47 65 6f 54 61 62 6c 65 22 2c 20 37  FromGeoTable", 7
14335 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
14336 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
14337 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
14338 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
14339 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 46 72   fnct_TopoGeo_Fr
1433a 6f 6d 47 65 6f 54 61 62 6c 65 2c 20 30 2c 20 30  omGeoTable, 0, 0
1433b 2c 0a 09 09 09 09 20 20 20 20 20 20 30 29 3b 0a  ,.....      0);.
1433c 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
1433d 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1433e 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d  b, "TopoGeo_From
1433f 47 65 6f 54 61 62 6c 65 4e 6f 46 61 63 65 22 2c  GeoTableNoFace",
14340 20 34 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   4,.....      SQ
14341 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
14342 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
14343 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
14344 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  e, fnct_TopoGeo_
14345 46 72 6f 6d 47 65 6f 54 61 62 6c 65 4e 6f 46 61  FromGeoTableNoFa
14346 63 65 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c  ce,.....      0,
14347 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
14348 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14349 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
1434a 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Geo_FromGeoTable
1434b 4e 6f 46 61 63 65 22 2c 20 35 2c 0a 09 09 09 09  NoFace", 5,.....
1434c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
1434d 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1434e 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20  MINISTIC,.....  
1434f 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f      cache, fnct_
14350 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54  TopoGeo_FromGeoT
14351 61 62 6c 65 4e 6f 46 61 63 65 2c 0a 09 09 09 09  ableNoFace,.....
14352 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
14353 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
14354 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
14355 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d  b, "TopoGeo_From
14356 47 65 6f 54 61 62 6c 65 4e 6f 46 61 63 65 22 2c  GeoTableNoFace",
14357 20 36 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   6,.....      SQ
14358 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
14359 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1435a 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
1435b 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  e, fnct_TopoGeo_
1435c 46 72 6f 6d 47 65 6f 54 61 62 6c 65 4e 6f 46 61  FromGeoTableNoFa
1435d 63 65 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c  ce,.....      0,
1435e 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1435f 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14360 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
14361 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Geo_FromGeoTable
14362 4e 6f 46 61 63 65 22 2c 20 37 2c 0a 09 09 09 09  NoFace", 7,.....
14363 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
14364 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
14365 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20  MINISTIC,.....  
14366 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f      cache, fnct_
14367 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54  TopoGeo_FromGeoT
14368 61 62 6c 65 4e 6f 46 61 63 65 2c 0a 09 09 09 09  ableNoFace,.....
14369 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
1436a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
1436b 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1436c 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d  b, "TopoGeo_From
1436d 47 65 6f 54 61 62 6c 65 45 78 74 22 2c 20 36 2c  GeoTableExt", 6,
1436e 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54  .....      SQLIT
1436f 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
14370 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09  DETERMINISTIC,..
14371 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 20  ...      cache, 
14372 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 46 72 6f  fnct_TopoGeo_Fro
14373 6d 47 65 6f 54 61 62 6c 65 45 78 74 2c 20 30 2c  mGeoTableExt, 0,
14374 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20 30 29  .....      0, 0)
14375 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
14376 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
14377 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72  (db, "TopoGeo_Fr
14378 6f 6d 47 65 6f 54 61 62 6c 65 45 78 74 22 2c 20  omGeoTableExt", 
14379 37 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c  7,.....      SQL
1437a 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1437b 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
1437c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65  .....      cache
1437d 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 46  , fnct_TopoGeo_F
1437e 72 6f 6d 47 65 6f 54 61 62 6c 65 45 78 74 2c 20  romGeoTableExt, 
1437f 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20  0,.....      0, 
14380 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14381 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14382 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
14383 46 72 6f 6d 47 65 6f 54 61 62 6c 65 45 78 74 22  FromGeoTableExt"
14384 2c 20 38 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 8,.....      S
14385 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
14386 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
14387 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63  C,.....      cac
14388 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  he, fnct_TopoGeo
14389 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65 45 78 74  _FromGeoTableExt
1438a 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30  , 0,.....      0
1438b 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
1438c 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1438d 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
1438e 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65 45 78  o_FromGeoTableEx
1438f 74 22 2c 20 39 2c 0a 09 09 09 09 20 20 20 20 20  t", 9,.....     
14390 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
14391 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14392 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
14393 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
14394 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65 45  eo_FromGeoTableE
14395 78 74 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  xt, 0,.....     
14396 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
14397 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14398 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
14399 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Geo_FromGeoTable
1439a 4e 6f 46 61 63 65 45 78 74 22 2c 20 36 2c 0a 09  NoFaceExt", 6,..
1439b 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
1439c 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
1439d 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
1439e 09 20 20 20 20 20 20 63 61 63 68 65 2c 0a 09 09  .      cache,...
1439f 09 09 20 20 20 20 20 20 66 6e 63 74 5f 54 6f 70  ..      fnct_Top
143a0 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c  oGeo_FromGeoTabl
143a1 65 4e 6f 46 61 63 65 45 78 74 2c 20 30 2c 0a 09  eNoFaceExt, 0,..
143a2 09 09 09 20 20 20 20 20 20 30 2c 20 30 29 3b 0a  ...      0, 0);.
143a3 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
143a4 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
143a5 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d  b, "TopoGeo_From
143a6 47 65 6f 54 61 62 6c 65 4e 6f 46 61 63 65 45 78  GeoTableNoFaceEx
143a7 74 22 2c 20 37 2c 0a 09 09 09 09 20 20 20 20 20  t", 7,.....     
143a8 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
143a9 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
143aa 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
143ab 61 63 68 65 2c 0a 09 09 09 09 20 20 20 20 20 20  ache,.....      
143ac 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 46 72 6f  fnct_TopoGeo_Fro
143ad 6d 47 65 6f 54 61 62 6c 65 4e 6f 46 61 63 65 45  mGeoTableNoFaceE
143ae 78 74 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  xt, 0,.....     
143af 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
143b0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
143b1 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
143b2 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c 65  Geo_FromGeoTable
143b3 4e 6f 46 61 63 65 45 78 74 22 2c 20 38 2c 0a 09  NoFaceExt", 8,..
143b4 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
143b5 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
143b6 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
143b7 09 20 20 20 20 20 20 63 61 63 68 65 2c 0a 09 09  .      cache,...
143b8 09 09 20 20 20 20 20 20 66 6e 63 74 5f 54 6f 70  ..      fnct_Top
143b9 6f 47 65 6f 5f 46 72 6f 6d 47 65 6f 54 61 62 6c  oGeo_FromGeoTabl
143ba 65 4e 6f 46 61 63 65 45 78 74 2c 20 30 2c 0a 09  eNoFaceExt, 0,..
143bb 09 09 09 20 20 20 20 20 20 30 2c 20 30 29 3b 0a  ...      0, 0);.
143bc 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
143bd 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
143be 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 46 72 6f 6d  b, "TopoGeo_From
143bf 47 65 6f 54 61 62 6c 65 4e 6f 46 61 63 65 45 78  GeoTableNoFaceEx
143c0 74 22 2c 20 39 2c 0a 09 09 09 09 20 20 20 20 20  t", 9,.....     
143c1 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
143c2 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
143c3 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
143c4 61 63 68 65 2c 0a 09 09 09 09 20 20 20 20 20 20  ache,.....      
143c5 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 46 72 6f  fnct_TopoGeo_Fro
143c6 6d 47 65 6f 54 61 62 6c 65 4e 6f 46 61 63 65 45  mGeoTableNoFaceE
143c7 78 74 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  xt, 0,.....     
143c8 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
143c9 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
143ca 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
143cb 47 65 6f 5f 50 6f 6c 79 67 6f 6e 69 7a 65 22 2c  Geo_Polygonize",
143cc 20 31 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   1,.....      SQ
143cd 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
143ce 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
143cf 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
143d0 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  e, fnct_TopoGeo_
143d1 50 6f 6c 79 67 6f 6e 69 7a 65 2c 20 30 2c 20 30  Polygonize, 0, 0
143d2 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
143d3 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
143d4 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
143d5 6f 5f 50 6f 6c 79 67 6f 6e 69 7a 65 22 2c 20 32  o_Polygonize", 2
143d6 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
143d7 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
143d8 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
143d9 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
143da 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 50 6f   fnct_TopoGeo_Po
143db 6c 79 67 6f 6e 69 7a 65 2c 20 30 2c 20 30 2c 20  lygonize, 0, 0, 
143dc 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
143dd 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
143de 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
143df 54 6f 70 6f 53 6e 61 70 22 2c 20 33 2c 0a 09 09  TopoSnap", 3,...
143e0 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55  ..      SQLITE_U
143e1 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
143e2 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
143e3 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63        cache, fnc
143e4 74 5f 54 6f 70 6f 47 65 6f 5f 54 6f 70 6f 53 6e  t_TopoGeo_TopoSn
143e5 61 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20  ap, 0, 0, 0);.. 
143e6 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
143e7 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
143e8 20 22 54 6f 70 6f 47 65 6f 5f 54 6f 70 6f 53 6e   "TopoGeo_TopoSn
143e9 61 70 22 2c 20 35 2c 0a 09 09 09 09 20 20 20 20  ap", 5,.....    
143ea 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
143eb 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
143ec 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20  STIC,.....      
143ed 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f  cache, fnct_Topo
143ee 47 65 6f 5f 54 6f 70 6f 53 6e 61 70 2c 20 30 2c  Geo_TopoSnap, 0,
143ef 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
143f0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
143f1 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
143f2 47 65 6f 5f 53 6e 61 70 70 65 64 47 65 6f 54 61  Geo_SnappedGeoTa
143f3 62 6c 65 22 2c 20 36 2c 0a 09 09 09 09 20 20 20  ble", 6,.....   
143f4 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
143f5 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
143f6 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
143f7 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70   cache, fnct_Top
143f8 6f 47 65 6f 5f 53 6e 61 70 70 65 64 47 65 6f 54  oGeo_SnappedGeoT
143f9 61 62 6c 65 2c 20 30 2c 0a 09 09 09 09 20 20 20  able, 0,.....   
143fa 20 20 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c     0, 0);..  sql
143fb 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
143fc 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f  tion_v2 (db, "To
143fd 70 6f 47 65 6f 5f 53 6e 61 70 70 65 64 47 65 6f  poGeo_SnappedGeo
143fe 54 61 62 6c 65 22 2c 20 38 2c 0a 09 09 09 09 20  Table", 8,..... 
143ff 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14400 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
14401 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
14402 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54     cache, fnct_T
14403 6f 70 6f 47 65 6f 5f 53 6e 61 70 70 65 64 47 65  opoGeo_SnappedGe
14404 6f 54 61 62 6c 65 2c 20 30 2c 0a 09 09 09 09 20  oTable, 0,..... 
14405 20 20 20 20 20 30 2c 20 30 29 3b 0a 09 20 20 73       0, 0);..  s
14406 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14407 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
14408 54 6f 70 6f 47 65 6f 5f 54 6f 47 65 6f 54 61 62  TopoGeo_ToGeoTab
14409 6c 65 22 2c 20 35 2c 0a 09 09 09 09 20 20 20 20  le", 5,.....    
1440a 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
1440b 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
1440c 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20  STIC,.....      
1440d 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f  cache, fnct_Topo
1440e 47 65 6f 5f 54 6f 47 65 6f 54 61 62 6c 65 2c 20  Geo_ToGeoTable, 
1440f 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c  0, 0, 0);..  sql
14410 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14411 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f  tion_v2 (db, "To
14412 70 6f 47 65 6f 5f 54 6f 47 65 6f 54 61 62 6c 65  poGeo_ToGeoTable
14413 22 2c 20 36 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 6,.....      
14414 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
14415 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
14416 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
14417 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65  che, fnct_TopoGe
14418 6f 5f 54 6f 47 65 6f 54 61 62 6c 65 2c 20 30 2c  o_ToGeoTable, 0,
14419 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1441a 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1441b 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
1441c 47 65 6f 5f 50 6f 6c 79 46 61 63 65 73 4c 69 73  Geo_PolyFacesLis
1441d 74 22 2c 20 35 2c 0a 09 09 09 09 20 20 20 20 20  t", 5,.....     
1441e 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
1441f 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14420 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
14421 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
14422 65 6f 5f 50 6f 6c 79 46 61 63 65 73 4c 69 73 74  eo_PolyFacesList
14423 2c 20 30 2c 20 30 2c 0a 09 09 09 09 20 20 20 20  , 0, 0,.....    
14424 20 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33    0);..  sqlite3
14425 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14426 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
14427 6f 5f 4c 69 6e 65 45 64 67 65 73 4c 69 73 74 22  o_LineEdgesList"
14428 2c 20 35 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 5,.....      S
14429 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
1442a 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
1442b 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63  C,.....      cac
1442c 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  he, fnct_TopoGeo
1442d 5f 4c 69 6e 65 45 64 67 65 73 4c 69 73 74 2c 20  _LineEdgesList, 
1442e 30 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20  0, 0,.....      
1442f 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14430 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14431 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
14432 54 6f 47 65 6f 54 61 62 6c 65 47 65 6e 65 72 61  ToGeoTableGenera
14433 6c 69 7a 65 22 2c 20 36 2c 0a 09 09 09 09 20 20  lize", 6,.....  
14434 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
14435 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
14436 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20  NISTIC,.....    
14437 20 20 63 61 63 68 65 2c 0a 09 09 09 09 20 20 20    cache,.....   
14438 20 20 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f     fnct_TopoGeo_
14439 54 6f 47 65 6f 54 61 62 6c 65 47 65 6e 65 72 61  ToGeoTableGenera
1443a 6c 69 7a 65 2c 20 30 2c 20 30 2c 0a 09 09 09 09  lize, 0, 0,.....
1443b 20 20 20 20 20 20 30 29 3b 0a 09 20 20 73 71 6c        0);..  sql
1443c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1443d 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f  tion_v2 (db, "To
1443e 70 6f 47 65 6f 5f 54 6f 47 65 6f 54 61 62 6c 65  poGeo_ToGeoTable
1443f 47 65 6e 65 72 61 6c 69 7a 65 22 2c 20 37 2c 0a  Generalize", 7,.
14440 09 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45  ....      SQLITE
14441 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
14442 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09  ETERMINISTIC,...
14443 09 09 20 20 20 20 20 20 63 61 63 68 65 2c 0a 09  ..      cache,..
14444 09 09 09 20 20 20 20 20 20 66 6e 63 74 5f 54 6f  ...      fnct_To
14445 70 6f 47 65 6f 5f 54 6f 47 65 6f 54 61 62 6c 65  poGeo_ToGeoTable
14446 47 65 6e 65 72 61 6c 69 7a 65 2c 20 30 2c 20 30  Generalize, 0, 0
14447 2c 0a 09 09 09 09 20 20 20 20 20 20 30 29 3b 0a  ,.....      0);.
14448 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
14449 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
1444a 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 52 65 6d 6f  b, "TopoGeo_Remo
1444b 76 65 53 6d 61 6c 6c 46 61 63 65 73 22 2c 20 32  veSmallFaces", 2
1444c 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
1444d 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
1444e 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
1444f 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
14450 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 52 65   fnct_TopoGeo_Re
14451 6d 6f 76 65 53 6d 61 6c 6c 46 61 63 65 73 2c 20  moveSmallFaces, 
14452 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20  0,.....      0, 
14453 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14454 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14455 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
14456 52 65 6d 6f 76 65 53 6d 61 6c 6c 46 61 63 65 73  RemoveSmallFaces
14457 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 3,.....      
14458 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
14459 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
1445a 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
1445b 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65  che, fnct_TopoGe
1445c 6f 5f 52 65 6d 6f 76 65 53 6d 61 6c 6c 46 61 63  o_RemoveSmallFac
1445d 65 73 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  es, 0,.....     
1445e 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1445f 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14460 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
14461 47 65 6f 5f 52 65 6d 6f 76 65 44 61 6e 67 6c 69  Geo_RemoveDangli
14462 6e 67 45 64 67 65 73 22 2c 20 31 2c 0a 09 09 09  ngEdges", 1,....
14463 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
14464 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14465 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20  RMINISTIC,..... 
14466 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74       cache, fnct
14467 5f 54 6f 70 6f 47 65 6f 5f 52 65 6d 6f 76 65 44  _TopoGeo_RemoveD
14468 61 6e 67 6c 69 6e 67 45 64 67 65 73 2c 0a 09 09  anglingEdges,...
14469 09 09 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29  ..      0, 0, 0)
1446a 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
1446b 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1446c 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 52 65  (db, "TopoGeo_Re
1446d 6d 6f 76 65 44 61 6e 67 6c 69 6e 67 4e 6f 64 65  moveDanglingNode
1446e 73 22 2c 20 31 2c 0a 09 09 09 09 20 20 20 20 20  s", 1,.....     
1446f 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
14470 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14471 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
14472 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
14473 65 6f 5f 52 65 6d 6f 76 65 44 61 6e 67 6c 69 6e  eo_RemoveDanglin
14474 67 4e 6f 64 65 73 2c 0a 09 09 09 09 20 20 20 20  gNodes,.....    
14475 20 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73    0, 0, 0);..  s
14476 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14477 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
14478 54 6f 70 6f 47 65 6f 5f 4e 65 77 45 64 67 65 48  TopoGeo_NewEdgeH
14479 65 61 6c 22 2c 20 31 2c 0a 09 09 09 09 20 20 20  eal", 1,.....   
1447a 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
1447b 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1447c 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
1447d 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70   cache, fnct_Top
1447e 6f 47 65 6f 5f 4e 65 77 45 64 67 65 48 65 61 6c  oGeo_NewEdgeHeal
1447f 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73  , 0, 0, 0);..  s
14480 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14481 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
14482 54 6f 70 6f 47 65 6f 5f 4d 6f 64 45 64 67 65 48  TopoGeo_ModEdgeH
14483 65 61 6c 22 2c 20 31 2c 0a 09 09 09 09 20 20 20  eal", 1,.....   
14484 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
14485 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14486 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
14487 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70   cache, fnct_Top
14488 6f 47 65 6f 5f 4d 6f 64 45 64 67 65 48 65 61 6c  oGeo_ModEdgeHeal
14489 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 20 20 73  , 0, 0, 0);..  s
1448a 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1448b 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
1448c 54 6f 70 6f 47 65 6f 5f 4e 65 77 45 64 67 65 73  TopoGeo_NewEdges
1448d 53 70 6c 69 74 22 2c 20 32 2c 0a 09 09 09 09 20  Split", 2,..... 
1448e 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
1448f 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
14490 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
14491 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54     cache, fnct_T
14492 6f 70 6f 47 65 6f 5f 4e 65 77 45 64 67 65 73 53  opoGeo_NewEdgesS
14493 70 6c 69 74 2c 20 30 2c 20 30 2c 0a 09 09 09 09  plit, 0, 0,.....
14494 20 20 20 20 20 20 30 29 3b 0a 09 20 20 73 71 6c        0);..  sql
14495 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14496 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f  tion_v2 (db, "To
14497 70 6f 47 65 6f 5f 4e 65 77 45 64 67 65 73 53 70  poGeo_NewEdgesSp
14498 6c 69 74 22 2c 20 33 2c 0a 09 09 09 09 20 20 20  lit", 3,.....   
14499 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
1449a 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1449b 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
1449c 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70   cache, fnct_Top
1449d 6f 47 65 6f 5f 4e 65 77 45 64 67 65 73 53 70 6c  oGeo_NewEdgesSpl
1449e 69 74 2c 20 30 2c 20 30 2c 0a 09 09 09 09 20 20  it, 0, 0,.....  
1449f 20 20 20 20 30 29 3b 0a 09 20 20 73 71 6c 69 74      0);..  sqlit
144a0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
144a1 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
144a2 47 65 6f 5f 4d 6f 64 45 64 67 65 53 70 6c 69 74  Geo_ModEdgeSplit
144a3 22 2c 20 32 2c 0a 09 09 09 09 20 20 20 20 20 20  ", 2,.....      
144a4 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
144a5 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
144a6 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61  IC,.....      ca
144a7 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65  che, fnct_TopoGe
144a8 6f 5f 4d 6f 64 45 64 67 65 53 70 6c 69 74 2c 20  o_ModEdgeSplit, 
144a9 30 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20  0, 0,.....      
144aa 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
144ab 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
144ac 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
144ad 4d 6f 64 45 64 67 65 53 70 6c 69 74 22 2c 20 33  ModEdgeSplit", 3
144ae 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c 49  ,.....      SQLI
144af 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
144b0 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
144b1 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65 2c  ....      cache,
144b2 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 4d 6f   fnct_TopoGeo_Mo
144b3 64 45 64 67 65 53 70 6c 69 74 2c 20 30 2c 20 30  dEdgeSplit, 0, 0
144b4 2c 0a 09 09 09 09 20 20 20 20 20 20 30 29 3b 0a  ,.....      0);.
144b5 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
144b6 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
144b7 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 43 6c 6f 6e  b, "TopoGeo_Clon
144b8 65 22 2c 20 33 2c 0a 09 09 09 09 20 20 20 20 20  e", 3,.....     
144b9 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
144ba 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
144bb 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
144bc 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
144bd 65 6f 5f 43 6c 6f 6e 65 2c 20 30 2c 20 30 2c 20  eo_Clone, 0, 0, 
144be 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
144bf 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
144c0 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
144c1 53 75 62 64 69 76 69 64 65 4c 69 6e 65 73 22 2c  SubdivideLines",
144c2 20 32 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   2,.....      SQ
144c3 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
144c4 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
144c5 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
144c6 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  e, fnct_TopoGeo_
144c7 53 75 62 64 69 76 69 64 65 4c 69 6e 65 73 2c 20  SubdivideLines, 
144c8 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20  0,.....      0, 
144c9 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
144ca 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
144cb 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
144cc 53 75 62 64 69 76 69 64 65 4c 69 6e 65 73 22 2c  SubdivideLines",
144cd 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   3,.....      SQ
144ce 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
144cf 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
144d0 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
144d1 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  e, fnct_TopoGeo_
144d2 53 75 62 64 69 76 69 64 65 4c 69 6e 65 73 2c 20  SubdivideLines, 
144d3 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20  0,.....      0, 
144d4 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
144d5 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
144d6 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
144d7 44 69 73 61 6d 62 69 67 75 61 74 65 53 65 67 6d  DisambiguateSegm
144d8 65 6e 74 45 64 67 65 73 22 2c 0a 09 09 09 09 20  entEdges",..... 
144d9 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
144da 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
144db 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09  ERMINISTIC,.....
144dc 20 20 20 20 20 20 63 61 63 68 65 2c 0a 09 09 09        cache,....
144dd 09 20 20 20 20 20 20 66 6e 63 74 5f 54 6f 70 6f  .      fnct_Topo
144de 47 65 6f 5f 44 69 73 61 6d 62 69 67 75 61 74 65  Geo_Disambiguate
144df 53 65 67 6d 65 6e 74 45 64 67 65 73 2c 0a 09 09  SegmentEdges,...
144e0 09 09 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29  ..      0, 0, 0)
144e1 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
144e2 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
144e3 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 47 65  (db, "TopoGeo_Ge
144e4 74 45 64 67 65 53 65 65 64 22 2c 20 32 2c 0a 09  tEdgeSeed", 2,..
144e5 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
144e6 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
144e7 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
144e8 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e  .      cache, fn
144e9 63 74 5f 54 6f 70 6f 47 65 6f 5f 47 65 74 45 64  ct_TopoGeo_GetEd
144ea 67 65 53 65 65 64 2c 20 30 2c 20 30 2c 20 30 29  geSeed, 0, 0, 0)
144eb 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
144ec 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
144ed 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 47 65  (db, "TopoGeo_Ge
144ee 74 46 61 63 65 53 65 65 64 22 2c 20 32 2c 0a 09  tFaceSeed", 2,..
144ef 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
144f0 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
144f1 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
144f2 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e  .      cache, fn
144f3 63 74 5f 54 6f 70 6f 47 65 6f 5f 47 65 74 46 61  ct_TopoGeo_GetFa
144f4 63 65 53 65 65 64 2c 20 30 2c 20 30 2c 20 30 29  ceSeed, 0, 0, 0)
144f5 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
144f6 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
144f7 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 55 70  (db, "TopoGeo_Up
144f8 64 61 74 65 53 65 65 64 73 22 2c 20 31 2c 0a 09  dateSeeds", 1,..
144f9 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
144fa 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
144fb 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
144fc 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e  .      cache, fn
144fd 63 74 5f 54 6f 70 6f 47 65 6f 5f 55 70 64 61 74  ct_TopoGeo_Updat
144fe 65 53 65 65 64 73 2c 20 30 2c 20 30 2c 20 30 29  eSeeds, 0, 0, 0)
144ff 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
14500 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
14501 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 55 70  (db, "TopoGeo_Up
14502 64 61 74 65 53 65 65 64 73 22 2c 20 32 2c 0a 09  dateSeeds", 2,..
14503 09 09 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ...      SQLITE_
14504 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
14505 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09  TERMINISTIC,....
14506 09 20 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e  .      cache, fn
14507 63 74 5f 54 6f 70 6f 47 65 6f 5f 55 70 64 61 74  ct_TopoGeo_Updat
14508 65 53 65 65 64 73 2c 20 30 2c 20 30 2c 20 30 29  eSeeds, 0, 0, 0)
14509 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ;..  sqlite3_cre
1450a 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
1450b 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f 53 6e  (db, "TopoGeo_Sn
1450c 61 70 50 6f 69 6e 74 54 6f 53 65 65 64 22 2c 20  apPointToSeed", 
1450d 33 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51 4c  3,.....      SQL
1450e 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
1450f 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
14510 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68 65  .....      cache
14511 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f 53  , fnct_TopoGeo_S
14512 6e 61 70 50 6f 69 6e 74 54 6f 53 65 65 64 2c 20  napPointToSeed, 
14513 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20  0,.....      0, 
14514 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14515 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14516 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
14517 53 6e 61 70 4c 69 6e 65 54 6f 53 65 65 64 22 2c  SnapLineToSeed",
14518 20 33 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   3,.....      SQ
14519 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
1451a 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
1451b 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
1451c 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f 5f  e, fnct_TopoGeo_
1451d 53 6e 61 70 4c 69 6e 65 54 6f 53 65 65 64 2c 20  SnapLineToSeed, 
1451e 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30 2c 20  0,.....      0, 
1451f 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 63  0);..  sqlite3_c
14520 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14521 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65 6f 5f  2 (db, "TopoGeo_
14522 43 72 65 61 74 65 54 6f 70 6f 4c 61 79 65 72 22  CreateTopoLayer"
14523 2c 20 35 2c 0a 09 09 09 09 20 20 20 20 20 20 53  , 5,.....      S
14524 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
14525 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
14526 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63  C,.....      cac
14527 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47 65 6f  he, fnct_TopoGeo
14528 5f 43 72 65 61 74 65 54 6f 70 6f 4c 61 79 65 72  _CreateTopoLayer
14529 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20 20 30  , 0,.....      0
1452a 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
1452b 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1452c 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
1452d 6f 5f 43 72 65 61 74 65 54 6f 70 6f 4c 61 79 65  o_CreateTopoLaye
1452e 72 22 2c 20 36 2c 0a 09 09 09 09 20 20 20 20 20  r", 6,.....     
1452f 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
14530 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14531 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
14532 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
14533 65 6f 5f 43 72 65 61 74 65 54 6f 70 6f 4c 61 79  eo_CreateTopoLay
14534 65 72 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  er, 0,.....     
14535 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
14536 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14537 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
14538 47 65 6f 5f 49 6e 69 74 54 6f 70 6f 4c 61 79 65  Geo_InitTopoLaye
14539 72 22 2c 20 34 2c 0a 09 09 09 09 20 20 20 20 20  r", 4,.....     
1453a 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
1453b 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
1453c 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
1453d 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
1453e 65 6f 5f 49 6e 69 74 54 6f 70 6f 4c 61 79 65 72  eo_InitTopoLayer
1453f 2c 20 30 2c 20 30 2c 0a 09 09 09 09 20 20 20 20  , 0, 0,.....    
14540 20 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65 33    0);..  sqlite3
14541 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14542 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 47 65  _v2 (db, "TopoGe
14543 6f 5f 52 65 6d 6f 76 65 54 6f 70 6f 4c 61 79 65  o_RemoveTopoLaye
14544 72 22 2c 20 32 2c 0a 09 09 09 09 20 20 20 20 20  r", 2,.....     
14545 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53   SQLITE_UTF8 | S
14546 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14547 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20 20 63  TIC,.....      c
14548 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70 6f 47  ache, fnct_TopoG
14549 65 6f 5f 52 65 6d 6f 76 65 54 6f 70 6f 4c 61 79  eo_RemoveTopoLay
1454a 65 72 2c 20 30 2c 0a 09 09 09 09 20 20 20 20 20  er, 0,.....     
1454b 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74   0, 0);..  sqlit
1454c 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1454d 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f  on_v2 (db, "Topo
1454e 47 65 6f 5f 45 78 70 6f 72 74 54 6f 70 6f 4c 61  Geo_ExportTopoLa
1454f 79 65 72 22 2c 20 33 2c 0a 09 09 09 09 20 20 20  yer", 3,.....   
14550 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
14551 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14552 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20 20 20  ISTIC,.....     
14553 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54 6f 70   cache, fnct_Top
14554 6f 47 65 6f 5f 45 78 70 6f 72 74 54 6f 70 6f 4c  oGeo_ExportTopoL
14555 61 79 65 72 2c 20 30 2c 0a 09 09 09 09 20 20 20  ayer, 0,.....   
14556 20 20 20 30 2c 20 30 29 3b 0a 09 20 20 73 71 6c     0, 0);..  sql
14557 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14558 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f  tion_v2 (db, "To
14559 70 6f 47 65 6f 5f 45 78 70 6f 72 74 54 6f 70 6f  poGeo_ExportTopo
1455a 4c 61 79 65 72 22 2c 20 34 2c 0a 09 09 09 09 20  Layer", 4,..... 
1455b 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
1455c 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1455d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20 20 20  INISTIC,.....   
1455e 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74 5f 54     cache, fnct_T
1455f 6f 70 6f 47 65 6f 5f 45 78 70 6f 72 74 54 6f 70  opoGeo_ExportTop
14560 6f 4c 61 79 65 72 2c 20 30 2c 0a 09 09 09 09 20  oLayer, 0,..... 
14561 20 20 20 20 20 30 2c 20 30 29 3b 0a 09 20 20 73       0, 0);..  s
14562 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14563 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
14564 54 6f 70 6f 47 65 6f 5f 45 78 70 6f 72 74 54 6f  TopoGeo_ExportTo
14565 70 6f 4c 61 79 65 72 22 2c 20 35 2c 0a 09 09 09  poLayer", 5,....
14566 09 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
14567 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14568 52 4d 49 4e 49 53 54 49 43 2c 0a 09 09 09 09 20  RMINISTIC,..... 
14569 20 20 20 20 20 63 61 63 68 65 2c 20 66 6e 63 74       cache, fnct
1456a 5f 54 6f 70 6f 47 65 6f 5f 45 78 70 6f 72 74 54  _TopoGeo_ExportT
1456b 6f 70 6f 4c 61 79 65 72 2c 20 30 2c 0a 09 09 09  opoLayer, 0,....
1456c 09 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 09 20  .      0, 0);.. 
1456d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1456e 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c  function_v2 (db,
1456f 0a 09 09 09 09 20 20 20 20 20 20 22 54 6f 70 6f  .....      "Topo
14570 47 65 6f 5f 49 6e 73 65 72 74 46 65 61 74 75 72  Geo_InsertFeatur
14571 65 46 72 6f 6d 54 6f 70 6f 4c 61 79 65 72 22 2c  eFromTopoLayer",
14572 20 34 2c 0a 09 09 09 09 20 20 20 20 20 20 53 51   4,.....      SQ
14573 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
14574 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
14575 2c 0a 09 09 09 09 20 20 20 20 20 20 63 61 63 68  ,.....      cach
14576 65 2c 0a 09 09 09 09 20 20 20 20 20 20 66 6e 63  e,.....      fnc
14577 74 5f 54 6f 70 6f 47 65 6f 5f 49 6e 73 65 72 74  t_TopoGeo_Insert
14578 46 65 61 74 75 72 65 46 72 6f 6d 54 6f 70 6f 4c  FeatureFromTopoL
14579 61 79 65 72 2c 0a 09 09 09 09 20 20 20 20 20 20  ayer,.....      
1457a 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1457b 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  }..    sqlite3_c
1457c 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
1457d 32 20 28 64 62 2c 20 22 43 72 65 61 74 65 4e 65  2 (db, "CreateNe
1457e 74 77 6f 72 6b 22 2c 20 31 2c 0a 09 09 09 09 53  twork", 1,.....S
1457f 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c  QLITE_UTF8 | SQL
14580 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
14581 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e  C, cache,.....fn
14582 63 74 5f 43 72 65 61 74 65 4e 65 74 77 6f 72 6b  ct_CreateNetwork
14583 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
14584 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14585 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
14586 22 43 72 65 61 74 65 4e 65 74 77 6f 72 6b 22 2c  "CreateNetwork",
14587 20 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   2,.....SQLITE_U
14588 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
14589 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
1458a 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72 65 61  e,.....fnct_Crea
1458b 74 65 4e 65 74 77 6f 72 6b 2c 20 30 2c 20 30 2c  teNetwork, 0, 0,
1458c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1458d 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1458e 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61 74 65  _v2 (db, "Create
1458f 4e 65 74 77 6f 72 6b 22 2c 20 33 2c 0a 09 09 09  Network", 3,....
14590 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
14591 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14592 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
14593 66 6e 63 74 5f 43 72 65 61 74 65 4e 65 74 77 6f  fnct_CreateNetwo
14594 72 6b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  rk, 0, 0, 0);.  
14595 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
14596 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
14597 2c 20 22 43 72 65 61 74 65 4e 65 74 77 6f 72 6b  , "CreateNetwork
14598 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54 45  ", 4,.....SQLITE
14599 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
1459a 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61  ETERMINISTIC, ca
1459b 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 43 72  che,.....fnct_Cr
1459c 65 61 74 65 4e 65 74 77 6f 72 6b 2c 20 30 2c 20  eateNetwork, 0, 
1459d 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1459e 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1459f 6f 6e 5f 76 32 20 28 64 62 2c 20 22 43 72 65 61  on_v2 (db, "Crea
145a0 74 65 4e 65 74 77 6f 72 6b 22 2c 20 35 2c 0a 09  teNetwork", 5,..
145a1 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
145a2 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
145a3 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
145a4 09 09 66 6e 63 74 5f 43 72 65 61 74 65 4e 65 74  ..fnct_CreateNet
145a5 77 6f 72 6b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  work, 0, 0, 0);.
145a6 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
145a7 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
145a8 64 62 2c 20 22 53 54 5f 49 6e 69 74 54 6f 70 6f  db, "ST_InitTopo
145a9 4e 65 74 22 2c 20 31 2c 0a 09 09 09 09 53 51 4c  Net", 1,.....SQL
145aa 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
145ab 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
145ac 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
145ad 5f 43 72 65 61 74 65 4e 65 74 77 6f 72 6b 2c 20  _CreateNetwork, 
145ae 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
145af 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
145b0 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 44  ction_v2 (db, "D
145b1 72 6f 70 4e 65 74 77 6f 72 6b 22 2c 20 31 2c 0a  ropNetwork", 1,.
145b2 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
145b3 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
145b4 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
145b5 09 09 09 66 6e 63 74 5f 44 72 6f 70 4e 65 74 77  ...fnct_DropNetw
145b6 6f 72 6b 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ork, 0, 0, 0);. 
145b7 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
145b8 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64  e_function_v2 (d
145b9 62 2c 20 22 47 65 74 4c 61 73 74 4e 65 74 77 6f  b, "GetLastNetwo
145ba 72 6b 45 78 63 65 70 74 69 6f 6e 22 2c 20 31 2c  rkException", 1,
145bb 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
145bc 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
145bd 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
145be 09 09 09 09 66 6e 63 74 5f 47 65 74 4c 61 73 74  ....fnct_GetLast
145bf 4e 65 74 77 6f 72 6b 45 78 63 65 70 74 69 6f 6e  NetworkException
145c0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
145c1 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
145c2 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20  unction_v2 (db, 
145c3 22 53 54 5f 41 64 64 49 73 6f 4e 65 74 4e 6f 64  "ST_AddIsoNetNod
145c4 65 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49 54  e", 2,.....SQLIT
145c5 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
145c6 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
145c7 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41  ache,.....fnct_A
145c8 64 64 49 73 6f 4e 65 74 4e 6f 64 65 2c 20 30 2c  ddIsoNetNode, 0,
145c9 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
145ca 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
145cb 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f  ion_v2 (db, "ST_
145cc 4d 6f 76 65 49 73 6f 4e 65 74 4e 6f 64 65 22 2c  MoveIsoNetNode",
145cd 20 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   3,.....SQLITE_U
145ce 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
145cf 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
145d0 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 6f 76 65  e,.....fnct_Move
145d1 49 73 6f 4e 65 74 4e 6f 64 65 2c 20 30 2c 20 30  IsoNetNode, 0, 0
145d2 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
145d3 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
145d4 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 52 65  n_v2 (db, "ST_Re
145d5 6d 49 73 6f 4e 65 74 4e 6f 64 65 22 2c 20 32 2c  mIsoNetNode", 2,
145d6 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
145d7 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
145d8 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
145d9 09 09 09 09 66 6e 63 74 5f 52 65 6d 49 73 6f 4e  ....fnct_RemIsoN
145da 65 74 4e 6f 64 65 2c 20 30 2c 20 30 2c 20 30 29  etNode, 0, 0, 0)
145db 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
145dc 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
145dd 20 28 64 62 2c 20 22 53 54 5f 41 64 64 4c 69 6e   (db, "ST_AddLin
145de 6b 22 2c 20 34 2c 0a 09 09 09 09 53 51 4c 49 54  k", 4,.....SQLIT
145df 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
145e0 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
145e1 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 41  ache,.....fnct_A
145e2 64 64 4c 69 6e 6b 2c 20 30 2c 20 30 2c 20 30 29  ddLink, 0, 0, 0)
145e3 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
145e4 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
145e5 20 28 64 62 2c 20 22 53 54 5f 43 68 61 6e 67 65   (db, "ST_Change
145e6 4c 69 6e 6b 47 65 6f 6d 22 2c 20 33 2c 0a 09 09  LinkGeom", 3,...
145e7 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20  ..SQLITE_UTF8 | 
145e8 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
145e9 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09  STIC, cache,....
145ea 09 66 6e 63 74 5f 43 68 61 6e 67 65 4c 69 6e 6b  .fnct_ChangeLink
145eb 47 65 6f 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Geom, 0, 0, 0);.
145ec 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
145ed 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
145ee 64 62 2c 20 22 53 54 5f 52 65 6d 6f 76 65 4c 69  db, "ST_RemoveLi
145ef 6e 6b 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c 49  nk", 2,.....SQLI
145f0 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
145f1 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
145f2 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f  cache,.....fnct_
145f3 52 65 6d 6f 76 65 4c 69 6e 6b 2c 20 30 2c 20 30  RemoveLink, 0, 0
145f4 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
145f5 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
145f6 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4e 65  n_v2 (db, "ST_Ne
145f7 77 4c 6f 67 4c 69 6e 6b 53 70 6c 69 74 22 2c 20  wLogLinkSplit", 
145f8 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
145f9 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
145fa 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
145fb 2c 0a 09 09 09 09 66 6e 63 74 5f 4e 65 77 4c 6f  ,.....fnct_NewLo
145fc 67 4c 69 6e 6b 53 70 6c 69 74 2c 20 30 2c 20 30  gLinkSplit, 0, 0
145fd 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
145fe 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
145ff 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 6f  n_v2 (db, "ST_Mo
14600 64 4c 6f 67 4c 69 6e 6b 53 70 6c 69 74 22 2c 20  dLogLinkSplit", 
14601 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
14602 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14603 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14604 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 6f 64 4c 6f  ,.....fnct_ModLo
14605 67 4c 69 6e 6b 53 70 6c 69 74 2c 20 30 2c 20 30  gLinkSplit, 0, 0
14606 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14607 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14608 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4e 65  n_v2 (db, "ST_Ne
14609 77 47 65 6f 4c 69 6e 6b 53 70 6c 69 74 22 2c 20  wGeoLinkSplit", 
1460a 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  3,.....SQLITE_UT
1460b 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1460c 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
1460d 2c 0a 09 09 09 09 66 6e 63 74 5f 4e 65 77 47 65  ,.....fnct_NewGe
1460e 6f 4c 69 6e 6b 53 70 6c 69 74 2c 20 30 2c 20 30  oLinkSplit, 0, 0
1460f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14610 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14611 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4d 6f  n_v2 (db, "ST_Mo
14612 64 47 65 6f 4c 69 6e 6b 53 70 6c 69 74 22 2c 20  dGeoLinkSplit", 
14613 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  3,.....SQLITE_UT
14614 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14615 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14616 2c 0a 09 09 09 09 66 6e 63 74 5f 4d 6f 64 47 65  ,.....fnct_ModGe
14617 6f 4c 69 6e 6b 53 70 6c 69 74 2c 20 30 2c 20 30  oLinkSplit, 0, 0
14618 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14619 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1461a 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4e 65  n_v2 (db, "ST_Ne
1461b 77 4c 69 6e 6b 48 65 61 6c 22 2c 20 33 2c 0a 09  wLinkHeal", 3,..
1461c 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
1461d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
1461e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
1461f 09 09 66 6e 63 74 5f 4e 65 77 4c 69 6e 6b 48 65  ..fnct_NewLinkHe
14620 61 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  al, 0, 0, 0);.  
14621 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
14622 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
14623 2c 20 22 53 54 5f 4d 6f 64 4c 69 6e 6b 48 65 61  , "ST_ModLinkHea
14624 6c 22 2c 20 33 2c 0a 09 09 09 09 53 51 4c 49 54  l", 3,.....SQLIT
14625 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
14626 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63  DETERMINISTIC, c
14627 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 4d  ache,.....fnct_M
14628 6f 64 4c 69 6e 6b 48 65 61 6c 2c 20 30 2c 20 30  odLinkHeal, 0, 0
14629 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1462a 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1462b 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 4c 6f  n_v2 (db, "ST_Lo
1462c 67 69 4e 65 74 46 72 6f 6d 54 47 65 6f 22 2c 20  giNetFromTGeo", 
1462d 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
1462e 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1462f 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14630 2c 0a 09 09 09 09 66 6e 63 74 5f 4c 6f 67 69 4e  ,.....fnct_LogiN
14631 65 74 46 72 6f 6d 54 47 65 6f 2c 20 30 2c 20 30  etFromTGeo, 0, 0
14632 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14633 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14634 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53 70  n_v2 (db, "ST_Sp
14635 61 74 4e 65 74 46 72 6f 6d 54 47 65 6f 22 2c 20  atNetFromTGeo", 
14636 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
14637 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14638 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14639 2c 0a 09 09 09 09 66 6e 63 74 5f 53 70 61 74 4e  ,.....fnct_SpatN
1463a 65 74 46 72 6f 6d 54 47 65 6f 2c 20 30 2c 20 30  etFromTGeo, 0, 0
1463b 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1463c 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1463d 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 53 70  n_v2 (db, "ST_Sp
1463e 61 74 4e 65 74 46 72 6f 6d 47 65 6f 6d 22 2c 20  atNetFromGeom", 
1463f 32 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  2,.....SQLITE_UT
14640 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14641 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14642 2c 0a 09 09 09 09 66 6e 63 74 5f 53 70 61 74 4e  ,.....fnct_SpatN
14643 65 74 46 72 6f 6d 47 65 6f 6d 2c 20 30 2c 20 30  etFromGeom, 0, 0
14644 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14645 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14646 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 56 61  n_v2 (db, "ST_Va
14647 6c 69 64 4c 6f 67 69 63 61 6c 4e 65 74 22 2c 20  lidLogicalNet", 
14648 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
14649 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
1464a 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
1464b 2c 0a 09 09 09 09 66 6e 63 74 5f 56 61 6c 69 64  ,.....fnct_Valid
1464c 4c 6f 67 69 63 61 6c 4e 65 74 2c 20 30 2c 20 30  LogicalNet, 0, 0
1464d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1464e 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1464f 6e 5f 76 32 20 28 64 62 2c 20 22 53 54 5f 56 61  n_v2 (db, "ST_Va
14650 6c 69 64 53 70 61 74 69 61 6c 4e 65 74 22 2c 20  lidSpatialNet", 
14651 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  1,.....SQLITE_UT
14652 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14653 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14654 2c 0a 09 09 09 09 66 6e 63 74 5f 56 61 6c 69 64  ,.....fnct_Valid
14655 53 70 61 74 69 61 6c 4e 65 74 2c 20 30 2c 20 30  SpatialNet, 0, 0
14656 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14657 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14658 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 74 4e 65  n_v2 (db, "GetNe
14659 74 4e 6f 64 65 42 79 50 6f 69 6e 74 22 2c 20 32  tNodeByPoint", 2
1465a 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1465b 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1465c 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1465d 0a 09 09 09 09 66 6e 63 74 5f 47 65 74 4e 65 74  .....fnct_GetNet
1465e 4e 6f 64 65 42 79 50 6f 69 6e 74 2c 20 30 2c 20  NodeByPoint, 0, 
1465f 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
14660 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
14661 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 74 4e  on_v2 (db, "GetN
14662 65 74 4e 6f 64 65 42 79 50 6f 69 6e 74 22 2c 20  etNodeByPoint", 
14663 33 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54  3,.....SQLITE_UT
14664 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
14665 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65  RMINISTIC, cache
14666 2c 0a 09 09 09 09 66 6e 63 74 5f 47 65 74 4e 65  ,.....fnct_GetNe
14667 74 4e 6f 64 65 42 79 50 6f 69 6e 74 2c 20 30 2c  tNodeByPoint, 0,
14668 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
14669 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1466a 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 47 65 74  ion_v2 (db, "Get
1466b 4c 69 6e 6b 42 79 50 6f 69 6e 74 22 2c 20 32 2c  LinkByPoint", 2,
1466c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
1466d 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
1466e 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
1466f 09 09 09 09 66 6e 63 74 5f 47 65 74 4c 69 6e 6b  ....fnct_GetLink
14670 42 79 50 6f 69 6e 74 2c 20 30 2c 20 30 2c 20 30  ByPoint, 0, 0, 0
14671 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
14672 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
14673 32 20 28 64 62 2c 20 22 47 65 74 4c 69 6e 6b 42  2 (db, "GetLinkB
14674 79 50 6f 69 6e 74 22 2c 20 33 2c 0a 09 09 09 09  yPoint", 3,.....
14675 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
14676 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
14677 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09 66  IC, cache,.....f
14678 6e 63 74 5f 47 65 74 4c 69 6e 6b 42 79 50 6f 69  nct_GetLinkByPoi
14679 6e 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nt, 0, 0, 0);.  
1467a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1467b 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62  _function_v2 (db
1467c 2c 20 22 54 6f 70 6f 4e 65 74 5f 46 72 6f 6d 47  , "TopoNet_FromG
1467d 65 6f 54 61 62 6c 65 22 2c 20 34 2c 0a 09 09 09  eoTable", 4,....
1467e 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
1467f 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
14680 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
14681 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f 46 72 6f  fnct_TopoNet_Fro
14682 6d 47 65 6f 54 61 62 6c 65 2c 20 30 2c 20 30 2c  mGeoTable, 0, 0,
14683 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14684 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14685 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 4e 65  _v2 (db, "TopoNe
14686 74 5f 54 6f 47 65 6f 54 61 62 6c 65 22 2c 20 35  t_ToGeoTable", 5
14687 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
14688 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
14689 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1468a 0a 09 09 09 09 66 6e 63 74 5f 54 6f 70 6f 4e 65  .....fnct_TopoNe
1468b 74 5f 54 6f 47 65 6f 54 61 62 6c 65 2c 20 30 2c  t_ToGeoTable, 0,
1468c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1468d 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1468e 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70  ion_v2 (db, "Top
1468f 6f 4e 65 74 5f 54 6f 47 65 6f 54 61 62 6c 65 22  oNet_ToGeoTable"
14690 2c 20 36 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f  , 6,.....SQLITE_
14691 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
14692 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63  TERMINISTIC, cac
14693 68 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 6f 70  he,.....fnct_Top
14694 6f 4e 65 74 5f 54 6f 47 65 6f 54 61 62 6c 65 2c  oNet_ToGeoTable,
14695 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
14696 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14697 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
14698 54 6f 70 6f 4e 65 74 5f 54 6f 47 65 6f 54 61 62  TopoNet_ToGeoTab
14699 6c 65 47 65 6e 65 72 61 6c 69 7a 65 22 2c 20 36  leGeneralize", 6
1469a 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46  ,.....SQLITE_UTF
1469b 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
1469c 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c  MINISTIC, cache,
1469d 0a 09 09 09 09 66 6e 63 74 5f 54 6f 70 6f 4e 65  .....fnct_TopoNe
1469e 74 5f 54 6f 47 65 6f 54 61 62 6c 65 47 65 6e 65  t_ToGeoTableGene
1469f 72 61 6c 69 7a 65 2c 20 30 2c 20 30 2c 20 30 29  ralize, 0, 0, 0)
146a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
146a1 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
146a2 20 28 64 62 2c 20 22 54 6f 70 6f 4e 65 74 5f 54   (db, "TopoNet_T
146a3 6f 47 65 6f 54 61 62 6c 65 47 65 6e 65 72 61 6c  oGeoTableGeneral
146a4 69 7a 65 22 2c 20 37 2c 0a 09 09 09 09 53 51 4c  ize", 7,.....SQL
146a5 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
146a6 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
146a7 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
146a8 5f 54 6f 70 6f 4e 65 74 5f 54 6f 47 65 6f 54 61  _TopoNet_ToGeoTa
146a9 62 6c 65 47 65 6e 65 72 61 6c 69 7a 65 2c 20 30  bleGeneralize, 0
146aa 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
146ab 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
146ac 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f  tion_v2 (db, "To
146ad 70 6f 4e 65 74 5f 43 6c 6f 6e 65 22 2c 20 33 2c  poNet_Clone", 3,
146ae 0a 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38  .....SQLITE_UTF8
146af 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
146b0 49 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a  INISTIC, cache,.
146b1 09 09 09 09 66 6e 63 74 5f 54 6f 70 6f 4e 65 74  ....fnct_TopoNet
146b2 5f 43 6c 6f 6e 65 2c 20 30 2c 20 30 2c 20 30 29  _Clone, 0, 0, 0)
146b3 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
146b4 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
146b5 20 28 64 62 2c 20 22 54 6f 70 6f 4e 65 74 5f 44   (db, "TopoNet_D
146b6 69 73 61 6d 62 69 67 75 61 74 65 53 65 67 6d 65  isambiguateSegme
146b7 6e 74 4c 69 6e 6b 73 22 2c 20 31 2c 0a 09 09 09  ntLinks", 1,....
146b8 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53  .SQLITE_UTF8 | S
146b9 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
146ba 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09 09 09  TIC, cache,.....
146bb 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f 44 69 73  fnct_TopoNet_Dis
146bc 61 6d 62 69 67 75 61 74 65 53 65 67 6d 65 6e 74  ambiguateSegment
146bd 4c 69 6e 6b 73 2c 20 30 2c 20 30 2c 20 30 29 3b  Links, 0, 0, 0);
146be 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
146bf 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20  ate_function_v2 
146c0 28 64 62 2c 20 22 54 6f 70 6f 4e 65 74 5f 47 65  (db, "TopoNet_Ge
146c1 74 4c 69 6e 6b 53 65 65 64 22 2c 20 32 2c 0a 09  tLinkSeed", 2,..
146c2 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  ...SQLITE_UTF8 |
146c3 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
146c4 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09 09  ISTIC, cache,...
146c5 09 09 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f 47  ..fnct_TopoNet_G
146c6 65 74 4c 69 6e 6b 53 65 65 64 2c 20 30 2c 20 30  etLinkSeed, 0, 0
146c7 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
146c8 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
146c9 6e 5f 76 32 20 28 64 62 2c 20 22 54 6f 70 6f 4e  n_v2 (db, "TopoN
146ca 65 74 5f 55 70 64 61 74 65 53 65 65 64 73 22 2c  et_UpdateSeeds",
146cb 20 31 2c 0a 09 09 09 09 53 51 4c 49 54 45 5f 55   1,.....SQLITE_U
146cc 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
146cd 45 52 4d 49 4e 49 53 54 49 43 2c 20 63 61 63 68  ERMINISTIC, cach
146ce 65 2c 0a 09 09 09 09 66 6e 63 74 5f 54 6f 70 6f  e,.....fnct_Topo
146cf 4e 65 74 5f 55 70 64 61 74 65 53 65 65 64 73 2c  Net_UpdateSeeds,
146d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
146d1 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
146d2 6e 63 74 69 6f 6e 5f 76 32 20 28 64 62 2c 20 22  nction_v2 (db, "
146d3 54 6f 70 6f 4e 65 74 5f 55 70 64 61 74 65 53 65  TopoNet_UpdateSe
146d4 65 64 73 22 2c 20 32 2c 0a 09 09 09 09 53 51 4c  eds", 2,.....SQL
146d5 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
146d6 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
146d7 20 63 61 63 68 65 2c 0a 09 09 09 09 66 6e 63 74   cache,.....fnct
146d8 5f 54 6f 70 6f 4e 65 74 5f 55 70 64 61 74 65 53  _TopoNet_UpdateS
146d9 65 65 64 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eeds, 0, 0, 0);.
146da 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
146db 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 28  te_function_v2 (
146dc 64 62 2c 20 22 54 6f 70 6f 4e 65 74 5f 4c 69 6e  db, "TopoNet_Lin
146dd 65 4c 69 6e 6b 73 4c 69 73 74 22 2c 20 35 2c 0a  eLinksList", 5,.
146de 09 09 09 09 53 51 4c 49 54 45 5f 55 54 46 38 20  ....SQLITE_UTF8 
146df 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
146e0 4e 49 53 54 49 43 2c 20 63 61 63 68 65 2c 0a 09  NISTIC, cache,..
146e1 09 09 09 66 6e 63 74 5f 54 6f 70 6f 4e 65 74 5f  ...fnct_TopoNet_
146e2 4c 69 6e 65 4c 69 6e 6b 73 4c 69 73 74 2c 20 30  LineLinksList, 0
146e3 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  , 0, 0);.#endif 
146e4 2f 2a 20 65 6e 64 20 54 4f 50 4f 4c 4f 47 59 20  /* end TOPOLOGY 
146e5 63 6f 6e 64 69 74 69 6f 6e 61 6c 73 20 2a 2f 0a  conditionals */.
146e6 0a 20 20 20 20 72 65 74 75 72 6e 20 63 61 63 68  .    return cach
146e7 65 3b 0a 7d 0a 0a 53 50 41 54 49 41 4c 49 54 45  e;.}..SPATIALITE
146e8 5f 50 52 49 56 41 54 45 20 76 6f 69 64 0a 69 6e  _PRIVATE void.in
146e9 69 74 5f 73 70 61 74 69 61 6c 69 74 65 5f 76 69  it_spatialite_vi
146ea 72 74 75 61 6c 74 61 62 6c 65 73 20 28 76 6f 69  rtualtables (voi
146eb 64 20 2a 70 5f 64 62 2c 20 63 6f 6e 73 74 20 76  d *p_db, const v
146ec 6f 69 64 20 2a 70 5f 63 61 63 68 65 29 0a 7b 0a  oid *p_cache).{.
146ed 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
146ee 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 20 70 5f  = (sqlite3 *) p_
146ef 64 62 3b 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49  db;..#ifndef OMI
146f0 54 5f 49 43 4f 4e 56 09 09 2f 2a 20 77 68 65 6e  T_ICONV../* when
146f1 20 49 43 4f 4e 56 20 69 73 20 64 69 73 61 62 6c   ICONV is disabl
146f2 65 64 20 53 48 50 2f 44 42 46 2f 54 58 54 20 63  ed SHP/DBF/TXT c
146f3 61 6e 6e 6f 74 20 62 65 20 73 75 70 70 6f 72 74  annot be support
146f4 65 64 20 2a 2f 0a 2f 2a 20 69 6e 69 74 69 61 6c  ed */./* initial
146f5 69 7a 69 6e 67 20 74 68 65 20 56 69 72 74 75 61  izing the Virtua
146f6 6c 53 68 61 70 65 20 20 65 78 74 65 6e 73 69 6f  lShape  extensio
146f7 6e 20 2a 2f 0a 20 20 20 20 76 69 72 74 75 61 6c  n */.    virtual
146f8 73 68 61 70 65 5f 65 78 74 65 6e 73 69 6f 6e 5f  shape_extension_
146f9 69 6e 69 74 20 28 64 62 29 3b 0a 2f 2a 20 69 6e  init (db);./* in
146fa 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 56  itializing the V
146fb 69 72 74 75 61 6c 44 62 66 20 20 65 78 74 65 6e  irtualDbf  exten
146fc 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 69 72 74  sion */.    virt
146fd 75 61 6c 64 62 66 5f 65 78 74 65 6e 73 69 6f 6e  ualdbf_extension
146fe 5f 69 6e 69 74 20 28 64 62 29 3b 0a 2f 2a 20 69  _init (db);./* i
146ff 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
14700 56 69 72 74 75 61 6c 54 65 78 74 20 65 78 74 65  VirtualText exte
14701 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 69 72  nsion */.    vir
14702 74 75 61 6c 74 65 78 74 5f 65 78 74 65 6e 73 69  tualtext_extensi
14703 6f 6e 5f 69 6e 69 74 20 28 64 62 29 3b 0a 0a 23  on_init (db);..#
14704 69 66 6e 64 65 66 20 4f 4d 49 54 5f 46 52 45 45  ifndef OMIT_FREE
14705 58 4c 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69  XL./* initializi
14706 6e 67 20 74 68 65 20 56 69 72 74 75 61 6c 58 4c  ng the VirtualXL
14707 20 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20    extension */. 
14708 20 20 20 76 69 72 74 75 61 6c 58 4c 5f 65 78 74     virtualXL_ext
14709 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29  ension_init (db)
1470a 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 46 72 65 65  ;.#endif /* Free
1470b 58 4c 20 65 6e 61 62 6c 65 64 2f 64 69 73 61 62  XL enabled/disab
1470c 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  le */.#endif /* 
1470d 49 43 4f 4e 56 20 65 6e 61 62 6c 65 64 2f 64 69  ICONV enabled/di
1470e 73 61 62 6c 65 64 20 2a 2f 0a 0a 2f 2a 20 69 6e  sabled */../* in
1470f 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 56  itializing the V
14710 69 72 74 75 61 6c 4e 65 74 77 6f 72 6b 20 20 65  irtualNetwork  e
14711 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  xtension */.    
14712 76 69 72 74 75 61 6c 6e 65 74 77 6f 72 6b 5f 65  virtualnetwork_e
14713 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 28 64  xtension_init (d
14714 62 29 3b 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a  b);./* initializ
14715 69 6e 67 20 74 68 65 20 4d 62 72 43 61 63 68 65  ing the MbrCache
14716 20 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20    extension */. 
14717 20 20 20 6d 62 72 63 61 63 68 65 5f 65 78 74 65     mbrcache_exte
14718 6e 73 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29 3b  nsion_init (db);
14719 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ./* initializing
1471a 20 74 68 65 20 56 69 72 74 75 61 6c 46 44 4f 20   the VirtualFDO 
1471b 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 20   extension */.  
1471c 20 20 76 69 72 74 75 61 6c 66 64 6f 5f 65 78 74    virtualfdo_ext
1471d 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29  ension_init (db)
1471e 3b 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ;./* initializin
1471f 67 20 74 68 65 20 56 69 72 74 75 61 6c 42 42 6f  g the VirtualBBo
14720 78 20 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a  x  extension */.
14721 20 20 20 20 76 69 72 74 75 61 6c 62 62 6f 78 5f      virtualbbox_
14722 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 28  extension_init (
14723 64 62 2c 20 70 5f 63 61 63 68 65 29 3b 0a 2f 2a  db, p_cache);./*
14724 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
14725 65 20 56 69 72 74 75 61 6c 53 70 61 74 69 61 6c  e VirtualSpatial
14726 49 6e 64 65 78 20 20 65 78 74 65 6e 73 69 6f 6e  Index  extension
14727 20 2a 2f 0a 20 20 20 20 76 69 72 74 75 61 6c 5f   */.    virtual_
14728 73 70 61 74 69 61 6c 69 6e 64 65 78 5f 65 78 74  spatialindex_ext
14729 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29  ension_init (db)
1472a 3b 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ;./* initializin
1472b 67 20 74 68 65 20 56 69 72 74 75 61 6c 45 6c 65  g the VirtualEle
1472c 6d 65 6e 74 61 72 79 20 20 65 78 74 65 6e 73 69  mentary  extensi
1472d 6f 6e 20 2a 2f 0a 20 20 20 20 76 69 72 74 75 61  on */.    virtua
1472e 6c 5f 65 6c 65 6d 65 6e 74 61 72 79 5f 65 78 74  l_elementary_ext
1472f 65 6e 73 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29  ension_init (db)
14730 3b 0a 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f  ;..#ifndef OMIT_
14731 47 45 4f 53 09 09 2f 2a 20 6f 6e 6c 79 20 69 66  GEOS../* only if
14732 20 47 45 4f 53 20 69 73 20 73 75 70 70 6f 72 74   GEOS is support
14733 65 64 20 2a 2f 0a 2f 2a 20 69 6e 69 74 69 61 6c  ed */./* initial
14734 69 7a 69 6e 67 20 74 68 65 20 56 69 72 74 75 61  izing the Virtua
14735 6c 52 6f 75 74 69 6e 67 20 20 65 78 74 65 6e 73  lRouting  extens
14736 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 69 72 74 75  ion */.    virtu
14737 61 6c 72 6f 75 74 69 6e 67 5f 65 78 74 65 6e 73  alrouting_extens
14738 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29 3b 0a 23  ion_init (db);.#
14739 69 66 6e 64 65 66 20 4f 4d 49 54 5f 4b 4e 4e 09  ifndef OMIT_KNN.
1473a 09 2f 2a 20 6f 6e 6c 79 20 69 66 20 4b 4e 4e 20  ./* only if KNN 
1473b 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 2f 2a  is enabled */./*
1473c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
1473d 65 20 56 69 72 74 75 61 6c 4b 4e 4e 20 20 65 78  e VirtualKNN  ex
1473e 74 65 6e 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 76  tension */.    v
1473f 69 72 74 75 61 6c 5f 6b 6e 6e 5f 65 78 74 65 6e  irtual_knn_exten
14740 73 69 6f 6e 5f 69 6e 69 74 20 28 64 62 29 3b 0a  sion_init (db);.
14741 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 4b 4e  #endif /* end KN
14742 4e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f  N conditional */
14743 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 47  .#endif /* end G
14744 45 4f 53 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  EOS conditional 
14745 2a 2f 0a 0a 23 69 66 64 65 66 20 45 4e 41 42 4c  */..#ifdef ENABL
14746 45 5f 47 45 4f 50 41 43 4b 41 47 45 09 2f 2a 20  E_GEOPACKAGE./* 
14747 6f 6e 6c 79 20 69 66 20 47 65 6f 50 61 63 6b 61  only if GeoPacka
14748 67 65 20 73 75 70 70 6f 72 74 20 69 73 20 65 6e  ge support is en
14749 61 62 6c 65 64 20 2a 2f 0a 2f 2a 20 69 6e 69 74  abled */./* init
1474a 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 56 69 72  ializing the Vir
1474b 74 75 61 6c 46 44 4f 20 20 65 78 74 65 6e 73 69  tualFDO  extensi
1474c 6f 6e 20 2a 2f 0a 20 20 20 20 76 69 72 74 75 61  on */.    virtua
1474d 6c 67 70 6b 67 5f 65 78 74 65 6e 73 69 6f 6e 5f  lgpkg_extension_
1474e 69 6e 69 74 20 28 64 62 29 3b 0a 23 65 6e 64 69  init (db);.#endi
1474f 66 20 2f 2a 20 65 6e 64 20 47 45 4f 50 41 43 4b  f /* end GEOPACK
14750 41 47 45 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  AGE conditional 
14751 2a 2f 0a 0a 23 69 66 64 65 66 20 45 4e 41 42 4c  */..#ifdef ENABL
14752 45 5f 4c 49 42 58 4d 4c 32 09 09 2f 2a 20 69 6e  E_LIBXML2../* in
14753 63 6c 75 64 69 6e 67 20 4c 49 42 58 4d 4c 32 20  cluding LIBXML2 
14754 2a 2f 0a 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69  */./* initializi
14755 6e 67 20 74 68 65 20 56 69 72 74 75 61 6c 58 50  ng the VirtualXP
14756 61 74 68 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  ath extension */
14757 0a 20 20 20 20 76 69 72 74 75 61 6c 5f 78 70 61  .    virtual_xpa
14758 74 68 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69  th_extension_ini
14759 74 20 28 64 62 2c 20 70 5f 63 61 63 68 65 29 3b  t (db, p_cache);
1475a 0a 23 65 6e 64 69 66 20 2f 2a 20 4c 49 42 58 4d  .#endif /* LIBXM
1475b 4c 32 20 65 6e 61 62 6c 65 64 2f 64 69 73 61 62  L2 enabled/disab
1475c 6c 65 20 2a 2f 0a 7d 0a 0a 23 69 66 64 65 66 20  le */.}..#ifdef 
1475d 4c 4f 41 44 41 42 4c 45 5f 45 58 54 45 4e 53 49  LOADABLE_EXTENSI
1475e 4f 4e 09 2f 2a 20 6c 6f 61 64 61 62 6c 65 2d 65  ON./* loadable-e
1475f 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 2a 2f  xtension only */
14760 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  .SQLITE_EXTENSIO
14761 4e 5f 49 4e 49 54 31 20 73 74 61 74 69 63 20 69  N_INIT1 static i
14762 6e 74 0a 69 6e 69 74 5f 73 70 61 74 69 61 6c 69  nt.init_spatiali
14763 74 65 5f 65 78 74 65 6e 73 69 6f 6e 20 28 73 71  te_extension (sq
14764 6c 69 74 65 33 20 2a 20 64 62 2c 20 63 68 61 72  lite3 * db, char
14765 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 09 09 09   **pzErrMsg,....
14766 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
14767 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 20  _api_routines * 
14768 70 41 70 69 29 0a 7b 0a 20 20 20 20 76 6f 69 64  pApi).{.    void
14769 20 2a 70 5f 63 61 63 68 65 20 3d 20 73 70 61 74   *p_cache = spat
1476a 69 61 6c 69 74 65 5f 61 6c 6c 6f 63 5f 63 6f 6e  ialite_alloc_con
1476b 6e 65 63 74 69 6f 6e 20 28 29 3b 0a 20 20 20 20  nection ();.    
1476c 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
1476d 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
1476e 63 68 65 20 3d 0a 09 28 73 74 72 75 63 74 20 73  che =..(struct s
1476f 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
14770 61 63 68 65 20 2a 29 20 70 5f 63 61 63 68 65 3b  ache *) p_cache;
14771 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 45  .    SQLITE_EXTE
14772 4e 53 49 4f 4e 5f 49 4e 49 54 32 20 28 70 41 70  NSION_INIT2 (pAp
14773 69 29 3b 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20  i);../* setting 
14774 74 68 65 20 50 4f 53 49 58 20 6c 6f 63 61 6c 65  the POSIX locale
14775 20 66 6f 72 20 6e 75 6d 65 72 69 63 20 2a 2f 0a   for numeric */.
14776 20 20 20 20 73 65 74 6c 6f 63 61 6c 65 20 28 4c      setlocale (L
14777 43 5f 4e 55 4d 45 52 49 43 2c 20 22 50 4f 53 49  C_NUMERIC, "POSI
14778 58 22 29 3b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  X");.    *pzErrM
14779 73 67 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  sg = NULL;..    
1477a 72 65 67 69 73 74 65 72 5f 73 70 61 74 69 61 6c  register_spatial
1477b 69 74 65 5f 73 71 6c 5f 66 75 6e 63 74 69 6f 6e  ite_sql_function
1477c 73 20 28 64 62 2c 20 63 61 63 68 65 29 3b 0a 0a  s (db, cache);..
1477d 20 20 20 20 69 6e 69 74 5f 73 70 61 74 69 61 6c      init_spatial
1477e 69 74 65 5f 76 69 72 74 75 61 6c 74 61 62 6c 65  ite_virtualtable
1477f 73 20 28 64 62 2c 20 70 5f 63 61 63 68 65 29 3b  s (db, p_cache);
14780 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20 61 20 74  ../* setting a t
14781 69 6d 65 6f 75 74 20 68 61 6e 64 6c 65 72 20 2a  imeout handler *
14782 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  /.    sqlite3_bu
14783 73 79 5f 74 69 6d 65 6f 75 74 20 28 64 62 2c 20  sy_timeout (db, 
14784 35 30 30 30 29 3b 0a 0a 20 20 20 20 72 65 74 75  5000);..    retu
14785 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
14786 53 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c 41  SPATIALITE_DECLA
14787 52 45 20 76 6f 69 64 0a 73 70 61 74 69 61 6c 69  RE void.spatiali
14788 74 65 5f 69 6e 69 74 5f 67 65 6f 73 20 28 76 6f  te_init_geos (vo
14789 69 64 29 0a 7b 0a 2f 2a 20 69 6e 69 74 69 61 6c  id).{./* initial
1478a 69 7a 65 73 20 47 45 4f 53 20 28 6f 72 20 72 65  izes GEOS (or re
1478b 73 65 74 73 20 74 6f 20 69 6e 69 74 69 61 6c 20  sets to initial 
1478c 73 74 61 74 65 20 2d 20 61 73 20 72 65 71 75 69  state - as requi
1478d 72 65 64 20 62 79 20 52 54 54 4f 50 4f 29 20 2a  red by RTTOPO) *
1478e 2f 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 47  /.#ifndef OMIT_G
1478f 45 4f 53 09 09 2f 2a 20 69 6e 69 74 69 61 6c 69  EOS../* initiali
14790 7a 69 6e 67 20 47 45 4f 53 20 2a 2f 0a 23 69 66  zing GEOS */.#if
14791 6e 64 65 66 20 47 45 4f 53 5f 55 53 45 5f 4f 4e  ndef GEOS_USE_ON
14792 4c 59 5f 52 5f 41 50 49 09 2f 2a 20 6f 62 73 6f  LY_R_API./* obso
14793 6c 65 74 65 20 76 65 72 73 69 6f 6e 73 20 6e 6f  lete versions no
14794 6e 20 66 75 6c 6c 79 20 74 68 72 65 61 64 2d 73  n fully thread-s
14795 61 66 65 20 2a 2f 0a 20 20 20 20 69 6e 69 74 47  afe */.    initG
14796 45 4f 53 20 28 67 65 6f 73 5f 77 61 72 6e 69 6e  EOS (geos_warnin
14797 67 2c 20 67 65 6f 73 5f 65 72 72 6f 72 29 3b 0a  g, geos_error);.
14798 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
14799 20 65 6e 64 20 47 45 4f 53 20 20 2a 2f 0a 7d 0a   end GEOS  */.}.
1479a 0a 53 50 41 54 49 41 4c 49 54 45 5f 50 52 49 56  .SPATIALITE_PRIV
1479b 41 54 45 20 76 6f 69 64 0a 73 70 61 74 69 61 6c  ATE void.spatial
1479c 69 74 65 5f 73 70 6c 61 73 68 5f 73 63 72 65 65  ite_splash_scree
1479d 6e 20 28 69 6e 74 20 76 65 72 62 6f 73 65 29 0a  n (int verbose).
1479e 7b 0a 20 20 20 20 69 66 20 28 69 73 61 74 74 79  {.    if (isatty
1479f 20 28 31 29 29 0a 20 20 20 20 20 20 7b 0a 09 20   (1)).      {.. 
147a0 20 2f 2a 20 70 72 69 6e 74 69 6e 67 20 22 68 65   /* printing "he
147a1 6c 6c 6f 22 20 6d 65 73 73 61 67 65 20 6f 6e 6c  llo" message onl
147a2 79 20 77 68 65 6e 20 73 74 64 6f 75 74 20 69 73  y when stdout is
147a3 20 6f 6e 20 63 6f 6e 73 6f 6c 65 20 2a 2f 0a 09   on console */..
147a4 20 20 69 66 20 28 76 65 72 62 6f 73 65 29 0a 09    if (verbose)..
147a5 20 20 20 20 7b 0a 09 09 73 70 61 74 69 61 6c 69      {...spatiali
147a6 74 65 5f 69 20 28 22 53 70 61 74 69 61 4c 69 74  te_i ("SpatiaLit
147a7 65 20 76 65 72 73 69 6f 6e 20 2e 2e 3a 20 25 73  e version ..: %s
147a8 22 2c 0a 09 09 09 20 20 20 20 20 20 73 70 61 74  ",....      spat
147a9 69 61 6c 69 74 65 5f 76 65 72 73 69 6f 6e 20 28  ialite_version (
147aa 29 29 3b 0a 09 09 73 70 61 74 69 61 6c 69 74 65  ));...spatialite
147ab 5f 69 20 28 22 5c 74 53 75 70 70 6f 72 74 65 64  _i ("\tSupported
147ac 20 45 78 74 65 6e 73 69 6f 6e 73 3a 5c 6e 22 29   Extensions:\n")
147ad 3b 0a 23 69 66 6e 64 65 66 20 4f 4d 49 54 5f 49  ;.#ifndef OMIT_I
147ae 43 4f 4e 56 09 09 2f 2a 20 49 43 4f 4e 56 20 69  CONV../* ICONV i
147af 73 20 72 65 71 75 69 72 65 64 20 62 79 20 53 48  s required by SH
147b0 50 2f 44 42 46 2f 54 58 54 20 2a 2f 0a 09 09 73  P/DBF/TXT */...s
147b1 70 61 74 69 61 6c 69 74 65 5f 69 0a 09 09 20 20  patialite_i...  
147b2 20 20 28 22 5c 74 2d 20 27 56 69 72 74 75 61 6c    ("\t- 'Virtual
147b3 53 68 61 70 65 27 5c 74 5b 64 69 72 65 63 74 20  Shape'\t[direct 
147b4 53 68 61 70 65 66 69 6c 65 20 61 63 63 65 73 73  Shapefile access
147b5 5d 5c 6e 22 29 3b 0a 09 09 73 70 61 74 69 61 6c  ]\n");...spatial
147b6 69 74 65 5f 69 20 28 22 5c 74 2d 20 27 56 69 72  ite_i ("\t- 'Vir
147b7 74 75 61 6c 44 62 66 27 5c 74 5c 74 5b 64 69 72  tualDbf'\t\t[dir
147b8 65 63 74 20 44 42 46 20 61 63 63 65 73 73 5d 5c  ect DBF access]\
147b9 6e 22 29 3b 0a 23 69 66 6e 64 65 66 20 4f 4d 49  n");.#ifndef OMI
147ba 54 5f 46 52 45 45 58 4c 0a 09 09 73 70 61 74 69  T_FREEXL...spati
147bb 61 6c 69 74 65 5f 69 20 28 22 5c 74 2d 20 27 56  alite_i ("\t- 'V
147bc 69 72 74 75 61 6c 58 4c 27 5c 74 5c 74 5b 64 69  irtualXL'\t\t[di
147bd 72 65 63 74 20 58 4c 53 20 61 63 63 65 73 73 5d  rect XLS access]
147be 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  \n");.#endif /* 
147bf 65 6e 64 20 46 72 65 65 58 4c 20 63 6f 6e 64 69  end FreeXL condi
147c0 74 69 6f 6e 61 6c 20 2a 2f 0a 09 09 73 70 61 74  tional */...spat
147c1 69 61 6c 69 74 65 5f 69 20 28 22 5c 74 2d 20 27  ialite_i ("\t- '
147c2 56 69 72 74 75 61 6c 54 65 78 74 27 5c 74 5c 74  VirtualText'\t\t
147c3 5b 64 69 72 65 63 74 20 43 53 56 2f 54 58 54 20  [direct CSV/TXT 
147c4 61 63 63 65 73 73 5d 5c 6e 22 29 3b 0a 23 65 6e  access]\n");.#en
147c5 64 69 66 20 2f 2a 20 65 6e 64 20 49 43 4f 4e 56  dif /* end ICONV
147c6 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a   conditional */.
147c7 09 09 73 70 61 74 69 61 6c 69 74 65 5f 69 0a 09  ..spatialite_i..
147c8 09 20 20 20 20 28 22 5c 74 2d 20 27 56 69 72 74  .    ("\t- 'Virt
147c9 75 61 6c 4e 65 74 77 6f 72 6b 27 5c 74 5b 44 69  ualNetwork'\t[Di
147ca 6a 6b 73 74 72 61 20 73 68 6f 72 74 65 73 74 20  jkstra shortest 
147cb 70 61 74 68 5d 5c 6e 22 29 3b 0a 09 09 73 70 61  path]\n");...spa
147cc 74 69 61 6c 69 74 65 5f 69 20 28 22 5c 74 2d 20  tialite_i ("\t- 
147cd 27 52 54 72 65 65 27 5c 74 5c 74 5b 53 70 61 74  'RTree'\t\t[Spat
147ce 69 61 6c 20 49 6e 64 65 78 20 2d 20 52 2a 54 72  ial Index - R*Tr
147cf 65 65 5d 5c 6e 22 29 3b 0a 09 09 73 70 61 74 69  ee]\n");...spati
147d0 61 6c 69 74 65 5f 69 0a 09 09 20 20 20 20 28 22  alite_i...    ("
147d1 5c 74 2d 20 27 4d 62 72 43 61 63 68 65 27 5c 74  \t- 'MbrCache'\t
147d2 5c 74 5b 53 70 61 74 69 61 6c 20 49 6e 64 65 78  \t[Spatial Index
147d3 20 2d 20 4d 42 52 20 63 61 63 68 65 5d 5c 6e 22   - MBR cache]\n"
147d4 29 3b 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f  );...spatialite_
147d5 69 0a 09 09 20 20 20 20 28 22 5c 74 2d 20 27 56  i...    ("\t- 'V
147d6 69 72 74 75 61 6c 53 70 61 74 69 61 6c 49 6e 64  irtualSpatialInd
147d7 65 78 27 5c 74 5b 52 2a 54 72 65 65 20 6d 65 74  ex'\t[R*Tree met
147d8 61 68 61 6e 64 6c 65 72 5d 5c 6e 22 29 3b 0a 09  ahandler]\n");..
147d9 09 73 70 61 74 69 61 6c 69 74 65 5f 69 0a 09 09  .spatialite_i...
147da 20 20 20 20 28 22 5c 74 2d 20 27 56 69 72 74 75      ("\t- 'Virtu
147db 61 6c 45 6c 65 6d 65 6e 74 61 72 79 27 5c 74 5b  alElementary'\t[
147dc 45 6c 65 6d 47 65 6f 6d 73 20 6d 65 74 61 68 61  ElemGeoms metaha
147dd 6e 64 6c 65 72 5d 5c 6e 22 29 3b 0a 0a 23 69 66  ndler]\n");..#if
147de 6e 64 65 66 20 4f 4d 49 54 5f 4b 4e 4e 09 09 2f  ndef OMIT_KNN../
147df 2a 20 6f 6e 6c 79 20 69 66 20 4b 4e 4e 20 69 73  * only if KNN is
147e0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 09 73 70   enabled */...sp
147e1 61 74 69 61 6c 69 74 65 5f 69 0a 09 09 20 20 20  atialite_i...   
147e2 20 28 22 5c 74 2d 20 27 56 69 72 74 75 61 6c 4b   ("\t- 'VirtualK
147e3 4e 4e 27 5c 74 5b 4b 2d 4e 65 61 72 65 73 74 20  NN'\t[K-Nearest 
147e4 4e 65 69 67 68 62 6f 72 73 20 6d 65 74 61 68 61  Neighbors metaha
147e5 6e 64 6c 65 72 5d 5c 6e 22 29 3b 0a 23 65 6e 64  ndler]\n");.#end
147e6 69 66 20 2f 2a 20 65 6e 64 20 4b 4e 4e 20 63 6f  if /* end KNN co
147e7 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 0a 0a 23 69  nditional */..#i
147e8 66 64 65 66 20 45 4e 41 42 4c 45 5f 4c 49 42 58  fdef ENABLE_LIBX
147e9 4d 4c 32 09 09 2f 2a 20 56 69 72 74 75 61 6c 58  ML2../* VirtualX
147ea 50 61 74 68 20 69 73 20 73 75 70 70 6f 72 74 65  Path is supporte
147eb 64 20 2a 2f 0a 09 09 73 70 61 74 69 61 6c 69 74  d */...spatialit
147ec 65 5f 69 0a 09 09 20 20 20 20 28 22 5c 74 2d 20  e_i...    ("\t- 
147ed 27 56 69 72 74 75 61 6c 58 50 61 74 68 27 5c 74  'VirtualXPath'\t
147ee 5b 58 4d 4c 20 50 61 74 68 20 4c 61 6e 67 75 61  [XML Path Langua
147ef 67 65 20 2d 20 58 50 61 74 68 5d 5c 6e 22 29 3b  ge - XPath]\n");
147f0 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20 69  .#endif /* end i
147f1 6e 63 6c 75 64 69 6e 67 20 4c 49 42 58 4d 4c 32  ncluding LIBXML2
147f2 20 2a 2f 0a 0a 09 09 73 70 61 74 69 61 6c 69 74   */....spatialit
147f3 65 5f 69 0a 09 09 20 20 20 20 28 22 5c 74 2d 20  e_i...    ("\t- 
147f4 27 56 69 72 74 75 61 6c 46 44 4f 27 5c 74 5c 74  'VirtualFDO'\t\t
147f5 5b 46 44 4f 2d 4f 47 52 20 69 6e 74 65 72 6f 70  [FDO-OGR interop
147f6 65 72 61 62 69 6c 69 74 79 5d 5c 6e 22 29 3b 0a  erability]\n");.
147f7 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 47  .#ifdef ENABLE_G
147f8 45 4f 50 41 43 4b 41 47 45 09 2f 2a 20 56 69 72  EOPACKAGE./* Vir
147f9 74 75 61 6c 47 50 4b 47 20 69 73 20 73 75 70 70  tualGPKG is supp
147fa 6f 72 74 65 64 20 2a 2f 0a 09 09 73 70 61 74 69  orted */...spati
147fb 61 6c 69 74 65 5f 69 0a 09 09 20 20 20 20 28 22  alite_i...    ("
147fc 5c 74 2d 20 27 56 69 72 74 75 61 6c 47 50 4b 47  \t- 'VirtualGPKG
147fd 27 5c 74 5b 4f 47 43 20 47 65 6f 50 61 63 6b 61  '\t[OGC GeoPacka
147fe 67 65 20 69 6e 74 65 72 6f 70 65 72 61 62 69 6c  ge interoperabil
147ff 69 74 79 5d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  ity]\n");.#endif
14800 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f 69 20  ...spatialite_i 
14801 28 22 5c 74 2d 20 27 56 69 72 74 75 61 6c 42 42  ("\t- 'VirtualBB
14802 6f 78 27 5c 74 5c 74 5b 42 6f 75 6e 64 69 6e 67  ox'\t\t[Bounding
14803 42 6f 78 20 74 61 62 6c 65 73 5d 5c 6e 22 29 3b  Box tables]\n");
14804 0a 09 09 73 70 61 74 69 61 6c 69 74 65 5f 69 20  ...spatialite_i 
14805 28 22 5c 74 2d 20 27 53 70 61 74 69 61 4c 69 74  ("\t- 'SpatiaLit
14806 65 27 5c 74 5c 74 5b 53 70 61 74 69 61 6c 20 53  e'\t\t[Spatial S
14807 51 4c 20 2d 20 4f 47 43 5d 5c 6e 22 29 3b 0a 09  QL - OGC]\n");..
14808 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4f 4d      }.#ifndef OM
14809 49 54 5f 50 52 4f 4a 09 09 2f 2a 20 50 52 4f 4a  IT_PROJ../* PROJ
1480a 2e 34 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 20  .4 version */.. 
1480b 20 69 66 20 28 76 65 72 62 6f 73 65 29 0a 09 20   if (verbose).. 
1480c 20 20 20 20 20 73 70 61 74 69 61 6c 69 74 65 5f       spatialite_
1480d 69 20 28 22 50 52 4f 4a 2e 34 20 76 65 72 73 69  i ("PROJ.4 versi
1480e 6f 6e 20 2e 2e 2e 2e 2e 2e 3a 20 25 73 5c 6e 22  on ......: %s\n"
1480f 2c 20 70 6a 5f 67 65 74 5f 72 65 6c 65 61 73 65  , pj_get_release
14810 20 28 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20   ());.#endif /* 
14811 65 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 50 52  end including PR
14812 4f 4a 2e 34 20 2a 2f 0a 23 69 66 6e 64 65 66 20  OJ.4 */.#ifndef 
14813 4f 4d 49 54 5f 47 45 4f 53 09 09 2f 2a 20 47 45  OMIT_GEOS../* GE
14814 4f 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 20  OS version */.. 
14815 20 69 66 20 28 76 65 72 62 6f 73 65 29 0a 09 20   if (verbose).. 
14816 20 20 20 20 20 73 70 61 74 69 61 6c 69 74 65 5f       spatialite_
14817 69 20 28 22 47 45 4f 53 20 76 65 72 73 69 6f 6e  i ("GEOS version
14818 20 2e 2e 2e 2e 2e 2e 2e 2e 3a 20 25 73 5c 6e 22   ........: %s\n"
14819 2c 20 47 45 4f 53 76 65 72 73 69 6f 6e 20 28 29  , GEOSversion ()
1481a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64  );.#endif /* end
1481b 20 47 45 4f 53 20 76 65 72 73 69 6f 6e 20 2a 2f   GEOS version */
1481c 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f 52  .#ifdef ENABLE_R
1481d 54 54 4f 50 4f 09 09 2f 2a 20 52 54 54 4f 50 4f  TTOPO../* RTTOPO
1481e 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 20 20 69   version */..  i
1481f 66 20 28 76 65 72 62 6f 73 65 29 0a 09 20 20 20  f (verbose)..   
14820 20 20 20 73 70 61 74 69 61 6c 69 74 65 5f 69 20     spatialite_i 
14821 28 22 52 54 54 4f 50 4f 20 76 65 72 73 69 6f 6e  ("RTTOPO version
14822 20 2e 2e 2e 2e 2e 2e 3a 20 25 73 5c 6e 22 2c 0a   ......: %s\n",.
14823 09 09 09 20 20 20 20 73 70 6c 69 74 65 5f 72 74  ...    splite_rt
14824 74 6f 70 6f 5f 76 65 72 73 69 6f 6e 20 28 29 29  topo_version ())
14825 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e 64 20  ;.#endif /* end 
14826 52 54 54 4f 50 4f 20 76 65 72 73 69 6f 6e 20 2a  RTTOPO version *
14827 2f 0a 09 20 20 69 66 20 28 76 65 72 62 6f 73 65  /..  if (verbose
14828 29 0a 09 20 20 20 20 20 20 73 70 61 74 69 61 6c  )..      spatial
14829 69 74 65 5f 69 20 28 22 54 41 52 47 45 54 20 43  ite_i ("TARGET C
1482a 50 55 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 3a 20 25  PU ..........: %
1482b 73 5c 6e 22 2c 0a 09 09 09 20 20 20 20 73 70 61  s\n",....    spa
1482c 74 69 61 6c 69 74 65 5f 74 61 72 67 65 74 5f 63  tialite_target_c
1482d 70 75 20 28 29 29 3b 0a 20 20 20 20 20 20 7d 0a  pu ());.      }.
1482e 7d 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 41 44 41  }..#ifndef LOADA
1482f 42 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 0a 53 50  BLE_EXTENSION.SP
14830 41 54 49 41 4c 49 54 45 5f 44 45 43 4c 41 52 45  ATIALITE_DECLARE
14831 20 76 6f 69 64 0a 73 70 61 74 69 61 6c 69 74 65   void.spatialite
14832 5f 69 6e 69 74 5f 65 78 20 28 73 71 6c 69 74 65  _init_ex (sqlite
14833 33 20 2a 20 64 62 5f 68 61 6e 64 6c 65 2c 20 63  3 * db_handle, c
14834 6f 6e 73 74 20 76 6f 69 64 20 2a 70 5f 63 61 63  onst void *p_cac
14835 68 65 2c 20 69 6e 74 20 76 65 72 62 6f 73 65 29  he, int verbose)
14836 0a 7b 0a 2f 2a 20 75 73 65 64 20 77 68 65 6e 20  .{./* used when 
14837 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
14838 65 73 20 61 73 20 61 6e 20 6f 72 64 69 6e 61 72  es as an ordinar
14839 79 20 6c 69 62 20 2a 2f 0a 20 20 20 20 73 74 72  y lib */.    str
1483a 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72  uct splite_inter
1483b 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65  nal_cache *cache
1483c 20 3d 0a 09 28 73 74 72 75 63 74 20 73 70 6c 69   =..(struct spli
1483d 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  te_internal_cach
1483e 65 20 2a 29 20 70 5f 63 61 63 68 65 3b 0a 20 20  e *) p_cache;.  
1483f 20 20 69 66 20 28 70 5f 63 61 63 68 65 20 3d 3d    if (p_cache ==
14840 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09   NULL).      {..
14841 20 20 73 70 61 74 69 61 6c 69 74 65 5f 65 0a 09    spatialite_e..
14842 20 20 20 20 20 20 28 22 45 52 52 4f 52 20 75 6e        ("ERROR un
14843 61 62 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  able to initiali
14844 7a 65 20 74 68 65 20 53 70 61 74 69 61 4c 69 74  ze the SpatiaLit
14845 65 20 65 78 74 65 6e 73 69 6f 6e 3a 20 4e 55 4c  e extension: NUL
14846 4c 20 63 61 63 68 65 20 21 21 21 5c 6e 22 29 3b  L cache !!!\n");
14847 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ..  return;.    
14848 20 20 7d 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20    }../* setting 
14849 74 68 65 20 50 4f 53 49 58 20 6c 6f 63 61 6c 65  the POSIX locale
1484a 20 66 6f 72 20 6e 75 6d 65 72 69 63 20 2a 2f 0a   for numeric */.
1484b 20 20 20 20 73 65 74 6c 6f 63 61 6c 65 20 28 4c      setlocale (L
1484c 43 5f 4e 55 4d 45 52 49 43 2c 20 22 50 4f 53 49  C_NUMERIC, "POSI
1484d 58 22 29 3b 0a 0a 20 20 20 20 72 65 67 69 73 74  X");..    regist
1484e 65 72 5f 73 70 61 74 69 61 6c 69 74 65 5f 73 71  er_spatialite_sq
1484f 6c 5f 66 75 6e 63 74 69 6f 6e 73 20 28 64 62 5f  l_functions (db_
14850 68 61 6e 64 6c 65 2c 20 63 61 63 68 65 29 3b 0a  handle, cache);.
14851 0a 20 20 20 20 69 6e 69 74 5f 73 70 61 74 69 61  .    init_spatia
14852 6c 69 74 65 5f 76 69 72 74 75 61 6c 74 61 62 6c  lite_virtualtabl
14853 65 73 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20 70  es (db_handle, p
14854 5f 63 61 63 68 65 29 3b 0a 20 20 20 20 73 70 61  _cache);.    spa
14855 74 69 61 6c 69 74 65 5f 73 70 6c 61 73 68 5f 73  tialite_splash_s
14856 63 72 65 65 6e 20 28 76 65 72 62 6f 73 65 29 3b  creen (verbose);
14857 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20 61 20 74  ../* setting a t
14858 69 6d 65 6f 75 74 20 68 61 6e 64 6c 65 72 20 2a  imeout handler *
14859 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  /.    sqlite3_bu
1485a 73 79 5f 74 69 6d 65 6f 75 74 20 28 64 62 5f 68  sy_timeout (db_h
1485b 61 6e 64 6c 65 2c 20 35 30 30 30 29 3b 0a 7d 0a  andle, 5000);.}.
1485c 0a 53 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c  .SPATIALITE_DECL
1485d 41 52 45 20 76 6f 69 64 0a 73 70 61 74 69 61 6c  ARE void.spatial
1485e 69 74 65 5f 63 6c 65 61 6e 75 70 5f 65 78 20 28  ite_cleanup_ex (
1485f 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 74 72 29  const void *ptr)
14860 0a 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70  .{.    struct sp
14861 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61  lite_internal_ca
14862 63 68 65 20 2a 63 61 63 68 65 20 3d 20 28 73 74  che *cache = (st
14863 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65  ruct splite_inte
14864 72 6e 61 6c 5f 63 61 63 68 65 20 2a 29 20 70 74  rnal_cache *) pt
14865 72 3b 0a 0a 20 20 20 20 69 66 20 28 63 61 63 68  r;..    if (cach
14866 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75  e == NULL)..retu
14867 72 6e 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68  rn;.    if (cach
14868 65 2d 3e 6d 61 67 69 63 31 20 21 3d 20 53 50 41  e->magic1 != SPA
14869 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41  TIALITE_CACHE_MA
1486a 47 49 43 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e  GIC1..|| cache->
1486b 6d 61 67 69 63 32 20 21 3d 20 53 50 41 54 49 41  magic2 != SPATIA
1486c 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43  LITE_CACHE_MAGIC
1486d 32 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 23 69 66  2)..return;..#if
1486e 64 65 66 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50  def ENABLE_RTTOP
1486f 4f 0a 20 20 20 20 67 61 69 61 52 65 73 65 74 52  O.    gaiaResetR
14870 74 54 6f 70 6f 4d 73 67 20 28 63 61 63 68 65 29  tTopoMsg (cache)
14871 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 72  ;.#endif..    fr
14872 65 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68  ee_internal_cach
14873 65 20 28 63 61 63 68 65 29 3b 0a 20 20 20 20 73  e (cache);.    s
14874 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74  qlite3_reset_aut
14875 6f 5f 65 78 74 65 6e 73 69 6f 6e 20 28 29 3b 0a  o_extension ();.
14876 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 6e 6f 74 20  }.#endif /* not 
14877 62 75 69 6c 74 20 61 73 20 6c 6f 61 64 61 62 6c  built as loadabl
14878 65 2d 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e-extension only
14879 20 2a 2f 0a 0a 53 50 41 54 49 41 4c 49 54 45 5f   */..SPATIALITE_
1487a 50 52 49 56 41 54 45 20 76 6f 69 64 0a 73 70 61  PRIVATE void.spa
1487b 74 69 61 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c  tialite_internal
1487c 5f 69 6e 69 74 20 28 76 6f 69 64 20 2a 68 61 6e  _init (void *han
1487d 64 6c 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  dle, const void 
1487e 2a 70 5f 63 61 63 68 65 29 0a 7b 0a 2f 2a 20 75  *p_cache).{./* u
1487f 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 69 6e 74  sed only for int
14880 65 72 6e 61 6c 20 75 73 61 67 65 20 2a 2f 0a 20  ernal usage */. 
14881 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 5f 68     sqlite3 *db_h
14882 61 6e 64 6c 65 20 3d 20 28 73 71 6c 69 74 65 33  andle = (sqlite3
14883 20 2a 29 20 68 61 6e 64 6c 65 3b 0a 20 20 20 20   *) handle;.    
14884 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e  struct splite_in
14885 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61  ternal_cache *ca
14886 63 68 65 20 3d 0a 09 28 73 74 72 75 63 74 20 73  che =..(struct s
14887 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63  plite_internal_c
14888 61 63 68 65 20 2a 29 20 70 5f 63 61 63 68 65 3b  ache *) p_cache;
14889 0a 20 20 20 20 69 66 20 28 70 5f 63 61 63 68 65  .    if (p_cache
1488a 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   == NULL).      
1488b 7b 0a 09 20 20 73 70 61 74 69 61 6c 69 74 65 5f  {..  spatialite_
1488c 65 0a 09 20 20 20 20 20 20 28 22 45 52 52 4f 52  e..      ("ERROR
1488d 20 75 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69   unable to initi
1488e 61 6c 69 7a 65 20 74 68 65 20 53 70 61 74 69 61  alize the Spatia
1488f 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 3a 20  Lite extension: 
14890 4e 55 4c 4c 20 63 61 63 68 65 20 21 21 21 5c 6e  NULL cache !!!\n
14891 22 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  ");..  return;. 
14892 20 20 20 20 20 7d 0a 20 20 20 20 72 65 67 69 73       }.    regis
14893 74 65 72 5f 73 70 61 74 69 61 6c 69 74 65 5f 73  ter_spatialite_s
14894 71 6c 5f 66 75 6e 63 74 69 6f 6e 73 20 28 64 62  ql_functions (db
14895 5f 68 61 6e 64 6c 65 2c 20 63 61 63 68 65 29 3b  _handle, cache);
14896 0a 20 20 20 20 69 6e 69 74 5f 73 70 61 74 69 61  .    init_spatia
14897 6c 69 74 65 5f 76 69 72 74 75 61 6c 74 61 62 6c  lite_virtualtabl
14898 65 73 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20 70  es (db_handle, p
14899 5f 63 61 63 68 65 29 3b 0a 2f 2a 20 73 65 74 74  _cache);./* sett
1489a 69 6e 67 20 61 20 74 69 6d 65 6f 75 74 20 68 61  ing a timeout ha
1489b 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  ndler */.    sql
1489c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
1489d 74 20 28 64 62 5f 68 61 6e 64 6c 65 2c 20 35 30  t (db_handle, 50
1489e 30 30 29 3b 0a 7d 0a 0a 53 50 41 54 49 41 4c 49  00);.}..SPATIALI
1489f 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 0a  TE_PRIVATE void.
148a0 73 70 61 74 69 61 6c 69 74 65 5f 69 6e 74 65 72  spatialite_inter
148a1 6e 61 6c 5f 63 6c 65 61 6e 75 70 20 28 63 6f 6e  nal_cleanup (con
148a2 73 74 20 76 6f 69 64 20 2a 70 74 72 29 0a 7b 0a  st void *ptr).{.
148a3 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74      struct split
148a4 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65  e_internal_cache
148a5 20 2a 63 61 63 68 65 20 3d 20 28 73 74 72 75 63   *cache = (struc
148a6 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61  t splite_interna
148a7 6c 5f 63 61 63 68 65 20 2a 29 20 70 74 72 3b 0a  l_cache *) ptr;.
148a8 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 3d  .    if (cache =
148a9 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  = NULL)..return;
148aa 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e  .    if (cache->
148ab 6d 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 41  magic1 != SPATIA
148ac 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43  LITE_CACHE_MAGIC
148ad 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67  1..|| cache->mag
148ae 69 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54  ic2 != SPATIALIT
148af 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a  E_CACHE_MAGIC2).
148b0 09 72 65 74 75 72 6e 3b 0a 0a 23 69 66 64 65 66  .return;..#ifdef
148b1 20 45 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 0a 20   ENABLE_RTTOPO. 
148b2 20 20 20 67 61 69 61 52 65 73 65 74 52 74 54 6f     gaiaResetRtTo
148b3 70 6f 4d 73 67 20 28 63 61 63 68 65 29 3b 0a 23  poMsg (cache);.#
148b4 65 6e 64 69 66 0a 0a 20 20 20 20 66 72 65 65 5f  endif..    free_
148b5 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 28  internal_cache (
148b6 63 61 63 68 65 29 3b 0a 7d 0a 0a 23 69 66 64 65  cache);.}..#ifde
148b7 66 20 4c 4f 41 44 41 42 4c 45 5f 45 58 54 45 4e  f LOADABLE_EXTEN
148b8 53 49 4f 4e 09 2f 2a 20 6c 6f 61 64 61 62 6c 65  SION./* loadable
148b9 2d 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20  -extension only 
148ba 2a 2f 0a 23 69 66 20 21 28 64 65 66 69 6e 65 64  */.#if !(defined
148bb 20 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69   _WIN32) || defi
148bc 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29  ned(__MINGW32__)
148bd 0a 2f 2a 20 4d 53 56 43 20 69 73 20 75 6e 61 62  ./* MSVC is unab
148be 6c 65 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64  le to understand
148bf 20 74 68 69 73 20 64 65 63 6c 61 72 61 74 69 6f   this declaratio
148c0 6e 20 2a 2f 0a 5f 5f 61 74 74 72 69 62 75 74 65  n */.__attribute
148c1 5f 5f 20 28 28 76 69 73 69 62 69 6c 69 74 79 20  __ ((visibility 
148c2 28 22 64 65 66 61 75 6c 74 22 29 29 29 0a 23 65  ("default"))).#e
148c3 6e 64 69 66 0a 20 20 20 20 20 53 50 41 54 49 41  ndif.     SPATIA
148c4 4c 49 54 45 5f 44 45 43 4c 41 52 45 20 69 6e 74  LITE_DECLARE int
148c5 0a 09 20 73 71 6c 69 74 65 33 5f 6d 6f 64 73 70  .. sqlite3_modsp
148c6 61 74 69 61 6c 69 74 65 5f 69 6e 69 74 20 28 73  atialite_init (s
148c7 71 6c 69 74 65 33 20 2a 20 64 62 2c 20 63 68 61  qlite3 * db, cha
148c8 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 09 09  r **pzErrMsg,...
148c9 09 09 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  ..     const sql
148ca 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
148cb 73 20 2a 20 70 41 70 69 29 0a 7b 0a 2f 2a 20 53  s * pApi).{./* S
148cc 51 4c 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68  QLite invokes th
148cd 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
148ce 77 68 65 6e 20 69 74 20 64 79 6e 61 6d 69 63 61  when it dynamica
148cf 6c 6c 79 20 6c 6f 61 64 73 20 74 68 65 20 65 78  lly loads the ex
148d0 74 65 6e 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  tension. */.    
148d1 73 70 61 74 69 61 6c 69 74 65 5f 69 6e 69 74 69  spatialite_initi
148d2 61 6c 69 7a 65 20 28 29 3b 0a 20 20 20 20 72 65  alize ();.    re
148d3 74 75 72 6e 20 69 6e 69 74 5f 73 70 61 74 69 61  turn init_spatia
148d4 6c 69 74 65 5f 65 78 74 65 6e 73 69 6f 6e 20 28  lite_extension (
148d5 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c 20 70 41  db, pzErrMsg, pA
148d6 70 69 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 53  pi);.}.#endif..S
148d7 50 41 54 49 41 4c 49 54 45 5f 44 45 43 4c 41 52  PATIALITE_DECLAR
148d8 45 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 0a  E sqlite3_int64.
148d9 6d 61 74 68 5f 6c 6c 61 62 73 20 28 73 71 6c 69  math_llabs (sqli
148da 74 65 33 5f 69 6e 74 36 34 20 76 61 6c 75 65 29  te3_int64 value)
148db 0a 7b 0a 2f 2a 20 72 65 70 6c 61 63 69 6e 67 20  .{./* replacing 
148dc 74 68 65 20 43 39 39 20 6c 6c 61 62 73 28 29 20  the C99 llabs() 
148dd 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
148de 72 65 74 75 72 6e 20 76 61 6c 75 65 20 3c 20 30  return value < 0
148df 20 3f 20 2d 76 61 6c 75 65 20 3a 20 76 61 6c 75   ? -value : valu
148e0 65 3b 0a 7d 0a 0a 53 50 41 54 49 41 4c 49 54 45  e;.}..SPATIALITE
148e1 5f 44 45 43 4c 41 52 45 20 64 6f 75 62 6c 65 0a  _DECLARE double.
148e2 6d 61 74 68 5f 72 6f 75 6e 64 20 28 64 6f 75 62  math_round (doub
148e3 6c 65 20 76 61 6c 75 65 29 0a 7b 0a 2f 2a 20 72  le value).{./* r
148e4 65 70 6c 61 63 69 6e 67 20 74 68 65 20 43 39 39  eplacing the C99
148e5 20 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69 6f   round() functio
148e6 6e 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  n */.    double 
148e7 6d 69 6e 20 3d 20 66 6c 6f 6f 72 20 28 76 61 6c  min = floor (val
148e8 75 65 29 3b 0a 20 20 20 20 69 66 20 28 66 61 62  ue);.    if (fab
148e9 73 20 28 76 61 6c 75 65 20 2d 20 6d 69 6e 29 20  s (value - min) 
148ea 3c 20 30 2e 35 29 0a 09 72 65 74 75 72 6e 20 6d  < 0.5)..return m
148eb 69 6e 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  in;.    return m
148ec 69 6e 20 2b 20 31 2e 30 3b 0a 7d 0a              in + 1.0;.}.